github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/config/define.go (about)

     1  package cmdconfig
     2  
     3  import (
     4  	"errors"
     5  
     6  	"github.com/lmorg/murex/config"
     7  	"github.com/lmorg/murex/lang"
     8  	"github.com/lmorg/murex/lang/types"
     9  	"github.com/lmorg/murex/utils/json"
    10  )
    11  
    12  func defineConfig(p *lang.Process) error {
    13  	p.Stdout.SetDataType(types.Null)
    14  	app, err := p.Parameters.String(1)
    15  	if err != nil {
    16  		return err
    17  	}
    18  
    19  	key, err := p.Parameters.String(2)
    20  	if err != nil {
    21  		return err
    22  	}
    23  
    24  	var b []byte
    25  
    26  	if p.IsMethod {
    27  		b, err = p.Stdin.ReadAll()
    28  		if err != nil {
    29  			return err
    30  		}
    31  
    32  	} else {
    33  		b, err = p.Parameters.Byte(3)
    34  		if err != nil {
    35  			return err
    36  		}
    37  	}
    38  
    39  	var properties config.Properties
    40  	err = json.UnmarshalMurex(b, &properties)
    41  	if err != nil {
    42  		return err
    43  	}
    44  
    45  	properties.FileRefDef = p.FileRef
    46  
    47  	switch {
    48  	case properties.DataType == "":
    49  		return errors.New("`DataType` not defined")
    50  
    51  	case properties.Description == "":
    52  		return errors.New("`Description` not defined")
    53  
    54  	case properties.Default == nil:
    55  		return errors.New("`Default` not defined on non-dynamic config")
    56  
    57  	case (properties.Dynamic.Read == "" && properties.Dynamic.Write != "") ||
    58  		(properties.Dynamic.Read != "" && properties.Dynamic.Write == ""):
    59  		return errors.New("when using dynamic values, both the `read` and `write` need to contain code blocks")
    60  
    61  	case properties.Dynamic.Read != "" && !types.IsBlock([]byte(properties.Dynamic.Read)):
    62  		return errors.New("dynamic `Read` is not a valid code block")
    63  
    64  	case properties.Dynamic.Write != "" && !types.IsBlock([]byte(properties.Dynamic.Write)):
    65  		return errors.New("dynamic `Write` is not a valid code block")
    66  
    67  	case properties.Dynamic.Read != "" && !properties.Global:
    68  		return errors.New("`Global` must be `true` when dynamic values are defined")
    69  	}
    70  
    71  	if properties.Dynamic.Read != "" {
    72  		properties.Dynamic.GetDynamic = getDynamic(
    73  			[]rune(properties.Dynamic.Read), p.Parameters.StringArray(), p.FileRef)
    74  		properties.Dynamic.SetDynamic = setDynamic(
    75  			[]rune(properties.Dynamic.Write), p.Parameters.StringArray(), p.FileRef, properties.DataType)
    76  	}
    77  
    78  	lang.ShellProcess.Config.Define(app, key, properties)
    79  	// duplicate in case process has already forked from shell and we need to use config
    80  	p.Config.Define(app, key, properties)
    81  	return nil
    82  }