Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow types to determine how to decode themselves #294

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

mthjs
Copy link

@mthjs mthjs commented Jun 27, 2022

When the destination of a decode implements the custom decoder interface, use said interface. Custom decoders take precedence over the default decoding rules.

This should resolve #115

Renamed the master -> main which closed the pull-request, sorry 馃槄

@wrouesnel
Copy link

I'd like to see this merged, though to offer one comment, the interface function - Decode() might be a bit too generic within the go-ecosystem? MapStructureDecode maybe?

@andig
Copy link

andig commented Sep 29, 2022

+1 for allowing objects to decode themselves.

Similar to the `UnarshalX` family of functions seen throughout
`encoding` and `encoding/json`, include the name of what is being
decoded into the function.
@mthjs
Copy link
Author

mthjs commented Dec 15, 2022

@wrouesnel I've applied your suggestion although I did swap the order. Like any of the standard-libraries UnmarshalX functions, I've opted to suffix the expected Decode function with Mapstructure instead of prefixing it.

@stephensli
Copy link

@mitchellh any interest in this being merged?

@dplepage-dd
Copy link

Would it be possible to make this work in both directions, so that e.g. decoding a Someone into an interface{} produces a string (the same way json allows customizing both MarshallJSON and UnmarshallJSON)?

There would be some ambiguity, I guess, since you could conceivably call Decode(x,y) with x and y both being types with custom encoder/decoders, but in practice I think it's rarely used as a generic converter, it's almost always either decoding from a map structure to a custom type or encoding from a custom type back to a map structure, so it would probably be fine to just error out in case of conflicting custom handlers.

if outVal.CanAddr() {
v := outVal.Addr()
if u, ok := v.Interface().(decoder); ok {
return u.DecodeMapstructure(input)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it might make more sense to put this after the DecodeHook, so that any custom preprocessing can still happen.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Implement JSON like unmarshaling interface
5 participants