1  //! Parsers recognizing bytes streams, streaming version
2  
3  use crate::error::ErrorKind;
4  use crate::error::ParseError;
5  use crate::internal::{Err, IResult, Needed, Parser};
6  use crate::lib::std::ops::RangeFrom;
7  use crate::lib::std::result::Result::*;
8  use crate::traits::{
9    Compare, CompareResult, FindSubstring, FindToken, InputIter, InputLength, InputTake,
10    InputTakeAtPosition, Slice, ToUsize,
11  };
12  
13  /// Recognizes a pattern.
14  ///
15  /// The input data will be compared to the tag combinator's argument and will return the part of
16  /// the input that matches the argument.
17  /// # Example
18  /// ```rust
19  /// # use nom::{Err, error::{Error, ErrorKind}, Needed, IResult};
20  /// use nom::bytes::streaming::tag;
21  ///
22  /// fn parser(s: &str) -> IResult<&str, &str> {
23  ///   tag("Hello")(s)
24  /// }
25  ///
26  /// assert_eq!(parser("Hello, World!"), Ok((", World!", "Hello")));
27  /// assert_eq!(parser("Something"), Err(Err::Error(Error::new("Something", ErrorKind::Tag))));
28  /// assert_eq!(parser("S"), Err(Err::Error(Error::new("S", ErrorKind::Tag))));
29  /// assert_eq!(parser("H"), Err(Err::Incomplete(Needed::new(4))));
30  /// ```
tag<T, Input, Error: ParseError<Input>>( tag: T, ) -> impl Fn(Input) -> IResult<Input, Input, Error> where Input: InputTake + InputLength + Compare<T>, T: InputLength + Clone,31  pub fn tag<T, Input, Error: ParseError<Input>>(
32    tag: T,
33  ) -> impl Fn(Input) -> IResult<Input, Input, Error>
34  where
35    Input: InputTake + InputLength + Compare<T>,
36    T: InputLength + Clone,
37  {
38    move |i: Input| {
39      let tag_len = tag.input_len();
40      let t = tag.clone();
41  
42      let res: IResult<_, _, Error> = match i.compare(t) {
43        CompareResult::Ok => Ok(i.take_split(tag_len)),
44        CompareResult::Incomplete => Err(Err::Incomplete(Needed::new(tag_len - i.input_len()))),
45        CompareResult::Error => {
46          let e: ErrorKind = ErrorKind::Tag;
47          Err(Err::Error(Error::from_error_kind(i, e)))
48        }
49      };
50      res
51    }
52  }
53  
54  /// Recognizes a case insensitive pattern.
55  ///
56  /// The input data will be compared to the tag combinator's argument and will return the part of
57  /// the input that matches the argument with no regard to case.
58  /// # Example
59  /// ```rust
60  /// # use nom::{Err, error::{Error, ErrorKind}, Needed, IResult};
61  /// use nom::bytes::streaming::tag_no_case;
62  ///
63  /// fn parser(s: &str) -> IResult<&str, &str> {
64  ///   tag_no_case("hello")(s)
65  /// }
66  ///
67  /// assert_eq!(parser("Hello, World!"), Ok((", World!", "Hello")));
68  /// assert_eq!(parser("hello, World!"), Ok((", World!", "hello")));
69  /// assert_eq!(parser("HeLlO, World!"), Ok((", World!", "HeLlO")));
70  /// assert_eq!(parser("Something"), Err(Err::Error(Error::new("Something", ErrorKind::Tag))));
71  /// assert_eq!(parser(""), Err(Err::Incomplete(Needed::new(5))));
72  /// ```
tag_no_case<T, Input, Error: ParseError<Input>>( tag: T, ) -> impl Fn(Input) -> IResult<Input, Input, Error> where Input: InputTake + InputLength + Compare<T>, T: InputLength + Clone,73  pub fn tag_no_case<T, Input, Error: ParseError<Input>>(
74    tag: T,
75  ) -> impl Fn(Input) -> IResult<Input, Input, Error>
76  where
77    Input: InputTake + InputLength + Compare<T>,
78    T: InputLength + Clone,
79  {
80    move |i: Input| {
81      let tag_len = tag.input_len();
82      let t = tag.clone();
83  
84      let res: IResult<_, _, Error> = match (i).compare_no_case(t) {
85        CompareResult::Ok => Ok(i.take_split(tag_len)),
86        CompareResult::Incomplete => Err(Err::Incomplete(Needed::new(tag_len - i.input_len()))),
87        CompareResult::Error => {
88          let e: ErrorKind = ErrorKind::Tag;
89          Err(Err::Error(Error::from_error_kind(i, e)))
90        }
91      };
92      res
93    }
94  }
95  
96  /// Parse till certain characters are met.
97  ///
98  /// The parser will return the longest slice till one of the characters of the combinator's argument are met.
99  ///
100  /// It doesn't consume the matched character.
101  ///
102  /// It will return a `Err::Incomplete(Needed::new(1))` if the pattern wasn't met.
103  /// # Example
104  /// ```rust
105  /// # use nom::{Err, error::ErrorKind, Needed, IResult};
106  /// use nom::bytes::streaming::is_not;
107  ///
108  /// fn not_space(s: &str) -> IResult<&str, &str> {
109  ///   is_not(" \t\r\n")(s)
110  /// }
111  ///
112  /// assert_eq!(not_space("Hello, World!"), Ok((" World!", "Hello,")));
113  /// assert_eq!(not_space("Sometimes\t"), Ok(("\t", "Sometimes")));
114  /// assert_eq!(not_space("Nospace"), Err(Err::Incomplete(Needed::new(1))));
115  /// assert_eq!(not_space(""), Err(Err::Incomplete(Needed::new(1))));
116  /// ```
is_not<T, Input, Error: ParseError<Input>>( arr: T, ) -> impl Fn(Input) -> IResult<Input, Input, Error> where Input: InputTakeAtPosition, T: FindToken<<Input as InputTakeAtPosition>::Item>,117  pub fn is_not<T, Input, Error: ParseError<Input>>(
118    arr: T,
119  ) -> impl Fn(Input) -> IResult<Input, Input, Error>
120  where
121    Input: InputTakeAtPosition,
122    T: FindToken<<Input as InputTakeAtPosition>::Item>,
123  {
124    move |i: Input| {
125      let e: ErrorKind = ErrorKind::IsNot;
126      i.split_at_position1(|c| arr.find_token(c), e)
127    }
128  }
129  
130  /// Returns the longest slice of the matches the pattern.
131  ///
132  /// The parser will return the longest slice consisting of the characters in provided in the
133  /// combinator's argument.
134  ///
135  /// # Streaming specific
136  /// *Streaming version* will return a `Err::Incomplete(Needed::new(1))` if the pattern wasn't met
137  /// or if the pattern reaches the end of the input.
138  /// # Example
139  /// ```rust
140  /// # use nom::{Err, error::ErrorKind, Needed, IResult};
141  /// use nom::bytes::streaming::is_a;
142  ///
143  /// fn hex(s: &str) -> IResult<&str, &str> {
144  ///   is_a("1234567890ABCDEF")(s)
145  /// }
146  ///
147  /// assert_eq!(hex("123 and voila"), Ok((" and voila", "123")));
148  /// assert_eq!(hex("DEADBEEF and others"), Ok((" and others", "DEADBEEF")));
149  /// assert_eq!(hex("BADBABEsomething"), Ok(("something", "BADBABE")));
150  /// assert_eq!(hex("D15EA5E"), Err(Err::Incomplete(Needed::new(1))));
151  /// assert_eq!(hex(""), Err(Err::Incomplete(Needed::new(1))));
152  /// ```
is_a<T, Input, Error: ParseError<Input>>( arr: T, ) -> impl Fn(Input) -> IResult<Input, Input, Error> where Input: InputTakeAtPosition, T: FindToken<<Input as InputTakeAtPosition>::Item>,153  pub fn is_a<T, Input, Error: ParseError<Input>>(
154    arr: T,
155  ) -> impl Fn(Input) -> IResult<Input, Input, Error>
156  where
157    Input: InputTakeAtPosition,
158    T: FindToken<<Input as InputTakeAtPosition>::Item>,
159  {
160    move |i: Input| {
161      let e: ErrorKind = ErrorKind::IsA;
162      i.split_at_position1(|c| !arr.find_token(c), e)
163    }
164  }
165  
166  /// Returns the longest input slice (if any) that matches the predicate.
167  ///
168  /// The parser will return the longest slice that matches the given predicate *(a function that
169  /// takes the input and returns a bool)*.
170  ///
171  /// # Streaming Specific
172  /// *Streaming version* will return a `Err::Incomplete(Needed::new(1))` if the pattern reaches the end of the input.
173  /// # Example
174  /// ```rust
175  /// # use nom::{Err, error::ErrorKind, Needed, IResult};
176  /// use nom::bytes::streaming::take_while;
177  /// use nom::character::is_alphabetic;
178  ///
179  /// fn alpha(s: &[u8]) -> IResult<&[u8], &[u8]> {
180  ///   take_while(is_alphabetic)(s)
181  /// }
182  ///
183  /// assert_eq!(alpha(b"latin123"), Ok((&b"123"[..], &b"latin"[..])));
184  /// assert_eq!(alpha(b"12345"), Ok((&b"12345"[..], &b""[..])));
185  /// assert_eq!(alpha(b"latin"), Err(Err::Incomplete(Needed::new(1))));
186  /// assert_eq!(alpha(b""), Err(Err::Incomplete(Needed::new(1))));
187  /// ```
take_while<F, Input, Error: ParseError<Input>>( cond: F, ) -> impl Fn(Input) -> IResult<Input, Input, Error> where Input: InputTakeAtPosition, F: Fn(<Input as InputTakeAtPosition>::Item) -> bool,188  pub fn take_while<F, Input, Error: ParseError<Input>>(
189    cond: F,
190  ) -> impl Fn(Input) -> IResult<Input, Input, Error>
191  where
192    Input: InputTakeAtPosition,
193    F: Fn(<Input as InputTakeAtPosition>::Item) -> bool,
194  {
195    move |i: Input| i.split_at_position(|c| !cond(c))
196  }
197  
198  /// Returns the longest (at least 1) input slice that matches the predicate.
199  ///
200  /// The parser will return the longest slice that matches the given predicate *(a function that
201  /// takes the input and returns a bool)*.
202  ///
203  /// It will return an `Err(Err::Error((_, ErrorKind::TakeWhile1)))` if the pattern wasn't met.
204  ///
205  /// # Streaming Specific
206  /// *Streaming version* will return a `Err::Incomplete(Needed::new(1))` or if the pattern reaches the end of the input.
207  ///
208  /// # Example
209  /// ```rust
210  /// # use nom::{Err, error::{Error, ErrorKind}, Needed, IResult};
211  /// use nom::bytes::streaming::take_while1;
212  /// use nom::character::is_alphabetic;
213  ///
214  /// fn alpha(s: &[u8]) -> IResult<&[u8], &[u8]> {
215  ///   take_while1(is_alphabetic)(s)
216  /// }
217  ///
218  /// assert_eq!(alpha(b"latin123"), Ok((&b"123"[..], &b"latin"[..])));
219  /// assert_eq!(alpha(b"latin"), Err(Err::Incomplete(Needed::new(1))));
220  /// assert_eq!(alpha(b"12345"), Err(Err::Error(Error::new(&b"12345"[..], ErrorKind::TakeWhile1))));
221  /// ```
take_while1<F, Input, Error: ParseError<Input>>( cond: F, ) -> impl Fn(Input) -> IResult<Input, Input, Error> where Input: InputTakeAtPosition, F: Fn(<Input as InputTakeAtPosition>::Item) -> bool,222  pub fn take_while1<F, Input, Error: ParseError<Input>>(
223    cond: F,
224  ) -> impl Fn(Input) -> IResult<Input, Input, Error>
225  where
226    Input: InputTakeAtPosition,
227    F: Fn(<Input as InputTakeAtPosition>::Item) -> bool,
228  {
229    move |i: Input| {
230      let e: ErrorKind = ErrorKind::TakeWhile1;
231      i.split_at_position1(|c| !cond(c), e)
232    }
233  }
234  
235  /// Returns the longest (m <= len <= n) input slice  that matches the predicate.
236  ///
237  /// The parser will return the longest slice that matches the given predicate *(a function that
238  /// takes the input and returns a bool)*.
239  ///
240  /// It will return an `Err::Error((_, ErrorKind::TakeWhileMN))` if the pattern wasn't met.
241  /// # Streaming Specific
242  /// *Streaming version* will return a `Err::Incomplete(Needed::new(1))`  if the pattern reaches the end of the input or is too short.
243  ///
244  /// # Example
245  /// ```rust
246  /// # use nom::{Err, error::{Error, ErrorKind}, Needed, IResult};
247  /// use nom::bytes::streaming::take_while_m_n;
248  /// use nom::character::is_alphabetic;
249  ///
250  /// fn short_alpha(s: &[u8]) -> IResult<&[u8], &[u8]> {
251  ///   take_while_m_n(3, 6, is_alphabetic)(s)
252  /// }
253  ///
254  /// assert_eq!(short_alpha(b"latin123"), Ok((&b"123"[..], &b"latin"[..])));
255  /// assert_eq!(short_alpha(b"lengthy"), Ok((&b"y"[..], &b"length"[..])));
256  /// assert_eq!(short_alpha(b"latin"), Err(Err::Incomplete(Needed::new(1))));
257  /// assert_eq!(short_alpha(b"ed"), Err(Err::Incomplete(Needed::new(1))));
258  /// assert_eq!(short_alpha(b"12345"), Err(Err::Error(Error::new(&b"12345"[..], ErrorKind::TakeWhileMN))));
259  /// ```
take_while_m_n<F, Input, Error: ParseError<Input>>( m: usize, n: usize, cond: F, ) -> impl Fn(Input) -> IResult<Input, Input, Error> where Input: InputTake + InputIter + InputLength, F: Fn(<Input as InputIter>::Item) -> bool,260  pub fn take_while_m_n<F, Input, Error: ParseError<Input>>(
261    m: usize,
262    n: usize,
263    cond: F,
264  ) -> impl Fn(Input) -> IResult<Input, Input, Error>
265  where
266    Input: InputTake + InputIter + InputLength,
267    F: Fn(<Input as InputIter>::Item) -> bool,
268  {
269    move |i: Input| {
270      let input = i;
271  
272      match input.position(|c| !cond(c)) {
273        Some(idx) => {
274          if idx >= m {
275            if idx <= n {
276              let res: IResult<_, _, Error> = if let Ok(index) = input.slice_index(idx) {
277                Ok(input.take_split(index))
278              } else {
279                Err(Err::Error(Error::from_error_kind(
280                  input,
281                  ErrorKind::TakeWhileMN,
282                )))
283              };
284              res
285            } else {
286              let res: IResult<_, _, Error> = if let Ok(index) = input.slice_index(n) {
287                Ok(input.take_split(index))
288              } else {
289                Err(Err::Error(Error::from_error_kind(
290                  input,
291                  ErrorKind::TakeWhileMN,
292                )))
293              };
294              res
295            }
296          } else {
297            let e = ErrorKind::TakeWhileMN;
298            Err(Err::Error(Error::from_error_kind(input, e)))
299          }
300        }
301        None => {
302          let len = input.input_len();
303          if len >= n {
304            match input.slice_index(n) {
305              Ok(index) => Ok(input.take_split(index)),
306              Err(_needed) => Err(Err::Error(Error::from_error_kind(
307                input,
308                ErrorKind::TakeWhileMN,
309              ))),
310            }
311          } else {
312            let needed = if m > len { m - len } else { 1 };
313            Err(Err::Incomplete(Needed::new(needed)))
314          }
315        }
316      }
317    }
318  }
319  
320  /// Returns the longest input slice (if any) till a predicate is met.
321  ///
322  /// The parser will return the longest slice till the given predicate *(a function that
323  /// takes the input and returns a bool)*.
324  ///
325  /// # Streaming Specific
326  /// *Streaming version* will return a `Err::Incomplete(Needed::new(1))` if the match reaches the
327  /// end of input or if there was not match.
328  ///
329  /// # Example
330  /// ```rust
331  /// # use nom::{Err, error::ErrorKind, Needed, IResult};
332  /// use nom::bytes::streaming::take_till;
333  ///
334  /// fn till_colon(s: &str) -> IResult<&str, &str> {
335  ///   take_till(|c| c == ':')(s)
336  /// }
337  ///
338  /// assert_eq!(till_colon("latin:123"), Ok((":123", "latin")));
339  /// assert_eq!(till_colon(":empty matched"), Ok((":empty matched", ""))); //allowed
340  /// assert_eq!(till_colon("12345"), Err(Err::Incomplete(Needed::new(1))));
341  /// assert_eq!(till_colon(""), Err(Err::Incomplete(Needed::new(1))));
342  /// ```
take_till<F, Input, Error: ParseError<Input>>( cond: F, ) -> impl Fn(Input) -> IResult<Input, Input, Error> where Input: InputTakeAtPosition, F: Fn(<Input as InputTakeAtPosition>::Item) -> bool,343  pub fn take_till<F, Input, Error: ParseError<Input>>(
344    cond: F,
345  ) -> impl Fn(Input) -> IResult<Input, Input, Error>
346  where
347    Input: InputTakeAtPosition,
348    F: Fn(<Input as InputTakeAtPosition>::Item) -> bool,
349  {
350    move |i: Input| i.split_at_position(|c| cond(c))
351  }
352  
353  /// Returns the longest (at least 1) input slice till a predicate is met.
354  ///
355  /// The parser will return the longest slice till the given predicate *(a function that
356  /// takes the input and returns a bool)*.
357  ///
358  /// # Streaming Specific
359  /// *Streaming version* will return a `Err::Incomplete(Needed::new(1))` if the match reaches the
360  /// end of input or if there was not match.
361  /// # Example
362  /// ```rust
363  /// # use nom::{Err, error::{Error, ErrorKind}, Needed, IResult};
364  /// use nom::bytes::streaming::take_till1;
365  ///
366  /// fn till_colon(s: &str) -> IResult<&str, &str> {
367  ///   take_till1(|c| c == ':')(s)
368  /// }
369  ///
370  /// assert_eq!(till_colon("latin:123"), Ok((":123", "latin")));
371  /// assert_eq!(till_colon(":empty matched"), Err(Err::Error(Error::new(":empty matched", ErrorKind::TakeTill1))));
372  /// assert_eq!(till_colon("12345"), Err(Err::Incomplete(Needed::new(1))));
373  /// assert_eq!(till_colon(""), Err(Err::Incomplete(Needed::new(1))));
374  /// ```
take_till1<F, Input, Error: ParseError<Input>>( cond: F, ) -> impl Fn(Input) -> IResult<Input, Input, Error> where Input: InputTakeAtPosition, F: Fn(<Input as InputTakeAtPosition>::Item) -> bool,375  pub fn take_till1<F, Input, Error: ParseError<Input>>(
376    cond: F,
377  ) -> impl Fn(Input) -> IResult<Input, Input, Error>
378  where
379    Input: InputTakeAtPosition,
380    F: Fn(<Input as InputTakeAtPosition>::Item) -> bool,
381  {
382    move |i: Input| {
383      let e: ErrorKind = ErrorKind::TakeTill1;
384      i.split_at_position1(|c| cond(c), e)
385    }
386  }
387  
388  /// Returns an input slice containing the first N input elements (Input[..N]).
389  ///
390  /// # Streaming Specific
391  /// *Streaming version* if the input has less than N elements, `take` will
392  /// return a `Err::Incomplete(Needed::new(M))` where M is the number of
393  /// additional bytes the parser would need to succeed.
394  /// It is well defined for `&[u8]` as the number of elements is the byte size,
395  /// but for types like `&str`, we cannot know how many bytes correspond for
396  /// the next few chars, so the result will be `Err::Incomplete(Needed::Unknown)`
397  ///
398  /// # Example
399  /// ```rust
400  /// # use nom::{Err, error::ErrorKind, Needed, IResult};
401  /// use nom::bytes::streaming::take;
402  ///
403  /// fn take6(s: &str) -> IResult<&str, &str> {
404  ///   take(6usize)(s)
405  /// }
406  ///
407  /// assert_eq!(take6("1234567"), Ok(("7", "123456")));
408  /// assert_eq!(take6("things"), Ok(("", "things")));
409  /// assert_eq!(take6("short"), Err(Err::Incomplete(Needed::Unknown)));
410  /// ```
take<C, Input, Error: ParseError<Input>>( count: C, ) -> impl Fn(Input) -> IResult<Input, Input, Error> where Input: InputIter + InputTake + InputLength, C: ToUsize,411  pub fn take<C, Input, Error: ParseError<Input>>(
412    count: C,
413  ) -> impl Fn(Input) -> IResult<Input, Input, Error>
414  where
415    Input: InputIter + InputTake + InputLength,
416    C: ToUsize,
417  {
418    let c = count.to_usize();
419    move |i: Input| match i.slice_index(c) {
420      Err(i) => Err(Err::Incomplete(i)),
421      Ok(index) => Ok(i.take_split(index)),
422    }
423  }
424  
425  /// Returns the input slice up to the first occurrence of the pattern.
426  ///
427  /// It doesn't consume the pattern.
428  ///
429  /// # Streaming Specific
430  /// *Streaming version* will return a `Err::Incomplete(Needed::new(N))` if the input doesn't
431  /// contain the pattern or if the input is smaller than the pattern.
432  /// # Example
433  /// ```rust
434  /// # use nom::{Err, error::ErrorKind, Needed, IResult};
435  /// use nom::bytes::streaming::take_until;
436  ///
437  /// fn until_eof(s: &str) -> IResult<&str, &str> {
438  ///   take_until("eof")(s)
439  /// }
440  ///
441  /// assert_eq!(until_eof("hello, worldeof"), Ok(("eof", "hello, world")));
442  /// assert_eq!(until_eof("hello, world"), Err(Err::Incomplete(Needed::Unknown)));
443  /// assert_eq!(until_eof("hello, worldeo"), Err(Err::Incomplete(Needed::Unknown)));
444  /// assert_eq!(until_eof("1eof2eof"), Ok(("eof2eof", "1")));
445  /// ```
take_until<T, Input, Error: ParseError<Input>>( tag: T, ) -> impl Fn(Input) -> IResult<Input, Input, Error> where Input: InputTake + InputLength + FindSubstring<T>, T: Clone,446  pub fn take_until<T, Input, Error: ParseError<Input>>(
447    tag: T,
448  ) -> impl Fn(Input) -> IResult<Input, Input, Error>
449  where
450    Input: InputTake + InputLength + FindSubstring<T>,
451    T: Clone,
452  {
453    move |i: Input| {
454      let t = tag.clone();
455  
456      let res: IResult<_, _, Error> = match i.find_substring(t) {
457        None => Err(Err::Incomplete(Needed::Unknown)),
458        Some(index) => Ok(i.take_split(index)),
459      };
460      res
461    }
462  }
463  
464  /// Returns the non empty input slice up to the first occurrence of the pattern.
465  ///
466  /// It doesn't consume the pattern.
467  ///
468  /// # Streaming Specific
469  /// *Streaming version* will return a `Err::Incomplete(Needed::new(N))` if the input doesn't
470  /// contain the pattern or if the input is smaller than the pattern.
471  /// # Example
472  /// ```rust
473  /// # use nom::{Err, error::{Error, ErrorKind}, Needed, IResult};
474  /// use nom::bytes::streaming::take_until1;
475  ///
476  /// fn until_eof(s: &str) -> IResult<&str, &str> {
477  ///   take_until1("eof")(s)
478  /// }
479  ///
480  /// assert_eq!(until_eof("hello, worldeof"), Ok(("eof", "hello, world")));
481  /// assert_eq!(until_eof("hello, world"), Err(Err::Incomplete(Needed::Unknown)));
482  /// assert_eq!(until_eof("hello, worldeo"), Err(Err::Incomplete(Needed::Unknown)));
483  /// assert_eq!(until_eof("1eof2eof"), Ok(("eof2eof", "1")));
484  /// assert_eq!(until_eof("eof"),  Err(Err::Error(Error::new("eof", ErrorKind::TakeUntil))));
485  /// ```
take_until1<T, Input, Error: ParseError<Input>>( tag: T, ) -> impl Fn(Input) -> IResult<Input, Input, Error> where Input: InputTake + InputLength + FindSubstring<T>, T: Clone,486  pub fn take_until1<T, Input, Error: ParseError<Input>>(
487    tag: T,
488  ) -> impl Fn(Input) -> IResult<Input, Input, Error>
489  where
490    Input: InputTake + InputLength + FindSubstring<T>,
491    T: Clone,
492  {
493    move |i: Input| {
494      let t = tag.clone();
495  
496      let res: IResult<_, _, Error> = match i.find_substring(t) {
497        None => Err(Err::Incomplete(Needed::Unknown)),
498        Some(0) => Err(Err::Error(Error::from_error_kind(i, ErrorKind::TakeUntil))),
499        Some(index) => Ok(i.take_split(index)),
500      };
501      res
502    }
503  }
504  
505  /// Matches a byte string with escaped characters.
506  ///
507  /// * The first argument matches the normal characters (it must not accept the control character)
508  /// * The second argument is the control character (like `\` in most languages)
509  /// * The third argument matches the escaped characters
510  /// # Example
511  /// ```
512  /// # use nom::{Err, error::ErrorKind, Needed, IResult};
513  /// # use nom::character::complete::digit1;
514  /// use nom::bytes::streaming::escaped;
515  /// use nom::character::streaming::one_of;
516  ///
517  /// fn esc(s: &str) -> IResult<&str, &str> {
518  ///   escaped(digit1, '\\', one_of("\"n\\"))(s)
519  /// }
520  ///
521  /// assert_eq!(esc("123;"), Ok((";", "123")));
522  /// assert_eq!(esc("12\\\"34;"), Ok((";", "12\\\"34")));
523  /// ```
524  ///
escaped<Input, Error, F, G, O1, O2>( mut normal: F, control_char: char, mut escapable: G, ) -> impl FnMut(Input) -> IResult<Input, Input, Error> where Input: Clone + crate::traits::Offset + InputLength + InputTake + InputTakeAtPosition + Slice<RangeFrom<usize>> + InputIter, <Input as InputIter>::Item: crate::traits::AsChar, F: Parser<Input, O1, Error>, G: Parser<Input, O2, Error>, Error: ParseError<Input>,525  pub fn escaped<Input, Error, F, G, O1, O2>(
526    mut normal: F,
527    control_char: char,
528    mut escapable: G,
529  ) -> impl FnMut(Input) -> IResult<Input, Input, Error>
530  where
531    Input: Clone
532      + crate::traits::Offset
533      + InputLength
534      + InputTake
535      + InputTakeAtPosition
536      + Slice<RangeFrom<usize>>
537      + InputIter,
538    <Input as InputIter>::Item: crate::traits::AsChar,
539    F: Parser<Input, O1, Error>,
540    G: Parser<Input, O2, Error>,
541    Error: ParseError<Input>,
542  {
543    use crate::traits::AsChar;
544  
545    move |input: Input| {
546      let mut i = input.clone();
547  
548      while i.input_len() > 0 {
549        let current_len = i.input_len();
550  
551        match normal.parse(i.clone()) {
552          Ok((i2, _)) => {
553            if i2.input_len() == 0 {
554              return Err(Err::Incomplete(Needed::Unknown));
555            } else if i2.input_len() == current_len {
556              let index = input.offset(&i2);
557              return Ok(input.take_split(index));
558            } else {
559              i = i2;
560            }
561          }
562          Err(Err::Error(_)) => {
563            // unwrap() should be safe here since index < $i.input_len()
564            if i.iter_elements().next().unwrap().as_char() == control_char {
565              let next = control_char.len_utf8();
566              if next >= i.input_len() {
567                return Err(Err::Incomplete(Needed::new(1)));
568              } else {
569                match escapable.parse(i.slice(next..)) {
570                  Ok((i2, _)) => {
571                    if i2.input_len() == 0 {
572                      return Err(Err::Incomplete(Needed::Unknown));
573                    } else {
574                      i = i2;
575                    }
576                  }
577                  Err(e) => return Err(e),
578                }
579              }
580            } else {
581              let index = input.offset(&i);
582              return Ok(input.take_split(index));
583            }
584          }
585          Err(e) => {
586            return Err(e);
587          }
588        }
589      }
590  
591      Err(Err::Incomplete(Needed::Unknown))
592    }
593  }
594  
595  /// Matches a byte string with escaped characters.
596  ///
597  /// * The first argument matches the normal characters (it must not match the control character)
598  /// * The second argument is the control character (like `\` in most languages)
599  /// * The third argument matches the escaped characters and transforms them
600  ///
601  /// As an example, the chain `abc\tdef` could be `abc    def` (it also consumes the control character)
602  ///
603  /// ```
604  /// # use nom::{Err, error::ErrorKind, Needed, IResult};
605  /// # use std::str::from_utf8;
606  /// use nom::bytes::streaming::{escaped_transform, tag};
607  /// use nom::character::streaming::alpha1;
608  /// use nom::branch::alt;
609  /// use nom::combinator::value;
610  ///
611  /// fn parser(input: &str) -> IResult<&str, String> {
612  ///   escaped_transform(
613  ///     alpha1,
614  ///     '\\',
615  ///     alt((
616  ///       value("\\", tag("\\")),
617  ///       value("\"", tag("\"")),
618  ///       value("\n", tag("n")),
619  ///     ))
620  ///   )(input)
621  /// }
622  ///
623  /// assert_eq!(parser("ab\\\"cd\""), Ok(("\"", String::from("ab\"cd"))));
624  /// ```
625  #[cfg(feature = "alloc")]
626  #[cfg_attr(feature = "docsrs", doc(cfg(feature = "alloc")))]
escaped_transform<Input, Error, F, G, O1, O2, ExtendItem, Output>( mut normal: F, control_char: char, mut transform: G, ) -> impl FnMut(Input) -> IResult<Input, Output, Error> where Input: Clone + crate::traits::Offset + InputLength + InputTake + InputTakeAtPosition + Slice<RangeFrom<usize>> + InputIter, Input: crate::traits::ExtendInto<Item = ExtendItem, Extender = Output>, O1: crate::traits::ExtendInto<Item = ExtendItem, Extender = Output>, O2: crate::traits::ExtendInto<Item = ExtendItem, Extender = Output>, <Input as InputIter>::Item: crate::traits::AsChar, F: Parser<Input, O1, Error>, G: Parser<Input, O2, Error>, Error: ParseError<Input>,627  pub fn escaped_transform<Input, Error, F, G, O1, O2, ExtendItem, Output>(
628    mut normal: F,
629    control_char: char,
630    mut transform: G,
631  ) -> impl FnMut(Input) -> IResult<Input, Output, Error>
632  where
633    Input: Clone
634      + crate::traits::Offset
635      + InputLength
636      + InputTake
637      + InputTakeAtPosition
638      + Slice<RangeFrom<usize>>
639      + InputIter,
640    Input: crate::traits::ExtendInto<Item = ExtendItem, Extender = Output>,
641    O1: crate::traits::ExtendInto<Item = ExtendItem, Extender = Output>,
642    O2: crate::traits::ExtendInto<Item = ExtendItem, Extender = Output>,
643    <Input as InputIter>::Item: crate::traits::AsChar,
644    F: Parser<Input, O1, Error>,
645    G: Parser<Input, O2, Error>,
646    Error: ParseError<Input>,
647  {
648    use crate::traits::AsChar;
649  
650    move |input: Input| {
651      let mut index = 0;
652      let mut res = input.new_builder();
653  
654      let i = input.clone();
655  
656      while index < i.input_len() {
657        let current_len = i.input_len();
658        let remainder = i.slice(index..);
659        match normal.parse(remainder.clone()) {
660          Ok((i2, o)) => {
661            o.extend_into(&mut res);
662            if i2.input_len() == 0 {
663              return Err(Err::Incomplete(Needed::Unknown));
664            } else if i2.input_len() == current_len {
665              return Ok((remainder, res));
666            } else {
667              index = input.offset(&i2);
668            }
669          }
670          Err(Err::Error(_)) => {
671            // unwrap() should be safe here since index < $i.input_len()
672            if remainder.iter_elements().next().unwrap().as_char() == control_char {
673              let next = index + control_char.len_utf8();
674              let input_len = input.input_len();
675  
676              if next >= input_len {
677                return Err(Err::Incomplete(Needed::Unknown));
678              } else {
679                match transform.parse(i.slice(next..)) {
680                  Ok((i2, o)) => {
681                    o.extend_into(&mut res);
682                    if i2.input_len() == 0 {
683                      return Err(Err::Incomplete(Needed::Unknown));
684                    } else {
685                      index = input.offset(&i2);
686                    }
687                  }
688                  Err(e) => return Err(e),
689                }
690              }
691            } else {
692              return Ok((remainder, res));
693            }
694          }
695          Err(e) => return Err(e),
696        }
697      }
698      Err(Err::Incomplete(Needed::Unknown))
699    }
700  }
701