github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/datatools/structkeys.go (about) 1 package datatools 2 3 import ( 4 "strconv" 5 6 "github.com/lmorg/murex/lang" 7 "github.com/lmorg/murex/lang/parameters" 8 "github.com/lmorg/murex/lang/types" 9 "github.com/lmorg/murex/utils/objectkeys" 10 ) 11 12 func init() { 13 lang.DefineMethod("struct-keys", cmdStructKeys, types.Unmarshal, types.Json) 14 } 15 16 func cmdStructKeys(p *lang.Process) error { 17 if err := p.ErrIfNotAMethod(); err != nil { 18 return err 19 } 20 21 flags, additional, err := p.Parameters.ParseFlags(¶meters.Arguments{ 22 AllowAdditional: true, 23 Flags: map[string]string{ 24 "--depth": "int", 25 "-d": "--depth", 26 "--separator": "str", 27 "-s": "--separator", 28 }, 29 }) 30 31 if err != nil { 32 return err 33 } 34 35 separator := flags["--separator"] 36 if separator == "" { 37 separator = "/" 38 } 39 40 depth := flags["--depth"] 41 if depth == "" && len(additional) == 1 { 42 depth = additional[0] 43 } 44 45 nDeep, _ := strconv.Atoi(depth) 46 if nDeep < 1 { 47 nDeep = -1 48 } 49 50 v, err := lang.UnmarshalData(p, p.Stdin.GetDataType()) 51 if err != nil { 52 return err 53 } 54 55 p.Stdout.SetDataType(types.Json) 56 57 aw, err := p.Stdout.WriteArray(types.Json) 58 if err != nil { 59 return err 60 } 61 62 err = objectkeys.Recursive(p.Context, "", v, separator, aw.WriteString, nDeep) 63 if err != nil { 64 return err 65 } 66 return aw.Close() 67 }