github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/config/dynamic.go (about) 1 package cmdconfig 2 3 import ( 4 "errors" 5 6 "github.com/lmorg/murex/debug" 7 "github.com/lmorg/murex/lang" 8 "github.com/lmorg/murex/lang/ref" 9 "github.com/lmorg/murex/lang/types" 10 "github.com/lmorg/murex/utils" 11 ) 12 13 func getDynamic(block []rune, args []string, fileRef *ref.File) func() (interface{}, error) { 14 return func() (interface{}, error) { 15 block = block[1 : len(block)-1] 16 17 fork := lang.ShellProcess.Fork(lang.F_FUNCTION | lang.F_NEW_MODULE | lang.F_NO_STDIN | lang.F_CREATE_STDOUT) 18 fork.Name.Set("config") 19 fork.Parameters.DefineParsed(args) 20 fork.FileRef = fileRef 21 exitNum, err := fork.Execute(block) 22 23 if err != nil { 24 return nil, errors.New("Dynamic config code could not compile: " + err.Error()) 25 } 26 if exitNum != 0 && debug.Enabled { 27 lang.ShellProcess.Stderr.Writeln([]byte("Dynamic config returned a none zero exit number." + utils.NewLineString)) 28 } 29 30 b, err := fork.Stdout.ReadAll() 31 if err != nil { 32 return nil, err 33 } 34 35 return string(b), nil 36 } 37 } 38 39 func setDynamic(block []rune, args []string, fileRef *ref.File, dataType string) func(interface{}) error { 40 return func(value interface{}) error { 41 //if !types.IsBlock([]byte(stringblock)) { 42 // return nil, errors.New("Dynamic config reader is not a code block") 43 //} 44 block = block[1 : len(block)-1] 45 fork := lang.ShellProcess.Fork(lang.F_FUNCTION | lang.F_NEW_MODULE | lang.F_CREATE_STDIN) 46 fork.Name.Set("config") 47 fork.Parameters.DefineParsed(args) 48 fork.FileRef = fileRef 49 s, err := types.ConvertGoType(value, types.String) 50 if err != nil { 51 return err 52 } 53 54 fork.Stdin.SetDataType(dataType) 55 _, err = fork.Stdin.Write([]byte(s.(string))) 56 if err != nil { 57 return err 58 } 59 60 exitNum, err := fork.Execute(block) 61 62 if err != nil { 63 return errors.New("Dynamic config code could not compile: " + err.Error()) 64 } 65 if exitNum != 0 && debug.Enabled { 66 lang.ShellProcess.Stderr.Writeln([]byte("Dynamic config returned a none zero exit number." + utils.NewLineString)) 67 } 68 69 return nil 70 } 71 }