Compare commits

..

2 Commits

Author SHA1 Message Date
JISAUAY
9e46cc9105 added ~ as home processing 2025-06-27 11:23:15 -05:00
JISAUAY
7062e798a9 added python path thing 2025-06-27 10:55:53 -05:00
7 changed files with 162 additions and 9 deletions

View File

@ -2,13 +2,17 @@ package cmd
import ( import (
"gosh/types" "gosh/types"
"gosh/util"
"os" "os"
"github.com/fatih/color" "github.com/fatih/color"
) )
func GoshCat(sh *types.Shell, filename string) types.CmdOutput { func GoshCat(sh *types.Shell, file_path string) types.CmdOutput {
data, err := os.ReadFile(filename)
file_path = util.ExpandHome(file_path)
data, err := os.ReadFile(file_path)
red := color.New(color.FgRed).SprintFunc() red := color.New(color.FgRed).SprintFunc()
if err != nil { if err != nil {
return types.CmdOutput{Id: 1, Output: red(err)} return types.CmdOutput{Id: 1, Output: red(err)}

View File

@ -4,11 +4,15 @@ import (
"os" "os"
"gosh/types" "gosh/types"
"gosh/util"
"github.com/fatih/color" "github.com/fatih/color"
) )
func GoshCd(sh *types.Shell, dir string) types.CmdOutput { func GoshCd(sh *types.Shell, dir string) types.CmdOutput {
dir = util.ExpandHome(dir)
err := os.Chdir(dir) err := os.Chdir(dir)
red := color.New(color.FgRed).SprintFunc() red := color.New(color.FgRed).SprintFunc()
if err != nil { if err != nil {

View File

@ -2,14 +2,27 @@ package cmd
import ( import (
"gosh/types" "gosh/types"
"gosh/util"
"os" "os"
"strings" "strings"
"github.com/fatih/color" "github.com/fatih/color"
) )
func GoshLs(sh *types.Shell) types.CmdOutput { func GoshLs(sh *types.Shell, paths ...string) types.CmdOutput {
children, err := os.ReadDir(sh.Cd)
var dir string
if len(paths) > 0 && paths[0] != "" {
dir = paths[0]
} else {
dir = sh.Cd
}
dir = util.ExpandHome(dir)
children, err := os.ReadDir(dir)
red := color.New(color.FgRed).SprintFunc() red := color.New(color.FgRed).SprintFunc()
if err != nil { if err != nil {
return types.CmdOutput{Id: 1, Output: red(err)} return types.CmdOutput{Id: 1, Output: red(err)}

26
cmd/pyapath.go Normal file
View File

@ -0,0 +1,26 @@
package cmd
import (
"gosh/types"
"gosh/util"
"path/filepath"
"github.com/fatih/color"
)
func GolshPyapath(sh *types.Shell, path string) types.CmdOutput {
path = util.ExpandHome(path)
abs, err := filepath.Abs(path)
red := color.New(color.FgRed).SprintFunc()
if err != nil {
return types.CmdOutput{Id: 1, Output: red(err)}
}
sh.PyPaths = append(sh.PyPaths, abs)
return types.CmdOutput{Id: 0, Output: ""}
}

94
main.go
View File

@ -6,6 +6,8 @@ import (
"gosh/cmd" "gosh/cmd"
"gosh/types" "gosh/types"
"os" "os"
"os/exec"
"path/filepath"
"strings" "strings"
"github.com/fatih/color" "github.com/fatih/color"
@ -41,6 +43,61 @@ func parse_flags(parts []string) (map[string]string, []string) {
return flags, args return flags, args
} }
func process_golshscript(sh *types.Shell, file_path string) {
data, err := os.ReadFile(file_path)
if err != nil {
fmt.Println("Error: ", err)
return
}
lines := strings.Split(string(data), "\n")
for _, line := range lines {
gosh_process_input(sh, strings.TrimSpace(line))
}
}
func check_pathes(sh *types.Shell, name string, args []string) bool {
var output types.CmdOutput
program_found := false
// Check Python Pathes
for _, path := range sh.PyPaths {
children, err := os.ReadDir(path)
if err != nil {
color.Red("Error reading path.")
fmt.Println(err)
}
for _, child := range children {
child_name := strings.TrimSpace(child.Name())
if !child.IsDir() && child_name == name {
program_found = true
full_path := filepath.Join(path, child.Name())
path_args := append([]string{full_path}, args...)
comd := exec.Command("python3", path_args...)
out, err := comd.Output()
if err != nil {
fmt.Print("Error: ")
color.Red(err.Error())
}
output = types.CmdOutput{Id: 0, Output: string(out)}
}
}
}
if program_found {
gosh_print_output(output)
}
return program_found
}
func gosh_process_input(sh *types.Shell, input string) { func gosh_process_input(sh *types.Shell, input string) {
// Split by pipe and trim spaces // Split by pipe and trim spaces
commands := strings.Split(input, "|") commands := strings.Split(input, "|")
@ -63,7 +120,11 @@ func gosh_process_input(sh *types.Shell, input string) {
} }
prevOutput = cmd.GoshCd(sh, parts[1]) prevOutput = cmd.GoshCd(sh, parts[1])
case "ls": case "ls":
if len(parts) > 1 {
prevOutput = cmd.GoshLs(sh, parts[1:]...)
} else {
prevOutput = cmd.GoshLs(sh) prevOutput = cmd.GoshLs(sh)
}
case "cat": case "cat":
if len(parts) < 2 { if len(parts) < 2 {
fmt.Println("Usage: cat <path to file>") fmt.Println("Usage: cat <path to file>")
@ -82,10 +143,20 @@ func gosh_process_input(sh *types.Shell, input string) {
prevOutput = cmd.GoshGrep(sh, flags, prevOutput.Output, args[len(args)-1]) prevOutput = cmd.GoshGrep(sh, flags, prevOutput.Output, args[len(args)-1])
case "clear": case "clear":
cmd.GoshClear() cmd.GoshClear()
default: case "apath":
fmt.Println("Unknown command: ", parts[0]) if len(parts) < 2 {
fmt.Println(("Usage: apath <path/dir>"))
return return
} }
prevOutput = cmd.GolshPyapath(sh, parts[1])
default:
if !check_pathes(sh, parts[0], parts[1:]) {
fmt.Println("Unknown command:", parts[0])
return
}
}
} }
gosh_print_output(prevOutput) gosh_print_output(prevOutput)
@ -97,7 +168,24 @@ func main() {
c := color.New(color.FgCyan) c := color.New(color.FgCyan)
dir, _ := os.Getwd() dir, _ := os.Getwd()
sh := types.Shell{Cd: dir}
// Init shell
sh := types.Shell{
Cd: dir,
PyPaths: []string{}}
// Check for and execute .golshrc
golshrc_path, _ := os.UserHomeDir()
golshrc_path = golshrc_path + "/.golshrc"
_, err := os.Stat(golshrc_path)
golshrc_exists := err == nil
fmt.Println(golshrc_exists)
if golshrc_exists {
fmt.Println("exists")
process_golshscript(&sh, golshrc_path)
}
var should_exit = false var should_exit = false
for { for {

View File

@ -2,6 +2,7 @@ package types
type Shell struct { type Shell struct {
Cd string Cd string
PyPaths []string
} }
type CmdOutput struct { type CmdOutput struct {

17
util/util.go Normal file
View File

@ -0,0 +1,17 @@
package util
import (
"os"
"strings"
)
func ExpandHome(path string) string {
if strings.HasPrefix(path, "~") {
home, err := os.UserHomeDir()
if err == nil {
return strings.Replace(path, "~", home, 1)
}
}
return path
}