github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/management/shell.go (about) 1 package management 2 3 import ( 4 "errors" 5 "fmt" 6 7 "github.com/lmorg/murex/lang" 8 "github.com/lmorg/murex/lang/parameters" 9 "github.com/lmorg/murex/lang/types" 10 "github.com/lmorg/murex/shell/hintsummary" 11 "github.com/lmorg/murex/utils/json" 12 "github.com/lmorg/murex/utils/man" 13 "github.com/lmorg/murex/utils/parser" 14 ) 15 16 func init() { 17 lang.DefineFunction("args", cmdArgs, types.Null) 18 lang.DefineMethod("murex-parser", cmdParser, types.String, types.Json) 19 lang.DefineFunction("summary", cmdSummary, types.Null) 20 lang.DefineFunction("!summary", cmdBangSummary, types.Null) 21 lang.DefineMethod("man-get-flags", cmdManParser, types.Text, types.Json) 22 } 23 24 func cmdArgs(p *lang.Process) (err error) { 25 p.Stdout.SetDataType(types.Null) 26 27 if p.Parameters.Len() != 2 { 28 return errors.New("invalid parameters. Usage: args var_name { json }") 29 } 30 31 varName, _ := p.Parameters.String(0) 32 33 var args parameters.Arguments 34 b, _ := p.Parameters.Byte(1) 35 err = json.UnmarshalMurex(b, &args) 36 if err != nil { 37 return err 38 } 39 40 type flags struct { 41 Self string 42 Flags map[string]string 43 Additional []string 44 Error string 45 } 46 var jObj flags 47 48 params := p.Scope.Parameters.StringArray() 49 if p.Scope.Id == 0 && len(params) > 0 { 50 jObj.Self = params[0] 51 if len(params) == 1 { 52 params = []string{} 53 } else { 54 params = params[1:] 55 } 56 } else { 57 jObj.Self = p.Scope.Name.String() 58 } 59 60 jObj.Flags, jObj.Additional, err = parameters.ParseFlags(params, &args) 61 if err != nil { 62 jObj.Error = err.Error() 63 p.ExitNum = 1 64 } 65 66 b, err = json.Marshal(jObj, false) 67 if err != nil { 68 return err 69 } 70 71 //return p.Scope.Variables.Set(varName, b, types.Json) 72 return p.Variables.Set(p, varName, b, types.Json) 73 } 74 75 func cmdParser(p *lang.Process) error { 76 p.Stdout.SetDataType(types.Json) 77 78 var ( 79 block []rune 80 pos int 81 //syntaxHighlight bool 82 ) 83 84 if p.IsMethod { 85 b, err := p.Stdin.ReadAll() 86 if err != nil { 87 return err 88 } 89 block = []rune(string(b)) 90 91 //syntaxHighlight, _ = p.Parameters.Bool(0) 92 93 } else { 94 r, err := p.Parameters.Block(0) 95 if err != nil { 96 return err 97 } 98 block = r 99 pos, _ = p.Parameters.Int(1) 100 } 101 102 pt, _ /*ansiHighlighted*/ := parser.Parse(block, pos) 103 104 /*if syntaxHighlight { 105 _, err := p.Stdout.Write([]byte(ansiHighlighted)) 106 return err 107 }*/ 108 109 b, err := json.Marshal(pt, p.Stdout.IsTTY()) 110 if err != nil { 111 return err 112 } 113 114 //_, err = p.Stdout.Write(b) 115 116 /*// start new parser 117 nodes, _ := lang.ParseBlock(block) 118 b, err = json.Marshal(nodes, p.Stdout.IsTTY()) 119 if err != nil { 120 return err 121 } 122 // end new parser*/ 123 124 _, err = p.Stdout.Write(b) 125 126 return err 127 } 128 129 func cmdSummary(p *lang.Process) error { 130 p.Stdout.SetDataType(types.Null) 131 132 exe, err := p.Parameters.String(0) 133 if err != nil { 134 return err 135 } 136 137 summary, err := p.Parameters.String(1) 138 if err != nil { 139 return err 140 } 141 142 hintsummary.Summary.Set(exe, summary) 143 144 return nil 145 } 146 147 func cmdBangSummary(p *lang.Process) error { 148 p.Stdout.SetDataType(types.Null) 149 150 exe, err := p.Parameters.String(0) 151 if err != nil { 152 return err 153 } 154 155 return hintsummary.Summary.Delete(exe) 156 } 157 158 const manArgDescriptions = "--descriptions" 159 160 var manArgs = ¶meters.Arguments{ 161 AllowAdditional: true, 162 Flags: map[string]string{ 163 manArgDescriptions: types.Boolean, 164 "-d": manArgDescriptions, 165 }, 166 } 167 168 func cmdManParser(p *lang.Process) error { 169 p.Stdout.SetDataType(types.Json) 170 171 var ( 172 flags []string 173 descriptions = map[string]string{} 174 ) 175 176 cmdFlags, additional, err := p.Parameters.ParseFlags(manArgs) 177 if err != nil { 178 return err 179 } 180 181 if p.IsMethod { 182 flags, descriptions = man.ParseByStdio(p.Stdin) 183 184 } else { 185 if len(additional) != 1 { 186 return fmt.Errorf("invalid parameters") 187 } 188 exe := additional[0] 189 190 paths := man.GetManPages(exe) 191 flags, descriptions = man.ParseByPaths(exe, paths) 192 } 193 194 var b []byte 195 if cmdFlags[manArgDescriptions] == types.TrueString { 196 b, err = json.Marshal(descriptions, p.Stdout.IsTTY()) 197 } else { 198 b, err = json.Marshal(flags, p.Stdout.IsTTY()) 199 } 200 if err != nil { 201 return err 202 } 203 204 _, err = p.Stdout.Write(b) 205 return err 206 }