github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/docs/docs.go (about) 1 package docs 2 3 import ( 4 "fmt" 5 6 "github.com/lmorg/murex/lang" 7 "github.com/lmorg/murex/lang/types" 8 "github.com/lmorg/murex/utils/json" 9 ) 10 11 func init() { 12 lang.DefineFunction("murex-docs", cmdMurexDocs, types.String) 13 } 14 15 var ( 16 // Definition stores the definitions for builtins. 17 Definition DocsFuncT 18 19 // Summary stores a one line summary of each builtins. 20 // This will be auto-populated by docgen 21 Summary map[string]string 22 23 // Synonym is used for builtins that might have more than one internal alias. 24 // This will be auto-populated by docgen 25 Synonym map[string]string 26 ) 27 28 type DocsFuncT func(string) []byte 29 30 func cmdMurexDocs(p *lang.Process) error { 31 cmd, err := p.Parameters.String(0) 32 if err != nil { 33 return err 34 } 35 36 switch cmd { 37 case "--docs": 38 p.Stdout.SetDataType(types.Json) 39 b, err := json.Marshal(listDocs(), p.Stdout.IsTTY()) 40 if err != nil { 41 return err 42 } 43 _, err = p.Stdout.Write(b) 44 return err 45 46 case "--digest", "--summary": 47 p.Stdout.SetDataType(types.String) 48 cmd, err := p.Parameters.String(1) 49 if err != nil { 50 return err 51 } 52 53 syn := Synonym[cmd] 54 if Summary[syn] == "" { 55 return fmt.Errorf("no summary found for command `%s`", cmd) 56 } 57 58 _, err = p.Stdout.Write([]byte(Summary[syn])) 59 return err 60 61 default: 62 p.Stdout.SetDataType(types.String) 63 syn := Synonym[cmd] 64 if syn == "" { 65 syn = cmd 66 } 67 b := Definition(syn) 68 if len(b) == 0 { 69 return fmt.Errorf("no documentation found for `%s`", cmd) 70 } 71 72 _, err = p.Stdout.Writeln(b) 73 return err 74 } 75 } 76 77 func listDocs() map[string]string { 78 m := make(map[string]string) 79 for k, v := range Synonym { 80 m[k] = Summary[v] 81 } 82 return m 83 }