feat: support receiving ast.Node in custom unmarshalers #642
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.
The
go-yamllibrary in addition to custom unmarshalers, also allows partial unmarshaling intoast.Nodestruct members.This can be useful when working with dynamic documents.
Unfortunately this is not enough when there is a need to have a custom type which needs to be constructed out of
ast.Nodebut you also would like to avoid inner unmarshaling insideTextUnmarshaler.In my case, this is also useful in order to provide a detailed information about position in returned syntax error.
Use-case demo
Let's assume you've an application which can accept some dynamic value which needs to be validated later.
Application accepts an input something like this:
Most of the content is static except
tasks.[*].withwhich can have different body depending on context.Currently in order to process that, you would need to unmarshal whole document into a struct below and process
ast.Nodefields separately.This PR introduces
NodeUnmarshalerandNodeUnmarshalerContextinterfaces that allow moving AST traversal into an unmarshaler.Testing
I've added tests for both new interfaces into
yaml_test.go