github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/autocomplete/autocomplete.go (about) 1 package cmdautocomplete 2 3 import ( 4 "errors" 5 "sort" 6 7 "github.com/lmorg/murex/lang" 8 "github.com/lmorg/murex/lang/types" 9 "github.com/lmorg/murex/shell/autocomplete" 10 "github.com/lmorg/murex/utils/json" 11 ) 12 13 func init() { 14 lang.DefineFunction("autocomplete", cmdAutocomplete, types.Json) 15 } 16 17 func cmdAutocomplete(p *lang.Process) error { 18 mode, err := p.Parameters.String(0) 19 if err != nil { 20 p.Stdout.SetDataType(types.Null) 21 return err 22 } 23 24 switch mode { 25 case "get": 26 return get(p) 27 28 case "set": 29 return set(p) 30 31 //case "cache-dynamic": 32 // return cacheDynamic(p) 33 34 default: 35 p.Stdout.SetDataType(types.Null) 36 return errors.New("Not a valid mode. Please use `get` or `set`") 37 } 38 } 39 40 func get(p *lang.Process) error { 41 p.Stdout.SetDataType(types.Json) 42 43 var v interface{} 44 cmd, err := p.Parameters.String(1) 45 if err != nil { 46 v = autocomplete.ExesFlags 47 } else { 48 v = autocomplete.ExesFlags[cmd] 49 } 50 51 b, err := json.Marshal(v, p.Stdout.IsTTY()) 52 if err != nil { 53 return err 54 } 55 56 _, err = p.Stdout.Writeln(b) 57 return err 58 } 59 60 func set(p *lang.Process) error { 61 p.Stdout.SetDataType(types.Null) 62 63 exe, err := p.Parameters.String(1) 64 if err != nil { 65 return err 66 } 67 68 var jf []byte 69 70 if p.IsMethod { 71 72 jf, err = p.Stdin.ReadAll() 73 if err != nil { 74 return err 75 } 76 77 } else { 78 79 jfr, err := p.Parameters.Block(2) 80 if err == nil { 81 jf = []byte(string(jfr)) 82 } else { 83 jf, err = p.Parameters.Byte(2) 84 if err != nil { 85 return err 86 } 87 } 88 } 89 90 var flags []autocomplete.Flags 91 err = json.UnmarshalMurex(jf, &flags) 92 if err != nil { 93 return err 94 } 95 96 // So we don't have nil values in JSON 97 if flags[0].CacheTTL == 0 { 98 flags[0].CacheTTL = 5 99 } 100 for i := range flags { 101 if len(flags[i].Flags) == 0 { 102 flags[i].Flags = make([]string, 0) 103 } 104 105 sort.Strings(flags[i].Flags) 106 } 107 108 autocomplete.ExesFlags[exe] = flags 109 autocomplete.ExesFlagsFileRef[exe] = p.FileRef 110 return nil 111 }