Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR adds support for a new
copier.Valuer
interface. This interface lets custom types implement a function returning the actual value to copy.For example if your type is a wrapper, or if it doesn't have to implement
sql/driver.Valuer
, you can implement this interface so the returned value will be used instead. It can also be used to format your type or convert it to another one before being copied.It differs from
TypeConverter
in several ways:TypeConverter
, you would have to define a type pair for every different generic type you are going to use. This is inconvenient.TypeConverter
, whereTypeConverter
handles the concrete simple types andValuer
allows more complex types to be handled gracefully.It works in a very simple way: at the start of
copier()
andset()
functions, if the from value implementsValuer
,it is replaced with the one returned byCopyValue()
, and the usual process continues.Example use-case:
The
Undefined
type allows to know if a field in a structure is undefined (which is different fromnil
, in the case of nullable values). This is useful for PATCH updates so we just omit the fields that are not present.If the field is not present, the struct has its zero-value, which is handy so it can be ignored with the option
IgnoreEmpty
.