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-yaml
library in addition to custom unmarshalers, also allows partial unmarshaling intoast.Node
struct 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.Node
but 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.[*].with
which 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.Node
fields separately.This PR introduces
NodeUnmarshaler
andNodeUnmarshalerContext
interfaces that allow moving AST traversal into an unmarshaler.Testing
I've added tests for both new interfaces into
yaml_test.go