Documents Reader and use idiomatic naming for methods.

This commit is contained in:
jcamiel 2023-04-16 14:32:46 +02:00
parent 28292ef114
commit bd2a7f4e9a
No known key found for this signature in database
GPG Key ID: 07FF11CFD55356CC
26 changed files with 500 additions and 469 deletions

View File

@ -23,7 +23,7 @@ use super::reader::Reader;
use super::ParseResult;
pub fn parse(s: &str) -> Result<Query, Error> {
let mut reader = Reader::init(s);
let mut reader = Reader::new(s);
query(&mut reader)
}
@ -296,15 +296,15 @@ mod tests {
#[test]
pub fn test_try_left_bracket() {
let mut reader = Reader::init("xxx");
let mut reader = Reader::new("xxx");
let error = try_left_bracket(&mut reader).err().unwrap();
assert!(error.recoverable);
let mut reader = Reader::init("[xxx");
let mut reader = Reader::new("[xxx");
assert!(try_left_bracket(&mut reader).is_ok());
assert_eq!(reader.state.cursor, 1);
let mut reader = Reader::init(".[xxx");
let mut reader = Reader::new(".[xxx");
assert!(try_left_bracket(&mut reader).is_ok());
assert_eq!(reader.state.cursor, 2);
}
@ -314,26 +314,23 @@ mod tests {
let expected_query = Query {
selectors: vec![Selector::ArrayIndex(vec![2])],
};
assert_eq!(query(&mut Reader::init("$[2]")).unwrap(), expected_query);
assert_eq!(query(&mut Reader::new("$[2]")).unwrap(), expected_query);
let expected_query = Query {
selectors: vec![Selector::NameChild("key".to_string())],
};
assert_eq!(
query(&mut Reader::init("$['key']")).unwrap(),
expected_query
);
assert_eq!(query(&mut Reader::init("$.key")).unwrap(), expected_query);
assert_eq!(query(&mut Reader::new("$['key']")).unwrap(), expected_query);
assert_eq!(query(&mut Reader::new("$.key")).unwrap(), expected_query);
let expected_query = Query {
selectors: vec![Selector::NameChild("profile-id".to_string())],
};
assert_eq!(
query(&mut Reader::init("$['profile-id']")).unwrap(),
query(&mut Reader::new("$['profile-id']")).unwrap(),
expected_query
);
assert_eq!(
query(&mut Reader::init("$.profile-id")).unwrap(),
query(&mut Reader::new("$.profile-id")).unwrap(),
expected_query
);
@ -346,11 +343,11 @@ mod tests {
],
};
assert_eq!(
query(&mut Reader::init("$.store.book[0].title")).unwrap(),
query(&mut Reader::new("$.store.book[0].title")).unwrap(),
expected_query
);
assert_eq!(
query(&mut Reader::init("$['store']['book'][0]['title']")).unwrap(),
query(&mut Reader::new("$['store']['book'][0]['title']")).unwrap(),
expected_query
);
@ -361,24 +358,24 @@ mod tests {
],
};
assert_eq!(
query(&mut Reader::init("$..book[2]")).unwrap(),
query(&mut Reader::new("$..book[2]")).unwrap(),
expected_query
);
}
#[test]
pub fn test_query_error() {
let error = query(&mut Reader::init("?$.store")).err().unwrap();
let error = query(&mut Reader::new("?$.store")).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
let error = query(&mut Reader::init("$.store?")).err().unwrap();
let error = query(&mut Reader::new("$.store?")).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 8 });
}
#[test]
pub fn test_selector_filter() {
// Filter exist value
let mut reader = Reader::init("[?(@.isbn)]");
let mut reader = Reader::new("[?(@.isbn)]");
assert_eq!(
selector(&mut reader).unwrap(),
Selector::Filter(Predicate {
@ -389,7 +386,7 @@ mod tests {
assert_eq!(reader.state.cursor, 11);
// Filter equal on string with single quotes
let mut reader = Reader::init("[?(@.key=='value')]");
let mut reader = Reader::new("[?(@.key=='value')]");
assert_eq!(
selector(&mut reader).unwrap(),
Selector::Filter(Predicate {
@ -399,7 +396,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 19);
let mut reader = Reader::init("[?(@.price<10)]");
let mut reader = Reader::new("[?(@.price<10)]");
assert_eq!(
selector(&mut reader).unwrap(),
Selector::Filter(Predicate {
@ -415,7 +412,7 @@ mod tests {
#[test]
pub fn test_selector_recursive() {
let mut reader = Reader::init("..book");
let mut reader = Reader::new("..book");
assert_eq!(
selector(&mut reader).unwrap(),
Selector::RecursiveKey("book".to_string())
@ -425,14 +422,14 @@ mod tests {
#[test]
pub fn test_selector_array_index() {
let mut reader = Reader::init("[2]");
let mut reader = Reader::new("[2]");
assert_eq!(
selector(&mut reader).unwrap(),
Selector::ArrayIndex(vec![2])
);
assert_eq!(reader.state.cursor, 3);
let mut reader = Reader::init("[0,1]");
let mut reader = Reader::new("[0,1]");
assert_eq!(
selector(&mut reader).unwrap(),
Selector::ArrayIndex(vec![0, 1])
@ -441,7 +438,7 @@ mod tests {
// you don't need to keep the exact string
// this is not part of the AST
let mut reader = Reader::init(".[2]");
let mut reader = Reader::new(".[2]");
assert_eq!(
selector(&mut reader).unwrap(),
Selector::ArrayIndex(vec![2])
@ -451,20 +448,20 @@ mod tests {
#[test]
pub fn test_selector_wildcard() {
let mut reader = Reader::init("[*]");
let mut reader = Reader::new("[*]");
assert_eq!(selector(&mut reader).unwrap(), Selector::ArrayWildcard {});
assert_eq!(reader.state.cursor, 3);
// you don't need to keep the exact string
// this is not part of the AST
let mut reader = Reader::init(".[*]");
let mut reader = Reader::new(".[*]");
assert_eq!(selector(&mut reader).unwrap(), Selector::ArrayWildcard {});
assert_eq!(reader.state.cursor, 4);
}
#[test]
pub fn test_selector_array_slice() {
let mut reader = Reader::init("[-1:]");
let mut reader = Reader::new("[-1:]");
assert_eq!(
selector(&mut reader).unwrap(),
Selector::ArraySlice(Slice {
@ -474,7 +471,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 5);
let mut reader = Reader::init("[:2]");
let mut reader = Reader::new("[:2]");
assert_eq!(
selector(&mut reader).unwrap(),
Selector::ArraySlice(Slice {
@ -487,21 +484,21 @@ mod tests {
#[test]
pub fn test_key_bracket_selector() {
let mut reader = Reader::init("['key']");
let mut reader = Reader::new("['key']");
assert_eq!(
selector(&mut reader).unwrap(),
Selector::NameChild("key".to_string())
);
assert_eq!(reader.state.cursor, 7);
let mut reader = Reader::init(".['key']");
let mut reader = Reader::new(".['key']");
assert_eq!(
selector(&mut reader).unwrap(),
Selector::NameChild("key".to_string())
);
assert_eq!(reader.state.cursor, 8);
let mut reader = Reader::init("['key1']");
let mut reader = Reader::new("['key1']");
assert_eq!(
selector(&mut reader).unwrap(),
Selector::NameChild("key1".to_string())
@ -511,14 +508,14 @@ mod tests {
#[test]
pub fn test_selector_key_dot_notation() {
let mut reader = Reader::init(".key");
let mut reader = Reader::new(".key");
assert_eq!(
selector(&mut reader).unwrap(),
Selector::NameChild("key".to_string())
);
assert_eq!(reader.state.cursor, 4);
let mut reader = Reader::init(".key1");
let mut reader = Reader::new(".key1");
assert_eq!(
selector(&mut reader).unwrap(),
Selector::NameChild("key1".to_string())
@ -530,7 +527,7 @@ mod tests {
pub fn test_predicate() {
// Key exists
assert_eq!(
predicate(&mut Reader::init("@.isbn")).unwrap(),
predicate(&mut Reader::new("@.isbn")).unwrap(),
Predicate {
key: vec!["isbn".to_string()],
func: PredicateFunc::KeyExist {},
@ -539,7 +536,7 @@ mod tests {
// Filter equal on string with single quotes
assert_eq!(
predicate(&mut Reader::init("@.key=='value'")).unwrap(),
predicate(&mut Reader::new("@.key=='value'")).unwrap(),
Predicate {
key: vec!["key".to_string()],
func: PredicateFunc::EqualString("value".to_string()),
@ -548,7 +545,7 @@ mod tests {
// Filter equal on int
assert_eq!(
predicate(&mut Reader::init("@.key==1")).unwrap(),
predicate(&mut Reader::new("@.key==1")).unwrap(),
Predicate {
key: vec!["key".to_string()],
func: PredicateFunc::Equal(Number { int: 1, decimal: 0 }),
@ -557,7 +554,7 @@ mod tests {
// Filter equal on int for key in object
assert_eq!(
predicate(&mut Reader::init("@.obj.key==1")).unwrap(),
predicate(&mut Reader::new("@.obj.key==1")).unwrap(),
Predicate {
key: vec!["obj".to_string(), "key".to_string()],
func: PredicateFunc::Equal(Number { int: 1, decimal: 0 }),
@ -566,7 +563,7 @@ mod tests {
// Filter less than int
assert_eq!(
predicate(&mut Reader::init("@.price<10")).unwrap(),
predicate(&mut Reader::new("@.price<10")).unwrap(),
Predicate {
key: vec!["price".to_string()],
func: PredicateFunc::LessThan(Number {
@ -579,14 +576,14 @@ mod tests {
#[test]
pub fn test_predicate_func() {
let mut reader = Reader::init("==2");
let mut reader = Reader::new("==2");
assert_eq!(
predicate_func(&mut reader).unwrap(),
PredicateFunc::Equal(Number { int: 2, decimal: 0 })
);
assert_eq!(reader.state.cursor, 3);
let mut reader = Reader::init("==2.1");
let mut reader = Reader::new("==2.1");
assert_eq!(
predicate_func(&mut reader).unwrap(),
PredicateFunc::Equal(Number {
@ -596,7 +593,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 5);
let mut reader = Reader::init("== 2.1 ");
let mut reader = Reader::new("== 2.1 ");
assert_eq!(
predicate_func(&mut reader).unwrap(),
PredicateFunc::Equal(Number {
@ -606,35 +603,35 @@ mod tests {
);
assert_eq!(reader.state.cursor, 7);
let mut reader = Reader::init("=='hello'");
let mut reader = Reader::new("=='hello'");
assert_eq!(
predicate_func(&mut reader).unwrap(),
PredicateFunc::EqualString("hello".to_string())
);
assert_eq!(reader.state.cursor, 9);
let mut reader = Reader::init(">5");
let mut reader = Reader::new(">5");
assert_eq!(
predicate_func(&mut reader).unwrap(),
PredicateFunc::GreaterThan(Number { int: 5, decimal: 0 })
);
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init(">=5");
let mut reader = Reader::new(">=5");
assert_eq!(
predicate_func(&mut reader).unwrap(),
PredicateFunc::GreaterThanOrEqual(Number { int: 5, decimal: 0 })
);
assert_eq!(reader.state.cursor, 3);
let mut reader = Reader::init("<5");
let mut reader = Reader::new("<5");
assert_eq!(
predicate_func(&mut reader).unwrap(),
PredicateFunc::LessThan(Number { int: 5, decimal: 0 })
);
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("<=5");
let mut reader = Reader::new("<=5");
assert_eq!(
predicate_func(&mut reader).unwrap(),
PredicateFunc::LessThanOrEqual(Number { int: 5, decimal: 0 })

View File

@ -252,22 +252,22 @@ mod tests {
#[test]
fn test_natural() {
let mut reader = Reader::init("0");
let mut reader = Reader::new("0");
assert_eq!(natural(&mut reader).unwrap(), 0);
assert_eq!(reader.state.cursor, 1);
let mut reader = Reader::init("0.");
let mut reader = Reader::new("0.");
assert_eq!(natural(&mut reader).unwrap(), 0);
assert_eq!(reader.state.cursor, 1);
let mut reader = Reader::init("10x");
let mut reader = Reader::new("10x");
assert_eq!(natural(&mut reader).unwrap(), 10);
assert_eq!(reader.state.cursor, 2);
}
#[test]
fn test_natural_error() {
let mut reader = Reader::init("");
let mut reader = Reader::new("");
let error = natural(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -278,7 +278,7 @@ mod tests {
);
assert!(error.recoverable);
let mut reader = Reader::init("01");
let mut reader = Reader::new("01");
let error = natural(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 2 });
assert_eq!(
@ -289,7 +289,7 @@ mod tests {
);
assert!(!error.recoverable);
let mut reader = Reader::init("x");
let mut reader = Reader::new("x");
let error = natural(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -303,16 +303,16 @@ mod tests {
#[test]
pub fn test_integer() {
let mut reader = Reader::init("1");
let mut reader = Reader::new("1");
assert_eq!(integer(&mut reader).unwrap(), 1);
let mut reader = Reader::init("1.1");
let mut reader = Reader::new("1.1");
assert_eq!(integer(&mut reader).unwrap(), 1);
let mut reader = Reader::init("-1.1");
let mut reader = Reader::new("-1.1");
assert_eq!(integer(&mut reader).unwrap(), -1);
let mut reader = Reader::init("x");
let mut reader = Reader::new("x");
let error = integer(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -326,15 +326,15 @@ mod tests {
#[test]
fn test_number() {
let mut reader = Reader::init("1");
let mut reader = Reader::new("1");
assert_eq!(number(&mut reader).unwrap(), Number { int: 1, decimal: 0 });
assert_eq!(reader.state.cursor, 1);
let mut reader = Reader::init("1.0");
let mut reader = Reader::new("1.0");
assert_eq!(number(&mut reader).unwrap(), Number { int: 1, decimal: 0 });
assert_eq!(reader.state.cursor, 3);
let mut reader = Reader::init("-1.0");
let mut reader = Reader::new("-1.0");
assert_eq!(
number(&mut reader).unwrap(),
Number {
@ -344,7 +344,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 4);
let mut reader = Reader::init("1.1");
let mut reader = Reader::new("1.1");
assert_eq!(
number(&mut reader).unwrap(),
Number {
@ -354,7 +354,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 3);
let mut reader = Reader::init("1.100");
let mut reader = Reader::new("1.100");
assert_eq!(
number(&mut reader).unwrap(),
Number {
@ -364,7 +364,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 5);
let mut reader = Reader::init("1.01");
let mut reader = Reader::new("1.01");
assert_eq!(
number(&mut reader).unwrap(),
Number {
@ -374,7 +374,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 4);
let mut reader = Reader::init("1.010");
let mut reader = Reader::new("1.010");
assert_eq!(
number(&mut reader).unwrap(),
Number {
@ -384,7 +384,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 5);
let mut reader = Reader::init("-0.333333333333333333");
let mut reader = Reader::new("-0.333333333333333333");
assert_eq!(
number(&mut reader).unwrap(),
Number {
@ -397,7 +397,7 @@ mod tests {
#[test]
fn test_number_error() {
let mut reader = Reader::init("");
let mut reader = Reader::new("");
let error = number(&mut reader).err().unwrap();
assert_eq!(
error.inner,
@ -408,7 +408,7 @@ mod tests {
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert!(error.recoverable);
let mut reader = Reader::init("-");
let mut reader = Reader::new("-");
let error = number(&mut reader).err().unwrap();
assert_eq!(
error.inner,
@ -419,7 +419,7 @@ mod tests {
assert_eq!(error.pos, Pos { line: 1, column: 2 });
assert!(error.recoverable);
let mut reader = Reader::init("1.");
let mut reader = Reader::new("1.");
let error = number(&mut reader).err().unwrap();
assert_eq!(
error.inner,
@ -430,7 +430,7 @@ mod tests {
assert_eq!(error.pos, Pos { line: 1, column: 3 });
assert!(!error.recoverable);
let mut reader = Reader::init("1.x");
let mut reader = Reader::new("1.x");
let error = number(&mut reader).err().unwrap();
assert_eq!(
error.inner,
@ -444,13 +444,13 @@ mod tests {
#[test]
fn test_string_value() {
let mut reader = Reader::init("'hello'");
let mut reader = Reader::new("'hello'");
assert_eq!(string_value(&mut reader).unwrap(), "hello".to_string());
let mut reader = Reader::init("'\\''");
let mut reader = Reader::new("'\\''");
assert_eq!(string_value(&mut reader).unwrap(), "'".to_string());
let mut reader = Reader::init("1");
let mut reader = Reader::new("1");
let error = string_value(&mut reader).err().unwrap();
assert_eq!(
error.inner,
@ -461,7 +461,7 @@ mod tests {
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert!(error.recoverable);
let mut reader = Reader::init("'hi");
let mut reader = Reader::new("'hi");
let error = string_value(&mut reader).err().unwrap();
assert_eq!(
error.inner,
@ -475,13 +475,13 @@ mod tests {
#[test]
fn test_key_name() {
let mut reader = Reader::init("id'");
let mut reader = Reader::new("id'");
assert_eq!(key_name(&mut reader).unwrap(), "id".to_string());
let mut reader = Reader::init("id123");
let mut reader = Reader::new("id123");
assert_eq!(key_name(&mut reader).unwrap(), "id123".to_string());
let mut reader = Reader::init(".");
let mut reader = Reader::new(".");
let error = key_name(&mut reader).err().unwrap();
assert!(!error.recoverable);
assert_eq!(
@ -491,7 +491,7 @@ mod tests {
}
);
let mut reader = Reader::init("1id");
let mut reader = Reader::new("1id");
let error = key_name(&mut reader).err().unwrap();
assert!(!error.recoverable);
assert_eq!(
@ -504,10 +504,10 @@ mod tests {
#[test]
fn test_key_path() {
let mut reader = Reader::init("id");
let mut reader = Reader::new("id");
assert_eq!(key_path(&mut reader).unwrap(), vec!["id".to_string()]);
let mut reader = Reader::init("key1.key2");
let mut reader = Reader::new("key1.key2");
assert_eq!(
key_path(&mut reader).unwrap(),
vec!["key1".to_string(), "key2".to_string()]
@ -516,15 +516,15 @@ mod tests {
#[test]
fn test_literal() {
let mut reader = Reader::init("hello");
let mut reader = Reader::new("hello");
assert_eq!(literal("hello", &mut reader), Ok(()));
assert_eq!(reader.state.cursor, 5);
let mut reader = Reader::init("hello ");
let mut reader = Reader::new("hello ");
assert_eq!(literal("hello", &mut reader), Ok(()));
assert_eq!(reader.state.cursor, 6);
let mut reader = Reader::init("");
let mut reader = Reader::new("");
let error = literal("hello", &mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -535,7 +535,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 0);
let mut reader = Reader::init("hi");
let mut reader = Reader::new("hi");
let error = literal("hello", &mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -546,7 +546,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("he");
let mut reader = Reader::new("he");
let error = literal("hello", &mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(

View File

@ -15,8 +15,11 @@
* limitations under the License.
*
*/
use std::cmp::min;
use super::Pos;
/// Represents a JSONPath reader.
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Reader {
pub buffer: Vec<char>,
@ -30,7 +33,8 @@ pub struct ReaderState {
}
impl Reader {
pub fn init(s: &str) -> Reader {
/// Creates a new reader.
pub fn new(s: &str) -> Reader {
Reader {
buffer: s.chars().collect(),
state: ReaderState {
@ -40,10 +44,12 @@ impl Reader {
}
}
/// Returns true if the reader has read all the buffer, false otherwise.
pub fn is_eof(&self) -> bool {
self.state.cursor == self.buffer.len()
}
/// Returns the next char from the buffer advancing the internal state.
pub fn read(&mut self) -> Option<char> {
match self.buffer.get(self.state.cursor) {
None => None,
@ -61,10 +67,20 @@ impl Reader {
}
}
pub fn peek(&mut self) -> Option<char> {
self.buffer.get(self.state.cursor).copied()
/// Returns `count` chars from the buffer advancing the internal state.
/// This methods can returns less than `count` chars if there is not enough chars in the buffer.
pub fn read_n(&mut self, count: usize) -> String {
let mut s = String::from("");
for _ in 0..count {
match self.read() {
None => {}
Some(c) => s.push(c),
}
}
s
}
/// Returns chars from the buffer while `predicate` is true, advancing the internal state.
pub fn read_while(&mut self, predicate: fn(&char) -> bool) -> String {
let mut s = String::from("");
loop {
@ -81,32 +97,27 @@ impl Reader {
}
}
// assume that you still have count characters to read in your buffer
pub fn read_n(&mut self, count: usize) -> String {
let mut s = String::from("");
for _ in 0..count {
match self.read() {
None => {}
Some(c) => s.push(c),
}
}
s
/// Returns the next char from the buffer without advancing the internal state.
pub fn peek(&mut self) -> Option<char> {
self.buffer.get(self.state.cursor).copied()
}
/// Returns the `count` char from the buffer without advancing the internal state.
/// This methods can returns less than `count` chars if there is not enough chars in the buffer.
pub fn peek_n(&self, count: usize) -> String {
let start = self.state.cursor;
let end = min(start + count, self.buffer.len());
self.buffer[start..end].iter().collect()
}
pub fn try_literal(&mut self, value: &str) -> bool {
if self.remaining().starts_with(value.to_string().as_str()) {
if self.peek_n(value.len()) == value {
self.read_n(value.len());
true
} else {
false
}
}
pub fn remaining(&self) -> String {
self.buffer.as_slice()[self.state.cursor..self.buffer.len()]
.iter()
.collect()
}
}
fn is_combining_character(c: char) -> bool {
@ -119,10 +130,10 @@ mod tests {
#[test]
fn test_reader() {
let mut reader = Reader::init("hi");
let mut reader = Reader::new("hi");
assert_eq!(reader.state.cursor, 0);
assert!(!reader.is_eof());
assert_eq!(reader.remaining(), "hi".to_string());
assert_eq!(reader.peek_n(2), "hi".to_string());
assert_eq!(reader.read().unwrap(), 'h');
assert_eq!(reader.state.cursor, 1);
@ -135,11 +146,11 @@ mod tests {
#[test]
fn test_try_predicate() {
let mut reader = Reader::init("hi");
let mut reader = Reader::new("hi");
assert!(reader.try_literal("hi"));
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("hello");
let mut reader = Reader::new("hello");
assert!(!reader.try_literal("hi"));
assert_eq!(reader.state.cursor, 0);
}

View File

@ -69,7 +69,7 @@ pub fn eval_json_value(
// The String can only be null, a bool, a number
// It will be easier when your variables value have a type
let mut reader = Reader::init(s.as_str());
let mut reader = Reader::new(s.as_str());
let start = reader.state.clone();
if parse_json_number(&mut reader).is_ok() {
return Ok(s);

View File

@ -181,27 +181,27 @@ mod tests {
#[test]
fn test_decode_one_block() {
let mut reader = Reader::init("");
let mut reader = Reader::new("");
assert_eq!(parse(&mut reader), vec![] as Vec<u8>);
assert_eq!(reader.state.cursor, 0);
let mut reader = Reader::init("AA==;");
let mut reader = Reader::new("AA==;");
assert_eq!(parse(&mut reader), vec![0]);
assert_eq!(reader.state.cursor, 4);
let mut reader = Reader::init("AA");
let mut reader = Reader::new("AA");
assert_eq!(parse(&mut reader), vec![0]);
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("AA;");
let mut reader = Reader::new("AA;");
assert_eq!(parse(&mut reader), vec![0]);
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("TWE=;");
let mut reader = Reader::new("TWE=;");
assert_eq!(parse(&mut reader), vec![77, 97]);
assert_eq!(reader.state.cursor, 4);
let mut reader = Reader::init("TWFu;");
let mut reader = Reader::new("TWFu;");
assert_eq!(parse(&mut reader), vec![77, 97, 110]);
assert_eq!(reader.state.cursor, 4);
}
@ -222,29 +222,29 @@ mod tests {
#[test]
fn test_decode_with_padding() {
let mut reader = Reader::init("YW55IGNhcm5hbCBwbGVhcw==;");
let mut reader = Reader::new("YW55IGNhcm5hbCBwbGVhcw==;");
let decoded = parse(&mut reader);
assert_eq!(decoded, b"any carnal pleas");
let mut reader = Reader::init("YW55IGNhcm5hbCBwbGVhc3U=;");
let mut reader = Reader::new("YW55IGNhcm5hbCBwbGVhc3U=;");
assert_eq!(parse(&mut reader), b"any carnal pleasu");
let mut reader = Reader::init("YW55IGNhcm5hbCBwbGVhc3Vy;");
let mut reader = Reader::new("YW55IGNhcm5hbCBwbGVhc3Vy;");
assert_eq!(parse(&mut reader), b"any carnal pleasur");
}
#[test]
fn test_decode_without_padding() {
let mut reader = Reader::init("YW55IGNhcm5hbCBwbGVhcw;");
let mut reader = Reader::new("YW55IGNhcm5hbCBwbGVhcw;");
assert_eq!(parse(&mut reader), b"any carnal pleas");
let mut reader = Reader::init("YW55IGNhcm5hbCBwbGVhc3U;");
let mut reader = Reader::new("YW55IGNhcm5hbCBwbGVhc3U;");
assert_eq!(parse(&mut reader), b"any carnal pleasu");
}
#[test]
fn test_decode_with_whitespace() {
let mut reader = Reader::init("TW E=\n;");
let mut reader = Reader::new("TW E=\n;");
assert_eq!(parse(&mut reader), vec![77, 97]);
assert_eq!(reader.state.cursor, 5);
}

View File

@ -80,7 +80,7 @@ mod tests {
#[test]
fn test_bytes_json() {
let mut reader = Reader::init("[1,2,3] ");
let mut reader = Reader::new("[1,2,3] ");
assert_eq!(
bytes(&mut reader).unwrap(),
Bytes::Json(JsonValue::List {
@ -106,7 +106,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 7);
let mut reader = Reader::init("{ } ");
let mut reader = Reader::new("{ } ");
assert_eq!(
bytes(&mut reader).unwrap(),
Bytes::Json(JsonValue::Object {
@ -116,14 +116,14 @@ mod tests {
);
assert_eq!(reader.state.cursor, 3);
let mut reader = Reader::init("true");
let mut reader = Reader::new("true");
assert_eq!(
bytes(&mut reader).unwrap(),
Bytes::Json(JsonValue::Boolean(true))
);
assert_eq!(reader.state.cursor, 4);
let mut reader = Reader::init("\"\" x");
let mut reader = Reader::new("\"\" x");
assert_eq!(
bytes(&mut reader).unwrap(),
Bytes::Json(JsonValue::String(Template {
@ -137,7 +137,7 @@ mod tests {
#[test]
fn test_bytes_xml() {
let mut reader = Reader::init("<a/>");
let mut reader = Reader::new("<a/>");
assert_eq!(
bytes(&mut reader).unwrap(),
Bytes::Xml(String::from("<a/>"))
@ -146,7 +146,7 @@ mod tests {
#[test]
fn test_bytes_json_error() {
let mut reader = Reader::init("{ x ");
let mut reader = Reader::new("{ x ");
let error = bytes(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 3 });
assert_eq!(
@ -159,7 +159,7 @@ mod tests {
#[test]
fn test_bytes_multilines_error() {
let mut reader = Reader::init("```\nxxx ");
let mut reader = Reader::new("```\nxxx ");
let error = bytes(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 4 });
assert_eq!(error.inner, ParseError::Multiline);
@ -167,7 +167,7 @@ mod tests {
#[test]
fn test_bytes_eof() {
let mut reader = Reader::init("");
let mut reader = Reader::new("");
let error = bytes(&mut reader).err().unwrap();
assert_eq!(
error.inner,
@ -180,7 +180,7 @@ mod tests {
#[test]
fn test_json_bytes() {
let mut reader = Reader::init("100");
let mut reader = Reader::new("100");
assert_eq!(
json_bytes(&mut reader).unwrap(),
Bytes::Json(JsonValue::Number("100".to_string()))
@ -189,7 +189,7 @@ mod tests {
#[test]
fn test_bytes_string() {
let mut reader = Reader::init("`foo` ");
let mut reader = Reader::new("`foo` ");
assert_eq!(
bytes(&mut reader).unwrap(),
Bytes::OnelineString(Template {

View File

@ -26,7 +26,7 @@ use crate::parser::ParseResult;
pub fn cookiepath(reader: &mut Reader) -> ParseResult<'static, CookiePath> {
let start = reader.state.pos.clone();
let s = reader.read_while(|c| *c != '[');
let mut template_reader = Reader::init(s.as_str());
let mut template_reader = Reader::new(s.as_str());
template_reader.state.pos = start;
let name = unquoted_template(&mut template_reader)?;
let attribute = optional(cookiepath_attribute, reader)?;
@ -73,7 +73,7 @@ mod tests {
#[test]
fn test_cookiepath_simple() {
let mut reader = Reader::init("cookie1");
let mut reader = Reader::new("cookie1");
assert_eq!(
cookiepath(&mut reader).unwrap(),
CookiePath {
@ -93,7 +93,7 @@ mod tests {
#[test]
fn test_cookiepath_with_attribute() {
let mut reader = Reader::init("cookie1[Domain]");
let mut reader = Reader::new("cookie1[Domain]");
assert_eq!(
cookiepath(&mut reader).unwrap(),
CookiePath {
@ -123,7 +123,7 @@ mod tests {
#[test]
fn test_cookiepath_with_template() {
let mut reader = Reader::init("{{name}}[Domain]");
let mut reader = Reader::new("{{name}}[Domain]");
assert_eq!(
cookiepath(&mut reader).unwrap(),
CookiePath {
@ -163,13 +163,13 @@ mod tests {
#[test]
fn test_cookiepath_error() {
let mut reader = Reader::init("cookie1[");
let mut reader = Reader::new("cookie1[");
let error = cookiepath(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 9 });
assert_eq!(error.inner, ParseError::InvalidCookieAttribute {});
assert!(!error.recoverable);
let mut reader = Reader::init("cookie1[{{field]");
let mut reader = Reader::new("cookie1[{{field]");
let error = cookiepath(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 9 });
assert_eq!(error.inner, ParseError::InvalidCookieAttribute {});
@ -178,21 +178,21 @@ mod tests {
#[test]
fn test_cookie_attribute_name() {
let mut reader = Reader::init("Domain");
let mut reader = Reader::new("Domain");
assert_eq!(
cookiepath_attribute_name(&mut reader).unwrap(),
CookieAttributeName::Domain("Domain".to_string())
);
assert_eq!(reader.state.cursor, 6);
let mut reader = Reader::init("domain");
let mut reader = Reader::new("domain");
assert_eq!(
cookiepath_attribute_name(&mut reader).unwrap(),
CookieAttributeName::Domain("domain".to_string())
);
assert_eq!(reader.state.cursor, 6);
let mut reader = Reader::init("unknown");
let mut reader = Reader::new("unknown");
let error = cookiepath_attribute_name(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(error.inner, ParseError::InvalidCookieAttribute {});

View File

@ -83,7 +83,7 @@ mod tests {
#[test]
fn test_expr() {
let mut reader = Reader::init("{{ name}}");
let mut reader = Reader::new("{{ name}}");
assert_eq!(
parse(&mut reader).unwrap(),
Expr {
@ -105,7 +105,7 @@ mod tests {
#[test]
fn test_expr_error() {
let mut reader = Reader::init("{{host>}}");
let mut reader = Reader::new("{{host>}}");
let error = parse(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 7 });
assert_eq!(
@ -119,7 +119,7 @@ mod tests {
#[test]
fn test_expr_error_eof() {
let mut reader = Reader::init("{{host");
let mut reader = Reader::new("{{host");
let error = parse(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 7 });
assert_eq!(
@ -133,7 +133,7 @@ mod tests {
#[test]
fn test_variable() {
let mut reader = Reader::init("name");
let mut reader = Reader::new("name");
assert_eq!(
variable_name(&mut reader).unwrap(),
Variable {
@ -142,7 +142,7 @@ mod tests {
}
);
let mut reader = Reader::init("my-id");
let mut reader = Reader::new("my-id");
assert_eq!(
variable_name(&mut reader).unwrap(),
Variable {

View File

@ -52,7 +52,7 @@ mod tests {
#[test]
fn test_filename() {
let mut reader = Reader::init("data/data.bin");
let mut reader = Reader::new("data/data.bin");
assert_eq!(
parse(&mut reader).unwrap(),
Filename {
@ -62,7 +62,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 13);
let mut reader = Reader::init("data.bin");
let mut reader = Reader::new("data.bin");
assert_eq!(
parse(&mut reader).unwrap(),
Filename {
@ -75,7 +75,7 @@ mod tests {
#[test]
fn test_include_space() {
let mut reader = Reader::init("file\\ with\\ spaces");
let mut reader = Reader::new("file\\ with\\ spaces");
assert_eq!(
parse(&mut reader).unwrap(),
Filename {
@ -88,7 +88,7 @@ mod tests {
#[test]
fn test_filename_error() {
let mut reader = Reader::init("???");
let mut reader = Reader::new("???");
let error = parse(&mut reader).err().unwrap();
assert_eq!(error.inner, ParseError::Filename {});
assert_eq!(error.pos, Pos { line: 1, column: 1 });

View File

@ -183,7 +183,7 @@ mod tests {
#[test]
fn test_count() {
let mut reader = Reader::init("count");
let mut reader = Reader::new("count");
assert_eq!(
filter(&mut reader).unwrap(),
Filter {
@ -195,7 +195,7 @@ mod tests {
#[test]
fn test_error() {
let mut reader = Reader::init("xcount");
let mut reader = Reader::new("xcount");
let err = filter(&mut reader).err().unwrap();
assert_eq!(
err.inner,
@ -206,7 +206,7 @@ mod tests {
assert_eq!(err.pos, Pos { line: 1, column: 1 });
assert!(err.recoverable);
let mut reader = Reader::init("regex 1");
let mut reader = Reader::new("regex 1");
let err = filter(&mut reader).err().unwrap();
assert_eq!(
err.inner,

View File

@ -87,7 +87,7 @@ fn string_template(reader: &mut Reader) -> ParseResult<'static, Template> {
fn any_char(reader: &mut Reader) -> ParseResult<'static, (char, String, Pos)> {
let start = reader.state.clone();
match escape_char(reader) {
Ok(c) => Ok((c, reader.from(start.cursor), start.pos)),
Ok(c) => Ok((c, reader.peek_back(start.cursor), start.pos)),
Err(e) => {
if e.recoverable {
reader.state = start.clone();
@ -109,7 +109,7 @@ fn any_char(reader: &mut Reader) -> ParseResult<'static, (char, String, Pos)> {
},
})
} else {
Ok((c, reader.from(start.cursor), start.pos))
Ok((c, reader.peek_back(start.cursor), start.pos))
}
}
}
@ -364,13 +364,13 @@ mod tests {
#[test]
fn test_parse_error() {
let mut reader = Reader::init("{ \"a\":\n}");
let mut reader = Reader::new("{ \"a\":\n}");
let error = parse(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 7 });
assert_eq!(error.inner, error::ParseError::Json {});
assert!(!error.recoverable);
let mut reader = Reader::init("[0,1,]");
let mut reader = Reader::new("[0,1,]");
let error = parse(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 6 });
assert_eq!(error.inner, error::ParseError::Json {});
@ -379,11 +379,11 @@ mod tests {
#[test]
fn test_null_value() {
let mut reader = Reader::init("null");
let mut reader = Reader::new("null");
assert_eq!(null_value(&mut reader).unwrap(), JsonValue::Null {});
assert_eq!(reader.state.cursor, 4);
let mut reader = Reader::init("true");
let mut reader = Reader::new("true");
let error = null_value(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -397,14 +397,14 @@ mod tests {
#[test]
fn test_boolean_value() {
let mut reader = Reader::init("true");
let mut reader = Reader::new("true");
assert_eq!(
boolean_value(&mut reader).unwrap(),
JsonValue::Boolean(true)
);
assert_eq!(reader.state.cursor, 4);
let mut reader = Reader::init("1");
let mut reader = Reader::new("1");
let error = boolean_value(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -450,7 +450,7 @@ mod tests {
#[test]
fn test_string_value() {
let mut reader = Reader::init("\"\"");
let mut reader = Reader::new("\"\"");
assert_eq!(
string_value(&mut reader).unwrap(),
JsonValue::String(Template {
@ -461,11 +461,11 @@ mod tests {
);
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("\"Hello\\u0020{{name}}!\"");
let mut reader = Reader::new("\"Hello\\u0020{{name}}!\"");
assert_eq!(string_value(&mut reader).unwrap(), json_hello_world_value());
assert_eq!(reader.state.cursor, 22);
let mut reader = Reader::init("\"{}\"");
let mut reader = Reader::new("\"{}\"");
assert_eq!(
string_value(&mut reader).unwrap(),
JsonValue::String(Template {
@ -482,7 +482,7 @@ mod tests {
#[test]
fn test_string_value_error() {
let mut reader = Reader::init("1");
let mut reader = Reader::new("1");
let error = string_value(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -493,7 +493,7 @@ mod tests {
);
assert!(error.recoverable);
let mut reader = Reader::init("\"1");
let mut reader = Reader::new("\"1");
let error = string_value(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 3 });
assert_eq!(
@ -504,7 +504,7 @@ mod tests {
);
assert!(!error.recoverable);
let mut reader = Reader::init("\"{{x\"");
let mut reader = Reader::new("\"{{x\"");
let error = string_value(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 5 });
assert_eq!(
@ -518,35 +518,35 @@ mod tests {
#[test]
fn test_any_char() {
let mut reader = Reader::init("a");
let mut reader = Reader::new("a");
assert_eq!(
any_char(&mut reader).unwrap(),
('a', "a".to_string(), Pos { line: 1, column: 1 })
);
assert_eq!(reader.state.cursor, 1);
let mut reader = Reader::init(" ");
let mut reader = Reader::new(" ");
assert_eq!(
any_char(&mut reader).unwrap(),
(' ', " ".to_string(), Pos { line: 1, column: 1 })
);
assert_eq!(reader.state.cursor, 1);
let mut reader = Reader::init("\\u0020 ");
let mut reader = Reader::new("\\u0020 ");
assert_eq!(
any_char(&mut reader).unwrap(),
(' ', "\\u0020".to_string(), Pos { line: 1, column: 1 })
);
assert_eq!(reader.state.cursor, 6);
let mut reader = Reader::init("\\t");
let mut reader = Reader::new("\\t");
assert_eq!(
any_char(&mut reader).unwrap(),
('\t', "\\t".to_string(), Pos { line: 1, column: 1 })
);
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("#");
let mut reader = Reader::new("#");
assert_eq!(
any_char(&mut reader).unwrap(),
('#', "#".to_string(), Pos { line: 1, column: 1 })
@ -556,12 +556,12 @@ mod tests {
#[test]
fn test_any_char_error() {
let mut reader = Reader::init("");
let mut reader = Reader::new("");
let error = any_char(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert!(error.recoverable);
let mut reader = Reader::init("\t");
let mut reader = Reader::new("\t");
let error = any_char(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert!(error.recoverable);
@ -569,15 +569,15 @@ mod tests {
#[test]
fn test_escape_char() {
let mut reader = Reader::init("\\n");
let mut reader = Reader::new("\\n");
assert_eq!(escape_char(&mut reader).unwrap(), '\n');
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("\\u000a");
let mut reader = Reader::new("\\u000a");
assert_eq!(escape_char(&mut reader).unwrap(), '\n');
assert_eq!(reader.state.cursor, 6);
let mut reader = Reader::init("x");
let mut reader = Reader::new("x");
let error = escape_char(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -592,17 +592,17 @@ mod tests {
#[test]
fn test_unicode() {
let mut reader = Reader::init("000a");
let mut reader = Reader::new("000a");
assert_eq!(unicode(&mut reader).unwrap(), '\n');
assert_eq!(reader.state.cursor, 4);
}
#[test]
fn test_hex_value() {
let mut reader = Reader::init("0020x");
let mut reader = Reader::new("0020x");
assert_eq!(hex_value(&mut reader).unwrap(), 32);
let mut reader = Reader::init("x");
let mut reader = Reader::new("x");
let error = hex_value(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(error.inner, error::ParseError::HexDigit);
@ -611,49 +611,49 @@ mod tests {
#[test]
fn test_number_value() {
let mut reader = Reader::init("100");
let mut reader = Reader::new("100");
assert_eq!(
number_value(&mut reader).unwrap(),
JsonValue::Number("100".to_string())
);
assert_eq!(reader.state.cursor, 3);
let mut reader = Reader::init("1.333");
let mut reader = Reader::new("1.333");
assert_eq!(
number_value(&mut reader).unwrap(),
JsonValue::Number("1.333".to_string())
);
assert_eq!(reader.state.cursor, 5);
let mut reader = Reader::init("-1");
let mut reader = Reader::new("-1");
assert_eq!(
number_value(&mut reader).unwrap(),
JsonValue::Number("-1".to_string())
);
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("00");
let mut reader = Reader::new("00");
assert_eq!(
number_value(&mut reader).unwrap(),
JsonValue::Number("0".to_string())
);
assert_eq!(reader.state.cursor, 1);
let mut reader = Reader::init("1e0");
let mut reader = Reader::new("1e0");
assert_eq!(
number_value(&mut reader).unwrap(),
JsonValue::Number("1e0".to_string())
);
assert_eq!(reader.state.cursor, 3);
let mut reader = Reader::init("1e005");
let mut reader = Reader::new("1e005");
assert_eq!(
number_value(&mut reader).unwrap(),
JsonValue::Number("1e005".to_string())
);
assert_eq!(reader.state.cursor, 5);
let mut reader = Reader::init("1e-005");
let mut reader = Reader::new("1e-005");
assert_eq!(
number_value(&mut reader).unwrap(),
JsonValue::Number("1e-005".to_string())
@ -663,7 +663,7 @@ mod tests {
#[test]
fn test_number_value_error() {
let mut reader = Reader::init("true");
let mut reader = Reader::new("true");
let error = number_value(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -674,7 +674,7 @@ mod tests {
);
assert!(error.recoverable);
let mut reader = Reader::init("1.x");
let mut reader = Reader::new("1.x");
let error = number_value(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 3 });
assert_eq!(
@ -688,7 +688,7 @@ mod tests {
#[test]
fn test_expression_value() {
let mut reader = Reader::init("{{n}}");
let mut reader = Reader::new("{{n}}");
assert_eq!(
expression_value(&mut reader).unwrap(),
JsonValue::Expression(Expr {
@ -711,7 +711,7 @@ mod tests {
#[test]
fn test_list_value() {
let mut reader = Reader::init("[]");
let mut reader = Reader::new("[]");
assert_eq!(
list_value(&mut reader).unwrap(),
JsonValue::List {
@ -721,7 +721,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("[ ]");
let mut reader = Reader::new("[ ]");
assert_eq!(
list_value(&mut reader).unwrap(),
JsonValue::List {
@ -731,7 +731,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 3);
let mut reader = Reader::init("[true]");
let mut reader = Reader::new("[true]");
assert_eq!(
list_value(&mut reader).unwrap(),
JsonValue::List {
@ -748,7 +748,7 @@ mod tests {
#[test]
fn test_list_error() {
let mut reader = Reader::init("true");
let mut reader = Reader::new("true");
let error = list_value(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -759,7 +759,7 @@ mod tests {
);
assert!(error.recoverable);
let mut reader = Reader::init("[1, 2,]");
let mut reader = Reader::new("[1, 2,]");
let error = list_value(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 7 });
assert_eq!(error.inner, error::ParseError::Json {});
@ -768,7 +768,7 @@ mod tests {
#[test]
fn test_list_element() {
let mut reader = Reader::init("true");
let mut reader = Reader::new("true");
assert_eq!(
list_element(&mut reader).unwrap(),
JsonListElement {
@ -782,7 +782,7 @@ mod tests {
#[test]
fn test_object_value() {
let mut reader = Reader::init("{}");
let mut reader = Reader::new("{}");
assert_eq!(
object_value(&mut reader).unwrap(),
JsonValue::Object {
@ -792,7 +792,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("{ }");
let mut reader = Reader::new("{ }");
assert_eq!(
object_value(&mut reader).unwrap(),
JsonValue::Object {
@ -802,7 +802,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 3);
let mut reader = Reader::init("{\n \"a\": true\n}");
let mut reader = Reader::new("{\n \"a\": true\n}");
assert_eq!(
object_value(&mut reader).unwrap(),
JsonValue::Object {
@ -826,7 +826,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 15);
let mut reader = Reader::init("true");
let mut reader = Reader::new("true");
let error = object_value(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -840,7 +840,7 @@ mod tests {
#[test]
fn test_object_error() {
let mut reader = Reader::init("{ \"a\":\n}");
let mut reader = Reader::new("{ \"a\":\n}");
let error = object_value(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 7 });
assert_eq!(error.inner, error::ParseError::Json {});
@ -849,7 +849,7 @@ mod tests {
#[test]
fn test_object_element() {
let mut reader = Reader::init("\"a\": true");
let mut reader = Reader::new("\"a\": true");
assert_eq!(
object_element(&mut reader).unwrap(),
JsonObjectElement {
@ -873,7 +873,7 @@ mod tests {
#[test]
fn test_object_element_error() {
let mut reader = Reader::init(":");
let mut reader = Reader::new(":");
let error = object_element(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -884,7 +884,7 @@ mod tests {
);
assert!(!error.recoverable);
let mut reader = Reader::init("\"name\":\n");
let mut reader = Reader::new("\"name\":\n");
let error = object_element(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 8 });
assert_eq!(error.inner, error::ParseError::Json {});
@ -893,15 +893,15 @@ mod tests {
#[test]
fn test_whitespace() {
let mut reader = Reader::init("");
let mut reader = Reader::new("");
assert_eq!(whitespace(&mut reader), "".to_string());
assert_eq!(reader.state.cursor, 0);
let mut reader = Reader::init(" x");
let mut reader = Reader::new(" x");
assert_eq!(whitespace(&mut reader), " ".to_string());
assert_eq!(reader.state.cursor, 1);
let mut reader = Reader::init("\n x");
let mut reader = Reader::new("\n x");
assert_eq!(whitespace(&mut reader), "\n ".to_string());
assert_eq!(reader.state.cursor, 3);
}

View File

@ -19,7 +19,7 @@ pub type ParseResult<'a, T> = Result<T, Error>;
pub type ParseFunc<'a, T> = fn(&mut Reader) -> ParseResult<'a, T>;
pub fn parse_hurl_file(s: &str) -> ParseResult<'static, HurlFile> {
let mut reader = Reader::init(s);
let mut reader = Reader::new(s);
parsers::hurl_file(&mut reader)
}

View File

@ -300,7 +300,7 @@ mod tests {
#[test]
fn test_multiline_string_text() {
let mut reader = Reader::init("```\nline1\nline2\nline3\n```");
let mut reader = Reader::new("```\nline1\nline2\nline3\n```");
assert_eq!(
multiline_string(&mut reader).unwrap(),
MultilineString::Text(Text {
@ -323,7 +323,7 @@ mod tests {
})
);
let mut reader = Reader::init("``` \nline1\nline2\nline3\n```");
let mut reader = Reader::new("``` \nline1\nline2\nline3\n```");
assert_eq!(
multiline_string(&mut reader).unwrap(),
MultilineString::Text(Text {
@ -349,7 +349,7 @@ mod tests {
#[test]
fn test_multiline_string_json() {
let mut reader = Reader::init("```json\nline1\nline2\nline3\n```");
let mut reader = Reader::new("```json\nline1\nline2\nline3\n```");
assert_eq!(
multiline_string(&mut reader).unwrap(),
MultilineString::Json(Text {
@ -375,7 +375,7 @@ mod tests {
#[test]
fn test_multiline_string_graphql() {
let mut reader = Reader::init("```graphql\nline1\nline2\nline3\n```");
let mut reader = Reader::new("```graphql\nline1\nline2\nline3\n```");
assert_eq!(
multiline_string(&mut reader).unwrap(),
MultilineString::GraphQl(GraphQl {
@ -399,7 +399,7 @@ mod tests {
})
);
let mut reader = Reader::init("```graphql \nline1\nline2\nline3\n```");
let mut reader = Reader::new("```graphql \nline1\nline2\nline3\n```");
assert_eq!(
multiline_string(&mut reader).unwrap(),
MultilineString::GraphQl(GraphQl {
@ -432,14 +432,14 @@ mod tests {
];
for text in datas.iter() {
let mut reader = Reader::init(text);
let mut reader = Reader::new(text);
assert!(multiline_string(&mut reader).is_err())
}
}
#[test]
fn test_multiline_string_empty() {
let mut reader = Reader::init("``````");
let mut reader = Reader::new("``````");
assert_eq!(
multiline_string(&mut reader).unwrap(),
MultilineString::OneLineText(Template {
@ -449,7 +449,7 @@ mod tests {
})
);
let mut reader = Reader::init("```\n```");
let mut reader = Reader::new("```\n```");
assert_eq!(
multiline_string(&mut reader).unwrap(),
MultilineString::Text(Text {
@ -468,7 +468,7 @@ mod tests {
},
})
);
let mut reader = Reader::init("```\r\n```");
let mut reader = Reader::new("```\r\n```");
assert_eq!(
multiline_string(&mut reader).unwrap(),
MultilineString::Text(Text {
@ -491,7 +491,7 @@ mod tests {
#[test]
fn test_multiline_string_hello() {
let mut reader = Reader::init("```Hello World!```");
let mut reader = Reader::new("```Hello World!```");
assert_eq!(
multiline_string(&mut reader).unwrap(),
MultilineString::OneLineText(Template {
@ -507,7 +507,7 @@ mod tests {
#[test]
fn test_multiline_string_base64_prefix() {
let mut reader = Reader::init("```base64_inline```");
let mut reader = Reader::new("```base64_inline```");
assert_eq!(
multiline_string(&mut reader).unwrap(),
MultilineString::OneLineText(Template {
@ -523,7 +523,7 @@ mod tests {
#[test]
fn test_multiline_string_csv() {
let mut reader = Reader::init("```\nline1\nline2\nline3\n```");
let mut reader = Reader::new("```\nline1\nline2\nline3\n```");
assert_eq!(
multiline_string(&mut reader).unwrap(),
MultilineString::Text(Text {
@ -549,7 +549,7 @@ mod tests {
#[test]
fn test_multiline_string_one_empty_line() {
let mut reader = Reader::init("```\n\n```");
let mut reader = Reader::new("```\n\n```");
assert_eq!(
multiline_string(&mut reader).unwrap(),
MultilineString::Text(Text {
@ -573,7 +573,7 @@ mod tests {
);
// One cr
let mut reader = Reader::init("```\n\r\n````");
let mut reader = Reader::new("```\n\r\n````");
assert_eq!(
multiline_string(&mut reader).unwrap(),
MultilineString::Text(Text {
@ -599,7 +599,7 @@ mod tests {
#[test]
fn test_multiline_string_error() {
let mut reader = Reader::init("xxx");
let mut reader = Reader::new("xxx");
let error = multiline_string(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -610,13 +610,13 @@ mod tests {
);
assert!(error.recoverable);
let mut reader = Reader::init("```\nxxx");
let mut reader = Reader::new("```\nxxx");
let error = multiline_string(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 4 });
assert_eq!(error.inner, ParseError::Multiline);
assert!(!error.recoverable);
let mut reader = Reader::init("```xxx");
let mut reader = Reader::new("```xxx");
let error = multiline_string(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 7 });
assert_eq!(
@ -630,7 +630,7 @@ mod tests {
#[test]
fn test_multiline_string_value() {
let mut reader = Reader::init("```");
let mut reader = Reader::new("```");
assert_eq!(
multiline_string_value(&mut reader).unwrap(),
Template {
@ -641,7 +641,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 3);
let mut reader = Reader::init("hello```");
let mut reader = Reader::new("hello```");
assert_eq!(
multiline_string_value(&mut reader).unwrap(),
Template {
@ -658,7 +658,7 @@ mod tests {
#[test]
fn test_multiline_string_graphql_with_variables() {
let mut reader = Reader::init(
let mut reader = Reader::new(
r#"```graphql
query Human($name: String!) {
human(name: $name) {
@ -737,7 +737,7 @@ variables {
#[test]
fn test_multiline_string_graphql_with_variables_error() {
let mut reader = Reader::init(
let mut reader = Reader::new(
r#"```graphql
query Human($name: String!) {
human(name: $name) {
@ -765,7 +765,7 @@ variables
#[test]
fn test_multiline_string_graphql_with_variables_not_an_object() {
let mut reader = Reader::init(
let mut reader = Reader::new(
r#"```graphql
query Human($name: String!) {
human(name: $name) {

View File

@ -257,14 +257,14 @@ mod tests {
#[test]
fn test_hurl_file() {
let mut reader = Reader::init("GET http://google.fr");
let mut reader = Reader::new("GET http://google.fr");
let hurl_file = hurl_file(&mut reader).unwrap();
assert_eq!(hurl_file.entries.len(), 1);
}
#[test]
fn test_entry() {
let mut reader = Reader::init("GET http://google.fr");
let mut reader = Reader::new("GET http://google.fr");
let e = entry(&mut reader).unwrap();
assert_eq!(e.request.method, Method::Get);
assert_eq!(reader.state.cursor, 20);
@ -272,7 +272,7 @@ mod tests {
#[test]
fn test_several_entry() {
let mut reader = Reader::init("GET http://google.fr\nGET http://google.fr");
let mut reader = Reader::new("GET http://google.fr\nGET http://google.fr");
let e = entry(&mut reader).unwrap();
assert_eq!(e.request.method, Method::Get);
@ -285,7 +285,7 @@ mod tests {
assert_eq!(reader.state.pos.line, 2);
let mut reader =
Reader::init("GET http://google.fr # comment1\nGET http://google.fr # comment2");
Reader::new("GET http://google.fr # comment1\nGET http://google.fr # comment2");
let e = entry(&mut reader).unwrap();
assert_eq!(e.request.method, Method::Get);
@ -300,7 +300,7 @@ mod tests {
#[test]
fn test_entry_with_response() {
let mut reader = Reader::init("GET http://google.fr\nHTTP/1.1 200");
let mut reader = Reader::new("GET http://google.fr\nHTTP/1.1 200");
let e = entry(&mut reader).unwrap();
assert_eq!(e.request.method, Method::Get);
assert_eq!(e.response.unwrap().status.value, StatusValue::Specific(200));
@ -308,7 +308,7 @@ mod tests {
#[test]
fn test_request() {
let mut reader = Reader::init("GET http://google.fr");
let mut reader = Reader::new("GET http://google.fr");
let default_request = Request {
line_terminators: vec![],
space0: Whitespace {
@ -346,7 +346,7 @@ mod tests {
};
assert_eq!(request(&mut reader), Ok(default_request));
let mut reader = Reader::init("GET http://google.fr # comment");
let mut reader = Reader::new("GET http://google.fr # comment");
let default_request = Request {
line_terminators: vec![],
space0: Whitespace {
@ -386,7 +386,7 @@ mod tests {
};
assert_eq!(request(&mut reader), Ok(default_request));
let mut reader = Reader::init("GET http://google.fr\nGET http://google.fr");
let mut reader = Reader::new("GET http://google.fr\nGET http://google.fr");
let r = request(&mut reader);
assert_eq!(r.unwrap().method, Method::Get);
assert_eq!(reader.state.cursor, 21);
@ -400,7 +400,7 @@ mod tests {
// ```
// Hello World!
// ```
let mut reader = Reader::init("GET http://google.fr\n```\nHello World!\n```");
let mut reader = Reader::new("GET http://google.fr\n```\nHello World!\n```");
let req = request(&mut reader).unwrap();
assert_eq!(
req.body.unwrap(),
@ -445,7 +445,7 @@ mod tests {
#[test]
fn test_request_post_json() {
let mut reader = Reader::init("POST http://localhost:8000/post-json-array\n[1,2,3]");
let mut reader = Reader::new("POST http://localhost:8000/post-json-array\n[1,2,3]");
let r = request(&mut reader).unwrap();
assert_eq!(r.method, Method::Post);
assert_eq!(
@ -472,7 +472,7 @@ mod tests {
})
);
let mut reader = Reader::init("POST http://localhost:8000/post-json-string\n\"Hello\"");
let mut reader = Reader::new("POST http://localhost:8000/post-json-string\n\"Hello\"");
let r = request(&mut reader).unwrap();
assert_eq!(r.method, Method::Post);
assert_eq!(
@ -487,7 +487,7 @@ mod tests {
}))
);
let mut reader = Reader::init("POST http://localhost:8000/post-json-number\n100");
let mut reader = Reader::new("POST http://localhost:8000/post-json-number\n100");
let r = request(&mut reader).unwrap();
assert_eq!(r.method, Method::Post);
assert_eq!(
@ -498,14 +498,14 @@ mod tests {
#[test]
fn test_request_error() {
let mut reader = Reader::init("xxx");
let mut reader = Reader::new("xxx");
let error = request(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
}
#[test]
fn test_response() {
let mut reader = Reader::init("HTTP/1.1 200");
let mut reader = Reader::new("HTTP/1.1 200");
//println!("{:?}", response(&mut reader));
let r = response(&mut reader).unwrap();
@ -515,49 +515,49 @@ mod tests {
#[test]
fn test_method() {
let mut reader = Reader::init("xxx ");
let mut reader = Reader::new("xxx ");
let error = method(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(reader.state.cursor, 0);
let mut reader = Reader::init("");
let mut reader = Reader::new("");
let error = method(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(reader.state.cursor, 0);
let mut reader = Reader::init("GET ");
let mut reader = Reader::new("GET ");
assert_eq!(Ok(Method::Get), method(&mut reader));
assert_eq!(reader.state.cursor, 3);
}
#[test]
fn test_version() {
let mut reader = Reader::init("HTTP/1.1 200");
let mut reader = Reader::new("HTTP/1.1 200");
assert_eq!(version(&mut reader).unwrap().value, VersionValue::Version11);
let mut reader = Reader::init("HTTP/1. 200");
let mut reader = Reader::new("HTTP/1. 200");
let error = version(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
}
#[test]
fn test_status() {
let mut reader = Reader::init("*");
let mut reader = Reader::new("*");
let s = status(&mut reader).unwrap();
assert_eq!(s.value, StatusValue::Any);
let mut reader = Reader::init("200");
let mut reader = Reader::new("200");
let s = status(&mut reader).unwrap();
assert_eq!(s.value, StatusValue::Specific(200));
let mut reader = Reader::init("xxx");
let mut reader = Reader::new("xxx");
let result = status(&mut reader);
assert!(result.is_err());
}
#[test]
fn test_body_json() {
let mut reader = Reader::init("[1,2,3] ");
let mut reader = Reader::new("[1,2,3] ");
let b = body(&mut reader).unwrap();
assert_eq!(b.line_terminators.len(), 0);
assert_eq!(
@ -585,7 +585,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 8);
let mut reader = Reader::init("{}");
let mut reader = Reader::new("{}");
let b = body(&mut reader).unwrap();
assert_eq!(b.line_terminators.len(), 0);
assert_eq!(
@ -597,7 +597,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("# comment\n {} # comment\nxxx");
let mut reader = Reader::new("# comment\n {} # comment\nxxx");
let b = body(&mut reader).unwrap();
assert_eq!(b.line_terminators.len(), 1);
assert_eq!(
@ -609,7 +609,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 24);
let mut reader = Reader::init("{x");
let mut reader = Reader::new("{x");
let error = body(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 2 });
assert!(!error.recoverable);

View File

@ -370,7 +370,7 @@ mod tests {
#[test]
fn test_predicate_not() {
let mut reader = Reader::init("notXX");
let mut reader = Reader::new("notXX");
assert_eq!(
predicate_not(&mut reader),
(
@ -383,7 +383,7 @@ mod tests {
);
assert_eq!(reader.state.pos, Pos { line: 1, column: 1 });
let mut reader = Reader::init("not XX");
let mut reader = Reader::new("not XX");
assert_eq!(
predicate_not(&mut reader),
(
@ -399,7 +399,7 @@ mod tests {
#[test]
fn test_predicate() {
let mut reader = Reader::init("not equals true");
let mut reader = Reader::new("not equals true");
assert_eq!(
predicate(&mut reader).unwrap(),
Predicate {
@ -425,7 +425,7 @@ mod tests {
#[test]
fn test_predicate_error() {
let mut reader = Reader::init("countEquals true");
let mut reader = Reader::new("countEquals true");
let error = predicate(&mut reader).err().unwrap();
assert_eq!(
error.pos,
@ -440,7 +440,7 @@ mod tests {
#[test]
fn test_predicate_func() {
let mut reader = Reader::init("tata equals 1");
let mut reader = Reader::new("tata equals 1");
let error = predicate_func(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert!(!error.recoverable);
@ -449,7 +449,7 @@ mod tests {
#[test]
fn test_equal_predicate() {
let mut reader = Reader::init("equals true");
let mut reader = Reader::new("equals true");
assert_eq!(
equal_predicate(&mut reader).unwrap(),
PredicateFuncValue::Equal {
@ -463,7 +463,7 @@ mod tests {
}
);
let mut reader = Reader::init("equals 1.1");
let mut reader = Reader::new("equals 1.1");
assert_eq!(
equal_predicate(&mut reader).unwrap(),
PredicateFuncValue::Equal {
@ -479,7 +479,7 @@ mod tests {
}
);
let mut reader = Reader::init("equals 2");
let mut reader = Reader::new("equals 2");
assert_eq!(
equal_predicate(&mut reader).unwrap(),
PredicateFuncValue::Equal {
@ -492,7 +492,7 @@ mod tests {
},
);
let mut reader = Reader::init("== 2");
let mut reader = Reader::new("== 2");
assert_eq!(
equal_predicate(&mut reader).unwrap(),
PredicateFuncValue::Equal {
@ -505,7 +505,7 @@ mod tests {
},
);
let mut reader = Reader::init("equals \"Bob\"");
let mut reader = Reader::new("equals \"Bob\"");
assert_eq!(
equal_predicate(&mut reader).unwrap(),
PredicateFuncValue::Equal {
@ -528,7 +528,7 @@ mod tests {
#[test]
fn test_equal_expression_predicate() {
let mut reader = Reader::init("equals {{count}}");
let mut reader = Reader::new("equals {{count}}");
assert_eq!(
equal_predicate(&mut reader).unwrap(),
PredicateFuncValue::Equal {
@ -557,7 +557,7 @@ mod tests {
#[test]
fn test_count_equal_predicate() {
let mut reader = Reader::init("countEquals 2");
let mut reader = Reader::new("countEquals 2");
assert_eq!(
count_equal_predicate(&mut reader).unwrap(),
PredicateFuncValue::CountEqual {
@ -569,7 +569,7 @@ mod tests {
}
);
let mut reader = Reader::init("countEquals true");
let mut reader = Reader::new("countEquals true");
let error = count_equal_predicate(&mut reader).err().unwrap();
assert_eq!(
error.pos,
@ -584,7 +584,7 @@ mod tests {
#[test]
fn test_start_with_predicate() {
let mut reader = Reader::init("startsWith 2");
let mut reader = Reader::new("startsWith 2");
let error = start_with_predicate(&mut reader).err().unwrap();
assert_eq!(
error.pos,

View File

@ -88,19 +88,19 @@ mod tests {
#[test]
fn test_predicate_value() {
let mut reader = Reader::init("true");
let mut reader = Reader::new("true");
assert_eq!(
predicate_value(&mut reader).unwrap(),
PredicateValue::Bool(true)
);
let mut reader = Reader::init("1");
let mut reader = Reader::new("1");
assert_eq!(
predicate_value(&mut reader).unwrap(),
PredicateValue::Integer(1)
);
let mut reader = Reader::init("1.1");
let mut reader = Reader::new("1.1");
assert_eq!(
predicate_value(&mut reader).unwrap(),
PredicateValue::Float(Float {
@ -112,7 +112,7 @@ mod tests {
#[test]
fn test_predicate_value_error() {
let mut reader = Reader::init("xx");
let mut reader = Reader::new("xx");
let error = predicate_value(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(error.inner, ParseError::PredicateValue {});
@ -121,7 +121,7 @@ mod tests {
#[test]
fn test_predicate_value_error_missing_quote() {
let mut reader = Reader::init("\"not_found");
let mut reader = Reader::new("\"not_found");
let error = predicate_value(&mut reader).err().unwrap();
assert_eq!(
error.pos,

View File

@ -316,7 +316,7 @@ pub fn hex(reader: &mut Reader) -> ParseResult<'static, Hex> {
inner: ParseError::OddNumberOfHexDigits {},
});
}
let encoded = reader.from(start);
let encoded = reader.peek_back(start);
let space1 = zero_or_more_spaces(reader)?;
literal(";", reader)?;
@ -494,7 +494,7 @@ pub fn float(reader: &mut Reader) -> ParseResult<'static, Float> {
});
}
let value = format!("{sign}{nat}.{s}").parse().unwrap();
let encoded = reader.from(start);
let encoded = reader.peek_back(start);
Ok(Float { value, encoded })
}
@ -597,12 +597,12 @@ mod tests {
#[test]
fn test_space() {
let mut reader = Reader::init("x");
let mut reader = Reader::new("x");
let error = space(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(reader.state.cursor, 1);
let mut reader = Reader::init(" ");
let mut reader = Reader::new(" ");
assert_eq!(
space(&mut reader),
Ok(Whitespace {
@ -615,7 +615,7 @@ mod tests {
#[test]
fn test_one_or_more_spaces() {
let mut reader = Reader::init(" ");
let mut reader = Reader::new(" ");
assert_eq!(
one_or_more_spaces(&mut reader),
Ok(Whitespace {
@ -624,14 +624,14 @@ mod tests {
})
);
let mut reader = Reader::init("abc");
let mut reader = Reader::new("abc");
let error = one_or_more_spaces(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
}
#[test]
fn test_zero_or_more_spaces() {
let mut reader = Reader::init(" ");
let mut reader = Reader::new(" ");
assert_eq!(
zero_or_more_spaces(&mut reader),
Ok(Whitespace {
@ -641,7 +641,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("xxx");
let mut reader = Reader::new("xxx");
assert_eq!(
zero_or_more_spaces(&mut reader),
Ok(Whitespace {
@ -651,7 +651,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 0);
let mut reader = Reader::init(" xxx");
let mut reader = Reader::new(" xxx");
assert_eq!(
zero_or_more_spaces(&mut reader),
Ok(Whitespace {
@ -673,7 +673,7 @@ mod tests {
// );
// assert_eq!(reader.state.cursor, 9);
let mut reader = Reader::init("#\n");
let mut reader = Reader::new("#\n");
assert_eq!(
comment(&mut reader),
Ok(Comment {
@ -681,7 +681,7 @@ mod tests {
})
);
let mut reader = Reader::init("# comment\n");
let mut reader = Reader::new("# comment\n");
assert_eq!(
comment(&mut reader),
Ok(Comment {
@ -690,7 +690,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 9);
let mut reader = Reader::init("xxx");
let mut reader = Reader::new("xxx");
let error = comment(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert!(error.recoverable);
@ -698,11 +698,11 @@ mod tests {
#[test]
fn test_literal() {
let mut reader = Reader::init("hello");
let mut reader = Reader::new("hello");
assert_eq!(literal("hello", &mut reader), Ok(()));
assert_eq!(reader.state.cursor, 5);
let mut reader = Reader::init("");
let mut reader = Reader::new("");
let error = literal("hello", &mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -713,7 +713,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 0);
let mut reader = Reader::init("hi");
let mut reader = Reader::new("hi");
let error = literal("hello", &mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -724,7 +724,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("he");
let mut reader = Reader::new("he");
let error = literal("hello", &mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -738,7 +738,7 @@ mod tests {
#[test]
fn test_new_line() {
let mut reader = Reader::init("\n");
let mut reader = Reader::new("\n");
assert_eq!(
newline(&mut reader).unwrap(),
Whitespace {
@ -750,7 +750,7 @@ mod tests {
#[test]
fn test_key_value() {
let mut reader = Reader::init("message: hello {{name}}! # comment");
let mut reader = Reader::new("message: hello {{name}}! # comment");
assert_eq!(
key_value(&mut reader).unwrap(),
KeyValue {
@ -820,10 +820,10 @@ mod tests {
#[test]
fn test_boolean() {
let mut reader = Reader::init("true");
let mut reader = Reader::new("true");
assert!(boolean(&mut reader).unwrap());
let mut reader = Reader::init("xxx");
let mut reader = Reader::new("xxx");
let error = boolean(&mut reader).err().unwrap();
assert_eq!(
error.inner,
@ -833,7 +833,7 @@ mod tests {
);
assert!(error.recoverable);
let mut reader = Reader::init("trux");
let mut reader = Reader::new("trux");
let error = boolean(&mut reader).err().unwrap();
assert_eq!(
error.inner,
@ -846,22 +846,22 @@ mod tests {
#[test]
fn test_natural() {
let mut reader = Reader::init("0");
let mut reader = Reader::new("0");
assert_eq!(natural(&mut reader).unwrap(), 0);
assert_eq!(reader.state.cursor, 1);
let mut reader = Reader::init("0.");
let mut reader = Reader::new("0.");
assert_eq!(natural(&mut reader).unwrap(), 0);
assert_eq!(reader.state.cursor, 1);
let mut reader = Reader::init("10x");
let mut reader = Reader::new("10x");
assert_eq!(natural(&mut reader).unwrap(), 10);
assert_eq!(reader.state.cursor, 2);
}
#[test]
fn test_natural_error() {
let mut reader = Reader::init("");
let mut reader = Reader::new("");
let error = natural(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -872,7 +872,7 @@ mod tests {
);
assert!(error.recoverable);
let mut reader = Reader::init("01");
let mut reader = Reader::new("01");
let error = natural(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 2 });
assert_eq!(
@ -883,7 +883,7 @@ mod tests {
);
assert!(!error.recoverable);
let mut reader = Reader::init("x");
let mut reader = Reader::new("x");
let error = natural(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -897,16 +897,16 @@ mod tests {
#[test]
pub fn test_integer() {
let mut reader = Reader::init("1");
let mut reader = Reader::new("1");
assert_eq!(integer(&mut reader).unwrap(), 1);
let mut reader = Reader::init("1.1");
let mut reader = Reader::new("1.1");
assert_eq!(integer(&mut reader).unwrap(), 1);
let mut reader = Reader::init("-1.1");
let mut reader = Reader::new("-1.1");
assert_eq!(integer(&mut reader).unwrap(), -1);
let mut reader = Reader::init("x");
let mut reader = Reader::new("x");
let error = integer(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -920,7 +920,7 @@ mod tests {
#[test]
fn test_float() {
let mut reader = Reader::init("1.0");
let mut reader = Reader::new("1.0");
assert_eq!(
float(&mut reader).unwrap(),
Float {
@ -930,7 +930,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 3);
let mut reader = Reader::init("-1.0");
let mut reader = Reader::new("-1.0");
assert_eq!(
float(&mut reader).unwrap(),
Float {
@ -940,7 +940,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 4);
let mut reader = Reader::init("1.1");
let mut reader = Reader::new("1.1");
assert_eq!(
float(&mut reader).unwrap(),
Float {
@ -950,7 +950,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 3);
let mut reader = Reader::init("1.100");
let mut reader = Reader::new("1.100");
assert_eq!(
float(&mut reader).unwrap(),
Float {
@ -960,7 +960,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 5);
let mut reader = Reader::init("1.01");
let mut reader = Reader::new("1.01");
assert_eq!(
float(&mut reader).unwrap(),
Float {
@ -970,7 +970,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 4);
let mut reader = Reader::init("1.010");
let mut reader = Reader::new("1.010");
assert_eq!(
float(&mut reader).unwrap(),
Float {
@ -981,7 +981,7 @@ mod tests {
assert_eq!(reader.state.cursor, 5);
// provide more digits than necessary
let mut reader = Reader::init("-0.3333333333333333333");
let mut reader = Reader::new("-0.3333333333333333333");
assert_eq!(
float(&mut reader).unwrap(),
Float {
@ -994,7 +994,7 @@ mod tests {
#[test]
fn test_float_error() {
let mut reader = Reader::init("");
let mut reader = Reader::new("");
let error = float(&mut reader).err().unwrap();
assert_eq!(
error.inner,
@ -1005,7 +1005,7 @@ mod tests {
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert!(error.recoverable);
let mut reader = Reader::init("-");
let mut reader = Reader::new("-");
let error = float(&mut reader).err().unwrap();
assert_eq!(
error.inner,
@ -1016,7 +1016,7 @@ mod tests {
assert_eq!(error.pos, Pos { line: 1, column: 2 });
assert!(error.recoverable);
let mut reader = Reader::init("1");
let mut reader = Reader::new("1");
let error = float(&mut reader).err().unwrap();
assert_eq!(
error.inner,
@ -1027,7 +1027,7 @@ mod tests {
assert_eq!(error.pos, Pos { line: 1, column: 2 });
assert!(error.recoverable);
let mut reader = Reader::init("1x");
let mut reader = Reader::new("1x");
let error = float(&mut reader).err().unwrap();
assert_eq!(
error.inner,
@ -1038,7 +1038,7 @@ mod tests {
assert_eq!(error.pos, Pos { line: 1, column: 2 });
assert!(error.recoverable);
let mut reader = Reader::init("1.");
let mut reader = Reader::new("1.");
let error = float(&mut reader).err().unwrap();
assert_eq!(
error.inner,
@ -1049,7 +1049,7 @@ mod tests {
assert_eq!(error.pos, Pos { line: 1, column: 3 });
assert!(!error.recoverable);
let mut reader = Reader::init("1.x");
let mut reader = Reader::new("1.x");
let error = float(&mut reader).err().unwrap();
assert_eq!(
error.inner,
@ -1063,10 +1063,10 @@ mod tests {
#[test]
fn test_hex_digit() {
let mut reader = Reader::init("0");
let mut reader = Reader::new("0");
assert_eq!(hex_digit(&mut reader).unwrap(), 0);
let mut reader = Reader::init("x");
let mut reader = Reader::new("x");
let error = hex_digit(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(error.inner, ParseError::HexDigit {});
@ -1075,7 +1075,7 @@ mod tests {
#[test]
fn test_hex() {
let mut reader = Reader::init("hex, ff;");
let mut reader = Reader::new("hex, ff;");
assert_eq!(
hex(&mut reader).unwrap(),
Hex {
@ -1092,7 +1092,7 @@ mod tests {
}
);
let mut reader = Reader::init("hex,010203 ;");
let mut reader = Reader::new("hex,010203 ;");
assert_eq!(
hex(&mut reader).unwrap(),
Hex {
@ -1112,7 +1112,7 @@ mod tests {
#[test]
fn test_hex_error() {
let mut reader = Reader::init("hex,012;");
let mut reader = Reader::new("hex,012;");
let error = hex(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 8 });
assert_eq!(error.inner, ParseError::OddNumberOfHexDigits {});
@ -1120,7 +1120,7 @@ mod tests {
#[test]
fn test_regex() {
let mut reader = Reader::init(r#"/a{3}/"#);
let mut reader = Reader::new(r#"/a{3}/"#);
assert_eq!(
regex(&mut reader).unwrap(),
Regex {
@ -1128,7 +1128,7 @@ mod tests {
}
);
let mut reader = Reader::init(r#"/a\/b/"#);
let mut reader = Reader::new(r#"/a\/b/"#);
assert_eq!(
regex(&mut reader).unwrap(),
Regex {
@ -1136,7 +1136,7 @@ mod tests {
}
);
let mut reader = Reader::init(r#"/a\.b/"#);
let mut reader = Reader::new(r#"/a\.b/"#);
assert_eq!(
regex(&mut reader).unwrap(),
Regex {
@ -1144,7 +1144,7 @@ mod tests {
}
);
let mut reader = Reader::init(r#"/\d{4}-\d{2}-\d{2}/"#);
let mut reader = Reader::new(r#"/\d{4}-\d{2}-\d{2}/"#);
assert_eq!(
regex(&mut reader).unwrap(),
Regex {
@ -1155,18 +1155,18 @@ mod tests {
#[test]
fn test_regex_error() {
let mut reader = Reader::init("xxx");
let mut reader = Reader::new("xxx");
let error = regex(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert!(error.recoverable);
let mut reader = Reader::init("/xxx");
let mut reader = Reader::new("/xxx");
let error = regex(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 5 });
assert!(!error.recoverable);
assert_eq!(error.inner, ParseError::Eof {});
let mut reader = Reader::init("/x{a}/");
let mut reader = Reader::new("/x{a}/");
let error = regex(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 2 });
assert!(!error.recoverable);
@ -1180,7 +1180,7 @@ mod tests {
#[test]
fn test_file() {
let mut reader = Reader::init("file,data.xml;");
let mut reader = Reader::new("file,data.xml;");
assert_eq!(
file(&mut reader).unwrap(),
File {
@ -1199,7 +1199,7 @@ mod tests {
}
);
let mut reader = Reader::init("file, filename1;");
let mut reader = Reader::new("file, filename1;");
assert_eq!(
file(&mut reader).unwrap(),
File {
@ -1218,7 +1218,7 @@ mod tests {
}
);
let mut reader = Reader::init("file, tmp/filename1;");
let mut reader = Reader::new("file, tmp/filename1;");
assert_eq!(
file(&mut reader).unwrap(),
File {
@ -1237,7 +1237,7 @@ mod tests {
}
);
let mut reader = Reader::init(r#"file, tmp/filename\ with\ spaces.txt;"#);
let mut reader = Reader::new(r#"file, tmp/filename\ with\ spaces.txt;"#);
assert_eq!(
file(&mut reader).unwrap(),
File {
@ -1259,12 +1259,12 @@ mod tests {
#[test]
fn test_file_error() {
let mut reader = Reader::init("fil; filename1;");
let mut reader = Reader::new("fil; filename1;");
let error = file(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert!(error.recoverable);
let mut reader = Reader::init("file, filename1");
let mut reader = Reader::new("file, filename1");
let error = file(&mut reader).err().unwrap();
assert_eq!(
error.pos,
@ -1281,7 +1281,7 @@ mod tests {
}
);
let mut reader = Reader::init(r#"file, tmp/filename\ with\ unescaped .txt;"#);
let mut reader = Reader::new(r#"file, tmp/filename\ with\ unescaped .txt;"#);
let error = file(&mut reader).err().unwrap();
assert_eq!(
error.pos,
@ -1301,7 +1301,7 @@ mod tests {
#[test]
fn test_base64() {
let mut reader = Reader::init("base64, T WE=;xxx");
let mut reader = Reader::new("base64, T WE=;xxx");
assert_eq!(
base64(&mut reader).unwrap(),
Base64 {

View File

@ -80,7 +80,7 @@ fn cookie_query(reader: &mut Reader) -> ParseResult<'static, QueryValue> {
// todo should work with an encodedString in order to support escape sequence
// or decode escape sequence with the cookiepath parser
let mut cookiepath_reader = Reader::init(s.as_str());
let mut cookiepath_reader = Reader::new(s.as_str());
cookiepath_reader.state.pos = Pos {
line: start.line,
column: start.column + 1,
@ -222,7 +222,7 @@ mod tests {
#[test]
fn test_query() {
let mut reader = Reader::init("status");
let mut reader = Reader::new("status");
assert_eq!(
query(&mut reader).unwrap(),
Query {
@ -234,7 +234,7 @@ mod tests {
#[test]
fn test_status_query() {
let mut reader = Reader::init("status");
let mut reader = Reader::new("status");
assert_eq!(
query(&mut reader).unwrap(),
Query {
@ -246,7 +246,7 @@ mod tests {
#[test]
fn test_header_query() {
let mut reader = Reader::init("header \"Foo\"");
let mut reader = Reader::new("header \"Foo\"");
assert_eq!(
header_query(&mut reader).unwrap(),
QueryValue::Header {
@ -268,7 +268,7 @@ mod tests {
#[test]
fn test_cookie_query() {
let mut reader = Reader::init("cookie \"Foo[Domain]\"");
let mut reader = Reader::new("cookie \"Foo[Domain]\"");
assert_eq!(
cookie_query(&mut reader).unwrap(),
QueryValue::Cookie {
@ -307,7 +307,7 @@ mod tests {
#[test]
fn test_xpath_query() {
let mut reader = Reader::init("xpath \"normalize-space(//head/title)\"");
let mut reader = Reader::new("xpath \"normalize-space(//head/title)\"");
assert_eq!(
xpath_query(&mut reader).unwrap(),
QueryValue::Xpath {
@ -326,7 +326,7 @@ mod tests {
},
);
let mut reader = Reader::init("xpath \"normalize-space(//div[contains(concat(' ',normalize-space(@class),' '),' monthly-price ')])\"");
let mut reader = Reader::new("xpath \"normalize-space(//div[contains(concat(' ',normalize-space(@class),' '),' monthly-price ')])\"");
assert_eq!(xpath_query(&mut reader).unwrap(), QueryValue::Xpath {
space0: Whitespace { value: String::from(" "), source_info: SourceInfo::new(1, 6, 1, 7) },
expr: Template {
@ -345,7 +345,7 @@ mod tests {
#[test]
fn test_jsonpath_query() {
let mut reader = Reader::init("jsonpath \"$['statusCode']\"");
let mut reader = Reader::new("jsonpath \"$['statusCode']\"");
assert_eq!(
jsonpath_query(&mut reader).unwrap(),
QueryValue::Jsonpath {
@ -363,7 +363,7 @@ mod tests {
},
},
);
let mut reader = Reader::init("jsonpath \"$.success\"");
let mut reader = Reader::new("jsonpath \"$.success\"");
assert_eq!(
jsonpath_query(&mut reader).unwrap(),
QueryValue::Jsonpath {
@ -385,7 +385,7 @@ mod tests {
#[test]
fn test_query_with_filters() {
let mut reader = Reader::init("body urlDecode ");
let mut reader = Reader::new("body urlDecode ");
assert_eq!(
query(&mut reader).unwrap(),
Query {

View File

@ -19,6 +19,24 @@ use std::cmp::min;
use crate::ast::Pos;
/// Represents a text reader.
///
/// The `Reader` implements methods to read a stream of text. A reader manages
/// an internal `state` which is the position of the current cursor within the reader's buffer.
/// Methods like [`Reader::read`], [`Reader::read_while`], [`Reader::read_while_escaping`]
/// do advance the internal reader's`state`. Other methods, like [`Reader::peek`], [`Reader::peek_k`]
/// allows to get the next chars in the buffer without modifying the current reader state.
///
/// # Example
/// ```
/// use hurl_core::parser::Reader;
///
/// let mut reader = Reader::new("hi");
/// let state = reader.state.cursor; // cursor is 0
/// let eof = reader.is_eof();
/// let val = reader.peek_n(2); // val = "hi"
/// let val = reader.read().unwrap(); // val = 'h'
/// ```
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Reader {
pub buffer: Vec<char>,
@ -32,8 +50,8 @@ pub struct ReaderState {
}
impl Reader {
// FIXME: change name to the more idiomatic new
pub fn init(s: &str) -> Reader {
/// Creates a new reader.
pub fn new(s: &str) -> Reader {
Reader {
buffer: s.chars().collect(),
state: ReaderState {
@ -43,10 +61,12 @@ impl Reader {
}
}
/// Returns true if the reader has read all the buffer, false otherwise.
pub fn is_eof(&self) -> bool {
self.state.cursor == self.buffer.len()
}
/// Returns the next char from the buffer advancing the internal state.
pub fn read(&mut self) -> Option<char> {
match self.buffer.get(self.state.cursor) {
None => None,
@ -64,16 +84,20 @@ impl Reader {
}
}
pub fn peek(&mut self) -> Option<char> {
self.buffer.get(self.state.cursor).copied()
}
pub fn peek_n(&self, n: usize) -> String {
let start = self.state.cursor;
let end = min(start + n, self.buffer.len());
self.buffer[start..end].iter().collect()
/// Returns `count` chars from the buffer advancing the internal state.
/// This methods can returns less than `count` chars if there is not enough chars in the buffer.
pub fn read_n(&mut self, count: usize) -> String {
let mut s = String::from("");
for _ in 0..count {
match self.read() {
None => {}
Some(c) => s.push(c),
}
}
s
}
/// Returns chars from the buffer while `predicate` is true, advancing the internal state.
pub fn read_while(&mut self, predicate: fn(&char) -> bool) -> String {
let mut s = String::from("");
loop {
@ -114,16 +138,17 @@ impl Reader {
}
}
// assume that you still have count characters to read in your buffer
pub fn read_n(&mut self, count: usize) -> String {
let mut s = String::from("");
for _ in 0..count {
match self.read() {
None => {}
Some(c) => s.push(c),
}
}
s
/// Returns the next char from the buffer without advancing the internal state.
pub fn peek(&mut self) -> Option<char> {
self.buffer.get(self.state.cursor).copied()
}
/// Returns the `count` char from the buffer without advancing the internal state.
/// This methods can returns less than `count` chars if there is not enough chars in the buffer.
pub fn peek_n(&self, count: usize) -> String {
let start = self.state.cursor;
let end = min(start + count, self.buffer.len());
self.buffer[start..end].iter().collect()
}
pub fn try_literal(&mut self, value: &str) -> bool {
@ -135,10 +160,9 @@ impl Reader {
}
}
// FIXME: explain this method, find a better name mayebe?
pub fn from(&self, start: usize) -> String {
pub fn peek_back(&self, start: usize) -> String {
let end = self.state.cursor;
self.buffer.as_slice()[start..end].iter().collect()
self.buffer[start..end].iter().collect()
}
}
@ -152,7 +176,7 @@ mod tests {
#[test]
fn test_reader() {
let mut reader = Reader::init("hi");
let mut reader = Reader::new("hi");
assert_eq!(reader.state.cursor, 0);
assert!(!reader.is_eof());
assert_eq!(reader.peek_n(2), "hi".to_string());
@ -168,11 +192,11 @@ mod tests {
#[test]
fn test_try_predicate() {
let mut reader = Reader::init("hi");
let mut reader = Reader::new("hi");
assert!(reader.try_literal("hi"));
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("hello");
let mut reader = Reader::new("hello");
assert!(!reader.try_literal("hi"));
assert_eq!(reader.state.cursor, 0);
}

View File

@ -738,17 +738,17 @@ mod tests {
#[test]
fn test_section_name() {
let mut reader = Reader::init("[SectionA]");
let mut reader = Reader::new("[SectionA]");
assert_eq!(section_name(&mut reader).unwrap(), String::from("SectionA"));
let mut reader = Reader::init("[]");
let mut reader = Reader::new("[]");
assert!(section_name(&mut reader).err().unwrap().recoverable);
}
#[test]
fn test_asserts_section() {
let mut reader =
Reader::init("[Asserts]\nheader \"Location\" equals \"https://google.fr\"\n");
Reader::new("[Asserts]\nheader \"Location\" equals \"https://google.fr\"\n");
assert_eq!(
response_section(&mut reader).unwrap(),
@ -841,8 +841,7 @@ mod tests {
#[test]
fn test_asserts_section_error() {
let mut reader =
Reader::init("x[Assertsx]\nheader Location equals \"https://google.fr\"\n");
let mut reader = Reader::new("x[Assertsx]\nheader Location equals \"https://google.fr\"\n");
let error = response_section(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -853,7 +852,7 @@ mod tests {
);
assert!(error.recoverable);
let mut reader = Reader::init("[Assertsx]\nheader Location equals \"https://google.fr\"\n");
let mut reader = Reader::new("[Assertsx]\nheader Location equals \"https://google.fr\"\n");
let error = response_section(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 2 });
assert_eq!(
@ -867,7 +866,7 @@ mod tests {
#[test]
fn test_cookie() {
let mut reader = Reader::init("Foo: Bar");
let mut reader = Reader::new("Foo: Bar");
let c = cookie(&mut reader).unwrap();
assert_eq!(c.name.value, String::from("Foo"));
assert_eq!(
@ -885,7 +884,7 @@ mod tests {
#[test]
fn test_option_insecure() {
let mut reader = Reader::init("insecure: true");
let mut reader = Reader::new("insecure: true");
let option = option_insecure(&mut reader).unwrap();
assert_eq!(
option,
@ -954,14 +953,14 @@ mod tests {
#[test]
fn test_option_insecure_error() {
let mut reader = Reader::init("insecure: error");
let mut reader = Reader::new("insecure: error");
let error = option_insecure(&mut reader).err().unwrap();
assert!(!error.recoverable)
}
#[test]
fn test_option_cacert() {
let mut reader = Reader::init("cacert: /home/foo/cert.pem");
let mut reader = Reader::new("cacert: /home/foo/cert.pem");
let option = option_cacert(&mut reader).unwrap();
assert_eq!(
option,
@ -1033,14 +1032,14 @@ mod tests {
#[test]
fn test_option_cacert_error() {
let mut reader = Reader::init("cacert: ###");
let mut reader = Reader::new("cacert: ###");
let error = option_cacert(&mut reader).err().unwrap();
assert!(!error.recoverable)
}
#[test]
fn test_variable_definition() {
let mut reader = Reader::init("a=1");
let mut reader = Reader::new("a=1");
assert_eq!(
variable_definition(&mut reader).unwrap(),
VariableDefinition {
@ -1066,22 +1065,22 @@ mod tests {
#[test]
fn test_variable_value() {
let mut reader = Reader::init("null");
let mut reader = Reader::new("null");
assert_eq!(variable_value(&mut reader).unwrap(), VariableValue::Null {});
let mut reader = Reader::init("true");
let mut reader = Reader::new("true");
assert_eq!(
variable_value(&mut reader).unwrap(),
VariableValue::Bool(true)
);
let mut reader = Reader::init("1");
let mut reader = Reader::new("1");
assert_eq!(
variable_value(&mut reader).unwrap(),
VariableValue::Integer(1)
);
let mut reader = Reader::init("toto");
let mut reader = Reader::new("toto");
assert_eq!(
variable_value(&mut reader).unwrap(),
VariableValue::String(Template {
@ -1096,7 +1095,7 @@ mod tests {
},
})
);
let mut reader = Reader::init("\"123\"");
let mut reader = Reader::new("\"123\"");
assert_eq!(
variable_value(&mut reader).unwrap(),
VariableValue::String(Template {
@ -1115,7 +1114,7 @@ mod tests {
#[test]
fn test_cookie_error() {
let mut reader = Reader::init("Foo: {{Bar");
let mut reader = Reader::new("Foo: {{Bar");
let error = cookie(&mut reader).err().unwrap();
assert_eq!(
error.pos,
@ -1135,7 +1134,7 @@ mod tests {
#[test]
fn test_file_value() {
let mut reader = Reader::init("file,hello.txt;");
let mut reader = Reader::new("file,hello.txt;");
assert_eq!(
file_value(&mut reader).unwrap(),
FileValue {
@ -1158,7 +1157,7 @@ mod tests {
content_type: None,
}
);
let mut reader = Reader::init("file,hello.txt; text/html");
let mut reader = Reader::new("file,hello.txt; text/html");
assert_eq!(
file_value(&mut reader).unwrap(),
FileValue {
@ -1185,21 +1184,21 @@ mod tests {
#[test]
fn test_file_content_type() {
let mut reader = Reader::init("text/html");
let mut reader = Reader::new("text/html");
assert_eq!(
file_content_type(&mut reader).unwrap(),
"text/html".to_string()
);
assert_eq!(reader.state.cursor, 9);
let mut reader = Reader::init("text/plain; charset=us-ascii");
let mut reader = Reader::new("text/plain; charset=us-ascii");
assert_eq!(
file_content_type(&mut reader).unwrap(),
"text/plain; charset=us-ascii".to_string()
);
assert_eq!(reader.state.cursor, 28);
let mut reader = Reader::init("text/html # comment");
let mut reader = Reader::new("text/html # comment");
assert_eq!(
file_content_type(&mut reader).unwrap(),
"text/html".to_string()
@ -1209,7 +1208,7 @@ mod tests {
#[test]
fn test_capture() {
let mut reader = Reader::init("url: header \"Location\"");
let mut reader = Reader::new("url: header \"Location\"");
let capture0 = capture(&mut reader).unwrap();
assert_eq!(
@ -1245,7 +1244,7 @@ mod tests {
#[test]
fn test_capture_with_filter() {
let mut reader = Reader::init("token: header \"Location\" regex \"token=(.*)\"");
let mut reader = Reader::new("token: header \"Location\" regex \"token=(.*)\"");
let capture0 = capture(&mut reader).unwrap();
assert_eq!(
@ -1273,7 +1272,7 @@ mod tests {
#[test]
fn test_capture_with_filter_error() {
let mut reader = Reader::init("token: header \"Location\" regex ");
let mut reader = Reader::new("token: header \"Location\" regex ");
let error = capture(&mut reader).err().unwrap();
assert_eq!(
error.pos,
@ -1290,7 +1289,7 @@ mod tests {
);
assert!(!error.recoverable);
let mut reader = Reader::init("token: header \"Location\" xxx");
let mut reader = Reader::new("token: header \"Location\" xxx");
let error = capture(&mut reader).err().unwrap();
assert_eq!(
error.pos,
@ -1310,7 +1309,7 @@ mod tests {
#[test]
fn test_assert() {
let mut reader = Reader::init("header \"Location\" equals \"https://google.fr\"");
let mut reader = Reader::new("header \"Location\" equals \"https://google.fr\"");
let assert0 = assert(&mut reader).unwrap();
assert_eq!(
@ -1337,7 +1336,7 @@ mod tests {
#[test]
fn test_assert_jsonpath() {
let mut reader = Reader::init("jsonpath \"$.errors\" equals 5");
let mut reader = Reader::new("jsonpath \"$.errors\" equals 5");
assert_eq!(
assert(&mut reader).unwrap().predicate,

View File

@ -86,7 +86,7 @@ pub fn unquoted_string_key(reader: &mut Reader) -> ParseResult<'static, EncodedS
match escape_char(reader) {
Ok(c) => {
value.push(c);
encoded.push_str(reader.from(save.cursor).as_str())
encoded.push_str(reader.peek_back(save.cursor).as_str())
}
Err(e) => {
if e.recoverable {
@ -104,7 +104,7 @@ pub fn unquoted_string_key(reader: &mut Reader) -> ParseResult<'static, EncodedS
|| c == '$'
{
value.push(c);
encoded.push_str(reader.from(save.cursor).as_str())
encoded.push_str(reader.peek_back(save.cursor).as_str())
} else {
reader.state = save;
break;
@ -237,7 +237,7 @@ pub fn backtick_template(reader: &mut Reader) -> ParseResult<'static, Template>
fn any_char(except: Vec<char>, reader: &mut Reader) -> ParseResult<'static, (char, String)> {
let start = reader.state.clone();
match escape_char(reader) {
Ok(c) => Ok((c, reader.from(start.cursor))),
Ok(c) => Ok((c, reader.peek_back(start.cursor))),
Err(e) => {
if e.recoverable {
reader.state = start.clone();
@ -261,7 +261,7 @@ fn any_char(except: Vec<char>, reader: &mut Reader) -> ParseResult<'static, (cha
},
})
} else {
Ok((c, reader.from(start.cursor)))
Ok((c, reader.peek_back(start.cursor)))
}
}
}
@ -332,7 +332,7 @@ mod tests {
#[test]
fn test_unquoted_template_empty() {
let mut reader = Reader::init("");
let mut reader = Reader::new("");
assert_eq!(
unquoted_template(&mut reader).unwrap(),
Template {
@ -346,7 +346,7 @@ mod tests {
#[test]
fn test_unquoted_template_with_hash() {
let mut reader = Reader::init("a#");
let mut reader = Reader::new("a#");
assert_eq!(
unquoted_template(&mut reader).unwrap(),
Template {
@ -363,7 +363,7 @@ mod tests {
#[test]
fn test_unquoted_template_with_encoded_hash() {
let mut reader = Reader::init("a\\u{23}");
let mut reader = Reader::new("a\\u{23}");
assert_eq!(
unquoted_template(&mut reader).unwrap(),
Template {
@ -380,7 +380,7 @@ mod tests {
#[test]
fn test_unquoted_template_with_quote() {
let mut reader = Reader::init("\"hi\"");
let mut reader = Reader::new("\"hi\"");
assert_eq!(
unquoted_template(&mut reader).unwrap(),
Template {
@ -397,7 +397,7 @@ mod tests {
#[test]
fn test_unquoted_template_hello_world() {
let mut reader = Reader::init("hello\\u{20}{{name}}!");
let mut reader = Reader::new("hello\\u{20}{{name}}!");
assert_eq!(
unquoted_template(&mut reader).unwrap(),
Template {
@ -434,7 +434,7 @@ mod tests {
#[test]
fn test_unquoted_template_trailing_space() {
let mut reader = Reader::init("hello world # comment");
let mut reader = Reader::new("hello world # comment");
assert_eq!(
unquoted_template(&mut reader).unwrap(),
Template {
@ -458,7 +458,7 @@ mod tests {
#[test]
fn test_unquoted_key() {
let mut reader = Reader::init("key");
let mut reader = Reader::new("key");
assert_eq!(
unquoted_string_key(&mut reader).unwrap(),
EncodedString {
@ -470,7 +470,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 3);
let mut reader = Reader::init("key\\u{20}\\u{3a} :");
let mut reader = Reader::new("key\\u{20}\\u{3a} :");
assert_eq!(
unquoted_string_key(&mut reader).unwrap(),
EncodedString {
@ -482,7 +482,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 15);
let mut reader = Reader::init("$top:");
let mut reader = Reader::new("$top:");
assert_eq!(
unquoted_string_key(&mut reader).unwrap(),
EncodedString {
@ -497,7 +497,7 @@ mod tests {
#[test]
fn test_unquoted_key_with_square_bracket() {
let mut reader = Reader::init("values\\u{5b}0\\u{5d} :");
let mut reader = Reader::new("values\\u{5b}0\\u{5d} :");
assert_eq!(
unquoted_string_key(&mut reader).unwrap(),
EncodedString {
@ -509,7 +509,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 19);
let mut reader = Reader::init("values[0] :");
let mut reader = Reader::new("values[0] :");
assert_eq!(
unquoted_string_key(&mut reader).unwrap(),
EncodedString {
@ -524,7 +524,7 @@ mod tests {
#[test]
fn test_unquoted_keys_ignore_start_square_bracket() {
let mut reader = Reader::init("[0]:");
let mut reader = Reader::new("[0]:");
let error = unquoted_string_key(&mut reader).err().unwrap();
assert!(error.recoverable);
assert_eq!(reader.state.cursor, 3);
@ -532,7 +532,7 @@ mod tests {
#[test]
fn test_unquoted_keys_accept_start_escape_square_bracket() {
let mut reader = Reader::init("\\u{5b}0\\u{5d}");
let mut reader = Reader::new("\\u{5b}0\\u{5d}");
assert_eq!(
unquoted_string_key(&mut reader).unwrap(),
EncodedString {
@ -547,7 +547,7 @@ mod tests {
#[test]
fn test_unquoted_key_error() {
let mut reader = Reader::init("");
let mut reader = Reader::new("");
let error = unquoted_string_key(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -557,12 +557,12 @@ mod tests {
}
);
let mut reader = Reader::init("\\l");
let mut reader = Reader::new("\\l");
let error = unquoted_string_key(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 2 });
assert_eq!(error.inner, ParseError::EscapeChar {});
let mut reader = Reader::init(r#"{"id":1}"#);
let mut reader = Reader::new(r#"{"id":1}"#);
let error = unquoted_string_key(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -575,7 +575,7 @@ mod tests {
#[test]
fn test_quoted_template() {
let mut reader = Reader::init("\"\"");
let mut reader = Reader::new("\"\"");
assert_eq!(
quoted_template(&mut reader).unwrap(),
Template {
@ -586,7 +586,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("\"a#\"");
let mut reader = Reader::new("\"a#\"");
assert_eq!(
quoted_template(&mut reader).unwrap(),
Template {
@ -600,7 +600,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 4);
let mut reader = Reader::init("\"{0}\"");
let mut reader = Reader::new("\"{0}\"");
assert_eq!(
quoted_template(&mut reader).unwrap(),
Template {
@ -618,7 +618,7 @@ mod tests {
#[test]
fn test_quoted_template_with_quote() {
// "\"hi\""
let mut reader = Reader::init("\"\\\"hi\\\"\"");
let mut reader = Reader::new("\"\\\"hi\\\"\"");
assert_eq!(
quoted_template(&mut reader).unwrap(),
Template {
@ -635,7 +635,7 @@ mod tests {
#[test]
fn test_quoted_template_error_missing_closing_quote() {
let mut reader = Reader::init("\"not found");
let mut reader = Reader::new("\"not found");
let error = quoted_template(&mut reader).err().unwrap();
assert_eq!(
error.pos,
@ -649,18 +649,18 @@ mod tests {
#[test]
fn test_quoted_string() {
let mut reader = Reader::init("\"\"");
let mut reader = Reader::new("\"\"");
assert_eq!(quoted_string(&mut reader).unwrap(), "");
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("\"Hello\"");
let mut reader = Reader::new("\"Hello\"");
assert_eq!(quoted_string(&mut reader).unwrap(), "Hello");
assert_eq!(reader.state.cursor, 7);
}
#[test]
fn test_backtick_template() {
let mut reader = Reader::init("``");
let mut reader = Reader::new("``");
assert_eq!(
backtick_template(&mut reader).unwrap(),
Template {
@ -671,7 +671,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("`foo#`");
let mut reader = Reader::new("`foo#`");
assert_eq!(
backtick_template(&mut reader).unwrap(),
Template {
@ -685,7 +685,7 @@ mod tests {
);
assert_eq!(reader.state.cursor, 6);
let mut reader = Reader::init("`{0}`");
let mut reader = Reader::new("`{0}`");
assert_eq!(
backtick_template(&mut reader).unwrap(),
Template {
@ -703,7 +703,7 @@ mod tests {
#[test]
fn test_backtick_template_with_backtick() {
// `\`hi\``
let mut reader = Reader::init("`\\`hi\\``");
let mut reader = Reader::new("`\\`hi\\``");
assert_eq!(
backtick_template(&mut reader).unwrap(),
Template {
@ -720,7 +720,7 @@ mod tests {
#[test]
fn test_backtick_template_error_missing_closing_backtick() {
let mut reader = Reader::init("`not found");
let mut reader = Reader::new("`not found");
let error = backtick_template(&mut reader).err().unwrap();
assert_eq!(
error.pos,
@ -734,28 +734,28 @@ mod tests {
#[test]
fn test_any_char() {
let mut reader = Reader::init("a");
let mut reader = Reader::new("a");
assert_eq!(
any_char(vec![], &mut reader).unwrap(),
('a', "a".to_string())
);
assert_eq!(reader.state.cursor, 1);
let mut reader = Reader::init(" ");
let mut reader = Reader::new(" ");
assert_eq!(
any_char(vec![], &mut reader).unwrap(),
(' ', " ".to_string())
);
assert_eq!(reader.state.cursor, 1);
let mut reader = Reader::init("\\t");
let mut reader = Reader::new("\\t");
assert_eq!(
any_char(vec![], &mut reader).unwrap(),
('\t', "\\t".to_string())
);
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("#");
let mut reader = Reader::new("#");
assert_eq!(
any_char(vec![], &mut reader).unwrap(),
('#', "#".to_string())
@ -765,7 +765,7 @@ mod tests {
#[test]
fn test_any_char_quote() {
let mut reader = Reader::init("\\\"");
let mut reader = Reader::new("\\\"");
assert_eq!(
any_char(vec![], &mut reader).unwrap(),
('"', "\\\"".to_string())
@ -775,17 +775,17 @@ mod tests {
#[test]
fn test_any_char_error() {
let mut reader = Reader::init("");
let mut reader = Reader::new("");
let error = any_char(vec![], &mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert!(error.recoverable);
let mut reader = Reader::init("#");
let mut reader = Reader::new("#");
let error = any_char(vec!['#'], &mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert!(error.recoverable);
let mut reader = Reader::init("\t");
let mut reader = Reader::new("\t");
let error = any_char(vec![], &mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert!(error.recoverable);
@ -793,15 +793,15 @@ mod tests {
#[test]
fn test_escape_char() {
let mut reader = Reader::init("\\n");
let mut reader = Reader::new("\\n");
assert_eq!(escape_char(&mut reader).unwrap(), '\n');
assert_eq!(reader.state.cursor, 2);
let mut reader = Reader::init("\\u{0a}");
let mut reader = Reader::new("\\u{0a}");
assert_eq!(escape_char(&mut reader).unwrap(), '\n');
assert_eq!(reader.state.cursor, 6);
let mut reader = Reader::init("x");
let mut reader = Reader::new("x");
let error = escape_char(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(
@ -816,21 +816,21 @@ mod tests {
#[test]
fn test_unicode() {
let mut reader = Reader::init("{000a}");
let mut reader = Reader::new("{000a}");
assert_eq!(unicode(&mut reader).unwrap(), '\n');
assert_eq!(reader.state.cursor, 6);
let mut reader = Reader::init("{E9}");
let mut reader = Reader::new("{E9}");
assert_eq!(unicode(&mut reader).unwrap(), 'é');
assert_eq!(reader.state.cursor, 4);
}
#[test]
fn test_hex_value() {
let mut reader = Reader::init("20x");
let mut reader = Reader::new("20x");
assert_eq!(hex_value(&mut reader).unwrap(), 32);
let mut reader = Reader::init("x");
let mut reader = Reader::new("x");
let error = hex_value(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(error.inner, ParseError::HexDigit);
@ -841,7 +841,7 @@ mod tests {
fn test_quoted_template_benchmark() {
// benchmark tests not in stable toolchain yet
// Simply log duration for the time-being
let mut reader = Reader::init(
let mut reader = Reader::new(
format!(
"\"Hello World!\"{}",
(0..10_000_000).map(|_| "X").collect::<String>()

View File

@ -82,7 +82,7 @@ pub fn templatize(encoded_string: EncodedString) -> ParseResult<'static, Vec<Tem
State::FirstCloseBracket {} => {
if s.as_str() == "}" {
let mut reader = Reader::init(encoded.as_str());
let mut reader = Reader::new(encoded.as_str());
reader.state = ReaderState {
cursor: 0,
pos: expression_start.unwrap().clone(),

View File

@ -139,7 +139,7 @@ mod tests {
#[test]
fn test_url() {
let mut reader = Reader::init("http://google.fr # ");
let mut reader = Reader::new("http://google.fr # ");
assert_eq!(
url(&mut reader).unwrap(),
Template {
@ -156,7 +156,7 @@ mod tests {
#[test]
fn test_url2() {
let mut reader = Reader::init("http://localhost:8000/cookies/set-session-cookie2-valueA");
let mut reader = Reader::new("http://localhost:8000/cookies/set-session-cookie2-valueA");
assert_eq!(
url(&mut reader).unwrap(),
Template {
@ -175,7 +175,7 @@ mod tests {
#[test]
fn test_url_with_expression() {
let mut reader = Reader::init("http://{{host}}.fr ");
let mut reader = Reader::new("http://{{host}}.fr ");
assert_eq!(
url(&mut reader).unwrap(),
Template {
@ -212,7 +212,7 @@ mod tests {
#[test]
fn test_url_error_variable() {
let mut reader = Reader::init("http://{{host>}}.fr");
let mut reader = Reader::new("http://{{host>}}.fr");
let error = url(&mut reader).err().unwrap();
assert_eq!(
error.pos,
@ -233,7 +233,7 @@ mod tests {
#[test]
fn test_url_error_missing_delimiter() {
let mut reader = Reader::init("http://{{host");
let mut reader = Reader::new("http://{{host");
let error = url(&mut reader).err().unwrap();
assert_eq!(
error.pos,
@ -253,7 +253,7 @@ mod tests {
#[test]
fn test_url_error_empty() {
let mut reader = Reader::init(" # eol");
let mut reader = Reader::new(" # eol");
let error = url(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(error.inner, ParseError::UrlIllegalCharacter(' '));
@ -315,7 +315,7 @@ mod tests {
];
for s in valid_urls {
//eprintln!("{}", s);
let mut reader = Reader::init(s);
let mut reader = Reader::new(s);
assert!(url(&mut reader).is_ok());
}
}

View File

@ -66,30 +66,30 @@ mod tests {
#[test]
fn test_parsing_xml_brute_force_errors() {
let mut reader = Reader::init("");
let mut reader = Reader::new("");
let error = parse(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(error.inner, ParseError::Xml {});
assert!(error.recoverable);
let mut reader = Reader::init("x");
let mut reader = Reader::new("x");
let error = parse(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(error.inner, ParseError::Xml {});
assert!(error.recoverable);
let mut reader = Reader::init("<<");
let mut reader = Reader::new("<<");
let error = parse(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(error.inner, ParseError::Xml {});
assert!(!error.recoverable);
let mut reader = Reader::init("<users><user /></users");
let mut reader = Reader::new("<users><user /></users");
let error = parse(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(error.inner, ParseError::Xml {});
let mut reader = Reader::init("<users aa><user /></users");
let mut reader = Reader::new("<users aa><user /></users");
let error = parse(&mut reader).err().unwrap();
assert_eq!(error.pos, Pos { line: 1, column: 1 });
assert_eq!(error.inner, ParseError::Xml {});
@ -97,14 +97,14 @@ mod tests {
#[test]
fn test_parsing_xml_brute_force() {
let mut reader = Reader::init("<users><user /></users>");
let mut reader = Reader::new("<users><user /></users>");
assert_eq!(
parse(&mut reader).unwrap(),
String::from("<users><user /></users>")
);
assert_eq!(reader.state.cursor, 23);
let mut reader = Reader::init("<users><user /></users>xx");
let mut reader = Reader::new("<users><user /></users>xx");
assert_eq!(
parse(&mut reader).unwrap(),
String::from("<users><user /></users>")
@ -112,7 +112,7 @@ mod tests {
assert_eq!(reader.state.cursor, 23);
assert_eq!(reader.peek_n(2), String::from("xx"));
let mut reader = Reader::init("<?xml version=\"1.0\"?><users/>xxx");
let mut reader = Reader::new("<?xml version=\"1.0\"?><users/>xxx");
assert_eq!(
parse(&mut reader).unwrap(),
String::from("<?xml version=\"1.0\"?><users/>")

View File

@ -39,7 +39,7 @@ fn test_echo() {
}
fn parse_json(content: String) -> Result<JsonValue, hurl_core::parser::Error> {
let mut reader = hurl_core::parser::Reader::init(content.as_str());
let mut reader = hurl_core::parser::Reader::new(content.as_str());
hurl_core::parser::parse_json(&mut reader)
}

View File

@ -276,7 +276,7 @@ fn test_echo() {
//eprintln!("value={:#?}", value);
let s = format_value(value);
eprintln!("s={s}");
let mut reader = Reader::init(s.as_str());
let mut reader = Reader::new(s.as_str());
let parsed_value = parse_json(&mut reader).unwrap();
assert_eq!(format_value(parsed_value), s);
@ -294,7 +294,7 @@ fn test_parse_files() {
let path = p.unwrap().path();
println!("parsing json file {}", path.display());
let s = fs::read_to_string(path).expect("Something went wrong reading the file");
let mut reader = Reader::init(s.as_str());
let mut reader = Reader::new(s.as_str());
let parsed_value = parse_json(&mut reader).unwrap();
assert_eq!(format_value(parsed_value), s);