use crate::error::Error;
use crate::value::Value;
use super::parser::Parser;
pub(crate) fn parse_str(text: &str) -> Result<Value, Error> {
let mut parser = Parser::new();
let bytes = text.as_bytes();
let mut line_start: usize = 0;
let mut line_num: usize = 0;
while line_start <= bytes.len() {
let nl = bytes[line_start..].iter().position(|&b| b == b'\n');
let (end, next_start) = match nl {
Some(rel) => (line_start + rel, line_start + rel + 1),
None => {
if line_start == bytes.len() {
break;
}
(bytes.len(), bytes.len() + 1) }
};
let content_end = if end > line_start && bytes[end - 1] == b'\r' {
end - 1
} else {
end
};
let line: &str = &text[line_start..content_end];
line_num += 1;
parser.handle_line(line, line_num, line_start as u32)?;
line_start = next_start;
}
parser.finish(bytes.len() as u32)
}