Setting: map
map [SOURCE-PATH] TARGET [| FUNC]
can be defined as method comment.
map SOURCE-FIELD TARGET
If the source and target struct have differently named fields, then you can use map
to define the mapping.
package example
// goverter:converter
type Converter interface {
// goverter:map LastName Surname
Convert(Input) Output
}
type Input struct {
Age int
LastName string
}
type Output struct {
Age int
Surname string
}
// Code generated by github.com/jmattheis/goverter, DO NOT EDIT.
//go:build !goverter
package generated
import mapfield "github.com/jmattheis/goverter/example/map-field"
type ConverterImpl struct{}
func (c *ConverterImpl) Convert(source mapfield.Input) mapfield.Output {
var exampleOutput mapfield.Output
exampleOutput.Age = source.Age
exampleOutput.Surname = source.LastName
return exampleOutput
}
map SOURCE-PATH TARGET
You can access nested properties by separating the field names with .
:
// goverter:converter
type Converter interface {
// goverter:map Nested.LastName Surname
Convert(Input) Output
}
Example (click to expand)
package example
// goverter:converter
type Converter interface {
// goverter:map Nested.LastName Surname
Convert(Input) Output
}
type Input struct {
Age int
Nested NestedInput
}
type NestedInput struct {
LastName string
}
type Output struct {
Age int
Surname string
}
// Code generated by github.com/jmattheis/goverter, DO NOT EDIT.
//go:build !goverter
package generated
import mappath "github.com/jmattheis/goverter/example/map-path"
type ConverterImpl struct{}
func (c *ConverterImpl) Convert(source mappath.Input) mappath.Output {
var exampleOutput mappath.Output
exampleOutput.Age = source.Age
exampleOutput.Surname = source.Nested.LastName
return exampleOutput
}
map DOT TARGET
map . TARGET
When using .
as source field inside map
, then you the instruct Goverter to use the source struct as source for the conversion to the target property. This is useful, when you've a struct that is the flattened version of another struct. See autoMap
for the invert operation of this.
package example
// goverter:converter
type Converter interface {
// goverter:map . Address
Convert(FlatPerson) Person
}
type FlatPerson struct {
Name string
Age int
Street string
ZipCode string
}
type Person struct {
Name string
Age int
Address Address
}
type Address struct {
Street string
ZipCode string
}
// Code generated by github.com/jmattheis/goverter, DO NOT EDIT.
//go:build !goverter
package generated
import mapidentity "github.com/jmattheis/goverter/example/map-identity"
type ConverterImpl struct{}
func (c *ConverterImpl) Convert(source mapidentity.FlatPerson) mapidentity.Person {
var examplePerson mapidentity.Person
examplePerson.Name = source.Name
examplePerson.Age = source.Age
examplePerson.Address = c.exampleFlatPersonToExampleAddress(source)
return examplePerson
}
func (c *ConverterImpl) exampleFlatPersonToExampleAddress(source mapidentity.FlatPerson) mapidentity.Address {
var exampleAddress mapidentity.Address
exampleAddress.Street = source.Street
exampleAddress.ZipCode = source.ZipCode
return exampleAddress
}
map [SOURCE-PATH] TARGET | [PACKAGE:]FUNC
For [SOURCE-PATH] TARGET
you can use everything that's described above in this document. The FUNC
may have the signatures described in Signature: Optional Source.
You can optionally define the PACKAGE
where FUNC
is located by separating the PACKAGE
and FUNC
with a :
(colon). If no package is defined, then the package of the conversion method is used.
package example
// goverter:converter
type Converter interface {
// goverter:map URL | PrependHTTPS
// goverter:map . FullName | GetFullName
// goverter:map Age | DefaultAge
// goverter:map Value | strconv:Itoa
Convert(Input) (Output, error)
}
type Input struct {
URL string
FirstName string
LastName string
Value int
}
type Output struct {
URL string
FullName string
Age int
Value string
}
func GetFullName(input Input) string {
return input.FirstName + " " + input.LastName
}
func PrependHTTPS(url string) string { return "https://" + url }
func DefaultAge() int { return 42 }
// Code generated by github.com/jmattheis/goverter, DO NOT EDIT.
//go:build !goverter
package generated
import (
mapcustom "github.com/jmattheis/goverter/example/map-custom"
"strconv"
)
type ConverterImpl struct{}
func (c *ConverterImpl) Convert(source mapcustom.Input) (mapcustom.Output, error) {
var exampleOutput mapcustom.Output
exampleOutput.URL = mapcustom.PrependHTTPS(source.URL)
exampleOutput.FullName = mapcustom.GetFullName(source)
exampleOutput.Age = mapcustom.DefaultAge()
exampleOutput.Value = strconv.Itoa(source.Value)
return exampleOutput, nil
}