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(&parameters.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  }