Skip to content
This repository was archived by the owner on Dec 18, 2019. It is now read-only.

Commit 0da60f8

Browse files
committed
Implement InputTakeAtPosition for Span
1 parent 8e84f42 commit 0da60f8

File tree

1 file changed

+36
-20
lines changed

1 file changed

+36
-20
lines changed

source/tokens.rs

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ use nom::{
5151
InputIter,
5252
InputLength,
5353
InputTake,
54+
InputTakeAtPosition,
55+
IResult,
56+
Err,
57+
Needed,
58+
Context,
59+
ErrorKind,
5460
Offset,
5561
Slice
5662
};
@@ -825,32 +831,42 @@ pub struct Span<'a> {
825831
slice: Input<'a>
826832
}
827833

834+
impl<'a> InputTakeAtPosition for Span<'a> {
835+
type Item = InputElement;
836+
837+
fn split_at_position<P>(&self, predicate: P) -> IResult<Self, Self, u32>
838+
where
839+
P: Fn(Self::Item) -> bool,
840+
{
841+
match (0..self.slice.len()).find(|b| predicate(self.slice[*b])) {
842+
Some(i) => Ok((self.slice(i..), self.slice(..i))),
843+
None => Err(Err::Incomplete(Needed::Size(1))),
844+
}
845+
}
846+
847+
fn split_at_position1<P>(&self, predicate: P, e: ErrorKind<u32>) -> IResult<Self, Self, u32>
848+
where
849+
P: Fn(Self::Item) -> bool,
850+
{
851+
match (0..self.slice.len()).find(|b| predicate(self.slice[*b])) {
852+
Some(0) => Err(Err::Error(Context::Code(*self, e))),
853+
Some(i) => {
854+
Ok((self.slice(i..), self.slice(..i)))
855+
},
856+
None => Err(Err::Incomplete(Needed::Size(1))),
857+
}
858+
}
859+
}
860+
828861
impl<'a> InputTake for Span<'a> {
829862
fn take(&self, count: usize) -> Self {
830-
Span {
831-
offset: self.offset,
832-
line: self.line,
833-
column: self.column,
834-
slice: self.slice.take(count),
835-
}
863+
self.slice(..count)
836864
}
837865

838866
fn take_split(&self, count: usize) -> (Self, Self) {
839-
let (left, right) = self.slice.take_split(count);
840-
841867
(
842-
Span {
843-
offset: self.offset,
844-
line: self.line,
845-
column: self.column,
846-
slice: left,
847-
},
848-
Span {
849-
offset: self.offset,
850-
line: self.line,
851-
column: self.column,
852-
slice: right,
853-
},
868+
self.slice(count..),
869+
self.slice(..count),
854870
)
855871
}
856872
}

0 commit comments

Comments
 (0)