Skip to content

Conversation

@moretea
Copy link

@moretea moretea commented Jun 27, 2018

This work in progress pull request adds the markers to the output of the parser

Changes
  1. Renamed Yaml to Node, introduced struct Yaml(Option<Marker>, Node).
  2. Introduced HashItem. The key of the Hash will stay a Node without a Marker, we store the position of the key in this HashItem too.

I'm not very happy with the fact that now you need to use the .0 and .1 struct indices to get access to the marker or the node. I'll probably update these.

A question to you @chyh1990, is this something that you would merge eventually? Otherwise I'll be able to live with maintaining a fork for my own purpose.

Closes #103.

@dtolnay dtolnay added the wip label Sep 15, 2018
@dtolnay dtolnay changed the title [WIP] Keep markers in parsed output Keep markers in parsed output Sep 15, 2018
@hallettj
Copy link

@moretea Hi! I'm have a use case for source location markers. I am happy to contribute some time to get this PR finished and merged. Is there anything that I can do to help? What needs to be done to complete this work?

@hallettj
Copy link

As a start I merged the latest changes from master into the code for this PR. The result is in my fork at https://github.com/hallettj/yaml-rust/tree/keep_markers

hallettj pushed a commit to hallettj/yaml-rust that referenced this pull request Mar 26, 2019
…ce markers

fixes chyh1990#103, replaces chyh1990#105

The new function produces an alternative representation for YAML
documents where each YAML node is paired with a `Marker` to indicate the
corresponding line and column in the source markup. The new
representation takes the form of two new types, `Node` and `YamlMarked`.

`Node` is a pair of `YamlMarked` and `Marker`.

`YamlMarked` mimics the existing `Yaml` enum; the difference is that array
elements and hash keys and values are `Node` values instead of `Yaml` or
`YamlMarked` values. I created a new enum because I did not know of a way
to switch child nodes in `Yaml` between `Yaml` and `Node` types without
backward-incompatible changes to the `Yaml` enum.

The the behavior of the existing `load_from_str` function and `Yaml`
enum are unchanged, so pattern matching on results from `load_from_str`
will work as before.

To ensure consistent behavior for the `Node` and `Yaml` I moved methods
from the `impl Yaml` block to a new trait called `YamlNode` which is
implemented by `Yaml`, `Node`, and `YamlMarked`. This is a breaking
change since it means that consumers will have to import `YamlNode` to
use methods like `.as_str()` and `.is_array()`.

I want to present this pull request as one proposal. I think there is also
an argument for changing the existing `Yaml` type to incorporate source
location markers instead of maintaining two parallel enums.

While making changes I split up `yaml.rs` into three nested modules.
I can put it back the way it was if that is preferable.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants