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 }