Valuer interface#191
Open
System-Glitch wants to merge 2 commits intojinzhu:masterfrom
Open
Conversation
Author
|
For those wanting this feature, I decided to maintain a fork: https://github.com/go-goyave/copier Contributions are also welcome there. |
| } | ||
|
|
||
| func copier(toValue interface{}, fromValue interface{}, opt Option) (err error) { | ||
|
|
| } | ||
|
|
||
| func TestCopyValuer(t *testing.T) { | ||
|
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.Valuerinterface. 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
TypeConverterin 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, whereTypeConverterhandles the concrete simple types andValuerallows 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
Undefinedtype 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.