Skip to content

Commit

Permalink
Merge pull request #14 from underbek/fix/pointer_2_pointer
Browse files Browse the repository at this point in the history
Fixed pointer to pointer conversion
  • Loading branch information
underbek authored Mar 5, 2023
2 parents a834a27 + 570d578 commit 7a17284
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 27 deletions.

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

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package with_from_and_to_pointers_without_errors

type From struct {
Name string `map:"name"`
Age int `map:"age"`
}

type To struct {
Name string `map:"name"`
Age uint `map:"age"`
}
3 changes: 2 additions & 1 deletion generator/fillers.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,11 +83,12 @@ func fillConvertor(res result) (string, error) {
return fillTemplate[string](convertorFilePath, data)
}

func getPointerCheck(fromFullName, toModelName, err string) (string, error) {
func getPointerCheck(fromFullName, toModelName, err string, isError bool) (string, error) {
data := map[string]any{
"fromFullName": fromFullName,
"resValue": nilOrDefault(toModelName),
"error": err,
"isError": isError,
}

return fillTemplate[string](pointerCheckFilePath, data)
Expand Down
2 changes: 0 additions & 2 deletions generator/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,6 @@ func GenerateConvertor(from, to models.Struct, pkg models.Package, functions mod
res.fromTag = from.Fields[0].Tags[0].Name
res.toTag = to.Fields[0].Tags[0].Name

res.withError = res.withError || isReturnError(res.fields)

convertor, err := fillConvertor(res)
if err != nil {
return models.GeneratedConversionFunction{}, err
Expand Down
9 changes: 9 additions & 0 deletions generator/generator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,15 @@ func Test_GenerateConvertor(t *testing.T) {
isFromPointer: true,
isToPointer: true,
},
{
name: "With from and to pointers without errors",
pathFrom: "with_from_and_to_pointers_without_errors",
pathTo: "with_from_and_to_pointers_without_errors",
generatePath: "with_from_and_to_pointers_without_errors",
cfPath: cfPath,
isFromPointer: true,
isToPointer: true,
},
}

lg := logger.New()
Expand Down
53 changes: 29 additions & 24 deletions generator/pairs.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,38 @@ func createModelsPair(from, to models.Struct, pkgPath string, functions models.F
var fields []FieldsPair
packages := make(models.Packages)

fromFields := make(map[string]models.Field)
for _, field := range from.Fields {
fromFields[field.Tags[0].Value] = field
}

for _, toField := range to.Fields {
fromField, ok := fromFields[toField.Tags[0].Value]
if !ok {
//TODO: warning or error politics
continue
}

pair, packs, err := getFieldsPair(fromField, toField, from, to, pkgPath, functions)
if err != nil {
return result{}, err
}

maps.Copy(packages, packs)
fields = append(fields, pair)
}

withError := isReturnError(fields)

var conversions []string
var withError bool
if from.Type.Pointer && !to.Type.Pointer {
withError = true

conversion, err := getPointerCheck(
"from",
to.Type.FullName(pkgPath),
fmt.Sprintf("errors.New(\"%s is nil\")", from.Type.Name),
withError,
)
if err != nil {
return result{}, err
Expand All @@ -28,15 +53,14 @@ func createModelsPair(from, to models.Struct, pkgPath string, functions models.F
Name: "errors",
Path: "errors",
}] = struct{}{}

withError = true
}

if from.Type.Pointer && to.Type.Pointer {
conversion, err := getPointerCheck(
"from",
to.Type.FullName(pkgPath),
"nil",
withError,
)
if err != nil {
return result{}, err
Expand All @@ -45,27 +69,6 @@ func createModelsPair(from, to models.Struct, pkgPath string, functions models.F
conversions = append(conversions, conversion)
}

fromFields := make(map[string]models.Field)
for _, field := range from.Fields {
fromFields[field.Tags[0].Value] = field
}

for _, toField := range to.Fields {
fromField, ok := fromFields[toField.Tags[0].Value]
if !ok {
//TODO: warning or error politics
continue
}

pair, packs, err := getFieldsPair(fromField, toField, from, to, pkgPath, functions)
if err != nil {
return result{}, err
}

maps.Copy(packages, packs)
fields = append(fields, pair)
}

conversions = append(conversions, fillConversions(fields)...)

return result{
Expand Down Expand Up @@ -135,6 +138,7 @@ func fillConversionFunction(pair FieldsPair, fromField, toField models.Field, fr
fromField.Name,
toField.Name,
),
true,
)
if err != nil {
return FieldsPair{}, nil, err
Expand Down Expand Up @@ -303,6 +307,7 @@ func fillConversionFunctionBySlice(pair FieldsPair, fromField, toField models.Fi
fromField.Name,
toField.Name,
),
true,
)
if err != nil {
return FieldsPair{}, nil, err
Expand Down
4 changes: 4 additions & 0 deletions generator/templates/pointer_check.temp
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
if {{.fromFullName}} == nil {
{{- if .isError -}}
return {{.resValue}}, {{.error}}
{{- else -}}
return {{.resValue}}
{{- end -}}
}

0 comments on commit 7a17284

Please sign in to comment.