nom/
traits.rs

1//! Traits input types have to implement to work with nom combinators
2use crate::error::{ErrorKind, ParseError};
3use crate::internal::{Err, IResult, Needed};
4use crate::lib::std::iter::{Copied, Enumerate};
5use crate::lib::std::ops::{Range, RangeFrom, RangeFull, RangeTo};
6use crate::lib::std::slice::Iter;
7use crate::lib::std::str::from_utf8;
8use crate::lib::std::str::CharIndices;
9use crate::lib::std::str::Chars;
10use crate::lib::std::str::FromStr;
11
12#[cfg(feature = "alloc")]
13use crate::lib::std::string::String;
14#[cfg(feature = "alloc")]
15use crate::lib::std::vec::Vec;
16
17/// Abstract method to calculate the input length
18pub trait InputLength {
19  /// Calculates the input length, as indicated by its name,
20  /// and the name of the trait itself
21  fn input_len(&self) -> usize;
22}
23
24impl<'a, T> InputLength for &'a [T] {
25  #[inline]
26  fn input_len(&self) -> usize {
27    self.len()
28  }
29}
30
31impl<'a> InputLength for &'a str {
32  #[inline]
33  fn input_len(&self) -> usize {
34    self.len()
35  }
36}
37
38impl<'a> InputLength for (&'a [u8], usize) {
39  #[inline]
40  fn input_len(&self) -> usize {
41    //println!("bit input length for ({:?}, {}):", self.0, self.1);
42    //println!("-> {}", self.0.len() * 8 - self.1);
43    self.0.len() * 8 - self.1
44  }
45}
46
47/// Useful functions to calculate the offset between slices and show a hexdump of a slice
48pub trait Offset {
49  /// Offset between the first byte of self and the first byte of the argument
50  fn offset(&self, second: &Self) -> usize;
51}
52
53impl Offset for [u8] {
54  fn offset(&self, second: &Self) -> usize {
55    let fst = self.as_ptr();
56    let snd = second.as_ptr();
57
58    snd as usize - fst as usize
59  }
60}
61
62impl<'a> Offset for &'a [u8] {
63  fn offset(&self, second: &Self) -> usize {
64    let fst = self.as_ptr();
65    let snd = second.as_ptr();
66
67    snd as usize - fst as usize
68  }
69}
70
71impl Offset for str {
72  fn offset(&self, second: &Self) -> usize {
73    let fst = self.as_ptr();
74    let snd = second.as_ptr();
75
76    snd as usize - fst as usize
77  }
78}
79
80impl<'a> Offset for &'a str {
81  fn offset(&self, second: &Self) -> usize {
82    let fst = self.as_ptr();
83    let snd = second.as_ptr();
84
85    snd as usize - fst as usize
86  }
87}
88
89/// Helper trait for types that can be viewed as a byte slice
90pub trait AsBytes {
91  /// Casts the input type to a byte slice
92  fn as_bytes(&self) -> &[u8];
93}
94
95impl<'a> AsBytes for &'a str {
96  #[inline(always)]
97  fn as_bytes(&self) -> &[u8] {
98    (*self).as_bytes()
99  }
100}
101
102impl AsBytes for str {
103  #[inline(always)]
104  fn as_bytes(&self) -> &[u8] {
105    self.as_ref()
106  }
107}
108
109impl<'a> AsBytes for &'a [u8] {
110  #[inline(always)]
111  fn as_bytes(&self) -> &[u8] {
112    *self
113  }
114}
115
116impl AsBytes for [u8] {
117  #[inline(always)]
118  fn as_bytes(&self) -> &[u8] {
119    self
120  }
121}
122
123macro_rules! as_bytes_array_impls {
124  ($($N:expr)+) => {
125    $(
126      impl<'a> AsBytes for &'a [u8; $N] {
127        #[inline(always)]
128        fn as_bytes(&self) -> &[u8] {
129          *self
130        }
131      }
132
133      impl AsBytes for [u8; $N] {
134        #[inline(always)]
135        fn as_bytes(&self) -> &[u8] {
136          self
137        }
138      }
139    )+
140  };
141}
142
143as_bytes_array_impls! {
144     0  1  2  3  4  5  6  7  8  9
145    10 11 12 13 14 15 16 17 18 19
146    20 21 22 23 24 25 26 27 28 29
147    30 31 32
148}
149
150/// Transforms common types to a char for basic token parsing
151pub trait AsChar {
152  /// makes a char from self
153  fn as_char(self) -> char;
154
155  /// Tests that self is an alphabetic character
156  ///
157  /// Warning: for `&str` it recognizes alphabetic
158  /// characters outside of the 52 ASCII letters
159  fn is_alpha(self) -> bool;
160
161  /// Tests that self is an alphabetic character
162  /// or a decimal digit
163  fn is_alphanum(self) -> bool;
164  /// Tests that self is a decimal digit
165  fn is_dec_digit(self) -> bool;
166  /// Tests that self is an hex digit
167  fn is_hex_digit(self) -> bool;
168  /// Tests that self is an octal digit
169  fn is_oct_digit(self) -> bool;
170  /// Gets the len in bytes for self
171  fn len(self) -> usize;
172}
173
174impl AsChar for u8 {
175  #[inline]
176  fn as_char(self) -> char {
177    self as char
178  }
179  #[inline]
180  fn is_alpha(self) -> bool {
181    (self >= 0x41 && self <= 0x5A) || (self >= 0x61 && self <= 0x7A)
182  }
183  #[inline]
184  fn is_alphanum(self) -> bool {
185    self.is_alpha() || self.is_dec_digit()
186  }
187  #[inline]
188  fn is_dec_digit(self) -> bool {
189    self >= 0x30 && self <= 0x39
190  }
191  #[inline]
192  fn is_hex_digit(self) -> bool {
193    (self >= 0x30 && self <= 0x39)
194      || (self >= 0x41 && self <= 0x46)
195      || (self >= 0x61 && self <= 0x66)
196  }
197  #[inline]
198  fn is_oct_digit(self) -> bool {
199    self >= 0x30 && self <= 0x37
200  }
201  #[inline]
202  fn len(self) -> usize {
203    1
204  }
205}
206impl<'a> AsChar for &'a u8 {
207  #[inline]
208  fn as_char(self) -> char {
209    *self as char
210  }
211  #[inline]
212  fn is_alpha(self) -> bool {
213    (*self >= 0x41 && *self <= 0x5A) || (*self >= 0x61 && *self <= 0x7A)
214  }
215  #[inline]
216  fn is_alphanum(self) -> bool {
217    self.is_alpha() || self.is_dec_digit()
218  }
219  #[inline]
220  fn is_dec_digit(self) -> bool {
221    *self >= 0x30 && *self <= 0x39
222  }
223  #[inline]
224  fn is_hex_digit(self) -> bool {
225    (*self >= 0x30 && *self <= 0x39)
226      || (*self >= 0x41 && *self <= 0x46)
227      || (*self >= 0x61 && *self <= 0x66)
228  }
229  #[inline]
230  fn is_oct_digit(self) -> bool {
231    *self >= 0x30 && *self <= 0x37
232  }
233  #[inline]
234  fn len(self) -> usize {
235    1
236  }
237}
238
239impl AsChar for char {
240  #[inline]
241  fn as_char(self) -> char {
242    self
243  }
244  #[inline]
245  fn is_alpha(self) -> bool {
246    self.is_ascii_alphabetic()
247  }
248  #[inline]
249  fn is_alphanum(self) -> bool {
250    self.is_alpha() || self.is_dec_digit()
251  }
252  #[inline]
253  fn is_dec_digit(self) -> bool {
254    self.is_ascii_digit()
255  }
256  #[inline]
257  fn is_hex_digit(self) -> bool {
258    self.is_ascii_hexdigit()
259  }
260  #[inline]
261  fn is_oct_digit(self) -> bool {
262    self.is_digit(8)
263  }
264  #[inline]
265  fn len(self) -> usize {
266    self.len_utf8()
267  }
268}
269
270impl<'a> AsChar for &'a char {
271  #[inline]
272  fn as_char(self) -> char {
273    *self
274  }
275  #[inline]
276  fn is_alpha(self) -> bool {
277    self.is_ascii_alphabetic()
278  }
279  #[inline]
280  fn is_alphanum(self) -> bool {
281    self.is_alpha() || self.is_dec_digit()
282  }
283  #[inline]
284  fn is_dec_digit(self) -> bool {
285    self.is_ascii_digit()
286  }
287  #[inline]
288  fn is_hex_digit(self) -> bool {
289    self.is_ascii_hexdigit()
290  }
291  #[inline]
292  fn is_oct_digit(self) -> bool {
293    self.is_digit(8)
294  }
295  #[inline]
296  fn len(self) -> usize {
297    self.len_utf8()
298  }
299}
300
301/// Abstracts common iteration operations on the input type
302pub trait InputIter {
303  /// The current input type is a sequence of that `Item` type.
304  ///
305  /// Example: `u8` for `&[u8]` or `char` for `&str`
306  type Item;
307  /// An iterator over the input type, producing the item and its position
308  /// for use with [Slice]. If we're iterating over `&str`, the position
309  /// corresponds to the byte index of the character
310  type Iter: Iterator<Item = (usize, Self::Item)>;
311
312  /// An iterator over the input type, producing the item
313  type IterElem: Iterator<Item = Self::Item>;
314
315  /// Returns an iterator over the elements and their byte offsets
316  fn iter_indices(&self) -> Self::Iter;
317  /// Returns an iterator over the elements
318  fn iter_elements(&self) -> Self::IterElem;
319  /// Finds the byte position of the element
320  fn position<P>(&self, predicate: P) -> Option<usize>
321  where
322    P: Fn(Self::Item) -> bool;
323  /// Get the byte offset from the element's position in the stream
324  fn slice_index(&self, count: usize) -> Result<usize, Needed>;
325}
326
327/// Abstracts slicing operations
328pub trait InputTake: Sized {
329  /// Returns a slice of `count` bytes. panics if count > length
330  fn take(&self, count: usize) -> Self;
331  /// Split the stream at the `count` byte offset. panics if count > length
332  fn take_split(&self, count: usize) -> (Self, Self);
333}
334
335impl<'a> InputIter for &'a [u8] {
336  type Item = u8;
337  type Iter = Enumerate<Self::IterElem>;
338  type IterElem = Copied<Iter<'a, u8>>;
339
340  #[inline]
341  fn iter_indices(&self) -> Self::Iter {
342    self.iter_elements().enumerate()
343  }
344  #[inline]
345  fn iter_elements(&self) -> Self::IterElem {
346    self.iter().copied()
347  }
348  #[inline]
349  fn position<P>(&self, predicate: P) -> Option<usize>
350  where
351    P: Fn(Self::Item) -> bool,
352  {
353    self.iter().position(|b| predicate(*b))
354  }
355  #[inline]
356  fn slice_index(&self, count: usize) -> Result<usize, Needed> {
357    if self.len() >= count {
358      Ok(count)
359    } else {
360      Err(Needed::new(count - self.len()))
361    }
362  }
363}
364
365impl<'a> InputTake for &'a [u8] {
366  #[inline]
367  fn take(&self, count: usize) -> Self {
368    &self[0..count]
369  }
370  #[inline]
371  fn take_split(&self, count: usize) -> (Self, Self) {
372    let (prefix, suffix) = self.split_at(count);
373    (suffix, prefix)
374  }
375}
376
377impl<'a> InputIter for &'a str {
378  type Item = char;
379  type Iter = CharIndices<'a>;
380  type IterElem = Chars<'a>;
381  #[inline]
382  fn iter_indices(&self) -> Self::Iter {
383    self.char_indices()
384  }
385  #[inline]
386  fn iter_elements(&self) -> Self::IterElem {
387    self.chars()
388  }
389  fn position<P>(&self, predicate: P) -> Option<usize>
390  where
391    P: Fn(Self::Item) -> bool,
392  {
393    for (o, c) in self.char_indices() {
394      if predicate(c) {
395        return Some(o);
396      }
397    }
398    None
399  }
400  #[inline]
401  fn slice_index(&self, count: usize) -> Result<usize, Needed> {
402    let mut cnt = 0;
403    for (index, _) in self.char_indices() {
404      if cnt == count {
405        return Ok(index);
406      }
407      cnt += 1;
408    }
409    if cnt == count {
410      return Ok(self.len());
411    }
412    Err(Needed::Unknown)
413  }
414}
415
416impl<'a> InputTake for &'a str {
417  #[inline]
418  fn take(&self, count: usize) -> Self {
419    &self[..count]
420  }
421
422  // return byte index
423  #[inline]
424  fn take_split(&self, count: usize) -> (Self, Self) {
425    let (prefix, suffix) = self.split_at(count);
426    (suffix, prefix)
427  }
428}
429
430/// Dummy trait used for default implementations (currently only used for `InputTakeAtPosition` and `Compare`).
431///
432/// When implementing a custom input type, it is possible to use directly the
433/// default implementation: If the input type implements `InputLength`, `InputIter`,
434/// `InputTake` and `Clone`, you can implement `UnspecializedInput` and get
435/// a default version of `InputTakeAtPosition` and `Compare`.
436///
437/// For performance reasons, you might want to write a custom implementation of
438/// `InputTakeAtPosition` (like the one for `&[u8]`).
439pub trait UnspecializedInput {}
440
441/// Methods to take as much input as possible until the provided function returns true for the current element.
442///
443/// A large part of nom's basic parsers are built using this trait.
444pub trait InputTakeAtPosition: Sized {
445  /// The current input type is a sequence of that `Item` type.
446  ///
447  /// Example: `u8` for `&[u8]` or `char` for `&str`
448  type Item;
449
450  /// Looks for the first element of the input type for which the condition returns true,
451  /// and returns the input up to this position.
452  ///
453  /// *streaming version*: If no element is found matching the condition, this will return `Incomplete`
454  fn split_at_position<P, E: ParseError<Self>>(&self, predicate: P) -> IResult<Self, Self, E>
455  where
456    P: Fn(Self::Item) -> bool;
457
458  /// Looks for the first element of the input type for which the condition returns true
459  /// and returns the input up to this position.
460  ///
461  /// Fails if the produced slice is empty.
462  ///
463  /// *streaming version*: If no element is found matching the condition, this will return `Incomplete`
464  fn split_at_position1<P, E: ParseError<Self>>(
465    &self,
466    predicate: P,
467    e: ErrorKind,
468  ) -> IResult<Self, Self, E>
469  where
470    P: Fn(Self::Item) -> bool;
471
472  /// Looks for the first element of the input type for which the condition returns true,
473  /// and returns the input up to this position.
474  ///
475  /// *complete version*: If no element is found matching the condition, this will return the whole input
476  fn split_at_position_complete<P, E: ParseError<Self>>(
477    &self,
478    predicate: P,
479  ) -> IResult<Self, Self, E>
480  where
481    P: Fn(Self::Item) -> bool;
482
483  /// Looks for the first element of the input type for which the condition returns true
484  /// and returns the input up to this position.
485  ///
486  /// Fails if the produced slice is empty.
487  ///
488  /// *complete version*: If no element is found matching the condition, this will return the whole input
489  fn split_at_position1_complete<P, E: ParseError<Self>>(
490    &self,
491    predicate: P,
492    e: ErrorKind,
493  ) -> IResult<Self, Self, E>
494  where
495    P: Fn(Self::Item) -> bool;
496}
497
498impl<T: InputLength + InputIter + InputTake + Clone + UnspecializedInput> InputTakeAtPosition
499  for T
500{
501  type Item = <T as InputIter>::Item;
502
503  fn split_at_position<P, E: ParseError<Self>>(&self, predicate: P) -> IResult<Self, Self, E>
504  where
505    P: Fn(Self::Item) -> bool,
506  {
507    match self.position(predicate) {
508      Some(n) => Ok(self.take_split(n)),
509      None => Err(Err::Incomplete(Needed::new(1))),
510    }
511  }
512
513  fn split_at_position1<P, E: ParseError<Self>>(
514    &self,
515    predicate: P,
516    e: ErrorKind,
517  ) -> IResult<Self, Self, E>
518  where
519    P: Fn(Self::Item) -> bool,
520  {
521    match self.position(predicate) {
522      Some(0) => Err(Err::Error(E::from_error_kind(self.clone(), e))),
523      Some(n) => Ok(self.take_split(n)),
524      None => Err(Err::Incomplete(Needed::new(1))),
525    }
526  }
527
528  fn split_at_position_complete<P, E: ParseError<Self>>(
529    &self,
530    predicate: P,
531  ) -> IResult<Self, Self, E>
532  where
533    P: Fn(Self::Item) -> bool,
534  {
535    match self.split_at_position(predicate) {
536      Err(Err::Incomplete(_)) => Ok(self.take_split(self.input_len())),
537      res => res,
538    }
539  }
540
541  fn split_at_position1_complete<P, E: ParseError<Self>>(
542    &self,
543    predicate: P,
544    e: ErrorKind,
545  ) -> IResult<Self, Self, E>
546  where
547    P: Fn(Self::Item) -> bool,
548  {
549    match self.split_at_position1(predicate, e) {
550      Err(Err::Incomplete(_)) => {
551        if self.input_len() == 0 {
552          Err(Err::Error(E::from_error_kind(self.clone(), e)))
553        } else {
554          Ok(self.take_split(self.input_len()))
555        }
556      }
557      res => res,
558    }
559  }
560}
561
562impl<'a> InputTakeAtPosition for &'a [u8] {
563  type Item = u8;
564
565  fn split_at_position<P, E: ParseError<Self>>(&self, predicate: P) -> IResult<Self, Self, E>
566  where
567    P: Fn(Self::Item) -> bool,
568  {
569    match self.iter().position(|c| predicate(*c)) {
570      Some(i) => Ok(self.take_split(i)),
571      None => Err(Err::Incomplete(Needed::new(1))),
572    }
573  }
574
575  fn split_at_position1<P, E: ParseError<Self>>(
576    &self,
577    predicate: P,
578    e: ErrorKind,
579  ) -> IResult<Self, Self, E>
580  where
581    P: Fn(Self::Item) -> bool,
582  {
583    match self.iter().position(|c| predicate(*c)) {
584      Some(0) => Err(Err::Error(E::from_error_kind(self, e))),
585      Some(i) => Ok(self.take_split(i)),
586      None => Err(Err::Incomplete(Needed::new(1))),
587    }
588  }
589
590  fn split_at_position_complete<P, E: ParseError<Self>>(
591    &self,
592    predicate: P,
593  ) -> IResult<Self, Self, E>
594  where
595    P: Fn(Self::Item) -> bool,
596  {
597    match self.iter().position(|c| predicate(*c)) {
598      Some(i) => Ok(self.take_split(i)),
599      None => Ok(self.take_split(self.input_len())),
600    }
601  }
602
603  fn split_at_position1_complete<P, E: ParseError<Self>>(
604    &self,
605    predicate: P,
606    e: ErrorKind,
607  ) -> IResult<Self, Self, E>
608  where
609    P: Fn(Self::Item) -> bool,
610  {
611    match self.iter().position(|c| predicate(*c)) {
612      Some(0) => Err(Err::Error(E::from_error_kind(self, e))),
613      Some(i) => Ok(self.take_split(i)),
614      None => {
615        if self.is_empty() {
616          Err(Err::Error(E::from_error_kind(self, e)))
617        } else {
618          Ok(self.take_split(self.input_len()))
619        }
620      }
621    }
622  }
623}
624
625impl<'a> InputTakeAtPosition for &'a str {
626  type Item = char;
627
628  fn split_at_position<P, E: ParseError<Self>>(&self, predicate: P) -> IResult<Self, Self, E>
629  where
630    P: Fn(Self::Item) -> bool,
631  {
632    match self.find(predicate) {
633      // find() returns a byte index that is already in the slice at a char boundary
634      Some(i) => unsafe { Ok((self.get_unchecked(i..), self.get_unchecked(..i))) },
635      None => Err(Err::Incomplete(Needed::new(1))),
636    }
637  }
638
639  fn split_at_position1<P, E: ParseError<Self>>(
640    &self,
641    predicate: P,
642    e: ErrorKind,
643  ) -> IResult<Self, Self, E>
644  where
645    P: Fn(Self::Item) -> bool,
646  {
647    match self.find(predicate) {
648      Some(0) => Err(Err::Error(E::from_error_kind(self, e))),
649      // find() returns a byte index that is already in the slice at a char boundary
650      Some(i) => unsafe { Ok((self.get_unchecked(i..), self.get_unchecked(..i))) },
651      None => Err(Err::Incomplete(Needed::new(1))),
652    }
653  }
654
655  fn split_at_position_complete<P, E: ParseError<Self>>(
656    &self,
657    predicate: P,
658  ) -> IResult<Self, Self, E>
659  where
660    P: Fn(Self::Item) -> bool,
661  {
662    match self.find(predicate) {
663      // find() returns a byte index that is already in the slice at a char boundary
664      Some(i) => unsafe { Ok((self.get_unchecked(i..), self.get_unchecked(..i))) },
665      // the end of slice is a char boundary
666      None => unsafe {
667        Ok((
668          self.get_unchecked(self.len()..),
669          self.get_unchecked(..self.len()),
670        ))
671      },
672    }
673  }
674
675  fn split_at_position1_complete<P, E: ParseError<Self>>(
676    &self,
677    predicate: P,
678    e: ErrorKind,
679  ) -> IResult<Self, Self, E>
680  where
681    P: Fn(Self::Item) -> bool,
682  {
683    match self.find(predicate) {
684      Some(0) => Err(Err::Error(E::from_error_kind(self, e))),
685      // find() returns a byte index that is already in the slice at a char boundary
686      Some(i) => unsafe { Ok((self.get_unchecked(i..), self.get_unchecked(..i))) },
687      None => {
688        if self.is_empty() {
689          Err(Err::Error(E::from_error_kind(self, e)))
690        } else {
691          // the end of slice is a char boundary
692          unsafe {
693            Ok((
694              self.get_unchecked(self.len()..),
695              self.get_unchecked(..self.len()),
696            ))
697          }
698        }
699      }
700    }
701  }
702}
703
704/// Indicates whether a comparison was successful, an error, or
705/// if more data was needed
706#[derive(Debug, PartialEq)]
707pub enum CompareResult {
708  /// Comparison was successful
709  Ok,
710  /// We need more data to be sure
711  Incomplete,
712  /// Comparison failed
713  Error,
714}
715
716/// Abstracts comparison operations
717pub trait Compare<T> {
718  /// Compares self to another value for equality
719  fn compare(&self, t: T) -> CompareResult;
720  /// Compares self to another value for equality
721  /// independently of the case.
722  ///
723  /// Warning: for `&str`, the comparison is done
724  /// by lowercasing both strings and comparing
725  /// the result. This is a temporary solution until
726  /// a better one appears
727  fn compare_no_case(&self, t: T) -> CompareResult;
728}
729
730fn lowercase_byte(c: u8) -> u8 {
731  match c {
732    b'A'..=b'Z' => c - b'A' + b'a',
733    _ => c,
734  }
735}
736
737impl<'a, 'b> Compare<&'b [u8]> for &'a [u8] {
738  #[inline(always)]
739  fn compare(&self, t: &'b [u8]) -> CompareResult {
740    let pos = self.iter().zip(t.iter()).position(|(a, b)| a != b);
741
742    match pos {
743      Some(_) => CompareResult::Error,
744      None => {
745        if self.len() >= t.len() {
746          CompareResult::Ok
747        } else {
748          CompareResult::Incomplete
749        }
750      }
751    }
752
753    /*
754    let len = self.len();
755    let blen = t.len();
756    let m = if len < blen { len } else { blen };
757    let reduced = &self[..m];
758    let b = &t[..m];
759
760    if reduced != b {
761      CompareResult::Error
762    } else if m < blen {
763      CompareResult::Incomplete
764    } else {
765      CompareResult::Ok
766    }
767    */
768  }
769
770  #[inline(always)]
771  fn compare_no_case(&self, t: &'b [u8]) -> CompareResult {
772    if self
773      .iter()
774      .zip(t)
775      .any(|(a, b)| lowercase_byte(*a) != lowercase_byte(*b))
776    {
777      CompareResult::Error
778    } else if self.len() < t.len() {
779      CompareResult::Incomplete
780    } else {
781      CompareResult::Ok
782    }
783  }
784}
785
786impl<
787    T: InputLength + InputIter<Item = u8> + InputTake + UnspecializedInput,
788    O: InputLength + InputIter<Item = u8> + InputTake,
789  > Compare<O> for T
790{
791  #[inline(always)]
792  fn compare(&self, t: O) -> CompareResult {
793    let pos = self
794      .iter_elements()
795      .zip(t.iter_elements())
796      .position(|(a, b)| a != b);
797
798    match pos {
799      Some(_) => CompareResult::Error,
800      None => {
801        if self.input_len() >= t.input_len() {
802          CompareResult::Ok
803        } else {
804          CompareResult::Incomplete
805        }
806      }
807    }
808  }
809
810  #[inline(always)]
811  fn compare_no_case(&self, t: O) -> CompareResult {
812    if self
813      .iter_elements()
814      .zip(t.iter_elements())
815      .any(|(a, b)| lowercase_byte(a) != lowercase_byte(b))
816    {
817      CompareResult::Error
818    } else if self.input_len() < t.input_len() {
819      CompareResult::Incomplete
820    } else {
821      CompareResult::Ok
822    }
823  }
824}
825
826impl<'a, 'b> Compare<&'b str> for &'a [u8] {
827  #[inline(always)]
828  fn compare(&self, t: &'b str) -> CompareResult {
829    self.compare(AsBytes::as_bytes(t))
830  }
831  #[inline(always)]
832  fn compare_no_case(&self, t: &'b str) -> CompareResult {
833    self.compare_no_case(AsBytes::as_bytes(t))
834  }
835}
836
837impl<'a, 'b> Compare<&'b str> for &'a str {
838  #[inline(always)]
839  fn compare(&self, t: &'b str) -> CompareResult {
840    self.as_bytes().compare(t.as_bytes())
841  }
842
843  //FIXME: this version is too simple and does not use the current locale
844  #[inline(always)]
845  fn compare_no_case(&self, t: &'b str) -> CompareResult {
846    let pos = self
847      .chars()
848      .zip(t.chars())
849      .position(|(a, b)| a.to_lowercase().ne(b.to_lowercase()));
850
851    match pos {
852      Some(_) => CompareResult::Error,
853      None => {
854        if self.len() >= t.len() {
855          CompareResult::Ok
856        } else {
857          CompareResult::Incomplete
858        }
859      }
860    }
861  }
862}
863
864impl<'a, 'b> Compare<&'b [u8]> for &'a str {
865  #[inline(always)]
866  fn compare(&self, t: &'b [u8]) -> CompareResult {
867    AsBytes::as_bytes(self).compare(t)
868  }
869  #[inline(always)]
870  fn compare_no_case(&self, t: &'b [u8]) -> CompareResult {
871    AsBytes::as_bytes(self).compare_no_case(t)
872  }
873}
874
875/// Look for a token in self
876pub trait FindToken<T> {
877  /// Returns true if self contains the token
878  fn find_token(&self, token: T) -> bool;
879}
880
881impl<'a> FindToken<u8> for &'a [u8] {
882  fn find_token(&self, token: u8) -> bool {
883    memchr::memchr(token, self).is_some()
884  }
885}
886
887impl<'a> FindToken<u8> for &'a str {
888  fn find_token(&self, token: u8) -> bool {
889    self.as_bytes().find_token(token)
890  }
891}
892
893impl<'a, 'b> FindToken<&'a u8> for &'b [u8] {
894  fn find_token(&self, token: &u8) -> bool {
895    self.find_token(*token)
896  }
897}
898
899impl<'a, 'b> FindToken<&'a u8> for &'b str {
900  fn find_token(&self, token: &u8) -> bool {
901    self.as_bytes().find_token(token)
902  }
903}
904
905impl<'a> FindToken<char> for &'a [u8] {
906  fn find_token(&self, token: char) -> bool {
907    self.iter().any(|i| *i == token as u8)
908  }
909}
910
911impl<'a> FindToken<char> for &'a str {
912  fn find_token(&self, token: char) -> bool {
913    self.chars().any(|i| i == token)
914  }
915}
916
917impl<'a> FindToken<char> for &'a [char] {
918  fn find_token(&self, token: char) -> bool {
919    self.iter().any(|i| *i == token)
920  }
921}
922
923impl<'a, 'b> FindToken<&'a char> for &'b [char] {
924  fn find_token(&self, token: &char) -> bool {
925    self.find_token(*token)
926  }
927}
928
929/// Look for a substring in self
930pub trait FindSubstring<T> {
931  /// Returns the byte position of the substring if it is found
932  fn find_substring(&self, substr: T) -> Option<usize>;
933}
934
935impl<'a, 'b> FindSubstring<&'b [u8]> for &'a [u8] {
936  fn find_substring(&self, substr: &'b [u8]) -> Option<usize> {
937    if substr.len() > self.len() {
938      return None;
939    }
940
941    let (&substr_first, substr_rest) = match substr.split_first() {
942      Some(split) => split,
943      // an empty substring is found at position 0
944      // This matches the behavior of str.find("").
945      None => return Some(0),
946    };
947
948    if substr_rest.is_empty() {
949      return memchr::memchr(substr_first, self);
950    }
951
952    let mut offset = 0;
953    let haystack = &self[..self.len() - substr_rest.len()];
954
955    while let Some(position) = memchr::memchr(substr_first, &haystack[offset..]) {
956      offset += position;
957      let next_offset = offset + 1;
958      if &self[next_offset..][..substr_rest.len()] == substr_rest {
959        return Some(offset);
960      }
961
962      offset = next_offset;
963    }
964
965    None
966  }
967}
968
969impl<'a, 'b> FindSubstring<&'b str> for &'a [u8] {
970  fn find_substring(&self, substr: &'b str) -> Option<usize> {
971    self.find_substring(AsBytes::as_bytes(substr))
972  }
973}
974
975impl<'a, 'b> FindSubstring<&'b str> for &'a str {
976  //returns byte index
977  fn find_substring(&self, substr: &'b str) -> Option<usize> {
978    self.find(substr)
979  }
980}
981
982/// Used to integrate `str`'s `parse()` method
983pub trait ParseTo<R> {
984  /// Succeeds if `parse()` succeeded. The byte slice implementation
985  /// will first convert it to a `&str`, then apply the `parse()` function
986  fn parse_to(&self) -> Option<R>;
987}
988
989impl<'a, R: FromStr> ParseTo<R> for &'a [u8] {
990  fn parse_to(&self) -> Option<R> {
991    from_utf8(self).ok().and_then(|s| s.parse().ok())
992  }
993}
994
995impl<'a, R: FromStr> ParseTo<R> for &'a str {
996  fn parse_to(&self) -> Option<R> {
997    self.parse().ok()
998  }
999}
1000
1001/// Slicing operations using ranges.
1002///
1003/// This trait is loosely based on
1004/// `Index`, but can actually return
1005/// something else than a `&[T]` or `&str`
1006pub trait Slice<R> {
1007  /// Slices self according to the range argument
1008  fn slice(&self, range: R) -> Self;
1009}
1010
1011macro_rules! impl_fn_slice {
1012  ( $ty:ty ) => {
1013    fn slice(&self, range: $ty) -> Self {
1014      &self[range]
1015    }
1016  };
1017}
1018
1019macro_rules! slice_range_impl {
1020  ( [ $for_type:ident ], $ty:ty ) => {
1021    impl<'a, $for_type> Slice<$ty> for &'a [$for_type] {
1022      impl_fn_slice!($ty);
1023    }
1024  };
1025  ( $for_type:ty, $ty:ty ) => {
1026    impl<'a> Slice<$ty> for &'a $for_type {
1027      impl_fn_slice!($ty);
1028    }
1029  };
1030}
1031
1032macro_rules! slice_ranges_impl {
1033  ( [ $for_type:ident ] ) => {
1034    slice_range_impl! {[$for_type], Range<usize>}
1035    slice_range_impl! {[$for_type], RangeTo<usize>}
1036    slice_range_impl! {[$for_type], RangeFrom<usize>}
1037    slice_range_impl! {[$for_type], RangeFull}
1038  };
1039  ( $for_type:ty ) => {
1040    slice_range_impl! {$for_type, Range<usize>}
1041    slice_range_impl! {$for_type, RangeTo<usize>}
1042    slice_range_impl! {$for_type, RangeFrom<usize>}
1043    slice_range_impl! {$for_type, RangeFull}
1044  };
1045}
1046
1047slice_ranges_impl! {str}
1048slice_ranges_impl! {[T]}
1049
1050macro_rules! array_impls {
1051  ($($N:expr)+) => {
1052    $(
1053      impl InputLength for [u8; $N] {
1054        #[inline]
1055        fn input_len(&self) -> usize {
1056          self.len()
1057        }
1058      }
1059
1060      impl<'a> InputLength for &'a [u8; $N] {
1061        #[inline]
1062        fn input_len(&self) -> usize {
1063          self.len()
1064        }
1065      }
1066
1067      impl<'a> InputIter for &'a [u8; $N] {
1068        type Item = u8;
1069        type Iter = Enumerate<Self::IterElem>;
1070        type IterElem = Copied<Iter<'a, u8>>;
1071
1072        fn iter_indices(&self) -> Self::Iter {
1073          (&self[..]).iter_indices()
1074        }
1075
1076        fn iter_elements(&self) -> Self::IterElem {
1077          (&self[..]).iter_elements()
1078        }
1079
1080        fn position<P>(&self, predicate: P) -> Option<usize>
1081          where P: Fn(Self::Item) -> bool {
1082          (&self[..]).position(predicate)
1083        }
1084
1085        fn slice_index(&self, count: usize) -> Result<usize, Needed> {
1086          (&self[..]).slice_index(count)
1087        }
1088      }
1089
1090      impl<'a> Compare<[u8; $N]> for &'a [u8] {
1091        #[inline(always)]
1092        fn compare(&self, t: [u8; $N]) -> CompareResult {
1093          self.compare(&t[..])
1094        }
1095
1096        #[inline(always)]
1097        fn compare_no_case(&self, t: [u8;$N]) -> CompareResult {
1098          self.compare_no_case(&t[..])
1099        }
1100      }
1101
1102      impl<'a,'b> Compare<&'b [u8; $N]> for &'a [u8] {
1103        #[inline(always)]
1104        fn compare(&self, t: &'b [u8; $N]) -> CompareResult {
1105          self.compare(&t[..])
1106        }
1107
1108        #[inline(always)]
1109        fn compare_no_case(&self, t: &'b [u8;$N]) -> CompareResult {
1110          self.compare_no_case(&t[..])
1111        }
1112      }
1113
1114      impl FindToken<u8> for [u8; $N] {
1115        fn find_token(&self, token: u8) -> bool {
1116          memchr::memchr(token, &self[..]).is_some()
1117        }
1118      }
1119
1120      impl<'a> FindToken<&'a u8> for [u8; $N] {
1121        fn find_token(&self, token: &u8) -> bool {
1122          self.find_token(*token)
1123        }
1124      }
1125    )+
1126  };
1127}
1128
1129array_impls! {
1130     0  1  2  3  4  5  6  7  8  9
1131    10 11 12 13 14 15 16 17 18 19
1132    20 21 22 23 24 25 26 27 28 29
1133    30 31 32
1134}
1135
1136/// Abstracts something which can extend an `Extend`.
1137/// Used to build modified input slices in `escaped_transform`
1138pub trait ExtendInto {
1139  /// The current input type is a sequence of that `Item` type.
1140  ///
1141  /// Example: `u8` for `&[u8]` or `char` for `&str`
1142  type Item;
1143
1144  /// The type that will be produced
1145  type Extender;
1146
1147  /// Create a new `Extend` of the correct type
1148  fn new_builder(&self) -> Self::Extender;
1149  /// Accumulate the input into an accumulator
1150  fn extend_into(&self, acc: &mut Self::Extender);
1151}
1152
1153#[cfg(feature = "alloc")]
1154impl ExtendInto for [u8] {
1155  type Item = u8;
1156  type Extender = Vec<u8>;
1157
1158  #[inline]
1159  fn new_builder(&self) -> Vec<u8> {
1160    Vec::new()
1161  }
1162  #[inline]
1163  fn extend_into(&self, acc: &mut Vec<u8>) {
1164    acc.extend(self.iter().cloned());
1165  }
1166}
1167
1168#[cfg(feature = "alloc")]
1169impl ExtendInto for &[u8] {
1170  type Item = u8;
1171  type Extender = Vec<u8>;
1172
1173  #[inline]
1174  fn new_builder(&self) -> Vec<u8> {
1175    Vec::new()
1176  }
1177  #[inline]
1178  fn extend_into(&self, acc: &mut Vec<u8>) {
1179    acc.extend_from_slice(self);
1180  }
1181}
1182
1183#[cfg(feature = "alloc")]
1184impl ExtendInto for str {
1185  type Item = char;
1186  type Extender = String;
1187
1188  #[inline]
1189  fn new_builder(&self) -> String {
1190    String::new()
1191  }
1192  #[inline]
1193  fn extend_into(&self, acc: &mut String) {
1194    acc.push_str(self);
1195  }
1196}
1197
1198#[cfg(feature = "alloc")]
1199impl ExtendInto for &str {
1200  type Item = char;
1201  type Extender = String;
1202
1203  #[inline]
1204  fn new_builder(&self) -> String {
1205    String::new()
1206  }
1207  #[inline]
1208  fn extend_into(&self, acc: &mut String) {
1209    acc.push_str(self);
1210  }
1211}
1212
1213#[cfg(feature = "alloc")]
1214impl ExtendInto for char {
1215  type Item = char;
1216  type Extender = String;
1217
1218  #[inline]
1219  fn new_builder(&self) -> String {
1220    String::new()
1221  }
1222  #[inline]
1223  fn extend_into(&self, acc: &mut String) {
1224    acc.push(*self);
1225  }
1226}
1227
1228/// Helper trait to convert numbers to usize.
1229///
1230/// By default, usize implements `From<u8>` and `From<u16>` but not
1231/// `From<u32>` and `From<u64>` because that would be invalid on some
1232/// platforms. This trait implements the conversion for platforms
1233/// with 32 and 64 bits pointer platforms
1234pub trait ToUsize {
1235  /// converts self to usize
1236  fn to_usize(&self) -> usize;
1237}
1238
1239impl ToUsize for u8 {
1240  #[inline]
1241  fn to_usize(&self) -> usize {
1242    *self as usize
1243  }
1244}
1245
1246impl ToUsize for u16 {
1247  #[inline]
1248  fn to_usize(&self) -> usize {
1249    *self as usize
1250  }
1251}
1252
1253impl ToUsize for usize {
1254  #[inline]
1255  fn to_usize(&self) -> usize {
1256    *self
1257  }
1258}
1259
1260#[cfg(any(target_pointer_width = "32", target_pointer_width = "64"))]
1261impl ToUsize for u32 {
1262  #[inline]
1263  fn to_usize(&self) -> usize {
1264    *self as usize
1265  }
1266}
1267
1268#[cfg(target_pointer_width = "64")]
1269impl ToUsize for u64 {
1270  #[inline]
1271  fn to_usize(&self) -> usize {
1272    *self as usize
1273  }
1274}
1275
1276/// Equivalent From implementation to avoid orphan rules in bits parsers
1277pub trait ErrorConvert<E> {
1278  /// Transform to another error type
1279  fn convert(self) -> E;
1280}
1281
1282impl<I> ErrorConvert<(I, ErrorKind)> for ((I, usize), ErrorKind) {
1283  fn convert(self) -> (I, ErrorKind) {
1284    ((self.0).0, self.1)
1285  }
1286}
1287
1288impl<I> ErrorConvert<((I, usize), ErrorKind)> for (I, ErrorKind) {
1289  fn convert(self) -> ((I, usize), ErrorKind) {
1290    ((self.0, 0), self.1)
1291  }
1292}
1293
1294use crate::error;
1295impl<I> ErrorConvert<error::Error<I>> for error::Error<(I, usize)> {
1296  fn convert(self) -> error::Error<I> {
1297    error::Error {
1298      input: self.input.0,
1299      code: self.code,
1300    }
1301  }
1302}
1303
1304impl<I> ErrorConvert<error::Error<(I, usize)>> for error::Error<I> {
1305  fn convert(self) -> error::Error<(I, usize)> {
1306    error::Error {
1307      input: (self.input, 0),
1308      code: self.code,
1309    }
1310  }
1311}
1312
1313#[cfg(feature = "alloc")]
1314#[cfg_attr(feature = "docsrs", doc(cfg(feature = "alloc")))]
1315impl<I> ErrorConvert<error::VerboseError<I>> for error::VerboseError<(I, usize)> {
1316  fn convert(self) -> error::VerboseError<I> {
1317    error::VerboseError {
1318      errors: self.errors.into_iter().map(|(i, e)| (i.0, e)).collect(),
1319    }
1320  }
1321}
1322
1323#[cfg(feature = "alloc")]
1324#[cfg_attr(feature = "docsrs", doc(cfg(feature = "alloc")))]
1325impl<I> ErrorConvert<error::VerboseError<(I, usize)>> for error::VerboseError<I> {
1326  fn convert(self) -> error::VerboseError<(I, usize)> {
1327    error::VerboseError {
1328      errors: self.errors.into_iter().map(|(i, e)| ((i, 0), e)).collect(),
1329    }
1330  }
1331}
1332
1333impl ErrorConvert<()> for () {
1334  fn convert(self) {}
1335}
1336
1337#[cfg(feature = "std")]
1338#[cfg_attr(feature = "docsrs", doc(cfg(feature = "std")))]
1339/// Helper trait to show a byte slice as a hex dump
1340pub trait HexDisplay {
1341  /// Converts the value of `self` to a hex dump, returning the owned
1342  /// `String`.
1343  fn to_hex(&self, chunk_size: usize) -> String;
1344
1345  /// Converts the value of `self` to a hex dump beginning at `from` address, returning the owned
1346  /// `String`.
1347  fn to_hex_from(&self, chunk_size: usize, from: usize) -> String;
1348}
1349
1350#[cfg(feature = "std")]
1351static CHARS: &[u8] = b"0123456789abcdef";
1352
1353#[cfg(feature = "std")]
1354impl HexDisplay for [u8] {
1355  #[allow(unused_variables)]
1356  fn to_hex(&self, chunk_size: usize) -> String {
1357    self.to_hex_from(chunk_size, 0)
1358  }
1359
1360  #[allow(unused_variables)]
1361  fn to_hex_from(&self, chunk_size: usize, from: usize) -> String {
1362    let mut v = Vec::with_capacity(self.len() * 3);
1363    let mut i = from;
1364    for chunk in self.chunks(chunk_size) {
1365      let s = format!("{:08x}", i);
1366      for &ch in s.as_bytes().iter() {
1367        v.push(ch);
1368      }
1369      v.push(b'\t');
1370
1371      i += chunk_size;
1372
1373      for &byte in chunk {
1374        v.push(CHARS[(byte >> 4) as usize]);
1375        v.push(CHARS[(byte & 0xf) as usize]);
1376        v.push(b' ');
1377      }
1378      if chunk_size > chunk.len() {
1379        for j in 0..(chunk_size - chunk.len()) {
1380          v.push(b' ');
1381          v.push(b' ');
1382          v.push(b' ');
1383        }
1384      }
1385      v.push(b'\t');
1386
1387      for &byte in chunk {
1388        if (byte >= 32 && byte <= 126) || byte >= 128 {
1389          v.push(byte);
1390        } else {
1391          v.push(b'.');
1392        }
1393      }
1394      v.push(b'\n');
1395    }
1396
1397    String::from_utf8_lossy(&v[..]).into_owned()
1398  }
1399}
1400
1401#[cfg(feature = "std")]
1402impl HexDisplay for str {
1403  #[allow(unused_variables)]
1404  fn to_hex(&self, chunk_size: usize) -> String {
1405    self.to_hex_from(chunk_size, 0)
1406  }
1407
1408  #[allow(unused_variables)]
1409  fn to_hex_from(&self, chunk_size: usize, from: usize) -> String {
1410    self.as_bytes().to_hex_from(chunk_size, from)
1411  }
1412}
1413
1414#[cfg(test)]
1415mod tests {
1416  use super::*;
1417
1418  #[test]
1419  fn test_offset_u8() {
1420    let s = b"abcd123";
1421    let a = &s[..];
1422    let b = &a[2..];
1423    let c = &a[..4];
1424    let d = &a[3..5];
1425    assert_eq!(a.offset(b), 2);
1426    assert_eq!(a.offset(c), 0);
1427    assert_eq!(a.offset(d), 3);
1428  }
1429
1430  #[test]
1431  fn test_offset_str() {
1432    let s = "abcřèÂßÇd123";
1433    let a = &s[..];
1434    let b = &a[7..];
1435    let c = &a[..5];
1436    let d = &a[5..9];
1437    assert_eq!(a.offset(b), 7);
1438    assert_eq!(a.offset(c), 0);
1439    assert_eq!(a.offset(d), 5);
1440  }
1441}