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

Commit 821f857

Browse files
committed
Implement InputTakeAtPosition for Span
1 parent 8e84f42 commit 821f857

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

source/tokens.rs

Lines changed: 51 additions & 0 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,6 +831,51 @@ 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((Span {
843+
offset: self.offset,
844+
line: self.line,
845+
column: self.column,
846+
slice: &self.slice[i..],
847+
}, Span {
848+
offset: self.offset,
849+
line: self.line,
850+
column: self.column,
851+
slice: &self.slice[..i],
852+
})),
853+
None => Err(Err::Incomplete(Needed::Size(1))),
854+
}
855+
}
856+
857+
fn split_at_position1<P>(&self, predicate: P, e: ErrorKind<u32>) -> IResult<Self, Self, u32>
858+
where
859+
P: Fn(Self::Item) -> bool,
860+
{
861+
match (0..self.slice.len()).find(|b| predicate(self.slice[*b])) {
862+
Some(0) => Err(Err::Error(Context::Code(*self, e))),
863+
Some(i) => Ok((Span {
864+
offset: self.offset,
865+
line: self.line,
866+
column: self.column,
867+
slice: &self.slice[i..],
868+
}, Span {
869+
offset: self.offset,
870+
line: self.line,
871+
column: self.column,
872+
slice: &self.slice[..i],
873+
})),
874+
None => Err(Err::Incomplete(Needed::Size(1))),
875+
}
876+
}
877+
}
878+
828879
impl<'a> InputTake for Span<'a> {
829880
fn take(&self, count: usize) -> Self {
830881
Span {

0 commit comments

Comments
 (0)