parser: add Parser::new_from_str(&str)

This commit is contained in:
David Aguilar 2024-03-24 14:51:15 -07:00 committed by Ethiraric
parent 61b0e70a4e
commit c00b27bb95
6 changed files with 16 additions and 8 deletions

View file

@ -182,7 +182,7 @@ pub struct Parser<T> {
/// /// Load events from a yaml string. /// /// Load events from a yaml string.
/// fn str_to_events(yaml: &str) -> Vec<Event> { /// fn str_to_events(yaml: &str) -> Vec<Event> {
/// let mut sink = EventSink { events: Vec::new() }; /// let mut sink = EventSink { events: Vec::new() };
/// let mut parser = Parser::new(yaml.chars()); /// let mut parser = Parser::new_from_str(yaml);
/// // Load events using our sink as the receiver. /// // Load events using our sink as the receiver.
/// parser.load(&mut sink, true).unwrap(); /// parser.load(&mut sink, true).unwrap();
/// sink.events /// sink.events
@ -210,8 +210,16 @@ impl<R: EventReceiver> MarkedEventReceiver for R {
/// A convenience alias for a `Result` of a parser event. /// A convenience alias for a `Result` of a parser event.
pub type ParseResult = Result<(Event, Marker), ScanError>; pub type ParseResult = Result<(Event, Marker), ScanError>;
impl<'a> Parser<core::str::Chars<'a>> {
/// Create a new instance of a parser from a &str.
#[must_use]
pub fn new_from_str(value: &'a str) -> Self {
Parser::new(value.chars())
}
}
impl<T: Iterator<Item = char>> Parser<T> { impl<T: Iterator<Item = char>> Parser<T> {
/// Crate a new instance of a parser from the given input of characters. /// Create a new instance of a parser from the given input of characters.
pub fn new(src: T) -> Parser<T> { pub fn new(src: T) -> Parser<T> {
Parser { Parser {
scanner: Scanner::new(src), scanner: Scanner::new(src),
@ -1099,7 +1107,7 @@ a4:
- 2 - 2
a5: *x a5: *x
"; ";
let mut p = Parser::new(s.chars()); let mut p = Parser::new_from_str(s);
while { while {
let event_peek = p.peek().unwrap().clone(); let event_peek = p.peek().unwrap().clone();
let event = p.next_token().unwrap(); let event = p.next_token().unwrap();

View file

@ -49,7 +49,7 @@ impl EventReceiver for YamlChecker {
fn str_to_test_events(docs: &str) -> Vec<TestEvent> { fn str_to_test_events(docs: &str) -> Vec<TestEvent> {
let mut p = YamlChecker { evs: Vec::new() }; let mut p = YamlChecker { evs: Vec::new() };
let mut parser = Parser::new(docs.chars()); let mut parser = Parser::new_from_str(docs);
parser.load(&mut p, true).unwrap(); parser.load(&mut p, true).unwrap();
p.evs p.evs
} }

View file

@ -123,7 +123,7 @@ fn load_tests_from_file(entry: &DirEntry) -> Result<Vec<Test<YamlTest>>> {
fn parse_to_events(source: &str) -> Result<Vec<String>, ScanError> { fn parse_to_events(source: &str) -> Result<Vec<String>, ScanError> {
let mut reporter = EventReporter::new(); let mut reporter = EventReporter::new();
Parser::new(source.chars()).load(&mut reporter, true)?; Parser::new_from_str(source).load(&mut reporter, true)?;
Ok(reporter.events) Ok(reporter.events)
} }

View file

@ -21,7 +21,7 @@ impl MarkedEventReceiver for EventSink {
fn str_to_events(yaml: &str) -> Vec<(Event, Marker)> { fn str_to_events(yaml: &str) -> Vec<(Event, Marker)> {
let mut sink = EventSink { events: Vec::new() }; let mut sink = EventSink { events: Vec::new() };
let mut parser = Parser::new(yaml.chars()); let mut parser = Parser::new_from_str(yaml);
// Load events using our sink as the receiver. // Load events using our sink as the receiver.
parser.load(&mut sink, true).unwrap(); parser.load(&mut sink, true).unwrap();
sink.events sink.events

View file

@ -17,7 +17,7 @@ impl MarkedEventReceiver for NullSink {
/// Parse the given input, returning elapsed time in nanoseconds. /// Parse the given input, returning elapsed time in nanoseconds.
fn do_parse(input: &str) -> u64 { fn do_parse(input: &str) -> u64 {
let mut sink = NullSink {}; let mut sink = NullSink {};
let mut parser = Parser::new(input.chars()); let mut parser = Parser::new_from_str(input);
let begin = std::time::Instant::now(); let begin = std::time::Instant::now();
parser.load(&mut sink, true).unwrap(); parser.load(&mut sink, true).unwrap();
let end = std::time::Instant::now(); let end = std::time::Instant::now();

View file

@ -21,7 +21,7 @@ fn main() {
f.read_to_string(&mut s).unwrap(); f.read_to_string(&mut s).unwrap();
let mut sink = NullSink {}; let mut sink = NullSink {};
let mut parser = Parser::new(s.chars()); let mut parser = Parser::new_from_str(&s);
// Load events using our sink as the receiver. // Load events using our sink as the receiver.
let begin = std::time::Instant::now(); let begin = std::time::Instant::now();