Skip to content

Commit 98847d7

Browse files
authored
Merge pull request #5 from networkteam/package_check
added check if identical package
2 parents 2955549 + 131cec7 commit 98847d7

6 files changed

Lines changed: 175 additions & 31 deletions

File tree

cli.go

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,21 +72,23 @@ func NewCliApp() *cli.App {
7272
if err := os.WriteFile(outputFilename, buf.Bytes(), 0644); err != nil {
7373
return fmt.Errorf("writing output file: %w", err)
7474
}
75-
} else {
76-
mappings, err := internal.DiscoverStructMappings(mappingTypePackage)
75+
76+
return nil
77+
}
78+
79+
mappings, err := internal.DiscoverStructMappings(mappingTypePackage)
80+
if err != nil {
81+
return fmt.Errorf("discovering struct mappings: %w", err)
82+
}
83+
84+
for _, m := range mappings {
85+
var buf bytes.Buffer
86+
outputFilename, err := internal.Generate(m, goPackage, goFile, &buf)
7787
if err != nil {
78-
return fmt.Errorf("discovering struct mappings: %w", err)
88+
return fmt.Errorf("generating code: %w", err)
7989
}
80-
81-
for _, m := range mappings {
82-
var buf bytes.Buffer
83-
outputFilename, err := internal.Generate(m, goPackage, goFile, &buf)
84-
if err != nil {
85-
return fmt.Errorf("generating code: %w", err)
86-
}
87-
if err := os.WriteFile(outputFilename, buf.Bytes(), 0644); err != nil {
88-
return fmt.Errorf("writing output file: %w", err)
89-
}
90+
if err := os.WriteFile(outputFilename, buf.Bytes(), 0644); err != nil {
91+
return fmt.Errorf("writing output file: %w", err)
9092
}
9193
}
9294

example/pgx/model/mappings.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package model
2+
3+
//go:generate go run github.com/networkteam/construct/v2/cmd/construct github.com/networkteam/construct/v2/example/pgx/model

go.work.sum

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,28 @@
11
github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=
2+
github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
23
github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
34
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
45
github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
56
github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
67
github.com/creack/pty v1.1.9 h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w=
78
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
89
github.com/dave/astrid v0.0.0-20170323122508-8c2895878b14 h1:YI1gOOdmMk3xodBao7fehcvoZsEeOyy/cfhlpCSPgM4=
10+
github.com/dave/astrid v0.0.0-20170323122508-8c2895878b14/go.mod h1:Sth2QfxfATb/nW4EsrSi2KyJmbcniZ8TgTaji17D6ms=
911
github.com/dave/brenda v1.1.0 h1:Sl1LlwXnbw7xMhq3y2x11McFu43AjDcwkllxxgZ3EZw=
12+
github.com/dave/brenda v1.1.0/go.mod h1:4wCUr6gSlu5/1Tk7akE5X7UorwiQ8Rij0SKH3/BGMOM=
1013
github.com/dave/courtney v0.3.0 h1:8aR1os2ImdIQf3Zj4oro+lD/L4Srb5VwGefqZ/jzz7U=
14+
github.com/dave/courtney v0.3.0/go.mod h1:BAv3hA06AYfNUjfjQr+5gc6vxeBVOupLqrColj+QSD8=
1115
github.com/dave/gopackages v0.0.0-20170318123100-46e7023ec56e h1:l99YKCdrK4Lvb/zTupt0GMPfNbncAGf8Cv/t1sYLOg0=
16+
github.com/dave/gopackages v0.0.0-20170318123100-46e7023ec56e/go.mod h1:i00+b/gKdIDIxuLDFob7ustLAVqhsZRk2qVZrArELGQ=
1217
github.com/dave/kerr v0.0.0-20170318121727-bc25dd6abe8e h1:xURkGi4RydhyaYR6PzcyHTueQudxY4LgxN1oYEPJHa0=
18+
github.com/dave/kerr v0.0.0-20170318121727-bc25dd6abe8e/go.mod h1:qZqlPyPvfsDJt+3wHJ1EvSXDuVjFTK0j2p/ca+gtsb8=
1319
github.com/dave/patsy v0.0.0-20210517141501-957256f50cba h1:1o36L4EKbZzazMk8iGC4kXpVnZ6TPxR2mZ9qVKjNNAs=
20+
github.com/dave/patsy v0.0.0-20210517141501-957256f50cba/go.mod h1:qfR88CgEGLoiqDaE+xxDCi5QA5v4vUoW0UCX2Nd5Tlc=
1421
github.com/dave/rebecca v0.9.1 h1:jxVfdOxRirbXL28vXMvUvJ1in3djwkVKXCq339qhBL0=
22+
github.com/dave/rebecca v0.9.1/go.mod h1:N6XYdMD/OKw3lkF3ywh8Z6wPGuwNFDNtWYEMFWEmXBA=
1523
github.com/jackc/puddle/v2 v2.2.0/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
1624
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
25+
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
1726
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
1827
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
1928
github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
@@ -54,3 +63,4 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
5463
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
5564
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
5665
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
66+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=

internal/fixtures/fixture_mytype_gen.go

Lines changed: 99 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/generate.go

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import (
1212

1313
// Generate Go code for the struct mapping
1414
func Generate(m *StructMapping, goPackage string, goFile string, w io.Writer) (outputFilename string, err error) {
15+
pkgName := m.MappingTypePackage[strings.LastIndex(m.MappingTypePackage, "/")+1:]
16+
1517
f := NewFile(goPackage)
1618

1719
f.PackageComment("Code generated by construct, DO NOT EDIT.")
@@ -22,7 +24,7 @@ func Generate(m *StructMapping, goPackage string, goFile string, w io.Writer) (o
2224

2325
// ChangeSet struct
2426

25-
changeSetName, err := generateChangeSetStruct(f, m)
27+
changeSetName, err := generateChangeSetStruct(f, m, goPackage)
2628
if err != nil {
2729
return "", fmt.Errorf("generating ChangeSet struct: %w", err)
2830
}
@@ -100,8 +102,12 @@ func Generate(m *StructMapping, goPackage string, goFile string, w io.Writer) (o
100102

101103
toChangeSetBlock = append(toChangeSetBlock, Return())
102104

105+
mtp := m.MappingTypePackage
106+
if goPackage == pkgName {
107+
mtp = ""
108+
}
103109
f.Func().Id(firstToUpper(m.TargetName) + "ToChangeSet").Params(
104-
Id("r").Qual(m.MappingTypePackage, m.MappingTypeName),
110+
Id("r").Qual(mtp, m.MappingTypeName),
105111
).Params(Id("c").Id(changeSetName)).Block(
106112
toChangeSetBlock...,
107113
).Line()
@@ -163,7 +169,7 @@ func generateDefaultSelectJsonObject(f *File, m *StructMapping) {
163169
f.Var().Id(varName).Op("=").Add(code).Line()
164170
}
165171

166-
func generateChangeSetStruct(f *File, m *StructMapping) (changeSetName string, err error) {
172+
func generateChangeSetStruct(f *File, m *StructMapping, pkgDest string) (changeSetName string, err error) {
167173
var structFields []Code
168174

169175
for _, fm := range m.FieldMappings {
@@ -174,8 +180,13 @@ func generateChangeSetStruct(f *File, m *StructMapping) (changeSetName string, e
174180
code.Op("*").Id(v.String())
175181
case *types.Named:
176182
typeName := v.Obj()
183+
pkgPath := typeName.Pkg().Path()
184+
pkgName := pkgPath[strings.LastIndex(pkgPath, "/")+1:]
185+
if pkgDest == pkgName {
186+
pkgPath = ""
187+
}
177188
code.Op("*").Qual(
178-
typeName.Pkg().Path(),
189+
pkgPath,
179190
typeName.Name(),
180191
)
181192
case *types.Pointer:
@@ -186,8 +197,13 @@ func generateChangeSetStruct(f *File, m *StructMapping) (changeSetName string, e
186197
code.Op("*").Id(v.String())
187198
case *types.Named:
188199
typeName := v.Obj()
200+
pkgPath := typeName.Pkg().Path()
201+
pkgName := pkgPath[strings.LastIndex(pkgPath, "/")+1:]
202+
if pkgDest == pkgName {
203+
pkgPath = ""
204+
}
189205
code.Op("*").Qual(
190-
typeName.Pkg().Path(),
206+
pkgPath,
191207
typeName.Name(),
192208
)
193209
case *types.Slice:
@@ -203,8 +219,13 @@ func generateChangeSetStruct(f *File, m *StructMapping) (changeSetName string, e
203219
code.Id(v.String())
204220
case *types.Named:
205221
typeName := v.Obj()
222+
pkgPath := typeName.Pkg().Path()
223+
pkgName := pkgPath[strings.LastIndex(pkgPath, "/")+1:]
224+
if pkgDest == pkgName {
225+
pkgPath = ""
226+
}
206227
code.Qual(
207-
typeName.Pkg().Path(),
228+
pkgPath,
208229
typeName.Name(),
209230
)
210231
default:

internal/generate_test.go

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"testing"
77

88
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
910

1011
"github.com/networkteam/construct/v2/internal"
1112
)
@@ -15,21 +16,29 @@ func TestGenerate(t *testing.T) {
1516

1617
var buf bytes.Buffer
1718
outputFilename, err := internal.Generate(m, "repository", "mappings.go", &buf)
18-
if err != nil {
19-
t.Fatalf("error generating code: %v", err)
20-
}
19+
require.NoErrorf(t, err, "error generating code: %v")
2120

2221
const expectedOutputFilename = "mappings_mytype_gen.go"
23-
if outputFilename != expectedOutputFilename {
24-
t.Errorf("expected output filename to be %s, but got %s", expectedOutputFilename, outputFilename)
25-
}
22+
require.Equal(t, expectedOutputFilename, outputFilename, "expected output filename to be %s, but got %s", expectedOutputFilename, outputFilename)
2623

2724
fixtureOut, err := os.ReadFile("./fixtures/repository/" + expectedOutputFilename)
28-
if err != nil {
29-
t.Fatalf("error reading fixture file: %v", err)
30-
}
25+
require.NoError(t, err, "error reading fixture file: %v")
3126

32-
if buf.String() != string(fixtureOut) {
33-
assert.Equal(t, string(fixtureOut), buf.String())
34-
}
27+
assert.Equal(t, string(fixtureOut), buf.String())
28+
}
29+
30+
func TestGenerateSamePackage(t *testing.T) {
31+
m := myTypeStructMapping()
32+
33+
var buf bytes.Buffer
34+
outputFilename, err := internal.Generate(m, "fixtures", "fixture.go", &buf)
35+
require.NoErrorf(t, err, "error generating code: %v")
36+
37+
const expectedOutputFilename = "fixture_mytype_gen.go"
38+
require.Equal(t, expectedOutputFilename, outputFilename, "expected output filename to be %s, but got %s", expectedOutputFilename, outputFilename)
39+
40+
fixtureOut, err := os.ReadFile("./fixtures/" + expectedOutputFilename)
41+
require.NoError(t, err, "error reading fixture file: %v")
42+
43+
assert.Equal(t, string(fixtureOut), buf.String())
3544
}

0 commit comments

Comments
 (0)