Skip to content
This repository has been archived by the owner on Dec 13, 2021. It is now read-only.

Commit

Permalink
Merge pull request #101 from go-generalize/tsuzu/innner-struct
Browse files Browse the repository at this point in the history
struct in structの対応
  • Loading branch information
54m committed Nov 8, 2021
2 parents efd0dac + 8f5d825 commit b87293e
Show file tree
Hide file tree
Showing 9 changed files with 433 additions and 27 deletions.
5 changes: 5 additions & 0 deletions examples/task.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ import "time"

//go:generate firestore-repo -disable-meta Task

type Inner struct {
A string `firestore:"a"`
}

// Task - with automatic id generation
type Task struct {
ID string `firestore:"-" firestore_key:"auto"`
Expand All @@ -18,4 +22,5 @@ type Task struct {
Proportion float64 `firestore:"proportion" indexer:"e"`
Flag map[string]float64 `firestore:"flag"`
Indexes map[string]bool `firestore:"indexes"`
Inner Inner `firestore:"inner"`
}
29 changes: 29 additions & 0 deletions examples/task_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions examples/task_label_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

108 changes: 104 additions & 4 deletions generator.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package main

import (
"bytes"
"embed"
"fmt"
"go/format"
"io"
"log"
"strings"
Expand Down Expand Up @@ -124,15 +126,15 @@ func (g *generator) generate(writer io.Writer) {
g.setting()
funcMap := g.setFuncMap()

buf, err := generateCodeTemplate.ReadFile("templates/gen.go.tmpl")
tmpl, err := generateCodeTemplate.ReadFile("templates/gen.go.tmpl")
if err != nil {
log.Fatalf("error in fs.ReadFile method: %+v", err)
}

t := template.Must(
template.New("Template").
Funcs(funcMap).
Parse(string(buf)),
Parse(string(tmpl)),
)

/* TODO(54m): use when `go1.16` is modified
Expand All @@ -145,8 +147,22 @@ func (g *generator) generate(writer io.Writer) {
),
)*/

if err := t.Execute(writer, g); err != nil {
buf := bytes.Buffer{}
if err := t.Execute(&buf, g); err != nil {
log.Printf("failed to execute template: %+v", err)
return
}

b, err := format.Source(buf.Bytes())

if err != nil {
log.Printf("failed to format source code: %+v", err)
return
}

if _, err := writer.Write(b); err != nil {
log.Printf("failed to write into the writer: %+v", err)
return
}
}

Expand All @@ -158,8 +174,22 @@ func (g *generator) generateByFileName(writer io.Writer, fileName string) {
),
)

if err := t.Execute(writer, g); err != nil {
buf := bytes.Buffer{}
if err := t.Execute(&buf, g); err != nil {
log.Printf("failed to execute template: %+v", err)
return
}

b, err := format.Source(buf.Bytes())

if err != nil {
log.Printf("failed to format source code: %+v", err)
return
}

if _, err := writer.Write(b); err != nil {
log.Printf("failed to write into the writer: %+v", err)
return
}
}

Expand Down Expand Up @@ -234,6 +264,76 @@ func (g *generator) setFuncMap() template.FuncMap {
)
return raw
},
"GenerateUpdateParam": func(fis []*FieldInfo, metaName string) string {
buf := bytes.Buffer{}

layers := make([]string, 0)
for _, f := range fis {
if f.IsUnique || metaName == f.Field {
continue
}

split := strings.Split(f.Field, ".")

common := 0
for common < len(split)-1 &&
common < len(layers) &&
split[common] == layers[common] {
common++
}

for i := len(layers) - 1; i >= common; i-- {
buf.WriteString("}\n")
}
for i := common; i < len(split)-1; i++ {
buf.WriteString(fmt.Sprintf("%s struct {\n", split[i]))
}
layers = split[:len(split)-1]

buf.WriteString(fmt.Sprintf("%s interface{}\n", split[len(split)-1]))
}

for i := len(layers) - 1; i >= 0; i-- {
buf.WriteString("}\n")
}

return buf.String()
},
"GenerateSearchParam": func(fis []*FieldInfo, metaName string) string {
buf := bytes.Buffer{}

layers := make([]string, 0)
for _, f := range fis {
if metaName == f.Field {
continue
}

split := strings.Split(f.Field, ".")

common := 0
for common < len(split)-1 &&
common < len(layers) &&
split[common] == layers[common] {
common++
}

for i := len(layers) - 1; i >= common; i-- {
buf.WriteString("}\n")
}
for i := common; i < len(split)-1; i++ {
buf.WriteString(fmt.Sprintf("%s struct {\n", split[i]))
}
layers = split[:len(split)-1]

buf.WriteString(fmt.Sprintf("%s *QueryChainer\n", split[len(split)-1]))
}

for i := len(layers) - 1; i >= 0; i-- {
buf.WriteString("}\n")
}

return buf.String()
},
"GetWithDocFunc": func() string {
raw := fmt.Sprintf(
"GetWithDoc(ctx context.Context, doc *firestore.DocumentRef, opts ...GetOption) (*%s, error)",
Expand Down
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ go 1.16
require (
cloud.google.com/go/firestore v1.4.0
github.com/fatih/structtag v1.2.0
github.com/go-generalize/go2ts v1.3.0 // indirect
github.com/go-utils/cont v0.1.2
github.com/go-utils/dedupe v0.2.1
github.com/go-utils/gopackages v0.0.0-20210218102646-e7d1f0008968
github.com/go-utils/plural v0.0.1
github.com/go-utils/xim v0.1.2
github.com/golang/mock v1.4.4
github.com/google/go-cmp v0.5.4
github.com/iancoleman/strcase v0.0.0-20191112232945-16388991a334
github.com/iancoleman/strcase v0.1.2
go.opencensus.io v0.22.6 // indirect
golang.org/x/oauth2 v0.0.0-20210201163806-010130855d6c // indirect
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1
Expand Down
12 changes: 9 additions & 3 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,12 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
github.com/go-generalize/go2ts v1.1.0 h1:S/wrT7LSM/BXto4BLc5xcJku2xeOLhSpahhooueztsQ=
github.com/go-generalize/go2ts v1.1.0/go.mod h1:075q+zcpc6IjwYy9WpJpY+M9ssbEA6uccjzWwr59t3M=
github.com/go-generalize/go2ts v1.2.0 h1:NUGvhEgdnSC6dRwl/S3iBfv1EKMAfV6Tlm7qs2XKN00=
github.com/go-generalize/go2ts v1.2.0/go.mod h1:075q+zcpc6IjwYy9WpJpY+M9ssbEA6uccjzWwr59t3M=
github.com/go-generalize/go2ts v1.3.0 h1:aXrhH7I/GUyl8YR0BtnOqb9j5CkhudUFzAqsYHhJfpY=
github.com/go-generalize/go2ts v1.3.0/go.mod h1:075q+zcpc6IjwYy9WpJpY+M9ssbEA6uccjzWwr59t3M=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
Expand All @@ -80,7 +86,6 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
Expand Down Expand Up @@ -129,8 +134,8 @@ github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/iancoleman/strcase v0.0.0-20191112232945-16388991a334 h1:VHgatEHNcBFEB7inlalqfNqw65aNkM1lGX2yt3NmbS8=
github.com/iancoleman/strcase v0.0.0-20191112232945-16388991a334/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE=
github.com/iancoleman/strcase v0.1.2 h1:gnomlvw9tnV3ITTAxzKSgTF+8kFWcU/f+TgttpXGz1U=
github.com/iancoleman/strcase v0.1.2/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
Expand Down Expand Up @@ -335,6 +340,7 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201202200335-bef1c476418a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
Expand Down
Loading

0 comments on commit b87293e

Please sign in to comment.