1use crate::branch::alt;
6use crate::combinator::opt;
7use crate::error::ErrorKind;
8use crate::error::ParseError;
9use crate::internal::{Err, IResult, Needed};
10use crate::traits::{AsChar, FindToken, Input};
11use crate::traits::{Compare, CompareResult};
12use crate::Emit;
13use crate::OutputM;
14use crate::Parser;
15use crate::Streaming;
16
17pub fn char<I, Error: ParseError<I>>(c: char) -> impl FnMut(I) -> IResult<I, char, Error>
33where
34 I: Input,
35 <I as Input>::Item: AsChar,
36{
37 let mut parser = super::char(c);
38 move |i: I| parser.process::<OutputM<Emit, Emit, Streaming>>(i)
39}
40
41pub fn satisfy<F, I, Error: ParseError<I>>(cond: F) -> impl FnMut(I) -> IResult<I, char, Error>
57where
58 I: Input,
59 <I as Input>::Item: AsChar,
60 F: Fn(char) -> bool,
61{
62 let mut parser = super::satisfy(cond);
63 move |i: I| parser.process::<OutputM<Emit, Emit, Streaming>>(i)
64}
65
66pub fn one_of<I, T, Error: ParseError<I>>(list: T) -> impl FnMut(I) -> IResult<I, char, Error>
79where
80 I: Input,
81 <I as Input>::Item: AsChar,
82 T: FindToken<char>,
83{
84 let mut parser = super::one_of(list);
85 move |i: I| parser.process::<OutputM<Emit, Emit, Streaming>>(i)
86}
87
88pub fn none_of<I, T, Error: ParseError<I>>(list: T) -> impl FnMut(I) -> IResult<I, char, Error>
101where
102 I: Input,
103 <I as Input>::Item: AsChar,
104 T: FindToken<char>,
105{
106 let mut parser = super::none_of(list);
107 move |i: I| parser.process::<OutputM<Emit, Emit, Streaming>>(i)
108}
109
110pub fn crlf<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
123where
124 T: Input,
125 T: Compare<&'static str>,
126{
127 match input.compare("\r\n") {
128 CompareResult::Ok => Ok(input.take_split(2)),
130 CompareResult::Incomplete => Err(Err::Incomplete(Needed::new(2))),
131 CompareResult::Error => {
132 let e: ErrorKind = ErrorKind::CrLf;
133 Err(Err::Error(E::from_error_kind(input, e)))
134 }
135 }
136}
137
138pub fn not_line_ending<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
153where
154 T: Input,
155 T: Compare<&'static str>,
156 <T as Input>::Item: AsChar,
157{
158 match input.position(|item| {
159 let c = item.as_char();
160 c == '\r' || c == '\n'
161 }) {
162 None => Err(Err::Incomplete(Needed::Unknown)),
163 Some(index) => {
164 let mut it = input.take_from(index).iter_elements();
165 let nth = it.next().unwrap().as_char();
166 if nth == '\r' {
167 let sliced = input.take_from(index);
168 let comp = sliced.compare("\r\n");
169 match comp {
170 CompareResult::Incomplete => Err(Err::Incomplete(Needed::Unknown)),
172 CompareResult::Error => {
173 let e: ErrorKind = ErrorKind::Tag;
174 Err(Err::Error(E::from_error_kind(input, e)))
175 }
176 CompareResult::Ok => Ok(input.take_split(index)),
177 }
178 } else {
179 Ok(input.take_split(index))
180 }
181 }
182 }
183}
184
185pub fn line_ending<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
198where
199 T: Input,
200 T: Compare<&'static str>,
201{
202 match input.compare("\n") {
203 CompareResult::Ok => Ok(input.take_split(1)),
204 CompareResult::Incomplete => Err(Err::Incomplete(Needed::new(1))),
205 CompareResult::Error => {
206 match input.compare("\r\n") {
207 CompareResult::Ok => Ok(input.take_split(2)),
209 CompareResult::Incomplete => Err(Err::Incomplete(Needed::new(2))),
210 CompareResult::Error => Err(Err::Error(E::from_error_kind(input, ErrorKind::CrLf))),
211 }
212 }
213 }
214}
215
216pub fn newline<I, Error: ParseError<I>>(input: I) -> IResult<I, char, Error>
229where
230 I: Input,
231 <I as Input>::Item: AsChar,
232{
233 char('\n')(input)
234}
235
236pub fn tab<I, Error: ParseError<I>>(input: I) -> IResult<I, char, Error>
249where
250 I: Input,
251 <I as Input>::Item: AsChar,
252{
253 char('\t')(input)
254}
255
256pub fn anychar<T, E: ParseError<T>>(input: T) -> IResult<T, char, E>
267where
268 T: Input,
269 <T as Input>::Item: AsChar,
270{
271 let mut it = input.iter_elements();
272 match it.next() {
273 None => Err(Err::Incomplete(Needed::new(1))),
274 Some(c) => Ok((input.take_from(c.len()), c.as_char())),
275 }
276}
277
278pub fn alpha0<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
292where
293 T: Input,
294 <T as Input>::Item: AsChar,
295{
296 input.split_at_position(|item| !item.is_alpha())
297}
298
299pub fn alpha1<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
313where
314 T: Input,
315 <T as Input>::Item: AsChar,
316{
317 input.split_at_position1(|item| !item.is_alpha(), ErrorKind::Alpha)
318}
319
320pub fn digit0<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
334where
335 T: Input,
336 <T as Input>::Item: AsChar,
337{
338 input.split_at_position(|item| !item.is_dec_digit())
339}
340
341pub fn digit1<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
355where
356 T: Input,
357 <T as Input>::Item: AsChar,
358{
359 input.split_at_position1(|item| !item.is_dec_digit(), ErrorKind::Digit)
360}
361
362pub fn hex_digit0<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
376where
377 T: Input,
378 <T as Input>::Item: AsChar,
379{
380 input.split_at_position(|item| !item.is_hex_digit())
381}
382
383pub fn hex_digit1<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
397where
398 T: Input,
399 <T as Input>::Item: AsChar,
400{
401 input.split_at_position1(|item| !item.is_hex_digit(), ErrorKind::HexDigit)
402}
403
404pub fn oct_digit0<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
418where
419 T: Input,
420 <T as Input>::Item: AsChar,
421{
422 input.split_at_position(|item| !item.is_oct_digit())
423}
424
425pub fn oct_digit1<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
439where
440 T: Input,
441 <T as Input>::Item: AsChar,
442{
443 input.split_at_position1(|item| !item.is_oct_digit(), ErrorKind::OctDigit)
444}
445
446pub fn bin_digit0<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
460where
461 T: Input,
462 <T as Input>::Item: AsChar,
463{
464 input.split_at_position(|item| !item.is_bin_digit())
465}
466
467pub fn bin_digit1<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
481where
482 T: Input,
483 <T as Input>::Item: AsChar,
484{
485 input.split_at_position1(|item| !item.is_bin_digit(), ErrorKind::BinDigit)
486}
487
488pub fn alphanumeric0<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
502where
503 T: Input,
504 <T as Input>::Item: AsChar,
505{
506 input.split_at_position(|item| !item.is_alphanum())
507}
508
509pub fn alphanumeric1<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
523where
524 T: Input,
525 <T as Input>::Item: AsChar,
526{
527 input.split_at_position1(|item| !item.is_alphanum(), ErrorKind::AlphaNumeric)
528}
529
530pub fn space0<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
544where
545 T: Input,
546 <T as Input>::Item: AsChar,
547{
548 input.split_at_position(|item| {
549 let c = item.as_char();
550 !(c == ' ' || c == '\t')
551 })
552}
553pub fn space1<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
567where
568 T: Input,
569 <T as Input>::Item: AsChar,
570{
571 input.split_at_position1(
572 |item| {
573 let c = item.as_char();
574 !(c == ' ' || c == '\t')
575 },
576 ErrorKind::Space,
577 )
578}
579
580pub fn multispace0<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
594where
595 T: Input,
596 <T as Input>::Item: AsChar,
597{
598 input.split_at_position(|item| {
599 let c = item.as_char();
600 !(c == ' ' || c == '\t' || c == '\r' || c == '\n')
601 })
602}
603
604pub fn multispace1<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
618where
619 T: Input,
620 <T as Input>::Item: AsChar,
621{
622 input.split_at_position1(
623 |item| {
624 let c = item.as_char();
625 !(c == ' ' || c == '\t' || c == '\r' || c == '\n')
626 },
627 ErrorKind::MultiSpace,
628 )
629}
630
631pub(crate) fn sign<T, E: ParseError<T>>(input: T) -> IResult<T, bool, E>
632where
633 T: Clone + Input,
634 T: for<'a> Compare<&'a [u8]>,
635{
636 use crate::bytes::streaming::tag;
637 use crate::combinator::value;
638
639 let (i, opt_sign) = opt(alt((
640 value(false, tag(&b"-"[..])),
641 value(true, tag(&b"+"[..])),
642 )))
643 .parse(input)?;
644 let sign = opt_sign.unwrap_or(true);
645
646 Ok((i, sign))
647}
648
649#[doc(hidden)]
650macro_rules! ints {
651 ($($t:tt)+) => {
652 $(
653 pub fn $t<T, E: ParseError<T>>(input: T) -> IResult<T, $t, E>
657 where
658 T: Input + Clone,
659 <T as Input>::Item: AsChar,
660 T: for <'a> Compare<&'a[u8]>,
661 {
662 let (i, sign) = sign(input.clone())?;
663
664 if i.input_len() == 0 {
665 return Err(Err::Incomplete(Needed::new(1)));
666 }
667
668 let mut value: $t = 0;
669 if sign {
670 let mut pos = 0;
671 for c in i.iter_elements() {
672 match c.as_char().to_digit(10) {
673 None => {
674 if pos == 0 {
675 return Err(Err::Error(E::from_error_kind(input, ErrorKind::Digit)));
676 } else {
677 return Ok((i.take_from(pos), value));
678 }
679 },
680 Some(d) => match value.checked_mul(10).and_then(|v| v.checked_add(d as $t)) {
681 None => return Err(Err::Error(E::from_error_kind(input, ErrorKind::Digit))),
682 Some(v) => {
683 pos += c.len();
684 value = v;
685 },
686 }
687 }
688 }
689 } else {
690 let mut pos = 0;
691 for c in i.iter_elements() {
692 match c.as_char().to_digit(10) {
693 None => {
694 if pos == 0 {
695 return Err(Err::Error(E::from_error_kind(input, ErrorKind::Digit)));
696 } else {
697 return Ok((i.take_from(pos), value));
698 }
699 },
700 Some(d) => match value.checked_mul(10).and_then(|v| v.checked_sub(d as $t)) {
701 None => return Err(Err::Error(E::from_error_kind(input, ErrorKind::Digit))),
702 Some(v) => {
703 pos += c.len();
704 value = v;
705 },
706 }
707 }
708 }
709 }
710
711 Err(Err::Incomplete(Needed::new(1)))
712 }
713 )+
714 }
715}
716
717ints! { i8 i16 i32 i64 i128 isize }
718
719#[doc(hidden)]
720macro_rules! uints {
721 ($($t:tt)+) => {
722 $(
723 pub fn $t<T, E: ParseError<T>>(input: T) -> IResult<T, $t, E>
727 where
728 T: Input ,
729 <T as Input>::Item: AsChar,
730 {
731 let i = input;
732
733 if i.input_len() == 0 {
734 return Err(Err::Incomplete(Needed::new(1)));
735 }
736
737 let mut value: $t = 0;
738 let mut pos = 0;
739 for c in i.iter_elements() {
740 match c.as_char().to_digit(10) {
741 None => {
742 if pos == 0 {
743 return Err(Err::Error(E::from_error_kind(i, ErrorKind::Digit)));
744 } else {
745 return Ok((i.take_from(pos), value));
746 }
747 },
748 Some(d) => match value.checked_mul(10).and_then(|v| v.checked_add(d as $t)) {
749 None => return Err(Err::Error(E::from_error_kind(i, ErrorKind::Digit))),
750 Some(v) => {
751 pos += c.len();
752 value = v;
753 },
754 }
755 }
756 }
757
758 Err(Err::Incomplete(Needed::new(1)))
759 }
760 )+
761 }
762}
763
764uints! { u8 u16 u32 u64 u128 usize }
765
766#[cfg(test)]
767mod tests {
768 use super::*;
769 use crate::error::ErrorKind;
770 use crate::internal::{Err, Needed};
771 use crate::sequence::pair;
772 use crate::traits::ParseTo;
773 use crate::Parser;
774 use proptest::prelude::*;
775
776 macro_rules! assert_parse(
777 ($left: expr, $right: expr) => {
778 let res: $crate::IResult<_, _, (_, ErrorKind)> = $left;
779 assert_eq!(res, $right);
780 };
781 );
782
783 #[test]
784 fn anychar_str() {
785 use super::anychar;
786 assert_eq!(anychar::<_, (&str, ErrorKind)>("Ә"), Ok(("", 'Ә')));
787 }
788
789 #[test]
790 fn character() {
791 let a: &[u8] = b"abcd";
792 let b: &[u8] = b"1234";
793 let c: &[u8] = b"a123";
794 let d: &[u8] = "azé12".as_bytes();
795 let e: &[u8] = b" ";
796 let f: &[u8] = b" ;";
797 assert_parse!(alpha1(a), Err(Err::Incomplete(Needed::new(1))));
799 assert_eq!(alpha1(b), Err(Err::Error((b, ErrorKind::Alpha))));
800 assert_eq!(alpha1::<_, (_, ErrorKind)>(c), Ok((&c[1..], &b"a"[..])));
801 assert_eq!(
802 alpha1::<_, (_, ErrorKind)>(d),
803 Ok(("é12".as_bytes(), &b"az"[..]))
804 );
805 assert_eq!(digit1(a), Err(Err::Error((a, ErrorKind::Digit))));
806 assert_eq!(
807 digit1::<_, (_, ErrorKind)>(b),
808 Err(Err::Incomplete(Needed::new(1)))
809 );
810 assert_eq!(digit1(c), Err(Err::Error((c, ErrorKind::Digit))));
811 assert_eq!(digit1(d), Err(Err::Error((d, ErrorKind::Digit))));
812 assert_eq!(
813 hex_digit1::<_, (_, ErrorKind)>(a),
814 Err(Err::Incomplete(Needed::new(1)))
815 );
816 assert_eq!(
817 hex_digit1::<_, (_, ErrorKind)>(b),
818 Err(Err::Incomplete(Needed::new(1)))
819 );
820 assert_eq!(
821 hex_digit1::<_, (_, ErrorKind)>(c),
822 Err(Err::Incomplete(Needed::new(1)))
823 );
824 assert_eq!(
825 hex_digit1::<_, (_, ErrorKind)>(d),
826 Ok(("zé12".as_bytes(), &b"a"[..]))
827 );
828 assert_eq!(hex_digit1(e), Err(Err::Error((e, ErrorKind::HexDigit))));
829 assert_eq!(oct_digit1(a), Err(Err::Error((a, ErrorKind::OctDigit))));
830 assert_eq!(
831 oct_digit1::<_, (_, ErrorKind)>(b),
832 Err(Err::Incomplete(Needed::new(1)))
833 );
834 assert_eq!(oct_digit1(c), Err(Err::Error((c, ErrorKind::OctDigit))));
835 assert_eq!(oct_digit1(d), Err(Err::Error((d, ErrorKind::OctDigit))));
836 assert_eq!(
837 alphanumeric1::<_, (_, ErrorKind)>(a),
838 Err(Err::Incomplete(Needed::new(1)))
839 );
840 assert_eq!(bin_digit1(a), Err(Err::Error((a, ErrorKind::BinDigit))));
841 assert_eq!(
842 bin_digit1::<_, (_, ErrorKind)>(b),
843 Ok((&b"234"[..], &b"1"[..]))
844 );
845 assert_eq!(bin_digit1(c), Err(Err::Error((c, ErrorKind::BinDigit))));
846 assert_eq!(bin_digit1(d), Err(Err::Error((d, ErrorKind::BinDigit))));
847 assert_eq!(
848 alphanumeric1::<_, (_, ErrorKind)>(a),
849 Err(Err::Incomplete(Needed::new(1)))
850 );
851 assert_eq!(
853 alphanumeric1::<_, (_, ErrorKind)>(c),
854 Err(Err::Incomplete(Needed::new(1)))
855 );
856 assert_eq!(
857 alphanumeric1::<_, (_, ErrorKind)>(d),
858 Ok(("é12".as_bytes(), &b"az"[..]))
859 );
860 assert_eq!(
861 space1::<_, (_, ErrorKind)>(e),
862 Err(Err::Incomplete(Needed::new(1)))
863 );
864 assert_eq!(space1::<_, (_, ErrorKind)>(f), Ok((&b";"[..], &b" "[..])));
865 }
866
867 #[cfg(feature = "alloc")]
868 #[test]
869 fn character_s() {
870 let a = "abcd";
871 let b = "1234";
872 let c = "a123";
873 let d = "azé12";
874 let e = " ";
875 assert_eq!(
876 alpha1::<_, (_, ErrorKind)>(a),
877 Err(Err::Incomplete(Needed::new(1)))
878 );
879 assert_eq!(alpha1(b), Err(Err::Error((b, ErrorKind::Alpha))));
880 assert_eq!(alpha1::<_, (_, ErrorKind)>(c), Ok((&c[1..], "a")));
881 assert_eq!(alpha1::<_, (_, ErrorKind)>(d), Ok(("é12", "az")));
882 assert_eq!(digit1(a), Err(Err::Error((a, ErrorKind::Digit))));
883 assert_eq!(
884 digit1::<_, (_, ErrorKind)>(b),
885 Err(Err::Incomplete(Needed::new(1)))
886 );
887 assert_eq!(digit1(c), Err(Err::Error((c, ErrorKind::Digit))));
888 assert_eq!(digit1(d), Err(Err::Error((d, ErrorKind::Digit))));
889 assert_eq!(
890 hex_digit1::<_, (_, ErrorKind)>(a),
891 Err(Err::Incomplete(Needed::new(1)))
892 );
893 assert_eq!(
894 hex_digit1::<_, (_, ErrorKind)>(b),
895 Err(Err::Incomplete(Needed::new(1)))
896 );
897 assert_eq!(
898 hex_digit1::<_, (_, ErrorKind)>(c),
899 Err(Err::Incomplete(Needed::new(1)))
900 );
901 assert_eq!(hex_digit1::<_, (_, ErrorKind)>(d), Ok(("zé12", "a")));
902 assert_eq!(hex_digit1(e), Err(Err::Error((e, ErrorKind::HexDigit))));
903 assert_eq!(oct_digit1(a), Err(Err::Error((a, ErrorKind::OctDigit))));
904 assert_eq!(
905 oct_digit1::<_, (_, ErrorKind)>(b),
906 Err(Err::Incomplete(Needed::new(1)))
907 );
908 assert_eq!(oct_digit1(c), Err(Err::Error((c, ErrorKind::OctDigit))));
909 assert_eq!(oct_digit1(d), Err(Err::Error((d, ErrorKind::OctDigit))));
910 assert_eq!(bin_digit1(a), Err(Err::Error((a, ErrorKind::BinDigit))));
911 assert_eq!(bin_digit1::<_, (_, ErrorKind)>(b), Ok(("234", "1")));
912 assert_eq!(bin_digit1(c), Err(Err::Error((c, ErrorKind::BinDigit))));
913 assert_eq!(bin_digit1(d), Err(Err::Error((d, ErrorKind::BinDigit))));
914 assert_eq!(
915 alphanumeric1::<_, (_, ErrorKind)>(a),
916 Err(Err::Incomplete(Needed::new(1)))
917 );
918 assert_eq!(
920 alphanumeric1::<_, (_, ErrorKind)>(c),
921 Err(Err::Incomplete(Needed::new(1)))
922 );
923 assert_eq!(alphanumeric1::<_, (_, ErrorKind)>(d), Ok(("é12", "az")));
924 assert_eq!(
925 space1::<_, (_, ErrorKind)>(e),
926 Err(Err::Incomplete(Needed::new(1)))
927 );
928 }
929
930 use crate::traits::Offset;
931 #[test]
932 fn offset() {
933 let a = &b"abcd;"[..];
934 let b = &b"1234;"[..];
935 let c = &b"a123;"[..];
936 let d = &b" \t;"[..];
937 let e = &b" \t\r\n;"[..];
938 let f = &b"123abcDEF;"[..];
939
940 match alpha1::<_, (_, ErrorKind)>(a) {
941 Ok((i, _)) => {
942 assert_eq!(a.offset(i) + i.len(), a.len());
943 }
944 _ => panic!("wrong return type in offset test for alpha"),
945 }
946 match digit1::<_, (_, ErrorKind)>(b) {
947 Ok((i, _)) => {
948 assert_eq!(b.offset(i) + i.len(), b.len());
949 }
950 _ => panic!("wrong return type in offset test for digit"),
951 }
952 match alphanumeric1::<_, (_, ErrorKind)>(c) {
953 Ok((i, _)) => {
954 assert_eq!(c.offset(i) + i.len(), c.len());
955 }
956 _ => panic!("wrong return type in offset test for alphanumeric"),
957 }
958 match space1::<_, (_, ErrorKind)>(d) {
959 Ok((i, _)) => {
960 assert_eq!(d.offset(i) + i.len(), d.len());
961 }
962 _ => panic!("wrong return type in offset test for space"),
963 }
964 match multispace1::<_, (_, ErrorKind)>(e) {
965 Ok((i, _)) => {
966 assert_eq!(e.offset(i) + i.len(), e.len());
967 }
968 _ => panic!("wrong return type in offset test for multispace"),
969 }
970 match hex_digit1::<_, (_, ErrorKind)>(f) {
971 Ok((i, _)) => {
972 assert_eq!(f.offset(i) + i.len(), f.len());
973 }
974 _ => panic!("wrong return type in offset test for hex_digit"),
975 }
976 match oct_digit1::<_, (_, ErrorKind)>(f) {
977 Ok((i, _)) => {
978 assert_eq!(f.offset(i) + i.len(), f.len());
979 }
980 _ => panic!("wrong return type in offset test for oct_digit"),
981 }
982 match bin_digit1::<_, (_, ErrorKind)>(f) {
983 Ok((i, _)) => {
984 assert_eq!(f.offset(i) + i.len(), f.len());
985 }
986 _ => panic!("wrong return type in offset test for bin_digit"),
987 }
988 }
989
990 #[test]
991 fn is_not_line_ending_bytes() {
992 let a: &[u8] = b"ab12cd\nefgh";
993 assert_eq!(
994 not_line_ending::<_, (_, ErrorKind)>(a),
995 Ok((&b"\nefgh"[..], &b"ab12cd"[..]))
996 );
997
998 let b: &[u8] = b"ab12cd\nefgh\nijkl";
999 assert_eq!(
1000 not_line_ending::<_, (_, ErrorKind)>(b),
1001 Ok((&b"\nefgh\nijkl"[..], &b"ab12cd"[..]))
1002 );
1003
1004 let c: &[u8] = b"ab12cd\r\nefgh\nijkl";
1005 assert_eq!(
1006 not_line_ending::<_, (_, ErrorKind)>(c),
1007 Ok((&b"\r\nefgh\nijkl"[..], &b"ab12cd"[..]))
1008 );
1009
1010 let d: &[u8] = b"ab12cd";
1011 assert_eq!(
1012 not_line_ending::<_, (_, ErrorKind)>(d),
1013 Err(Err::Incomplete(Needed::Unknown))
1014 );
1015 }
1016
1017 #[test]
1018 fn is_not_line_ending_str() {
1019 let f = "βèƒôřè\rÂßÇáƒƭèř";
1037 assert_eq!(not_line_ending(f), Err(Err::Error((f, ErrorKind::Tag))));
1038
1039 let g2: &str = "ab12cd";
1040 assert_eq!(
1041 not_line_ending::<_, (_, ErrorKind)>(g2),
1042 Err(Err::Incomplete(Needed::Unknown))
1043 );
1044 }
1045
1046 #[test]
1047 fn hex_digit_test() {
1048 let i = &b"0123456789abcdefABCDEF;"[..];
1049 assert_parse!(hex_digit1(i), Ok((&b";"[..], &i[..i.len() - 1])));
1050
1051 let i = &b"g"[..];
1052 assert_parse!(
1053 hex_digit1(i),
1054 Err(Err::Error(error_position!(i, ErrorKind::HexDigit)))
1055 );
1056
1057 let i = &b"G"[..];
1058 assert_parse!(
1059 hex_digit1(i),
1060 Err(Err::Error(error_position!(i, ErrorKind::HexDigit)))
1061 );
1062
1063 assert!(AsChar::is_hex_digit(b'0'));
1064 assert!(AsChar::is_hex_digit(b'9'));
1065 assert!(AsChar::is_hex_digit(b'a'));
1066 assert!(AsChar::is_hex_digit(b'f'));
1067 assert!(AsChar::is_hex_digit(b'A'));
1068 assert!(AsChar::is_hex_digit(b'F'));
1069 assert!(!AsChar::is_hex_digit(b'g'));
1070 assert!(!AsChar::is_hex_digit(b'G'));
1071 assert!(!AsChar::is_hex_digit(b'/'));
1072 assert!(!AsChar::is_hex_digit(b':'));
1073 assert!(!AsChar::is_hex_digit(b'@'));
1074 assert!(!AsChar::is_hex_digit(b'\x60'));
1075 }
1076
1077 #[test]
1078 fn oct_digit_test() {
1079 let i = &b"01234567;"[..];
1080 assert_parse!(oct_digit1(i), Ok((&b";"[..], &i[..i.len() - 1])));
1081
1082 let i = &b"8"[..];
1083 assert_parse!(
1084 oct_digit1(i),
1085 Err(Err::Error(error_position!(i, ErrorKind::OctDigit)))
1086 );
1087
1088 assert!(AsChar::is_oct_digit(b'0'));
1089 assert!(AsChar::is_oct_digit(b'7'));
1090 assert!(!AsChar::is_oct_digit(b'8'));
1091 assert!(!AsChar::is_oct_digit(b'9'));
1092 assert!(!AsChar::is_oct_digit(b'a'));
1093 assert!(!AsChar::is_oct_digit(b'A'));
1094 assert!(!AsChar::is_oct_digit(b'/'));
1095 assert!(!AsChar::is_oct_digit(b':'));
1096 assert!(!AsChar::is_oct_digit(b'@'));
1097 assert!(!AsChar::is_oct_digit(b'\x60'));
1098 }
1099
1100 #[test]
1101 fn bin_digit_test() {
1102 let i = &b"01;"[..];
1103 assert_parse!(bin_digit1(i), Ok((&b";"[..], &i[..i.len() - 1])));
1104
1105 let i = &b"8"[..];
1106 assert_parse!(
1107 bin_digit1(i),
1108 Err(Err::Error(error_position!(i, ErrorKind::BinDigit)))
1109 );
1110
1111 assert!(crate::character::is_bin_digit(b'0'));
1112 assert!(crate::character::is_bin_digit(b'1'));
1113 assert!(!crate::character::is_bin_digit(b'8'));
1114 assert!(!crate::character::is_bin_digit(b'9'));
1115 assert!(!crate::character::is_bin_digit(b'a'));
1116 assert!(!crate::character::is_bin_digit(b'A'));
1117 assert!(!crate::character::is_bin_digit(b'/'));
1118 assert!(!crate::character::is_bin_digit(b':'));
1119 assert!(!crate::character::is_bin_digit(b'@'));
1120 assert!(!crate::character::is_bin_digit(b'\x60'));
1121 }
1122
1123 #[test]
1124 fn full_line_windows() {
1125 fn take_full_line(i: &[u8]) -> IResult<&[u8], (&[u8], &[u8])> {
1126 pair(not_line_ending, line_ending).parse(i)
1127 }
1128 let input = b"abc\r\n";
1129 let output = take_full_line(input);
1130 assert_eq!(output, Ok((&b""[..], (&b"abc"[..], &b"\r\n"[..]))));
1131 }
1132
1133 #[test]
1134 fn full_line_unix() {
1135 fn take_full_line(i: &[u8]) -> IResult<&[u8], (&[u8], &[u8])> {
1136 pair(not_line_ending, line_ending).parse(i)
1137 }
1138 let input = b"abc\n";
1139 let output = take_full_line(input);
1140 assert_eq!(output, Ok((&b""[..], (&b"abc"[..], &b"\n"[..]))));
1141 }
1142
1143 #[test]
1144 fn check_windows_lineending() {
1145 let input = b"\r\n";
1146 let output = line_ending(&input[..]);
1147 assert_parse!(output, Ok((&b""[..], &b"\r\n"[..])));
1148 }
1149
1150 #[test]
1151 fn check_unix_lineending() {
1152 let input = b"\n";
1153 let output = line_ending(&input[..]);
1154 assert_parse!(output, Ok((&b""[..], &b"\n"[..])));
1155 }
1156
1157 #[test]
1158 fn cr_lf() {
1159 assert_parse!(crlf(&b"\r\na"[..]), Ok((&b"a"[..], &b"\r\n"[..])));
1160 assert_parse!(crlf(&b"\r"[..]), Err(Err::Incomplete(Needed::new(2))));
1161 assert_parse!(
1162 crlf(&b"\ra"[..]),
1163 Err(Err::Error(error_position!(&b"\ra"[..], ErrorKind::CrLf)))
1164 );
1165
1166 assert_parse!(crlf("\r\na"), Ok(("a", "\r\n")));
1167 assert_parse!(crlf("\r"), Err(Err::Incomplete(Needed::new(2))));
1168 assert_parse!(
1169 crlf("\ra"),
1170 Err(Err::Error(error_position!("\ra", ErrorKind::CrLf)))
1171 );
1172 }
1173
1174 #[test]
1175 fn end_of_line() {
1176 assert_parse!(line_ending(&b"\na"[..]), Ok((&b"a"[..], &b"\n"[..])));
1177 assert_parse!(line_ending(&b"\r\na"[..]), Ok((&b"a"[..], &b"\r\n"[..])));
1178 assert_parse!(
1179 line_ending(&b"\r"[..]),
1180 Err(Err::Incomplete(Needed::new(2)))
1181 );
1182 assert_parse!(
1183 line_ending(&b"\ra"[..]),
1184 Err(Err::Error(error_position!(&b"\ra"[..], ErrorKind::CrLf)))
1185 );
1186
1187 assert_parse!(line_ending("\na"), Ok(("a", "\n")));
1188 assert_parse!(line_ending("\r\na"), Ok(("a", "\r\n")));
1189 assert_parse!(line_ending("\r"), Err(Err::Incomplete(Needed::new(2))));
1190 assert_parse!(
1191 line_ending("\ra"),
1192 Err(Err::Error(error_position!("\ra", ErrorKind::CrLf)))
1193 );
1194 }
1195
1196 fn digit_to_i16(input: &str) -> IResult<&str, i16> {
1197 let i = input;
1198 let (i, opt_sign) = opt(alt((char('+'), char('-')))).parse(i)?;
1199 let sign = match opt_sign {
1200 Some('+') => true,
1201 Some('-') => false,
1202 _ => true,
1203 };
1204
1205 let (i, s) = match digit1::<_, crate::error::Error<_>>(i) {
1206 Ok((i, s)) => (i, s),
1207 Err(Err::Incomplete(i)) => return Err(Err::Incomplete(i)),
1208 Err(_) => {
1209 return Err(Err::Error(crate::error::Error::from_error_kind(
1210 input,
1211 ErrorKind::Digit,
1212 )))
1213 }
1214 };
1215 match s.parse_to() {
1216 Some(n) => {
1217 if sign {
1218 Ok((i, n))
1219 } else {
1220 Ok((i, -n))
1221 }
1222 }
1223 None => Err(Err::Error(crate::error::Error::from_error_kind(
1224 i,
1225 ErrorKind::Digit,
1226 ))),
1227 }
1228 }
1229
1230 fn digit_to_u32(i: &str) -> IResult<&str, u32> {
1231 let (i, s) = digit1(i)?;
1232 match s.parse_to() {
1233 Some(n) => Ok((i, n)),
1234 None => Err(Err::Error(crate::error::Error::from_error_kind(
1235 i,
1236 ErrorKind::Digit,
1237 ))),
1238 }
1239 }
1240
1241 proptest! {
1242 #[test]
1243 fn ints(s in "\\PC*") {
1244 let res1 = digit_to_i16(&s);
1245 let res2 = i16(s.as_str());
1246 assert_eq!(res1, res2);
1247 }
1248
1249 #[test]
1250 fn uints(s in "\\PC*") {
1251 let res1 = digit_to_u32(&s);
1252 let res2 = u32(s.as_str());
1253 assert_eq!(res1, res2);
1254 }
1255 }
1256}