Skip to content
This repository was archived by the owner on Jan 14, 2025. It is now read-only.

Commit 556b09d

Browse files
authored
BREAKING CHANGE: Add --go-orm-struct-package-import-path option and rename --go-orm-package-path option to --go-orm-output-path option (#47)
2 parents 98d50a6 + edbbf67 commit 556b09d

25 files changed

+154
-115
lines changed

internal/arcgen/lang/go/generate.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func generate(arcSrcSetSlice ARCSourceSetSlice) error {
6262
// closure for defer
6363
if err := func() error {
6464
filePathWithoutExt := strings.TrimSuffix(filepath.Base(arcSrcSet.Filename), fileExt)
65-
filename := filepath.Join(config.GoORMPackagePath(), filePathWithoutExt+crudFileExt)
65+
filename := filepath.Join(config.GoORMOutputPath(), filePathWithoutExt+crudFileExt)
6666
f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, rw_r__r__)
6767
if err != nil {
6868
return errorz.Errorf("os.OpenFile: %w", err)
@@ -84,7 +84,7 @@ func generate(arcSrcSetSlice ARCSourceSetSlice) error {
8484
}
8585

8686
if err := func() error {
87-
filename := filepath.Join(config.GoORMPackagePath(), "common"+crudFileExt)
87+
filename := filepath.Join(config.GoORMOutputPath(), "common"+crudFileExt)
8888
f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, rw_r__r__)
8989
if err != nil {
9090
return errorz.Errorf("os.OpenFile: %w", err)

internal/arcgen/lang/go/generate_orm.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,13 @@ func generateORMFileContent(buf buffer, arcSrcSet *ARCSourceSet) (string, error)
4444
Decls: []ast.Decl{},
4545
}
4646

47-
structPackagePath, err := util.GetPackagePath(filepath.Dir(arcSrcSet.Filename))
48-
if err != nil {
49-
return "", errorz.Errorf("GetPackagePath: %w", err)
47+
structPackageImportPath := config.GoORMStructPackageImportPath()
48+
if structPackageImportPath == "" {
49+
var err error
50+
structPackageImportPath, err = util.GetPackageImportPath(filepath.Dir(arcSrcSet.Filename))
51+
if err != nil {
52+
return "", errorz.Errorf("GetPackagePath: %w", err)
53+
}
5054
}
5155

5256
// import
@@ -68,7 +72,7 @@ func generateORMFileContent(buf buffer, arcSrcSet *ARCSourceSet) (string, error)
6872
},
6973
&ast.ImportSpec{
7074
Name: &ast.Ident{Name: importName},
71-
Path: &ast.BasicLit{Kind: token.STRING, Value: strconv.Quote(structPackagePath)},
75+
Path: &ast.BasicLit{Kind: token.STRING, Value: strconv.Quote(structPackageImportPath)},
7276
},
7377
},
7478
},

internal/arcgen/lang/go/generate_orm_common.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,13 @@ func generateORMCommonFileContent(buf buffer, arcSrcSetSlice ARCSourceSetSlice,
5252

5353
// Since all directories are the same from arcSrcSetSlice[0].Filename to arcSrcSetSlice[len(-1)].Filename,
5454
// get the package path from arcSrcSetSlice[0].Filename.
55-
dir := filepath.Dir(arcSrcSetSlice[0].Filename)
56-
structPackagePath, err := util.GetPackagePath(dir)
57-
if err != nil {
58-
return "", errorz.Errorf("GetPackagePath: %w", err)
55+
structPackageImportPath := config.GoORMStructPackageImportPath()
56+
if structPackageImportPath == "" {
57+
var err error
58+
structPackageImportPath, err = util.GetPackageImportPath(filepath.Dir(arcSrcSetSlice[0].Filename))
59+
if err != nil {
60+
return "", errorz.Errorf("GetPackagePath: %w", err)
61+
}
5962
}
6063

6164
astFile.Decls = append(astFile.Decls,
@@ -80,7 +83,7 @@ func generateORMCommonFileContent(buf buffer, arcSrcSetSlice ARCSourceSetSlice,
8083
},
8184
&ast.ImportSpec{
8285
Name: &ast.Ident{Name: importName},
83-
Path: &ast.BasicLit{Kind: token.STRING, Value: strconv.Quote(structPackagePath)},
86+
Path: &ast.BasicLit{Kind: token.STRING, Value: strconv.Quote(structPackageImportPath)},
8487
},
8588
},
8689
},

internal/arcgen/lang/util/package_name.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,24 @@ import (
44
"fmt"
55
"go/build"
66
"path/filepath"
7+
8+
apperr "github.com/kunitsucom/arcgen/pkg/errors"
79
)
810

9-
func GetPackagePath(dir string) (string, error) {
10-
absDir, err := filepath.Abs(dir)
11+
func GetPackageImportPath(path string) (string, error) {
12+
absDir, err := filepath.Abs(path)
1113
if err != nil {
12-
return "", fmt.Errorf("failed to get absolute path: %w", err)
14+
return "", fmt.Errorf("filepath.Abs: path=%s %w", path, err)
1315
}
1416

1517
pkg, err := build.ImportDir(absDir, build.FindOnly)
1618
if err != nil {
17-
return "", fmt.Errorf("failed to import directory: %w", err)
19+
return "", fmt.Errorf("build.ImportDir: path=%s: %w", path, err)
1820
}
1921

2022
if pkg.ImportPath == "." {
2123
// If ImportPath is ".", it means the directory is not in GOPATH or inside a module
22-
// In this case, we'll use the last directory name as the package path
23-
return filepath.Base(absDir), nil
24+
return "", fmt.Errorf("path=%s: %w", absDir, apperr.ErrFailedToDetectPackageImportPath)
2425
}
2526

2627
return pkg.ImportPath, nil

internal/config/config.go

Lines changed: 66 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,19 @@ type config struct {
2323
Dialect string `json:"dialect"`
2424
Language string `json:"language"`
2525
// Golang
26-
GoColumnTag string `json:"go_column_tag"`
27-
GoMethodNameTable string `json:"go_method_name_table"`
28-
GoMethodNameColumns string `json:"go_method_name_columns"`
29-
GoMethodPrefixColumn string `json:"go_method_prefix_column"`
30-
GoPKTag string `json:"go_pk_tag"`
31-
GoORMPackagePath string `json:"go_orm_package_path"`
32-
GoORMPackageName string `json:"go_orm_package_name"`
33-
GoORMTypeName string `json:"go_orm_type_name"`
34-
GoORMStructName string `json:"go_orm_struct_name"`
35-
GoHasManyTag string `json:"go_has_many_tag"`
36-
GoHasOneTag string `json:"go_has_one_tag"`
37-
GoSliceTypeSuffix string `json:"go_slice_type_suffix"`
26+
GoColumnTag string `json:"go_column_tag"`
27+
GoMethodNameTable string `json:"go_method_name_table"`
28+
GoMethodNameColumns string `json:"go_method_name_columns"`
29+
GoMethodPrefixColumn string `json:"go_method_prefix_column"`
30+
GoPKTag string `json:"go_pk_tag"`
31+
GoORMOutputPath string `json:"go_orm_output_path"`
32+
GoORMPackageName string `json:"go_orm_package_name"`
33+
GoORMStructPackageImportPath string `json:"go_orm_struct_package_import_path"`
34+
GoORMTypeName string `json:"go_orm_type_name"`
35+
GoORMStructName string `json:"go_orm_struct_name"`
36+
GoHasManyTag string `json:"go_has_many_tag"`
37+
GoHasOneTag string `json:"go_has_one_tag"`
38+
GoSliceTypeSuffix string `json:"go_slice_type_suffix"`
3839
}
3940

4041
//nolint:gochecknoglobals
@@ -73,28 +74,30 @@ func Load(ctx context.Context) (rollback func(), remainingArgs []string, err err
7374
return rollback, remainingArgs, nil
7475
}
7576

77+
//nolint:revive
7678
const (
77-
_OptionVersion = "version"
78-
_OptionTrace, _EnvKeyTrace = "trace", "ARCGEN_TRACE"
79-
_OptionDebug, _EnvKeyDebug = "debug", "ARCGEN_DEBUG"
80-
_OptionDialect, _EnvKeyDialect = "dialect", "ARCGEN_DIALECT"
81-
_OptionLanguage, _EnvKeyLanguage = "lang", "ARCGEN_LANGUAGE"
79+
OptionVersion = "version"
80+
OptionTrace, EnvKeyTrace = "trace", "ARCGEN_TRACE"
81+
OptionDebug, EnvKeyDebug = "debug", "ARCGEN_DEBUG"
82+
OptionDialect, EnvKeyDialect = "dialect", "ARCGEN_DIALECT"
83+
OptionLanguage, EnvKeyLanguage = "lang", "ARCGEN_LANGUAGE"
8284

8385
//
8486
// Golang
8587
//
86-
_OptionGoColumnTag, _EnvKeyGoColumnTag = "go-column-tag", "ARCGEN_GO_COLUMN_TAG"
87-
_OptionGoMethodNameTable, _EnvKeyGoMethodNameTable = "go-method-name-table", "ARCGEN_GO_METHOD_NAME_TABLE"
88-
_OptionGoMethodNameColumns, _EnvKeyGoMethodNameColumns = "go-method-name-columns", "ARCGEN_GO_METHOD_NAME_COLUMNS"
89-
_OptionGoMethodPrefixColumn, _EnvKeyGoMethodPrefixColumn = "go-method-prefix-column", "ARCGEN_GO_METHOD_PREFIX_COLUMN"
90-
_OptionGoPKTag, _EnvKeyGoPKTag = "go-pk-tag", "ARCGEN_GO_PK_TAG"
91-
_OptionGoSliceTypeSuffix, _EnvKeyGoSliceTypeSuffix = "go-slice-type-suffix", "ARCGEN_GO_SLICE_TYPE_SUFFIX"
92-
_OptionGoORMPackagePath, _EnvKeyGoORMPackagePath = "go-orm-package-path", "ARCGEN_GO_ORM_PACKAGE_PATH"
93-
_OptionGoORMPackageName, _EnvKeyGoORMPackageName = "go-orm-package-name", "ARCGEN_GO_ORM_PACKAGE_NAME"
94-
_OptionGoORMTypeName, _EnvKeyGoORMTypeName = "go-orm-type-name", "ARCGEN_GO_ORM_TYPE_NAME"
95-
_OptionGoORMStructName, _EnvKeyGoORMStructName = "go-orm-struct-name", "ARCGEN_GO_ORM_STRUCT_NAME"
96-
_OptionGoHasManyTag, _EnvKeyGoHasManyTag = "go-has-many-tag", "ARCGEN_GO_HAS_MANY_TAG"
97-
_OptionGoHasOneTag, _EnvKeyGoHasOneTag = "go-has-one-tag", "ARCGEN_GO_HAS_ONE_TAG"
88+
OptionGoColumnTag, EnvKeyGoColumnTag = "go-column-tag", "ARCGEN_GO_COLUMN_TAG"
89+
OptionGoMethodNameTable, EnvKeyGoMethodNameTable = "go-method-name-table", "ARCGEN_GO_METHOD_NAME_TABLE"
90+
OptionGoMethodNameColumns, EnvKeyGoMethodNameColumns = "go-method-name-columns", "ARCGEN_GO_METHOD_NAME_COLUMNS"
91+
OptionGoMethodPrefixColumn, EnvKeyGoMethodPrefixColumn = "go-method-prefix-column", "ARCGEN_GO_METHOD_PREFIX_COLUMN"
92+
OptionGoPKTag, EnvKeyGoPKTag = "go-pk-tag", "ARCGEN_GO_PK_TAG"
93+
OptionGoSliceTypeSuffix, EnvKeyGoSliceTypeSuffix = "go-slice-type-suffix", "ARCGEN_GO_SLICE_TYPE_SUFFIX"
94+
OptionGoORMOutputPath, EnvKeyGoORMOutputPath = "go-orm-output-path", "ARCGEN_GO_ORM_OUTPUT_PATH"
95+
OptionGoORMPackageName, EnvKeyGoORMPackageName = "go-orm-package-name", "ARCGEN_GO_ORM_PACKAGE_NAME"
96+
OptionGoORMStructPackageImportPath, EnvKeyGoORMStructPackageImportPath = "go-orm-struct-package-import-path", "ARCGEN_GO_ORM_STRUCT_PACKAGE_IMPORT_PATH"
97+
OptionGoORMTypeName, EnvKeyGoORMTypeName = "go-orm-type-name", "ARCGEN_GO_ORM_TYPE_NAME"
98+
OptionGoORMStructName, EnvKeyGoORMStructName = "go-orm-struct-name", "ARCGEN_GO_ORM_STRUCT_NAME"
99+
OptionGoHasManyTag, EnvKeyGoHasManyTag = "go-has-many-tag", "ARCGEN_GO_HAS_MANY_TAG"
100+
OptionGoHasOneTag, EnvKeyGoHasOneTag = "go-has-one-tag", "ARCGEN_GO_HAS_ONE_TAG"
98101
)
99102

100103
// MEMO: Since there is a possibility of returning some kind of error in the future, the signature is made to return an error.
@@ -107,74 +110,78 @@ func load(ctx context.Context) (cfg *config, remainingArgs []string, err error)
107110
Description: "Generate methods that return information such as DB table names and column names from Go struct tags.",
108111
Options: []cliz.Option{
109112
&cliz.BoolOption{
110-
Name: _OptionVersion, Description: "show version information and exit",
113+
Name: OptionVersion, Description: "show version information and exit",
111114
Default: cliz.Default(false),
112115
},
113116
&cliz.BoolOption{
114-
Name: _OptionTrace, Environment: _EnvKeyTrace, Description: "trace mode enabled",
117+
Name: OptionTrace, Environment: EnvKeyTrace, Description: "trace mode enabled",
115118
Default: cliz.Default(false),
116119
},
117120
&cliz.BoolOption{
118-
Name: _OptionDebug, Environment: _EnvKeyDebug, Description: "debug mode",
121+
Name: OptionDebug, Environment: EnvKeyDebug, Description: "debug mode",
119122
Default: cliz.Default(false),
120123
},
121124
&cliz.StringOption{
122-
Name: _OptionDialect, Environment: _EnvKeyDialect, Description: "dialect for DML",
125+
Name: OptionDialect, Environment: EnvKeyDialect, Description: "dialect for DML",
123126
Default: cliz.Default("postgres"),
124127
},
125128
&cliz.StringOption{
126-
Name: _OptionLanguage, Environment: _EnvKeyLanguage, Description: "programming language to generate DDL",
129+
Name: OptionLanguage, Environment: EnvKeyLanguage, Description: "programming language to generate DDL",
127130
Default: cliz.Default("go"),
128131
},
129132
//
130133
// Golang
131134
//
132135
&cliz.StringOption{
133-
Name: _OptionGoColumnTag, Environment: _EnvKeyGoColumnTag, Description: "column annotation key for Go struct tag",
136+
Name: OptionGoColumnTag, Environment: EnvKeyGoColumnTag, Description: "column annotation key for Go struct tag",
134137
Default: cliz.Default("db"),
135138
},
136139
&cliz.StringOption{
137-
Name: _OptionGoMethodNameTable, Environment: _EnvKeyGoMethodNameTable, Description: "method name for table",
140+
Name: OptionGoMethodNameTable, Environment: EnvKeyGoMethodNameTable, Description: "method name for table",
138141
Default: cliz.Default("TableName"),
139142
},
140143
&cliz.StringOption{
141-
Name: _OptionGoMethodNameColumns, Environment: _EnvKeyGoMethodNameColumns, Description: "method name for columns",
144+
Name: OptionGoMethodNameColumns, Environment: EnvKeyGoMethodNameColumns, Description: "method name for columns",
142145
Default: cliz.Default("ColumnNames"),
143146
},
144147
&cliz.StringOption{
145-
Name: _OptionGoMethodPrefixColumn, Environment: _EnvKeyGoMethodPrefixColumn, Description: "method prefix for column name",
148+
Name: OptionGoMethodPrefixColumn, Environment: EnvKeyGoMethodPrefixColumn, Description: "method prefix for column name",
146149
Default: cliz.Default("ColumnName_"),
147150
},
148151
&cliz.StringOption{
149-
Name: _OptionGoPKTag, Environment: _EnvKeyGoPKTag, Description: "primary key annotation key for Go struct tag",
152+
Name: OptionGoPKTag, Environment: EnvKeyGoPKTag, Description: "primary key annotation key for Go struct tag",
150153
Default: cliz.Default("pk"),
151154
},
152155
&cliz.StringOption{
153-
Name: _OptionGoSliceTypeSuffix, Environment: _EnvKeyGoSliceTypeSuffix, Description: "suffix for slice type",
156+
Name: OptionGoSliceTypeSuffix, Environment: EnvKeyGoSliceTypeSuffix, Description: "suffix for slice type",
154157
Default: cliz.Default("Slice"),
155158
},
156159
&cliz.StringOption{
157-
Name: _OptionGoORMPackagePath, Environment: _EnvKeyGoORMPackagePath, Description: "package path for ORM",
160+
Name: OptionGoORMOutputPath, Environment: EnvKeyGoORMOutputPath, Description: "output path of ORM. If empty, not output.",
158161
Default: cliz.Default(""),
159162
},
160163
&cliz.StringOption{
161-
Name: _OptionGoORMPackageName, Environment: _EnvKeyGoORMPackageName, Description: "package name for ORM",
164+
Name: OptionGoORMPackageName, Environment: EnvKeyGoORMPackageName, Description: "package name for ORM. If empty, use the base name of the output path.",
162165
Default: cliz.Default(""),
163166
},
164167
&cliz.StringOption{
165-
Name: _OptionGoORMTypeName, Environment: _EnvKeyGoORMTypeName, Description: "interface type name for ORM",
168+
Name: OptionGoORMStructPackageImportPath, Environment: EnvKeyGoORMStructPackageImportPath, Description: "package import path of ORM target struct. If empty, try to detect automatically.",
169+
Default: cliz.Default(""),
170+
},
171+
&cliz.StringOption{
172+
Name: OptionGoORMTypeName, Environment: EnvKeyGoORMTypeName, Description: "interface type name for ORM",
166173
Default: cliz.Default("ORM"),
167174
},
168175
&cliz.StringOption{
169-
Name: _OptionGoORMStructName, Environment: _EnvKeyGoORMStructName, Description: "struct name for ORM",
176+
Name: OptionGoORMStructName, Environment: EnvKeyGoORMStructName, Description: "struct name for ORM",
170177
Default: cliz.Default(""),
171178
},
172179
&cliz.StringOption{
173-
Name: _OptionGoHasOneTag, Environment: _EnvKeyGoHasOneTag, Description: "\"hasOne\" annotation key for Go struct tag",
180+
Name: OptionGoHasOneTag, Environment: EnvKeyGoHasOneTag, Description: "\"hasOne\" annotation key for Go struct tag",
174181
Default: cliz.Default("hasOne"),
175182
},
176183
&cliz.StringOption{
177-
Name: _OptionGoHasManyTag, Environment: _EnvKeyGoHasManyTag, Description: "\"hasMany\" annotation key for Go struct tag",
184+
Name: OptionGoHasManyTag, Environment: EnvKeyGoHasManyTag, Description: "\"hasMany\" annotation key for Go struct tag",
178185
Default: cliz.Default("hasMany"),
179186
},
180187
},
@@ -196,18 +203,19 @@ func load(ctx context.Context) (cfg *config, remainingArgs []string, err error)
196203
Dialect: loadDialect(ctx, cmd),
197204
Language: loadLanguage(ctx, cmd),
198205
// Golang
199-
GoColumnTag: loadGoColumnTag(ctx, cmd),
200-
GoMethodNameTable: loadGoMethodNameTable(ctx, cmd),
201-
GoMethodNameColumns: loadGoMethodNameColumns(ctx, cmd),
202-
GoMethodPrefixColumn: loadGoMethodPrefixColumn(ctx, cmd),
203-
GoPKTag: loadGoPKTag(ctx, cmd),
204-
GoSliceTypeSuffix: loadGoSliceTypeSuffix(ctx, cmd),
205-
GoORMPackagePath: loadGoORMPackagePath(ctx, cmd),
206-
GoORMPackageName: loadGoORMPackageName(ctx, cmd),
207-
GoORMTypeName: loadGoORMTypeName(ctx, cmd),
208-
GoORMStructName: loadGoORMStructName(ctx, cmd),
209-
GoHasOneTag: loadGoHasOneTag(ctx, cmd),
210-
GoHasManyTag: loadGoHasManyTag(ctx, cmd),
206+
GoColumnTag: loadGoColumnTag(ctx, cmd),
207+
GoMethodNameTable: loadGoMethodNameTable(ctx, cmd),
208+
GoMethodNameColumns: loadGoMethodNameColumns(ctx, cmd),
209+
GoMethodPrefixColumn: loadGoMethodPrefixColumn(ctx, cmd),
210+
GoPKTag: loadGoPKTag(ctx, cmd),
211+
GoSliceTypeSuffix: loadGoSliceTypeSuffix(ctx, cmd),
212+
GoORMOutputPath: loadGoORMOutputPath(ctx, cmd),
213+
GoORMPackageName: loadGoORMPackageName(ctx, cmd),
214+
GoORMStructPackageImportPath: loadGoORMStructPackageImportPath(ctx, cmd),
215+
GoORMTypeName: loadGoORMTypeName(ctx, cmd),
216+
GoORMStructName: loadGoORMStructName(ctx, cmd),
217+
GoHasOneTag: loadGoHasOneTag(ctx, cmd),
218+
GoHasManyTag: loadGoHasManyTag(ctx, cmd),
211219
}
212220

213221
if c.Debug {

internal/config/debug.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
)
88

99
func loadDebug(_ context.Context, cmd *cliz.Command) bool {
10-
v, _ := cmd.GetOptionBool(_OptionDebug)
10+
v, _ := cmd.GetOptionBool(OptionDebug)
1111
return v
1212
}
1313

internal/config/dialect.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
)
88

99
func loadDialect(_ context.Context, cmd *cliz.Command) string {
10-
v, _ := cmd.GetOptionString(_OptionDialect)
10+
v, _ := cmd.GetOptionString(OptionDialect)
1111
return v
1212
}
1313

internal/config/go_column_tag.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
)
88

99
func loadGoColumnTag(_ context.Context, cmd *cliz.Command) string {
10-
v, _ := cmd.GetOptionString(_OptionGoColumnTag)
10+
v, _ := cmd.GetOptionString(OptionGoColumnTag)
1111
return v
1212
}
1313

internal/config/go_has_many_tag.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
)
88

99
func loadGoHasManyTag(_ context.Context, cmd *cliz.Command) string {
10-
v, _ := cmd.GetOptionString(_OptionGoHasManyTag)
10+
v, _ := cmd.GetOptionString(OptionGoHasManyTag)
1111
return v
1212
}
1313

internal/config/go_has_one_tag.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
)
88

99
func loadGoHasOneTag(_ context.Context, cmd *cliz.Command) string {
10-
v, _ := cmd.GetOptionString(_OptionGoHasOneTag)
10+
v, _ := cmd.GetOptionString(OptionGoHasOneTag)
1111
return v
1212
}
1313

0 commit comments

Comments
 (0)