Skip to content

Commit

Permalink
Add* now uses MapperGetter
Browse files Browse the repository at this point in the history
  • Loading branch information
yuin committed Jul 20, 2023
1 parent 7291f41 commit 2d22428
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 19 deletions.
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ Mapping codes look like the following:
````go
mappers := mapper.NewMappers() # Creates new Mappers object
mapper.AddTimeToStringMapper(mappers) # Add custom mappers
mappers.AddFactory("TodoMapperHelper", func(ms Mappers) (any, error) {
mappers.AddFactory("TodoMapperHelper", func(ms MapperGetter) (any, error) {
return &todoMapperHelper{}, nil
}) # Add helpers

Expand Down Expand Up @@ -187,19 +187,19 @@ func (m *TimeStringMapper) TimeToString(source *time.Time) (string, error) {
}

type Mappers interface {
AddFactory(string, func(Mappers) (any, error))
AddMapperFuncFactory(string, string, func(Mappers) (any, error))
AddFactory(string, func(MapperGetter) (any, error))
AddMapperFuncFactory(string, string, func(MapperGetter) (any, error))
}

func AddTimeToStringMapper(mappers Mappers) {
stringTime := &TimeStringMapper{}
mappers.AddFactory("TimeStringMapper", func(m Mappers) (any, error) {
mappers.AddFactory("TimeStringMapper", func(m MapperGetter) (any, error) {
return stringTime, nil
})
mappers.AddMapperFuncFactory("string", "time#Time", func(m Mappers) (any, error) {
mappers.AddMapperFuncFactory("string", "time#Time", func(m MapperGetter) (any, error) {
return stringTime.StringToTime, nil
})
mappers.AddMapperFuncFactory("time#Time", "string", func(m Mappers) (any, error) {
mappers.AddMapperFuncFactory("time#Time", "string", func(m MapperGetter) (any, error) {
return stringTime.TimeToString, nil
})
}
Expand Down Expand Up @@ -241,7 +241,7 @@ func (h *todoMapperHelper) BtoA(source *domain.Todo, dest *model.TodoModel) erro
and register it as `{MAPPER_NAME}Helper`:
```go
mappers.AddFactory("TodoMapperHelper", func(ms Mappers) (any, error) {
mappers.AddFactory("TodoMapperHelper", func(ms MapperGetter) (any, error) {
return &todoMapperHelper{}, nil
})
```
Expand Down
4 changes: 2 additions & 2 deletions gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -648,12 +648,12 @@ func genMappers(mappers *Mappers, mapperFuncs []*mapperFunc, mctx *MappingContex
}

if _, ok := added[m.name]; !ok {
ms = append(ms, fmt.Sprintf(`mappers.AddFactory("%s", func(ms Mappers) (any, error) {`, m.name))
ms = append(ms, fmt.Sprintf(`mappers.AddFactory("%s", func(ms MapperGetter) (any, error) {`, m.name))
ms = append(ms, fmt.Sprintf("return %sNew%s(ms), nil", prefix, m.name))
ms = append(ms, "})")
added[m.name] = struct{}{}
}
ms = append(ms, fmt.Sprintf(`mappers.AddFactory("%s", func(ms Mappers) (any, error) {`, m.mappersName))
ms = append(ms, fmt.Sprintf(`mappers.AddFactory("%s", func(ms MapperGetter) (any, error) {`, m.mappersName))
ms = append(ms, fmt.Sprintf(`obj, err := ms.Get("%s")`, m.name))
ms = append(ms, `if err != nil { return nil, err }`)
ms = append(ms, fmt.Sprintf(`mapper, _ :=obj.(%s%s)`, prefix, m.name))
Expand Down
10 changes: 6 additions & 4 deletions mappers.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,15 @@ func (s *singleton[T]) MustGet() T {
return instance
}
type MapperGetter = ` + mapperGetterSrc + `
// Mappers is a collection of mappers.
type Mappers interface {
// AddFactory adds given object factory to this mappers.
AddFactory(name string, factory func(Mappers) (any, error))
AddFactory(name string, factory func(MapperGetter) (any, error))
// AddMapperFuncFactory adds given mapper function factory to this mappers.
AddMapperFuncFactory(sourceName string, destName string, factory func(Mappers) (any, error))
AddMapperFuncFactory(sourceName string, destName string, factory func(MapperGetter) (any, error))
// Get returns an object with given name.
Get(name string) (any, error)
Expand All @@ -71,7 +73,7 @@ func NewMappers() Mappers {
return mappers
}
func (d *mappers) AddFactory(name string, factory func(Mappers) (any, error)) {
func (d *mappers) AddFactory(name string, factory func(MapperGetter) (any, error)) {
s := newSingleton[any](func() (any, error) {
return factory(d)
})
Expand All @@ -80,7 +82,7 @@ func (d *mappers) AddFactory(name string, factory func(Mappers) (any, error)) {
})
}
func (d *mappers) AddMapperFuncFactory(sourceName string, destName string, factory func(Mappers) (any, error)) {
func (d *mappers) AddMapperFuncFactory(sourceName string, destName string, factory func(MapperGetter) (any, error)) {
d.AddFactory(sourceName+":"+destName, factory)
}
Expand Down
10 changes: 5 additions & 5 deletions testdata/testmod/mapper/my_mappers.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,17 @@ func (m *TimeStringMapper) TimeToString(source *time.Time) (string, error) {
}

func AddTimeToStringMapper(mappers interface {
AddFactory(string, func(Mappers) (any, error))
AddMapperFuncFactory(string, string, func(Mappers) (any, error))
AddFactory(string, func(MapperGetter) (any, error))
AddMapperFuncFactory(string, string, func(MapperGetter) (any, error))
}) {
stringTime := &TimeStringMapper{}
mappers.AddFactory("TimeStringMapper", func(m Mappers) (any, error) {
mappers.AddFactory("TimeStringMapper", func(m MapperGetter) (any, error) {
return stringTime, nil
})
mappers.AddMapperFuncFactory("string", "time#Time", func(m Mappers) (any, error) {
mappers.AddMapperFuncFactory("string", "time#Time", func(m MapperGetter) (any, error) {
return stringTime.StringToTime, nil
})
mappers.AddMapperFuncFactory("time#Time", "string", func(m Mappers) (any, error) {
mappers.AddMapperFuncFactory("time#Time", "string", func(m MapperGetter) (any, error) {
return stringTime.TimeToString, nil
})
}
2 changes: 1 addition & 1 deletion testdata/testmod/mapper/todo_mapper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ func TestMapperHelper(t *testing.T) {
mappers := NewMappers()
mapper.AddTimeToStringMapper(mappers)

mappers.AddFactory("TodoMapperHelper", func(ms Mappers) (any, error) {
mappers.AddFactory("TodoMapperHelper", func(ms MapperGetter) (any, error) {
return &todoMapperHelper{}, nil
})

Expand Down

0 comments on commit 2d22428

Please sign in to comment.