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 - `YamlLoader` structs now have a `documents()` method that returns the parsed
documents associated with a loader. documents associated with a loader.
- `Parser::new_from_str(&str)` and `YamlLoader::load_from_parser(&Parser)` were added.
**Development**: **Development**:
## v0.7.0 ## v0.7.0

View file

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

View file

@ -234,8 +234,20 @@ impl YamlLoader {
/// # Errors /// # Errors
/// Returns `ScanError` when loading fails. /// Returns `ScanError` when loading fails.
pub fn load_from_iter<I: Iterator<Item = char>>(source: I) -> Result<Vec<Yaml>, ScanError> { 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); 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)?; parser.load(&mut loader, true)?;
Ok(loader.docs) Ok(loader.docs)
} }