github.com/informationsea/shellflow@v0.1.3/flowscript/flowscript.go (about)

     1  package flowscript
     2  
     3  func ParseScript(text string) (Evaluable, error) {
     4  	tokenizer := NewTokenizerFromText(text)
     5  	tokenizer.Scan()
     6  	return ParseAsExp(tokenizer)
     7  }
     8  
     9  func EvaluateScript(text string, env Environment) (Value, error) {
    10  	eval, err := ParseScript(text)
    11  	if err != nil {
    12  		return nil, err
    13  	}
    14  	return eval.Evaluate(env)
    15  }
    16  
    17  func SearchDependentVariables(evaluable Evaluable) StringSet {
    18  	variables := NewStringSet()
    19  
    20  	if ae, ok := evaluable.(*AssignExpression); ok {
    21  		evaluable = ae.exp
    22  	}
    23  
    24  	if ae, ok := evaluable.(*Variable); ok {
    25  		variables.Add(ae.Name)
    26  	} else {
    27  		for _, v := range evaluable.SubEvaluable() {
    28  			variables.AddAll(SearchDependentVariables(v))
    29  		}
    30  	}
    31  
    32  	return variables
    33  }
    34  
    35  func SearchCreatedVariables(evaluable Evaluable) StringSet {
    36  	variables := NewStringSet()
    37  
    38  	if ae, ok := evaluable.(*AssignExpression); ok {
    39  		if ve, ok := ae.variable.(*Variable); ok {
    40  			variables.Add(ve.Name)
    41  		}
    42  	} else {
    43  		for _, v := range evaluable.SubEvaluable() {
    44  			variables.AddAll(SearchCreatedVariables(v))
    45  		}
    46  	}
    47  
    48  	return variables
    49  }