Bether input
This commit is contained in:
parent
990978f157
commit
6a94165e54
@ -8,5 +8,4 @@ import (
|
|||||||
|
|
||||||
func Echo(in input_parser.Input, _ *environment.Env) {
|
func Echo(in input_parser.Input, _ *environment.Env) {
|
||||||
fmt.Print(in.Args_raw)
|
fmt.Print(in.Args_raw)
|
||||||
// fungerar inte om råttan åt din kod
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,6 +10,9 @@ type Env struct {
|
|||||||
Path string
|
Path string
|
||||||
|
|
||||||
Env map[string]string
|
Env map[string]string
|
||||||
|
|
||||||
|
// History where each command gets append to the end
|
||||||
|
History []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func Get_env() Env {
|
func Get_env() Env {
|
||||||
@ -17,14 +20,21 @@ func Get_env() Env {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err.Error())
|
log.Fatal(err.Error())
|
||||||
}
|
}
|
||||||
|
return Env{
|
||||||
|
Path: pwd,
|
||||||
|
Env: inherit_environment(),
|
||||||
|
History: get_history(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func inherit_environment() map[string] string{
|
||||||
env := make(map[string]string)
|
env := make(map[string]string)
|
||||||
for _, s_env := range os.Environ() {
|
for _, s_env := range os.Environ() {
|
||||||
split := strings.Split(s_env, "=")
|
split := strings.Split(s_env, "=")
|
||||||
env[split[0]] = split[1]
|
env[split[0]] = split[1]
|
||||||
}
|
}
|
||||||
return Env{
|
return env
|
||||||
Path: pwd,
|
|
||||||
Env: env,
|
|
||||||
}
|
}
|
||||||
|
func get_history() []string {
|
||||||
|
var x []string
|
||||||
|
return x
|
||||||
}
|
}
|
||||||
|
|||||||
5
go.mod
5
go.mod
@ -1,3 +1,8 @@
|
|||||||
module bbash
|
module bbash
|
||||||
|
|
||||||
go 1.23.4
|
go 1.23.4
|
||||||
|
|
||||||
|
require (
|
||||||
|
golang.org/x/sys v0.29.0 // indirect
|
||||||
|
golang.org/x/term v0.28.0 // indirect
|
||||||
|
)
|
||||||
|
|||||||
4
go.sum
Normal file
4
go.sum
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
|
||||||
|
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
|
golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
|
||||||
|
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
|
||||||
@ -1,10 +1,13 @@
|
|||||||
package input_parser
|
package input_parser
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bbash/environment"
|
||||||
"bufio"
|
"bufio"
|
||||||
"log"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"golang.org/x/term"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Input struct {
|
type Input struct {
|
||||||
@ -17,16 +20,21 @@ type Input struct {
|
|||||||
Flags []string
|
Flags []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func Parse() Input {
|
func Parse(env *environment.Env) Input {
|
||||||
input := input_str()
|
input := input_str(env)
|
||||||
return parse(input)
|
return parse(input)
|
||||||
}
|
}
|
||||||
func parse(input string) Input {
|
func parse(input string) Input {
|
||||||
split := strings.Split(string(input), " ")
|
split := strings.Split(string(input), " ")
|
||||||
instruction := strings.TrimSpace(split[0])
|
instruction := strings.TrimSpace(split[0])
|
||||||
|
|
||||||
|
args_raw := ""
|
||||||
|
if len(split) > 1 {
|
||||||
|
args_raw = split[1]
|
||||||
|
}
|
||||||
|
|
||||||
var flags []string
|
var flags []string
|
||||||
var args []string
|
var args []string
|
||||||
|
|
||||||
for _, arg := range split[1:] {
|
for _, arg := range split[1:] {
|
||||||
if len(arg) == 1 && arg[0] == '-' {
|
if len(arg) == 1 && arg[0] == '-' {
|
||||||
continue
|
continue
|
||||||
@ -49,13 +57,69 @@ func parse(input string) Input {
|
|||||||
Instruction: instruction,
|
Instruction: instruction,
|
||||||
Args: args,
|
Args: args,
|
||||||
Flags: flags,
|
Flags: flags,
|
||||||
|
Args_raw: args_raw,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func input_str() string {
|
func input_str(env *environment.Env) string {
|
||||||
reader := bufio.NewReader(os.Stdin)
|
std_fd := os.Stdin.Fd()
|
||||||
input, err := reader.ReadString('\n')
|
term_restore, err := term.MakeRaw(int(std_fd))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err.Error())
|
fmt.Println(fmt.Sprintf("Error opening terminal: %s", err.Error()))
|
||||||
|
panic(err.Error())
|
||||||
}
|
}
|
||||||
|
reader := bufio.NewReader(os.Stdin)
|
||||||
|
var input string
|
||||||
|
history_index := len(env.History) // not -1 since we start at the new one
|
||||||
|
env.History = append(env.History, input)
|
||||||
|
|
||||||
|
env.History[len(env.History)-1] = input
|
||||||
|
fmt.Print("\r\033[K")
|
||||||
|
fmt.Print(env.Path)
|
||||||
|
fmt.Print(" > ")
|
||||||
|
fmt.Print(input)
|
||||||
|
|
||||||
|
for {
|
||||||
|
r_rune, _, err := reader.ReadRune()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Print(fmt.Sprintf("Error reading user input: ", err.Error()))
|
||||||
|
}
|
||||||
|
switch r_rune {
|
||||||
|
case 3: // ^C
|
||||||
|
input = ""
|
||||||
|
case 4: // ^D
|
||||||
|
input = "exit"
|
||||||
|
goto loop_exit
|
||||||
|
case 65: // UPP
|
||||||
|
if history_index > 0 {
|
||||||
|
history_index--
|
||||||
|
input = env.History[history_index]
|
||||||
|
}
|
||||||
|
case 66: // DOWN
|
||||||
|
if history_index < len(env.History)-1 {
|
||||||
|
history_index++
|
||||||
|
input = env.History[history_index]
|
||||||
|
} else {
|
||||||
|
input = ""
|
||||||
|
}
|
||||||
|
case 67: // LEFT
|
||||||
|
case 68: // RIGHT
|
||||||
|
case 127: //packspace
|
||||||
|
if len(input) > 0 {
|
||||||
|
input = input[:len(input)-1]
|
||||||
|
}
|
||||||
|
case 13: // Enter
|
||||||
|
goto loop_exit
|
||||||
|
default:
|
||||||
|
input = input + string(r_rune)
|
||||||
|
}
|
||||||
|
env.History[len(env.History)-1] = input
|
||||||
|
fmt.Print("\r\033[K")
|
||||||
|
fmt.Print(env.Path)
|
||||||
|
fmt.Print(" > ")
|
||||||
|
fmt.Print(input)
|
||||||
|
}
|
||||||
|
loop_exit:
|
||||||
|
term.Restore(int(std_fd), term_restore)
|
||||||
|
fmt.Println()
|
||||||
return input
|
return input
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package input_parser
|
package input_parser
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bbash/environment"
|
||||||
"fmt"
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
@ -11,3 +12,9 @@ func TestParse(t *testing.T) {
|
|||||||
fmt.Println(test.Args)
|
fmt.Println(test.Args)
|
||||||
fmt.Println(test.Flags)
|
fmt.Println(test.Flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestInput(t *testing.T) {
|
||||||
|
|
||||||
|
input := input_str(&environment.Env{})
|
||||||
|
fmt.Println(input)
|
||||||
|
}
|
||||||
|
|||||||
6
main.go
6
main.go
@ -13,8 +13,10 @@ func main() {
|
|||||||
command.Init(&env)
|
command.Init(&env)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
fmt.Print(fmt.Sprintf("%s > ", env.Path))
|
in_parsed := input_parser.Parse(&env)
|
||||||
in_parsed := input_parser.Parse()
|
if in_parsed.Instruction == "exit" {
|
||||||
|
break
|
||||||
|
}
|
||||||
command.Run_command(in_parsed, &env)
|
command.Run_command(in_parsed, &env)
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user