-
-
Notifications
You must be signed in to change notification settings - Fork 36
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’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Anchor in ignored tag #117
Comments
There are two issues here: The first is the problem of referencing anchors in ignored structure. This is a non-trivial problem due to the way NimYAML deserializes data currently. There are some interesting nuances: anchors:
- &a
id: &b anchor
items:
- id: *b
- *a If NimYAML was to say „well I'll remember the anchored events for later“ then in this instance, it'd remember both the The second issue is that you want to deserialize an alias node into a non-ref type. This would currently fail even without the ignored part, e.g. items:
- &a
id: droggeljug
- *a You'd get
Should NimYAML support that in this special case? I don't think so; the rule
is simple while
makes the API rather confusing. When we take the second issue out of the equation by making |
Thank you again for your quick reply and thorough analysis! |
Workaround: var node: YamlNode
load(input, node)
var stream = represent(node, tsNone, asNone)
discard stream.next() # skip stream start event
var main: Main
construct(stream, main) This loads the YAML into a node graph, then generates a stream from those with |
This use-case has now been implemented via import yaml / [serialization, dom]
let input = """
anchors:
- &myAnchor
id: anchor
items:
- *myAnchor
"""
type
Main {.ignore: ["anchors"].} = object
items: seq[Item]
Item = object
id: string
var main: Main
loadFlattened(input, main)
echo $main
Error messages have been updated appropriately. |
I am using the workaround you proposed above in my code quite a lot by now, as it leverages the need to use Just as a reference for others who might want to use this, here is how it looks like with nim-yaml v2: var s: FileStream = newFileStream(filePath)
var node: YamlNode
load(s, node)
s.close()
# Inline anchors
var stream = represent(node, SerializationOptions(anchorStyle: asNone))
discard stream.next() # skip stream start event
var main: Main
construct(stream, main) |
Hi @flyx,
thank you so much for your unflinching support!
If I define an anchor in a scope that is ignored by NimYAML, it won't be recognized.
Non-working example:
With the following output:
Please note that in yaml/serialization.nim:1211,
e.aliasTarget
is notinc.refs
, soval.tag
is empty.I am not sure if this should be fixed or if just the error handling should be adapted, e.g., as follows:
If you want to fix this, you would probably need to construct the data (and add it to the context refs) when the yamlAlias is reached, as otherwise its data type is unknown.
Any feedback is appreciated.
Thank you!
The text was updated successfully, but these errors were encountered: