yaml: add YamlLoader::load_from_parser(&Parser)

Make it easier to load documents from a prebuilt Parser.
This commit is contained in:
David Aguilar 2024-03-24 03:07:15 -07:00 committed by Ethiraric
parent c00b27bb95
commit d7f7c7ce15
3 changed files with 25 additions and 10 deletions

View file

@ -30,6 +30,8 @@ using that feature.
- `YamlLoader` structs now have a `documents()` method that returns the parsed
documents associated with a loader.
- `Parser::new_from_str(&str)` and `YamlLoader::load_from_parser(&Parser)` were added.
**Development**:
## v0.7.0

View file

@ -1126,17 +1126,18 @@ foo: "bar"
--- !t!2 &2
baz: "qux"
"#;
let mut loader = YamlLoader::default();
let mut parser = Parser::new(text.chars()).keep_tags(true);
assert!(parser.load(&mut loader, true).is_ok());
assert_eq!(loader.documents().len(), 2);
let yaml = &loader.documents()[0];
let mut parser = Parser::new_from_str(text).keep_tags(true);
let result = YamlLoader::load_from_parser(&mut parser);
assert!(result.is_ok());
let docs = result.unwrap();
assert_eq!(docs.len(), 2);
let yaml = &docs[0];
assert_eq!(yaml["foo"].as_str(), Some("bar"));
let yaml = &loader.documents()[1];
let yaml = &docs[1];
assert_eq!(yaml["baz"].as_str(), Some("qux"));
let mut loader = YamlLoader::default();
let mut parser = Parser::new(text.chars()).keep_tags(false);
assert!(parser.load(&mut loader, true).is_err());
let mut parser = Parser::new_from_str(text).keep_tags(false);
let result = YamlLoader::load_from_parser(&mut parser);
assert!(result.is_err());
}
}

View file

@ -234,8 +234,20 @@ impl YamlLoader {
/// # Errors
/// Returns `ScanError` when loading fails.
pub fn load_from_iter<I: Iterator<Item = char>>(source: I) -> Result<Vec<Yaml>, ScanError> {
let mut loader = YamlLoader::default();
let mut parser = Parser::new(source);
Self::load_from_parser(&mut parser)
}
/// Load the contents from the specified Parser as a set of YAML documents.
///
/// Parsing succeeds if and only if all documents are parsed successfully.
/// An error in a latter document prevents the former from being returned.
/// # Errors
/// Returns `ScanError` when loading fails.
pub fn load_from_parser<I: Iterator<Item = char>>(
parser: &mut Parser<I>,
) -> Result<Vec<Yaml>, ScanError> {
let mut loader = YamlLoader::default();
parser.load(&mut loader, true)?;
Ok(loader.docs)
}