Add command
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,3 +1,2 @@
 | 
				
			|||||||
scpt
 | 
					scpt
 | 
				
			||||||
cmd/scpt/scpt
 | 
					 | 
				
			||||||
.idea/
 | 
					.idea/
 | 
				
			||||||
							
								
								
									
										25
									
								
								ast.go
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								ast.go
									
									
									
									
									
								
							@@ -1,9 +1,34 @@
 | 
				
			|||||||
package scpt
 | 
					package scpt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"reflect"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type AST struct {
 | 
					type AST struct {
 | 
				
			||||||
	Commands []*Command `@@*`
 | 
						Commands []*Command `@@*`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (ast *AST) Execute() {
 | 
				
			||||||
 | 
						for _, cmd := range ast.Commands {
 | 
				
			||||||
 | 
							if cmd.Vars != nil {
 | 
				
			||||||
 | 
								for _, Var := range cmd.Vars {
 | 
				
			||||||
 | 
									val := ParseValue(Var.Value)
 | 
				
			||||||
 | 
									if strings.Contains(reflect.TypeOf(val).String(), ".FuncCall") {
 | 
				
			||||||
 | 
										Call := val.(*FuncCall)
 | 
				
			||||||
 | 
										Vars[Var.Key], _ = CallFunction(Call)
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										Vars[Var.Key] = val
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else if cmd.Calls != nil {
 | 
				
			||||||
 | 
								for _, Call := range cmd.Calls {
 | 
				
			||||||
 | 
									_, _ = CallFunction(Call)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Command struct {
 | 
					type Command struct {
 | 
				
			||||||
	Vars  []*Var      `( @@`
 | 
						Vars  []*Var      `( @@`
 | 
				
			||||||
	Calls []*FuncCall `| @@ )`
 | 
						Calls []*FuncCall `| @@ )`
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								scpt.go
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								scpt.go
									
									
									
									
									
								
							@@ -8,7 +8,6 @@ import (
 | 
				
			|||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"os/exec"
 | 
						"os/exec"
 | 
				
			||||||
	"reflect"
 | 
					 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -39,33 +38,13 @@ func Parse(r io.Reader) (*AST, error) {
 | 
				
			|||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ast := &AST{}
 | 
						ast := &AST{}
 | 
				
			||||||
	err = parser.Parse("", r, ast)
 | 
						err = parser.Parse(r, ast)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return ast, nil
 | 
						return ast, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Execute(ast AST) {
 | 
					 | 
				
			||||||
	for _, cmd := range ast.Commands {
 | 
					 | 
				
			||||||
		if cmd.Vars != nil {
 | 
					 | 
				
			||||||
			for _, Var := range cmd.Vars {
 | 
					 | 
				
			||||||
				val := ParseValue(Var.Value)
 | 
					 | 
				
			||||||
				if strings.Contains(reflect.TypeOf(val).String(), ".FuncCall") {
 | 
					 | 
				
			||||||
					Call := val.(*FuncCall)
 | 
					 | 
				
			||||||
					Vars[Var.Key], _ = CallFunction(Call)
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					Vars[Var.Key] = val
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else if cmd.Calls != nil {
 | 
					 | 
				
			||||||
			for _, Call := range cmd.Calls {
 | 
					 | 
				
			||||||
				_, _ = CallFunction(Call)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func ParseValue(val *Value) interface{} {
 | 
					func ParseValue(val *Value) interface{} {
 | 
				
			||||||
	if val.String != nil {
 | 
						if val.String != nil {
 | 
				
			||||||
		return strings.Trim(*val.String, `"`)
 | 
							return strings.Trim(*val.String, `"`)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user