feat: getting struct fields

This commit is contained in:
2025-02-11 18:51:25 +07:00
commit 653c667e57
9 changed files with 139 additions and 0 deletions

15
utils/contains_many.go Normal file
View File

@@ -0,0 +1,15 @@
package utils
import "strings"
func ContainsMany(str string, substrs... string) bool {
count := 0
for _, substr := range substrs {
if strings.Contains(str, substr) {
count++;
} else {
return false;
}
}
return count == len(substrs)
}

View File

@@ -0,0 +1,39 @@
package utils
import (
"bufio"
"nto_cli/types"
"os"
"strings"
)
func GetStructFields(file *os.File, structName string) []types.Field {
bracketsCount := 1
structFound := false
structFields := []types.Field{}
scanner := bufio.NewScanner(file)
for i := 1; scanner.Scan() && bracketsCount > 0; i++ {
line := scanner.Text()
if ContainsMany(line, structName, "type", "struct") {
structFound = true
}
if structFound {
bracketsCount += strings.Count(line, "{")
bracketsCount -= strings.Count(line, "}")
line = strings.TrimSpace(line)
newField := SplitStructField(line)
if newField != nil {
structFields = append(structFields, *newField)
}
}
}
if err := scanner.Err(); err != nil {
panic(err)
}
return structFields
}

View File

@@ -0,0 +1,38 @@
package utils
import (
"nto_cli/types"
"strings"
)
func SplitStructField(field string) *types.Field {
if strings.Contains(field, "type") {
return nil
}
startBacktip := strings.Index(field, "`")
var metadata []string
if startBacktip > -1 {
metadata = []string{field[startBacktip:]}
} else {
startBacktip = len(field)
}
field = strings.TrimSpace(field[:startBacktip])
data := strings.Split(field, " ")
if len(data) < 2 {
return nil
}
name := strings.TrimSpace(data[0])
dataType := strings.TrimSpace(data[1])
return &types.Field{
Medatada: metadata,
Type: dataType,
Name: name,
}
}