diff options
author | Mathias Magnusson <mathias@magnusson.space> | 2025-04-10 21:33:41 +0200 |
---|---|---|
committer | Mathias Magnusson <mathias@magnusson.space> | 2025-04-10 21:33:41 +0200 |
commit | 49bd3e0e0117768138f47f0c97accece15605025 (patch) | |
tree | 531306398969bf38fbaff946e5d67d122fa49c6b /cmd/generate/main.go | |
parent | b9bf8a23c75db82e1aff8295a97dcfdf789735f3 (diff) | |
download | hh-49bd3e0e0117768138f47f0c97accece15605025.tar.gz |
extract value extracting and convertion to functions; support uuid
Diffstat (limited to 'cmd/generate/main.go')
-rw-r--r-- | cmd/generate/main.go | 58 |
1 files changed, 51 insertions, 7 deletions
diff --git a/cmd/generate/main.go b/cmd/generate/main.go index 06cf8fd..2135320 100644 --- a/cmd/generate/main.go +++ b/cmd/generate/main.go @@ -8,8 +8,10 @@ import ( "go/format" "go/parser" "go/token" + "math" "os" "reflect" + "slices" "strings" "text/template" ) @@ -29,6 +31,7 @@ func slice(fileContents string, fset *token.FileSet, start token.Pos, end token. type Package struct { PackageName string + Imports []string Functions []Function } @@ -56,6 +59,12 @@ func run() error { "error": func(msg string) struct{} { panic("error in template: " + msg) }, + "extractorName": func(s string) string { + return "hh.ExtractFrom" + strings.ToUpper(s[:1]) + s[1:] + }, + "converterName": func(s string) string { + return "hh.ConvertTo" + strings.ToUpper(s[:1]) + strings.ReplaceAll(s[1:], ".", "") + }, }).Parse(fileTemplateString) if err != nil { return err @@ -66,31 +75,42 @@ func run() error { return err } - parsedPackage := Package{} + parsedPackage := Package{ + Imports: []string{ + "codeberg.org/foodelevator/hh", + "log/slog", + "net/http", + "github.com/google/uuid", + }, + } for _, ent := range dirEntries { if !strings.HasSuffix(ent.Name(), ".go") { continue } + if ent.Name() == "hh.gen.go" { + continue + } + fileBytes, err := os.ReadFile(ent.Name()) if err != nil { return err } fileContents := string(fileBytes) var fset token.FileSet - f, err := parser.ParseFile(&fset, ent.Name(), fileBytes, parser.ParseComments|parser.SkipObjectResolution) + file, err := parser.ParseFile(&fset, ent.Name(), fileBytes, parser.ParseComments|parser.SkipObjectResolution) if err != nil { return err } - if strings.HasSuffix(f.Name.String(), "_test") { + if strings.HasSuffix(file.Name.String(), "_test") { continue } - if parsedPackage.PackageName != "" && parsedPackage.PackageName != f.Name.String() { - return errors.New("Found two different package names in directory: " + parsedPackage.PackageName + " and " + f.Name.String()) + if parsedPackage.PackageName != "" && parsedPackage.PackageName != file.Name.String() { + return errors.New("Found two different package names in directory: " + parsedPackage.PackageName + " and " + file.Name.String()) } - parsedPackage.PackageName = f.Name.String() + parsedPackage.PackageName = file.Name.String() - for _, decl := range f.Decls { + for _, decl := range file.Decls { f, ok := decl.(*ast.FuncDecl) if !ok { continue @@ -121,6 +141,30 @@ func run() error { Optional: false, TypeDef: slice(fileContents, &fset, typ.Pos(), typ.End()), } + if selector, ok := typ.(*ast.SelectorExpr); ok { + sel := slice(fileContents, &fset, selector.X.Pos(), selector.X.End()) + least := math.MaxInt + var winner string + for _, imp := range file.Imports { + path := imp.Path.Value[1 : len(imp.Path.Value)-1] + idx := strings.LastIndex(path, sel) + if idx == -1 { + continue + } + ridx := len(path) - idx + if ridx < least { + least = ridx + winner = path + } + } + if winner == "" { + panic("Counld not find import for " + parsedField.TypeDef) + } + parsedPackage.Imports = append( + slices.DeleteFunc(parsedPackage.Imports, func(i string) bool { return i == winner }), + winner, + ) + } if parsedField.TypeDef == "*http.Request" { parsedFunction.RequestTypeFields = append(parsedFunction.RequestTypeFields, parsedField) continue |