Skip to content

Commit

Permalink
Merge pull request #7 from underbek/feature/parse_broken_sources
Browse files Browse the repository at this point in the history
Fixed parsing broken sources
  • Loading branch information
underbek committed Feb 5, 2023
2 parents 61b704e + b832d91 commit 492b58a
Show file tree
Hide file tree
Showing 14 changed files with 233 additions and 73 deletions.
5 changes: 2 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
### Install

```shell
go install github.com/underbek/datamapper@v0.0.6
go install github.com/underbek/datamapper@v0.0.7
```

### Usage
Expand Down Expand Up @@ -137,10 +137,9 @@ func ConvertStringToDecimal(from string) (decimal.Decimal, error) {
* [x] Generate convertor with from/to pointer
* [x] Fix error by parsing function as member
* [x] Wrap errors
* [ ] Parse packages with broken sources
* [x] Parse packages with broken sources
* [ ] Update readme
* [ ] Map field without tag
* [ ] Use in my projects
* [ ] Generate convertors with map fields
* [ ] Generate convertors with array fields
* [ ] Recursive convert by option if not found conversions
Expand Down
21 changes: 21 additions & 0 deletions _test_data/mapper/broken/models.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package transport

import "github.com/google/uuid"

type User struct {
UUID uuid.UUID `json:"uuid" map:"id"`
Name string `json:"name" map:"name"`
Age string `map:"age"`
ChildCount *string `map:"children"`
}

type BrokenUser [T]struct {
UUID uuid.UUID `json:"uuid" map:"id"`
Name string `json:"name" map:"name"`
Age string `map:"age"`
ChildCount *string `map:"children"`
}

type BrokenUser2 struct {
UUID `json:"uuid"`
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package convertors

import (
"github.com/google/uuid"
"github.com/shopspring/decimal"
"golang.org/x/exp/constraints"
)

func CustomUUIDToInteger[T constraints.Integer](from uuid.UUID) T {
return T(from.ID())
}

func CustomIntegerToUUID[T constraints.Integer](from T) uuid.UUID {
return uuid.New()
}

func BrokenConvertor(from decimal.Decimal) int {
return ""
}
19 changes: 12 additions & 7 deletions generator/generator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/underbek/datamapper/_test_data"
"github.com/underbek/datamapper/logger"
"github.com/underbek/datamapper/models"
"github.com/underbek/datamapper/parser"
)
Expand All @@ -20,7 +21,7 @@ const (
)

func parseFunctions(t *testing.T, source string) models.Functions {
funcs, err := parser.ParseConversionFunctions(source)
funcs, err := parser.ParseConversionFunctions(logger.New(), source)
require.NoError(t, err)
return funcs
}
Expand Down Expand Up @@ -250,17 +251,19 @@ func Test_GenerateConvertor(t *testing.T) {
},
}

lg := logger.New()

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
modelsFrom, err := parser.ParseModels(testGeneratorPath + tt.pathFrom + "/models.go")
modelsFrom, err := parser.ParseModels(lg, testGeneratorPath+tt.pathFrom+"/models.go")
require.NoError(t, err)

modelsTo, err := parser.ParseModels(testGeneratorPath + tt.pathTo + "/models.go")
modelsTo, err := parser.ParseModels(lg, testGeneratorPath+tt.pathTo+"/models.go")
require.NoError(t, err)

funcs := parseFunctions(t, tt.cfPath)

pkg, err := parser.ParseDestinationPackage(testGeneratorPath + tt.generatePath)
pkg, err := parser.ParseDestinationPackage(lg, testGeneratorPath+tt.generatePath)
require.NoError(t, err)

from := modelsFrom["From"]
Expand All @@ -282,10 +285,12 @@ func Test_GenerateConvertor(t *testing.T) {
}

func Test_GenerateConvertorWithAliases(t *testing.T) {
modelsFrom, err := parser.ParseModels(testGeneratorPath + "with_aliases/from")
lg := logger.New()

modelsFrom, err := parser.ParseModels(lg, testGeneratorPath+"with_aliases/from")
require.NoError(t, err)

modelsTo, err := parser.ParseModels(testGeneratorPath + "with_aliases/to")
modelsTo, err := parser.ParseModels(lg, testGeneratorPath+"with_aliases/to")
require.NoError(t, err)

funcs := parseFunctions(t, testGeneratorPath+"with_aliases/cf")
Expand All @@ -300,7 +305,7 @@ func Test_GenerateConvertorWithAliases(t *testing.T) {
to := modelsTo["To"]
to.Type.Package.Alias = "toalias"

pkg, err := parser.ParseDestinationPackage(testGeneratorPath + "with_aliases")
pkg, err := parser.ParseDestinationPackage(lg, testGeneratorPath+"with_aliases")
require.NoError(t, err)

pkgs, convertor, err := GenerateConvertor(from, to, pkg, funcs)
Expand Down
47 changes: 47 additions & 0 deletions logger/logger.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package logger

import (
"fmt"
"log"
"os"
)

const depth = 2

type Logger interface {
Info(v ...any)
Warn(v ...any)
Error(v ...any)
Fatal(v ...any)
}

type logger struct {
info *log.Logger
warn *log.Logger
error *log.Logger
}

func New() Logger {
return &logger{
info: log.New(os.Stderr, "INFO: ", log.Ldate|log.Ltime),
warn: log.New(os.Stderr, "WARNING: ", log.Ldate|log.Ltime),
error: log.New(os.Stderr, "ERROR: ", log.Ldate|log.Ltime),
}
}

func (l *logger) Info(v ...any) {
_ = l.info.Output(depth, fmt.Sprint(v...))
}

func (l *logger) Warn(v ...any) {
_ = l.warn.Output(depth, fmt.Sprint(v...))
}

func (l *logger) Error(v ...any) {
_ = l.error.Output(depth, fmt.Sprint(v...))
}

func (l *logger) Fatal(v ...any) {
_ = l.error.Output(depth, fmt.Sprint(v...))
os.Exit(1)
}
11 changes: 5 additions & 6 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
package main

import (
"log"
"os"

"github.com/underbek/datamapper/logger"
"github.com/underbek/datamapper/mapper"
"github.com/underbek/datamapper/options"
)

func main() {
lg := logger.New()
opts, err := options.ParseOptions()
if err != nil {
os.Exit(1)
lg.Fatal(err)
}

err = mapper.MapModels(opts)
err = mapper.MapModels(lg, opts)
if err != nil {
log.Fatal(err)
lg.Fatal(err)
}
}
13 changes: 7 additions & 6 deletions mapper/mapper.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"strings"

"github.com/underbek/datamapper/generator"
"github.com/underbek/datamapper/logger"
"github.com/underbek/datamapper/models"
"github.com/underbek/datamapper/options"
"github.com/underbek/datamapper/parser"
Expand All @@ -21,10 +22,10 @@ var (
ErrNotFoundTag = errors.New("not found tag error")
)

func MapModels(opts options.Options) error {
func MapModels(lg logger.Logger, opts options.Options) error {
fromSource, fromAlias := parseSourceOption(opts.FromSource)

structs, err := parser.ParseModelsByPackage(fromSource)
structs, err := parser.ParseModelsByPackage(lg, fromSource)
if err != nil {
return fmt.Errorf("parse models error: %w", err)
}
Expand All @@ -37,7 +38,7 @@ func MapModels(opts options.Options) error {
from.Type.Pointer = isFromPointer

toSource, toAlias := parseSourceOption(opts.ToSource)
structs, err = parser.ParseModelsByPackage(toSource)
structs, err = parser.ParseModelsByPackage(lg, toSource)
if err != nil {
return fmt.Errorf("parse models error: %w", err)
}
Expand Down Expand Up @@ -70,7 +71,7 @@ func MapModels(opts options.Options) error {
}

//TODO: parse or copy embed sources
funcs, err := parser.ParseConversionFunctionsByPackage(internalConvertsPackagePath)
funcs, err := parser.ParseConversionFunctionsByPackage(lg, internalConvertsPackagePath)
if err != nil {
return fmt.Errorf("parse internal conversion functions error: %w", err)
}
Expand All @@ -80,7 +81,7 @@ func MapModels(opts options.Options) error {
if len(opts.UserCFSources) != 0 {
for _, optSource := range opts.UserCFSources {
source, cfAlias := parseSourceOption(optSource)
res, err := parser.ParseConversionFunctionsByPackage(source)
res, err := parser.ParseConversionFunctionsByPackage(lg, source)
if err != nil {
return fmt.Errorf("parse user conversion functions error: %w", err)
}
Expand All @@ -105,7 +106,7 @@ func MapModels(opts options.Options) error {
return fmt.Errorf("create destination dir %s error: %w", path.Dir(opts.Destination), err)
}

pkg, err := parser.ParseDestinationPackage(opts.Destination)
pkg, err := parser.ParseDestinationPackage(lg, opts.Destination)
if err != nil {
return fmt.Errorf("parse destination package %s error: %w", opts.Destination, err)
}
Expand Down
9 changes: 7 additions & 2 deletions mapper/mapper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/underbek/datamapper/_test_data"
"github.com/underbek/datamapper/logger"
"github.com/underbek/datamapper/options"
)

Expand Down Expand Up @@ -106,9 +107,11 @@ func Test_IncorrectOptions(t *testing.T) {
},
}

lg := logger.New()

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := MapModels(tt.opts)
err := MapModels(lg, tt.opts)
require.Error(t, err)
})
}
Expand Down Expand Up @@ -196,9 +199,11 @@ func Test_MapModels(t *testing.T) {
},
}

lg := logger.New()

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := MapModels(tt.opts)
err := MapModels(lg, tt.opts)
require.NoError(t, err)

actual := readActual(t)
Expand Down
11 changes: 6 additions & 5 deletions parser/conversion_functions.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"path/filepath"
"strings"

"github.com/underbek/datamapper/logger"
"github.com/underbek/datamapper/models"
"github.com/underbek/datamapper/utils"
"golang.org/x/tools/go/packages"
Expand All @@ -20,10 +21,10 @@ var (
ErrUndefinedType = errors.New("undefined type error")
)

func ParseConversionFunctionsByPackage(source string) (models.Functions, error) {
func ParseConversionFunctionsByPackage(lg logger.Logger, source string) (models.Functions, error) {
_, err := os.Stat(source)
if err == nil {
return ParseConversionFunctions(source)
return ParseConversionFunctions(lg, source)
}

if !os.IsNotExist(err) {
Expand All @@ -40,16 +41,16 @@ func ParseConversionFunctionsByPackage(source string) (models.Functions, error)
return nil, err
}

return ParseConversionFunctions(p.Dir)
return ParseConversionFunctions(lg, p.Dir)
}
func ParseConversionFunctions(source string) (models.Functions, error) {
func ParseConversionFunctions(lg logger.Logger, source string) (models.Functions, error) {

absSourcePath, err := filepath.Abs(source)
if err != nil {
return nil, err
}

pkg, err := utils.LoadPackage(source)
pkg, err := utils.LoadPackage(lg, source)
if err != nil {
return nil, err
}
Expand Down

0 comments on commit 492b58a

Please sign in to comment.