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  }