1st
This commit is contained in:
parent
43423a7e8b
commit
1963ec9272
1 changed files with 136 additions and 0 deletions
136
interpreter.go
136
interpreter.go
|
|
@ -1 +1,137 @@
|
||||||
package interpreter
|
package interpreter
|
||||||
|
|
||||||
|
import (
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Interpreter struct {
|
||||||
|
RegexMap RegexMap
|
||||||
|
Funcs Funcs
|
||||||
|
// Env map[string]string
|
||||||
|
// Funcs map[string]func(args ...string) string
|
||||||
|
// Vars map[string]string
|
||||||
|
Statments Statments
|
||||||
|
LogicSplitters []string
|
||||||
|
}
|
||||||
|
type Funcs map[string]*Func
|
||||||
|
type Func struct {
|
||||||
|
Name string
|
||||||
|
Function Function
|
||||||
|
}
|
||||||
|
type Function func(args ...any) string
|
||||||
|
type Statments map[string]*Statment
|
||||||
|
type Statment struct {
|
||||||
|
Name string
|
||||||
|
Value string
|
||||||
|
RegexSplit []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type RegexMap map[string]*Regex
|
||||||
|
type Regex struct {
|
||||||
|
Name string
|
||||||
|
Value string
|
||||||
|
}
|
||||||
|
|
||||||
|
func New() *Interpreter {
|
||||||
|
i := &Interpreter{}
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
|
||||||
|
type InterpreterInterface interface {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *Interpreter) Regex(name string, regx string) *Regex {
|
||||||
|
i.RegexMap = make(RegexMap)
|
||||||
|
i.RegexMap[name] = &Regex{
|
||||||
|
Name: name,
|
||||||
|
Value: regx,
|
||||||
|
}
|
||||||
|
return i.RegexMap[name]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *Interpreter) AddStatment(name string, stmnt string) *Statment {
|
||||||
|
if _, ok := i.Statments[name]; !ok {
|
||||||
|
i.Statments = make(Statments)
|
||||||
|
}
|
||||||
|
i.Statments[name] = &Statment{
|
||||||
|
Value: stmnt,
|
||||||
|
Name: name,
|
||||||
|
}
|
||||||
|
return i.Statments[name]
|
||||||
|
}
|
||||||
|
func (fncs Funcs) GetFunc(funcName string) *Func {
|
||||||
|
fn := fncs[funcName]
|
||||||
|
return fn
|
||||||
|
}
|
||||||
|
func (i *Interpreter) Func(funcName string, fn func(args ...any) string) *Func {
|
||||||
|
if i.Funcs == nil {
|
||||||
|
i.Funcs = make(Funcs)
|
||||||
|
}
|
||||||
|
newFunc := &Func{
|
||||||
|
Name: funcName,
|
||||||
|
Function: fn,
|
||||||
|
}
|
||||||
|
i.Funcs[funcName] = newFunc
|
||||||
|
return i.Funcs[funcName]
|
||||||
|
}
|
||||||
|
func (i *Interpreter) GetRegex(name string) *Regex {
|
||||||
|
return i.RegexMap[name]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *Interpreter) CutPrefix(slc []string, prefix string) []string {
|
||||||
|
//TODO: get the slc from the struct... need to implement the setter before
|
||||||
|
for i, v := range slc {
|
||||||
|
clean, _ := strings.CutPrefix(v, prefix)
|
||||||
|
slc[i] = clean
|
||||||
|
}
|
||||||
|
|
||||||
|
return slc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Statment) SplitStatementByRegex(regx *Regex) *Statment {
|
||||||
|
|
||||||
|
input := s.Value
|
||||||
|
re := regexp.MustCompile(string(regx.Value))
|
||||||
|
matches := re.FindAllStringSubmatch(input, -1)
|
||||||
|
if len(matches) == 0 {
|
||||||
|
return s // Return original if no backticks found
|
||||||
|
}
|
||||||
|
|
||||||
|
result := []string{}
|
||||||
|
lastIndex := 0
|
||||||
|
|
||||||
|
for _, match := range matches {
|
||||||
|
|
||||||
|
startIndex := strings.Index(input, match[0])
|
||||||
|
|
||||||
|
if startIndex > lastIndex {
|
||||||
|
result = append(result, input[lastIndex:startIndex])
|
||||||
|
}
|
||||||
|
|
||||||
|
result = append(result, match[1]) // Append the content within backticks
|
||||||
|
lastIndex = startIndex + len(match[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
if lastIndex < len(input) {
|
||||||
|
result = append(result, input[lastIndex:])
|
||||||
|
}
|
||||||
|
s.RegexSplit = result
|
||||||
|
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
func (s Statments) ForEach(fn func(stmnt *Statment)) {
|
||||||
|
for _, stmntData := range s {
|
||||||
|
fn(stmntData)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// func (i *Interpreter) AddLogicSplitters(splitter ...string) {
|
||||||
|
// for _, s := range splitter {
|
||||||
|
// i.addLogicSplitter(s)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func (i *Interpreter) addLogicSplitter(splitter string) {
|
||||||
|
// i.LogicSplitters = append(i.LogicSplitters, splitter)
|
||||||
|
// }
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue