Implement copy on jsonpath::Pos.

This commit is contained in:
jcamiel 2023-11-27 16:05:45 +01:00
parent a8e7fe92ba
commit b7346a8c8e
No known key found for this signature in database
GPG Key ID: 07FF11CFD55356CC
5 changed files with 25 additions and 25 deletions

View File

@ -20,11 +20,11 @@ use super::reader::Reader;
use super::{ParseFunc, ParseResult};
pub fn zero_or_more<T>(f: ParseFunc<T>, p: &mut Reader) -> ParseResult<Vec<T>> {
let _start = p.state.clone();
let _start = p.state;
let mut v: Vec<T> = Vec::new();
loop {
let initial_state = p.state.clone();
let initial_state = p.state;
if p.is_eof() {
return Ok(v);
}
@ -50,7 +50,7 @@ pub fn zero_or_more<T>(f: ParseFunc<T>, p: &mut Reader) -> ParseResult<Vec<T>> {
/// Typically this should be recoverable
pub fn choice<T>(fs: &[ParseFunc<T>], reader: &mut Reader) -> ParseResult<T> {
for (pos, f) in fs.iter().enumerate() {
let start = reader.state.clone();
let start = reader.state;
if pos == fs.len() - 1 {
return f(reader);
}

View File

@ -19,7 +19,7 @@
use error::Error;
use reader::Reader;
#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct Pos {
pub line: usize,
pub column: usize,

View File

@ -33,7 +33,7 @@ fn query(reader: &mut Reader) -> ParseResult<Query> {
let selectors = zero_or_more(selector, reader)?;
if !reader.is_eof() {
return Err(Error {
pos: reader.state.pos.clone(),
pos: reader.state.pos,
recoverable: false,
inner: ParseError::Expecting {
value: "eof".to_string(),
@ -61,7 +61,7 @@ fn selector(reader: &mut Reader) -> ParseResult<Selector> {
}
fn selector_array_index_or_array_indices(reader: &mut Reader) -> Result<Selector, Error> {
let initial_state = reader.state.clone();
let initial_state = reader.state;
try_left_bracket(reader)?;
let mut indexes = vec![];
let i = match natural(reader) {
@ -76,7 +76,7 @@ fn selector_array_index_or_array_indices(reader: &mut Reader) -> Result<Selector
};
indexes.push(i);
loop {
let state = reader.state.clone();
let state = reader.state;
if try_literal(",", reader).is_ok() {
let i = match natural(reader) {
Err(e) => {
@ -99,7 +99,7 @@ fn selector_array_index_or_array_indices(reader: &mut Reader) -> Result<Selector
if let Err(e) = try_literal("]", reader) {
reader.state = initial_state;
return Err(Error {
pos: reader.state.pos.clone(),
pos: reader.state.pos,
recoverable: true,
inner: e.inner,
});
@ -121,10 +121,10 @@ fn selector_array_wildcard(reader: &mut Reader) -> Result<Selector, Error> {
fn selector_array_slice(reader: &mut Reader) -> Result<Selector, Error> {
try_left_bracket(reader)?;
let state = reader.state.clone();
let state = reader.state;
let start = match integer(reader) {
Err(_) => {
reader.state = state.clone();
reader.state = state;
None
}
Ok(v) => Some(v),
@ -138,7 +138,7 @@ fn selector_array_slice(reader: &mut Reader) -> Result<Selector, Error> {
},
});
};
let state = reader.state.clone();
let state = reader.state;
let end = match integer(reader) {
Err(_) => {
reader.state = state;
@ -162,7 +162,7 @@ fn selector_object_key_bracket(reader: &mut Reader) -> Result<Selector, Error> {
try_left_bracket(reader)?;
match string_value(reader) {
Err(_) => Err(Error {
pos: reader.state.pos.clone(),
pos: reader.state.pos,
recoverable: true,
inner: ParseError::Expecting {
value: "value string".to_string(),
@ -178,7 +178,7 @@ fn selector_object_key_bracket(reader: &mut Reader) -> Result<Selector, Error> {
fn selector_object_key(reader: &mut Reader) -> Result<Selector, Error> {
if !reader.try_literal(".") {
return Err(Error {
pos: reader.state.pos.clone(),
pos: reader.state.pos,
recoverable: true,
inner: ParseError::Expecting {
value: "[ or .".to_string(),
@ -189,7 +189,7 @@ fn selector_object_key(reader: &mut Reader) -> Result<Selector, Error> {
let s = reader.read_while(|c| c.is_alphanumeric() || *c == '_' || *c == '-');
if s.is_empty() {
return Err(Error {
pos: reader.state.pos.clone(),
pos: reader.state.pos,
recoverable: false,
inner: ParseError::Expecting {
value: "empty value".to_string(),
@ -216,7 +216,7 @@ fn selector_recursive_key(reader: &mut Reader) -> Result<Selector, Error> {
}
fn try_left_bracket(reader: &mut Reader) -> Result<(), Error> {
let start = reader.state.clone();
let start = reader.state;
if literal(".[", reader).is_err() {
reader.state = start;
try_literal("[", reader)?;
@ -236,7 +236,7 @@ fn predicate(reader: &mut Reader) -> ParseResult<Predicate> {
// @.key>=value GreaterThanOrEqual(Key, Value)
literal("@.", reader)?; // assume key value for the time being
let key = key_path(reader)?;
let state = reader.state.clone();
let state = reader.state;
let func = match predicate_func(reader) {
Ok(f) => f,
Err(_) => {

View File

@ -20,7 +20,7 @@ use super::error::{Error, ParseError};
use super::{ParseResult, Reader};
pub fn natural(reader: &mut Reader) -> ParseResult<usize> {
let start = reader.state.clone();
let start = reader.state;
if reader.is_eof() {
return Err(Error {
@ -42,7 +42,7 @@ pub fn natural(reader: &mut Reader) -> ParseResult<usize> {
});
}
let save = reader.state.clone();
let save = reader.state;
let s = reader.read_while(|c| c.is_ascii_digit());
// if the first digit is zero, you should not have any more digits
@ -103,7 +103,7 @@ pub fn string_value(reader: &mut Reader) -> Result<String, Error> {
match reader.read() {
None => {
return Err(Error {
pos: reader.state.pos.clone(),
pos: reader.state.pos,
recoverable: false,
inner: ParseError::Expecting {
value: String::from("'"),
@ -119,7 +119,7 @@ pub fn string_value(reader: &mut Reader) -> Result<String, Error> {
}
_ => {
return Err(Error {
pos: reader.state.pos.clone(),
pos: reader.state.pos,
recoverable: false,
inner: ParseError::Expecting {
value: String::from("'"),
@ -148,7 +148,7 @@ pub fn key_name(reader: &mut Reader) -> Result<String, Error> {
c
} else {
return Err(Error {
pos: reader.state.pos.clone(),
pos: reader.state.pos,
recoverable: false,
inner: ParseError::Expecting {
value: "key".to_string(),
@ -158,7 +158,7 @@ pub fn key_name(reader: &mut Reader) -> Result<String, Error> {
}
None => {
return Err(Error {
pos: reader.state.pos.clone(),
pos: reader.state.pos,
recoverable: false,
inner: ParseError::Expecting {
value: "key".to_string(),
@ -187,7 +187,7 @@ pub fn literal(s: &str, reader: &mut Reader) -> ParseResult<()> {
// does not return a value
// non recoverable reader
// => use combinator recover to make it recoverable
let start = reader.state.clone();
let start = reader.state;
if reader.clone().is_eof() {
return Err(Error {
pos: start.pos,
@ -198,7 +198,7 @@ pub fn literal(s: &str, reader: &mut Reader) -> ParseResult<()> {
});
}
for c in s.chars() {
let _state = reader.state.clone();
let _state = reader.state;
match reader.read() {
None => {
return Err(Error {

View File

@ -26,7 +26,7 @@ pub struct Reader {
pub state: ReaderState,
}
#[derive(Clone, Debug, PartialEq, Eq)]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct ReaderState {
pub cursor: usize,
pub pos: Pos,