nom/number/
mod.rs

1//! Parsers recognizing numbers
2
3use core::{
4  marker::PhantomData,
5  ops::{Add, Shl},
6};
7
8use crate::{
9  branch::alt,
10  character::{char, digit1},
11  combinator::{cut, map, opt, recognize},
12  error::{make_error, ErrorKind, ParseError},
13  sequence::pair,
14  AsBytes, AsChar, Compare, Either, Emit, Err, Input, IsStreaming, Mode, Needed, Offset, OutputM,
15  Parser,
16};
17
18pub mod complete;
19pub mod streaming;
20
21/// Configurable endianness
22#[derive(Debug, PartialEq, Eq, Clone, Copy)]
23pub enum Endianness {
24  /// Big endian
25  Big,
26  /// Little endian
27  Little,
28  /// Will match the host's endianness
29  Native,
30}
31
32/// creates a big endian unsigned integer parser
33///
34/// * `bound`: the number of bytes that will be read
35/// * `Uint`: the output type
36#[inline]
37fn be_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
38where
39  I: Input<Item = u8>,
40  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
41{
42  BeUint {
43    bound,
44    e: PhantomData,
45    u: PhantomData,
46  }
47}
48
49/// Big endian unsigned integer parser
50struct BeUint<Uint, E> {
51  bound: usize,
52  e: PhantomData<E>,
53  u: PhantomData<Uint>,
54}
55
56impl<I, Uint, E: ParseError<I>> Parser<I> for BeUint<Uint, E>
57where
58  I: Input<Item = u8>,
59  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
60{
61  type Output = Uint;
62  type Error = E;
63
64  #[inline(always)]
65  fn process<OM: crate::OutputMode>(
66    &mut self,
67    input: I,
68  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
69    if input.input_len() < self.bound {
70      if OM::Incomplete::is_streaming() {
71        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
72      } else {
73        Err(Err::Error(OM::Error::bind(|| {
74          make_error(input, ErrorKind::Eof)
75        })))
76      }
77    } else {
78      let res = OM::Output::bind(|| {
79        let mut res = Uint::default();
80
81        // special case to avoid shift a byte with overflow
82        if self.bound > 1 {
83          for byte in input.iter_elements().take(self.bound) {
84            res = (res << 8) + byte.into();
85          }
86        } else {
87          for byte in input.iter_elements().take(self.bound) {
88            res = byte.into();
89          }
90        }
91
92        res
93      });
94
95      Ok((input.take_from(self.bound), res))
96    }
97  }
98}
99
100/// Recognizes an unsigned 1 byte integer.
101///
102/// ```rust
103/// # use nom::{Err, error::ErrorKind, Needed, Parser};
104/// use nom::number::be_u8;
105///
106/// let parser = |s| {
107///   be_u8::<_, (_, ErrorKind)>().parse(s)
108/// };
109///
110/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00)));
111/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1))));
112/// ```
113#[inline]
114pub fn be_u8<I, E: ParseError<I>>() -> impl Parser<I, Output = u8, Error = E>
115where
116  I: Input<Item = u8>,
117{
118  be_uint(1)
119}
120
121/// Recognizes a big endian unsigned 2 bytes integer.
122///
123/// ```rust
124/// # use nom::{Err, error::ErrorKind, Needed, Parser};
125/// use nom::number::be_u16;
126///
127/// let parser = |s| {
128///   be_u16::<_, (_, ErrorKind)>().parse(s)
129/// };
130///
131/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0001)));
132/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
133/// ```
134#[inline]
135pub fn be_u16<I, E: ParseError<I>>() -> impl Parser<I, Output = u16, Error = E>
136where
137  I: Input<Item = u8>,
138{
139  be_uint(2)
140}
141
142/// Recognizes a big endian unsigned 3 byte integer.
143///
144/// ```rust
145/// # use nom::{Err, error::ErrorKind, Needed, Parser};
146/// use nom::number::be_u24;
147///
148/// let parser = |s| {
149///   be_u24::<_, (_, ErrorKind)>().parse(s)
150/// };
151///
152/// assert_eq!(parser(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x000102)));
153/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
154/// ```
155#[inline]
156pub fn be_u24<I, E: ParseError<I>>() -> impl Parser<I, Output = u32, Error = E>
157where
158  I: Input<Item = u8>,
159{
160  be_uint(3)
161}
162
163/// Recognizes a big endian unsigned 4 bytes integer.
164///
165/// ```rust
166/// # use nom::{Err, error::ErrorKind, Needed, Parser};
167/// use nom::number::be_u32;
168///
169/// let parser = |s| {
170///   be_u32::<_, (_, ErrorKind)>().parse(s)
171/// };
172///
173/// assert_eq!(parser(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x00010203)));
174/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
175/// ```
176#[inline]
177pub fn be_u32<I, E: ParseError<I>>() -> impl Parser<I, Output = u32, Error = E>
178where
179  I: Input<Item = u8>,
180{
181  be_uint(4)
182}
183
184/// Recognizes a big endian unsigned 8 bytes integer.
185///
186/// ```rust
187/// # use nom::{Err, error::ErrorKind, Needed, Parser};
188/// use nom::number::be_u64;
189///
190/// let parser = |s| {
191///   be_u64::<_, (_, ErrorKind)>().parse(s)
192/// };
193///
194/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0001020304050607)));
195/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
196/// ```
197#[inline]
198pub fn be_u64<I, E: ParseError<I>>() -> impl Parser<I, Output = u64, Error = E>
199where
200  I: Input<Item = u8>,
201{
202  be_uint(8)
203}
204
205/// Recognizes a big endian unsigned 16 bytes integer.
206///
207/// ```rust
208/// # use nom::{Err, error::ErrorKind, Needed, Parser};
209/// use nom::number::be_u128;
210///
211/// let parser = |s| {
212///   be_u128::<_, (_, ErrorKind)>().parse(s)
213/// };
214///
215/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x00010203040506070809101112131415)));
216/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
217/// ```
218#[inline]
219pub fn be_u128<I, E: ParseError<I>>() -> impl Parser<I, Output = u128, Error = E>
220where
221  I: Input<Item = u8>,
222{
223  be_uint(16)
224}
225
226/// Recognizes a signed 1 byte integer.
227///
228/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
229/// ```rust
230/// # use nom::{Err, error::ErrorKind, Needed, Parser};
231/// use nom::number::be_i8;
232///
233/// let mut parser = be_i8::<_, (_, ErrorKind)>();
234///
235/// assert_eq!(parser.parse(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00)));
236/// assert_eq!(parser.parse(&b""[..]), Err(Err::Incomplete(Needed::new(1))));
237/// ```
238#[inline]
239pub fn be_i8<I, E: ParseError<I>>() -> impl Parser<I, Output = i8, Error = E>
240where
241  I: Input<Item = u8>,
242{
243  be_u8().map(|x| x as i8)
244}
245
246/// Recognizes a big endian signed 2 bytes integer.
247///
248/// ```rust
249/// # use nom::{Err, error::ErrorKind, Needed, Parser};
250/// use nom::number::be_i16;
251///
252/// let mut parser = be_i16::<_, (_, ErrorKind)>();
253///
254/// assert_eq!(parser.parse(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0001)));
255/// assert_eq!(parser.parse(&b""[..]), Err(Err::Incomplete(Needed::new(2))));
256/// ```
257#[inline]
258pub fn be_i16<I, E: ParseError<I>>() -> impl Parser<I, Output = i16, Error = E>
259where
260  I: Input<Item = u8>,
261{
262  be_u16().map(|x| x as i16)
263}
264
265/// Recognizes a big endian signed 3 bytes integer.
266///
267/// ```rust
268/// # use nom::{Err, error::ErrorKind, Needed, Parser};
269/// use nom::number::be_i24;
270///
271/// let mut parser = be_i24::<_, (_, ErrorKind)>();
272///
273/// assert_eq!(parser.parse(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x000102)));
274/// assert_eq!(parser.parse(&b""[..]), Err(Err::Incomplete(Needed::new(3))));
275/// ```
276#[inline]
277pub fn be_i24<I, E: ParseError<I>>() -> impl Parser<I, Output = i32, Error = E>
278where
279  I: Input<Item = u8>,
280{
281  // Same as the unsigned version but we need to sign-extend manually here
282  be_u24().map(|x| {
283    if x & 0x80_00_00 != 0 {
284      (x | 0xff_00_00_00) as i32
285    } else {
286      x as i32
287    }
288  })
289}
290
291/// Recognizes a big endian signed 4 bytes integer.
292///
293/// ```rust
294/// # use nom::{Err, error::ErrorKind, Needed, Parser};
295/// use nom::number::be_i32;
296///
297/// let mut parser = be_i32::<_, (_, ErrorKind)>();
298///
299/// assert_eq!(parser.parse(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x00010203)));
300/// assert_eq!(parser.parse(&b""[..]), Err(Err::Incomplete(Needed::new(4))));
301/// ```
302#[inline]
303pub fn be_i32<I, E: ParseError<I>>() -> impl Parser<I, Output = i32, Error = E>
304where
305  I: Input<Item = u8>,
306{
307  be_u32().map(|x| x as i32)
308}
309
310/// Recognizes a big endian signed 8 bytes integer.
311///
312/// ```rust
313/// # use nom::{Err, error::ErrorKind, Needed, Parser};
314/// use nom::number::be_i64;
315///
316/// let mut parser = be_i64::<_, (_, ErrorKind)>();
317///
318/// assert_eq!(parser.parse(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0001020304050607)));
319/// assert_eq!(parser.parse(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
320/// ```
321#[inline]
322pub fn be_i64<I, E: ParseError<I>>() -> impl Parser<I, Output = i64, Error = E>
323where
324  I: Input<Item = u8>,
325{
326  be_u64().map(|x| x as i64)
327}
328
329/// Recognizes a big endian signed 16 bytes integer.
330///
331/// ```rust
332/// # use nom::{Err, error::ErrorKind, Needed, Parser};
333/// use nom::number::be_i128;
334///
335/// let mut parser = be_i128::<_, (_, ErrorKind)>();
336///
337/// assert_eq!(parser.parse(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x00010203040506070809101112131415)));
338/// assert_eq!(parser.parse(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
339/// ```
340#[inline]
341pub fn be_i128<I, E: ParseError<I>>() -> impl Parser<I, Output = i128, Error = E>
342where
343  I: Input<Item = u8>,
344{
345  be_u128().map(|x| x as i128)
346}
347
348/// creates a little endian unsigned integer parser
349///
350/// * `bound`: the number of bytes that will be read
351/// * `Uint`: the output type
352#[inline]
353fn le_uint<I, Uint, E: ParseError<I>>(bound: usize) -> impl Parser<I, Output = Uint, Error = E>
354where
355  I: Input<Item = u8>,
356  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
357{
358  LeUint {
359    bound,
360    e: PhantomData,
361    u: PhantomData,
362  }
363}
364
365/// Little endian unsigned integer parser
366struct LeUint<Uint, E> {
367  bound: usize,
368  e: PhantomData<E>,
369  u: PhantomData<Uint>,
370}
371
372impl<I, Uint, E: ParseError<I>> Parser<I> for LeUint<Uint, E>
373where
374  I: Input<Item = u8>,
375  Uint: Default + Shl<u8, Output = Uint> + Add<Uint, Output = Uint> + From<u8>,
376{
377  type Output = Uint;
378  type Error = E;
379
380  #[inline(always)]
381  fn process<OM: crate::OutputMode>(
382    &mut self,
383    input: I,
384  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
385    if input.input_len() < self.bound {
386      if OM::Incomplete::is_streaming() {
387        Err(Err::Incomplete(Needed::new(self.bound - input.input_len())))
388      } else {
389        Err(Err::Error(OM::Error::bind(|| {
390          make_error(input, ErrorKind::Eof)
391        })))
392      }
393    } else {
394      let res = OM::Output::bind(|| {
395        let mut res = Uint::default();
396        for (index, byte) in input.iter_elements().take(self.bound).enumerate() {
397          res = res + (Uint::from(byte) << (8 * index as u8));
398        }
399
400        res
401      });
402
403      Ok((input.take_from(self.bound), res))
404    }
405  }
406}
407
408/// Recognizes an unsigned 1 byte integer.
409///
410/// ```rust
411/// # use nom::{Err, error::ErrorKind, Needed, Parser};
412/// use nom::number::le_u8;
413///
414/// let mut parser = le_u8::<_, (_, ErrorKind)>();
415///
416/// assert_eq!(parser.parse(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00)));
417/// assert_eq!(parser.parse(&b""[..]), Err(Err::Incomplete(Needed::new(1))));
418/// ```
419#[inline]
420pub fn le_u8<I, E: ParseError<I>>() -> impl Parser<I, Output = u8, Error = E>
421where
422  I: Input<Item = u8>,
423{
424  le_uint(1)
425}
426
427/// Recognizes a little endian unsigned 2 bytes integer.
428///
429///
430/// ```rust
431/// # use nom::{Err, error::ErrorKind, Needed, Parser};
432/// use nom::number::le_u16;
433///
434/// let parser = |s| {
435///   le_u16::<_, (_, ErrorKind)>().parse(s)
436/// };
437///
438/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0100)));
439/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
440/// ```
441#[inline]
442pub fn le_u16<I, E: ParseError<I>>() -> impl Parser<I, Output = u16, Error = E>
443where
444  I: Input<Item = u8>,
445{
446  le_uint(2)
447}
448
449/// Recognizes a little endian unsigned 3 bytes integer.
450///
451/// ```rust
452/// # use nom::{Err, error::ErrorKind, Needed, Parser};
453/// use nom::number::le_u24;
454///
455/// let parser = |s| {
456///   le_u24::<_, (_, ErrorKind)>().parse(s)
457/// };
458///
459/// assert_eq!(parser(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x020100)));
460/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
461/// ```
462#[inline]
463pub fn le_u24<I, E: ParseError<I>>() -> impl Parser<I, Output = u32, Error = E>
464where
465  I: Input<Item = u8>,
466{
467  le_uint(3)
468}
469
470/// Recognizes a little endian unsigned 4 bytes integer.
471///
472/// ```rust
473/// # use nom::{Err, error::ErrorKind, Needed, Parser};
474/// use nom::number::le_u32;
475///
476/// let parser = |s| {
477///   le_u32::<_, (_, ErrorKind)>().parse(s)
478/// };
479///
480/// assert_eq!(parser(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x03020100)));
481/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
482/// ```
483#[inline]
484pub fn le_u32<I, E: ParseError<I>>() -> impl Parser<I, Output = u32, Error = E>
485where
486  I: Input<Item = u8>,
487{
488  le_uint(4)
489}
490
491/// Recognizes a little endian unsigned 8 bytes integer.
492///
493/// ```rust
494/// # use nom::{Err, error::ErrorKind, Needed, Parser};
495/// use nom::number::le_u64;
496///
497/// let parser = |s| {
498///   le_u64::<_, (_, ErrorKind)>().parse(s)
499/// };
500///
501/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0706050403020100)));
502/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
503/// ```
504#[inline]
505pub fn le_u64<I, E: ParseError<I>>() -> impl Parser<I, Output = u64, Error = E>
506where
507  I: Input<Item = u8>,
508{
509  le_uint(8)
510}
511
512/// Recognizes a little endian unsigned 16 bytes integer.
513///
514/// ```rust
515/// # use nom::{Err, error::ErrorKind, Needed, Parser};
516/// use nom::number::le_u128;
517///
518/// let mut parser = |s| {
519///   le_u128::<_, (_, ErrorKind)>().parse(s)
520/// };
521///
522/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x15141312111009080706050403020100)));
523/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
524/// ```
525#[inline]
526pub fn le_u128<I, E: ParseError<I>>() -> impl Parser<I, Output = u128, Error = E>
527where
528  I: Input<Item = u8>,
529{
530  le_uint(16)
531}
532
533/// Recognizes a signed 1 byte integer.
534///
535/// ```rust
536/// # use nom::{Err, error::ErrorKind, Needed, Parser};
537/// use nom::number::le_i8;
538///
539/// let mut parser = le_i8::<_, (_, ErrorKind)>();
540///
541/// assert_eq!(parser.parse(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00)));
542/// assert_eq!(parser.parse(&b""[..]), Err(Err::Incomplete(Needed::new(1))));
543/// ```
544#[inline]
545pub fn le_i8<I, E: ParseError<I>>() -> impl Parser<I, Output = i8, Error = E>
546where
547  I: Input<Item = u8>,
548{
549  le_u8().map(|x| x as i8)
550}
551
552/// Recognizes a little endian signed 2 bytes integer.
553///
554/// ```rust
555/// # use nom::{Err, error::ErrorKind, Needed, Parser};
556/// use nom::number::le_i16;
557///
558/// let parser = |s| {
559///   le_i16::<_, (_, ErrorKind)>().parse(s)
560/// };
561///
562/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0100)));
563/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
564/// ```
565#[inline]
566pub fn le_i16<I, E: ParseError<I>>() -> impl Parser<I, Output = i16, Error = E>
567where
568  I: Input<Item = u8>,
569{
570  le_u16().map(|x| x as i16)
571}
572
573/// Recognizes a little endian signed 3 bytes integer.
574///
575/// ```rust
576/// # use nom::{Err, error::ErrorKind, Needed, Parser};
577/// use nom::number::le_i24;
578///
579/// let parser = |s| {
580///   le_i24::<_, (_, ErrorKind)>().parse(s)
581/// };
582///
583/// assert_eq!(parser(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x020100)));
584/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
585/// ```
586#[inline]
587pub fn le_i24<I, E: ParseError<I>>() -> impl Parser<I, Output = i32, Error = E>
588where
589  I: Input<Item = u8>,
590{
591  // Same as the unsigned version but we need to sign-extend manually here
592  le_u24().map(|x| {
593    if x & 0x80_00_00 != 0 {
594      (x | 0xff_00_00_00) as i32
595    } else {
596      x as i32
597    }
598  })
599}
600
601/// Recognizes a little endian signed 4 bytes integer.
602///
603/// ```rust
604/// # use nom::{Err, error::ErrorKind, Needed, Parser};
605/// use nom::number::le_i32;
606///
607/// let parser = |s| {
608///   le_i32::<_, (_, ErrorKind)>().parse(s)
609/// };
610///
611/// assert_eq!(parser(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x03020100)));
612/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
613/// ```
614#[inline]
615pub fn le_i32<I, E: ParseError<I>>() -> impl Parser<I, Output = i32, Error = E>
616where
617  I: Input<Item = u8>,
618{
619  le_u32().map(|x| x as i32)
620}
621
622/// Recognizes a little endian signed 8 bytes integer.
623///
624/// ```rust
625/// # use nom::{Err, error::ErrorKind, Needed, Parser};
626/// use nom::number::le_i64;
627///
628/// let parser = |s| {
629///   le_i64::<_, (_, ErrorKind)>().parse(s)
630/// };
631///
632/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0706050403020100)));
633/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
634/// ```
635#[inline]
636pub fn le_i64<I, E: ParseError<I>>() -> impl Parser<I, Output = i64, Error = E>
637where
638  I: Input<Item = u8>,
639{
640  le_u64().map(|x| x as i64)
641}
642
643/// Recognizes a little endian signed 16 bytes integer.
644///
645/// ```rust
646/// # use nom::{Err, error::ErrorKind, Needed, Parser};
647/// use nom::number::le_i128;
648///
649/// let parser = |s| {
650///   le_i128::<_, (_, ErrorKind)>().parse(s)
651/// };
652///
653/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x15141312111009080706050403020100)));
654/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
655/// ```
656#[inline]
657pub fn le_i128<I, E: ParseError<I>>() -> impl Parser<I, Output = i128, Error = E>
658where
659  I: Input<Item = u8>,
660{
661  le_u128().map(|x| x as i128)
662}
663
664/// Recognizes an unsigned 1 byte integer
665///
666/// Note that endianness does not apply to 1 byte numbers.
667/// ```rust
668/// # use nom::{Err, error::ErrorKind, Needed, Parser};
669/// # use nom::Needed::Size;
670/// use nom::number::u8;
671///
672/// let parser = |s| {
673///   u8::<_, (_, ErrorKind)>().parse(s)
674/// };
675///
676/// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"\x03abcefg"[..], 0x00)));
677/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1))));
678/// ```
679#[inline]
680pub fn u8<I, E: ParseError<I>>() -> impl Parser<I, Output = u8, Error = E>
681where
682  I: Input<Item = u8>,
683{
684  be_u8()
685}
686
687/// Recognizes an unsigned 2 bytes integer
688///
689/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u16 integer,
690/// otherwise if `nom::number::Endianness::Little` parse a little endian u16 integer.
691///
692/// ```rust
693/// # use nom::{Err, error::ErrorKind, Needed, Parser};
694/// # use nom::Needed::Size;
695/// use nom::number::u16;
696///
697/// let be_u16 = |s| {
698///   u16::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
699/// };
700///
701/// assert_eq!(be_u16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0003)));
702/// assert_eq!(be_u16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
703///
704/// let le_u16 = |s| {
705///   u16::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
706/// };
707///
708/// assert_eq!(le_u16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0300)));
709/// assert_eq!(le_u16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
710/// ```
711#[inline]
712pub fn u16<I, E: ParseError<I>>(
713  endian: crate::number::Endianness,
714) -> impl Parser<I, Output = u16, Error = E>
715where
716  I: Input<Item = u8>,
717{
718  match endian {
719    crate::number::Endianness::Big => Either::Left(be_u16()),
720    crate::number::Endianness::Little => Either::Right(le_u16()),
721    #[cfg(target_endian = "big")]
722    crate::number::Endianness::Native => Either::Left(be_u16()),
723    #[cfg(target_endian = "little")]
724    crate::number::Endianness::Native => Either::Right(le_u16()),
725  }
726}
727
728/// Recognizes an unsigned 3 byte integer
729///
730/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u24 integer,
731/// otherwise if `nom::number::Endianness::Little` parse a little endian u24 integer.
732/// ```rust
733/// # use nom::{Err, error::ErrorKind, Needed, Parser};
734/// # use nom::Needed::Size;
735/// use nom::number::u24;
736///
737/// let be_u24 = |s| {
738///   u24::<_,(_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
739/// };
740///
741/// assert_eq!(be_u24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x000305)));
742/// assert_eq!(be_u24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
743///
744/// let le_u24 = |s| {
745///   u24::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
746/// };
747///
748/// assert_eq!(le_u24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x050300)));
749/// assert_eq!(le_u24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
750/// ```
751#[inline]
752pub fn u24<I, E: ParseError<I>>(
753  endian: crate::number::Endianness,
754) -> impl Parser<I, Output = u32, Error = E>
755where
756  I: Input<Item = u8>,
757{
758  match endian {
759    crate::number::Endianness::Big => Either::Left(be_u24()),
760    crate::number::Endianness::Little => Either::Right(le_u24()),
761    #[cfg(target_endian = "big")]
762    crate::number::Endianness::Native => Either::Left(be_u24()),
763    #[cfg(target_endian = "little")]
764    crate::number::Endianness::Native => Either::Right(le_u24()),
765  }
766}
767
768/// Recognizes an unsigned 4 byte integer
769///
770/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u32 integer,
771/// otherwise if `nom::number::Endianness::Little` parse a little endian u32 integer.
772/// ```rust
773/// # use nom::{Err, error::ErrorKind, Needed, Parser};
774/// # use nom::Needed::Size;
775/// use nom::number::u32;
776///
777/// let be_u32 = |s| {
778///   u32::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
779/// };
780///
781/// assert_eq!(be_u32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00030507)));
782/// assert_eq!(be_u32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
783///
784/// let le_u32 = |s| {
785///   u32::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
786/// };
787///
788/// assert_eq!(le_u32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07050300)));
789/// assert_eq!(le_u32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
790/// ```
791#[inline]
792pub fn u32<I, E: ParseError<I>>(
793  endian: crate::number::Endianness,
794) -> impl Parser<I, Output = u32, Error = E>
795where
796  I: Input<Item = u8>,
797{
798  match endian {
799    crate::number::Endianness::Big => Either::Left(be_u32()),
800    crate::number::Endianness::Little => Either::Right(le_u32()),
801    #[cfg(target_endian = "big")]
802    crate::number::Endianness::Native => Either::Left(be_u32()),
803    #[cfg(target_endian = "little")]
804    crate::number::Endianness::Native => Either::Right(le_u32()),
805  }
806}
807
808/// Recognizes an unsigned 8 byte integer
809///
810/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u64 integer,
811/// otherwise if `nom::number::Endianness::Little` parse a little endian u64 integer.
812/// ```rust
813/// # use nom::{Err, error::ErrorKind, Needed, Parser};
814/// # use nom::Needed::Size;
815/// use nom::number::u64;
816///
817/// let be_u64 = |s| {
818///   u64::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
819/// };
820///
821/// assert_eq!(be_u64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0001020304050607)));
822/// assert_eq!(be_u64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
823///
824/// let le_u64 = |s| {
825///   u64::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
826/// };
827///
828/// assert_eq!(le_u64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0706050403020100)));
829/// assert_eq!(le_u64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
830/// ```
831#[inline]
832pub fn u64<I, E: ParseError<I>>(
833  endian: crate::number::Endianness,
834) -> impl Parser<I, Output = u64, Error = E>
835where
836  I: Input<Item = u8>,
837{
838  match endian {
839    crate::number::Endianness::Big => Either::Left(be_u64()),
840    crate::number::Endianness::Little => Either::Right(le_u64()),
841    #[cfg(target_endian = "big")]
842    crate::number::Endianness::Native => Either::Left(be_u64()),
843    #[cfg(target_endian = "little")]
844    crate::number::Endianness::Native => Either::Right(le_u64()),
845  }
846}
847
848/// Recognizes an unsigned 16 byte integer
849///
850/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u128 integer,
851/// otherwise if `nom::number::Endianness::Little` parse a little endian u128 integer.
852/// ```rust
853/// # use nom::{Err, error::ErrorKind, Needed, Parser};
854/// # use nom::Needed::Size;
855/// use nom::number::u128;
856///
857/// let be_u128 = |s| {
858///   u128::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
859/// };
860///
861/// assert_eq!(be_u128(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00010203040506070001020304050607)));
862/// assert_eq!(be_u128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
863///
864/// let le_u128 = |s| {
865///   u128::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
866/// };
867///
868/// assert_eq!(le_u128(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07060504030201000706050403020100)));
869/// assert_eq!(le_u128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
870/// ```
871#[inline]
872pub fn u128<I, E: ParseError<I>>(
873  endian: crate::number::Endianness,
874) -> impl Parser<I, Output = u128, Error = E>
875where
876  I: Input<Item = u8>,
877{
878  match endian {
879    crate::number::Endianness::Big => Either::Left(be_u128()),
880    crate::number::Endianness::Little => Either::Right(le_u128()),
881    #[cfg(target_endian = "big")]
882    crate::number::Endianness::Native => Either::Left(be_u128()),
883    #[cfg(target_endian = "little")]
884    crate::number::Endianness::Native => Either::Right(le_u128()),
885  }
886}
887
888/// Recognizes a signed 1 byte integer
889///
890/// Note that endianness does not apply to 1 byte numbers.
891/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
892/// ```rust
893/// # use nom::{Err, error::ErrorKind, Needed, Parser};
894/// # use nom::Needed::Size;
895/// use nom::number::i8;
896///
897/// let parser = |s| {
898///   i8::<_, (_, ErrorKind)>().parse(s)
899/// };
900///
901/// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"\x03abcefg"[..], 0x00)));
902/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1))));
903/// ```
904#[inline]
905pub fn i8<I, E: ParseError<I>>() -> impl Parser<I, Output = i8, Error = E>
906where
907  I: Input<Item = u8>,
908{
909  u8().map(|x| x as i8)
910}
911
912/// Recognizes a signed 2 byte integer
913///
914/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i16 integer,
915/// otherwise if `nom::number::Endianness::Little` parse a little endian i16 integer.
916/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
917/// ```rust
918/// # use nom::{Err, error::ErrorKind, Needed, Parser};
919/// # use nom::Needed::Size;
920/// use nom::number::i16;
921///
922/// let be_i16 = |s| {
923///   i16::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
924/// };
925///
926/// assert_eq!(be_i16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0003)));
927/// assert_eq!(be_i16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
928///
929/// let le_i16 = |s| {
930///   i16::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
931/// };
932///
933/// assert_eq!(le_i16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0300)));
934/// assert_eq!(le_i16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
935/// ```
936#[inline]
937pub fn i16<I, E: ParseError<I>>(
938  endian: crate::number::Endianness,
939) -> impl Parser<I, Output = i16, Error = E>
940where
941  I: Input<Item = u8>,
942{
943  match endian {
944    crate::number::Endianness::Big => Either::Left(be_i16()),
945    crate::number::Endianness::Little => Either::Right(le_i16()),
946    #[cfg(target_endian = "big")]
947    crate::number::Endianness::Native => Either::Left(be_i16()),
948    #[cfg(target_endian = "little")]
949    crate::number::Endianness::Native => Either::Right(le_i16()),
950  }
951}
952
953/// Recognizes a signed 3 byte integer
954///
955/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i24 integer,
956/// otherwise if `nom::number::Endianness::Little` parse a little endian i24 integer.
957/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
958/// ```rust
959/// # use nom::{Err, error::ErrorKind, Needed, Parser};
960/// # use nom::Needed::Size;
961/// use nom::number::i24;
962///
963/// let be_i24 = |s| {
964///   i24::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
965/// };
966///
967/// assert_eq!(be_i24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x000305)));
968/// assert_eq!(be_i24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
969///
970/// let le_i24 = |s| {
971///   i24::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
972/// };
973///
974/// assert_eq!(le_i24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x050300)));
975/// assert_eq!(le_i24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
976/// ```
977#[inline]
978pub fn i24<I, E: ParseError<I>>(
979  endian: crate::number::Endianness,
980) -> impl Parser<I, Output = i32, Error = E>
981where
982  I: Input<Item = u8>,
983{
984  match endian {
985    crate::number::Endianness::Big => Either::Left(be_i24()),
986    crate::number::Endianness::Little => Either::Right(le_i24()),
987    #[cfg(target_endian = "big")]
988    crate::number::Endianness::Native => Either::Left(be_i24()),
989    #[cfg(target_endian = "little")]
990    crate::number::Endianness::Native => Either::Right(le_i24()),
991  }
992}
993
994/// Recognizes a signed 4 byte integer
995///
996/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i32 integer,
997/// otherwise if `nom::number::Endianness::Little` parse a little endian i32 integer.
998/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
999/// ```rust
1000/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1001/// # use nom::Needed::Size;
1002/// use nom::number::i32;
1003///
1004/// let be_i32 = |s| {
1005///   i32::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
1006/// };
1007///
1008/// assert_eq!(be_i32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00030507)));
1009/// assert_eq!(be_i32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
1010///
1011/// let le_i32 = |s| {
1012///   i32::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
1013/// };
1014///
1015/// assert_eq!(le_i32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07050300)));
1016/// assert_eq!(le_i32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
1017/// ```
1018#[inline]
1019pub fn i32<I, E: ParseError<I>>(
1020  endian: crate::number::Endianness,
1021) -> impl Parser<I, Output = i32, Error = E>
1022where
1023  I: Input<Item = u8>,
1024{
1025  match endian {
1026    crate::number::Endianness::Big => Either::Left(be_i32()),
1027    crate::number::Endianness::Little => Either::Right(le_i32()),
1028    #[cfg(target_endian = "big")]
1029    crate::number::Endianness::Native => Either::Left(be_i32()),
1030    #[cfg(target_endian = "little")]
1031    crate::number::Endianness::Native => Either::Right(le_i32()),
1032  }
1033}
1034
1035/// Recognizes a signed 8 byte integer
1036///
1037/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i64 integer,
1038/// otherwise if `nom::number::Endianness::Little` parse a little endian i64 integer.
1039/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1040/// ```rust
1041/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1042/// # use nom::Needed::Size;
1043/// use nom::number::i64;
1044///
1045/// let be_i64 = |s| {
1046///   i64::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
1047/// };
1048///
1049/// assert_eq!(be_i64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0001020304050607)));
1050/// assert_eq!(be_i64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
1051///
1052/// let le_i64 = |s| {
1053///   i64::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
1054/// };
1055///
1056/// assert_eq!(le_i64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0706050403020100)));
1057/// assert_eq!(le_i64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
1058/// ```
1059#[inline]
1060pub fn i64<I, E: ParseError<I>>(
1061  endian: crate::number::Endianness,
1062) -> impl Parser<I, Output = i64, Error = E>
1063where
1064  I: Input<Item = u8>,
1065{
1066  match endian {
1067    crate::number::Endianness::Big => Either::Left(be_i64()),
1068    crate::number::Endianness::Little => Either::Right(le_i64()),
1069    #[cfg(target_endian = "big")]
1070    crate::number::Endianness::Native => Either::Left(be_i64()),
1071    #[cfg(target_endian = "little")]
1072    crate::number::Endianness::Native => Either::Right(le_i64()),
1073  }
1074}
1075
1076/// Recognizes a signed 16 byte integer
1077///
1078/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i128 integer,
1079/// otherwise if `nom::number::Endianness::Little` parse a little endian i128 integer.
1080/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1081/// ```rust
1082/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1083/// # use nom::Needed::Size;
1084/// use nom::number::i128;
1085///
1086/// let be_i128 = |s| {
1087///   i128::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
1088/// };
1089///
1090/// assert_eq!(be_i128(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00010203040506070001020304050607)));
1091/// assert_eq!(be_i128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
1092///
1093/// let le_i128 = |s| {
1094///   i128::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
1095/// };
1096///
1097/// assert_eq!(le_i128(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07060504030201000706050403020100)));
1098/// assert_eq!(le_i128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
1099/// ```
1100#[inline]
1101pub fn i128<I, E: ParseError<I>>(
1102  endian: crate::number::Endianness,
1103) -> impl Parser<I, Output = i128, Error = E>
1104where
1105  I: Input<Item = u8>,
1106{
1107  match endian {
1108    crate::number::Endianness::Big => Either::Left(be_i128()),
1109    crate::number::Endianness::Little => Either::Right(le_i128()),
1110    #[cfg(target_endian = "big")]
1111    crate::number::Endianness::Native => Either::Left(be_i128()),
1112    #[cfg(target_endian = "little")]
1113    crate::number::Endianness::Native => Either::Right(le_i128()),
1114  }
1115}
1116
1117/// Recognizes a big endian 4 bytes floating point number.
1118///
1119/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1120/// ```rust
1121/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1122/// use nom::number::be_f32;
1123///
1124/// let parser = |s| {
1125///   be_f32::<_, (_, ErrorKind)>().parse(s)
1126/// };
1127///
1128/// assert_eq!(parser(&[0x40, 0x29, 0x00, 0x00][..]), Ok((&b""[..], 2.640625)));
1129/// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(3))));
1130/// ```
1131#[inline]
1132pub fn be_f32<I, E: ParseError<I>>() -> impl Parser<I, Output = f32, Error = E>
1133where
1134  I: Input<Item = u8>,
1135{
1136  be_u32().map(f32::from_bits)
1137}
1138
1139/// Recognizes a big endian 8 bytes floating point number.
1140///
1141/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1142/// ```rust
1143/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1144/// use nom::number::be_f64;
1145///
1146/// let parser = |s| {
1147///   be_f64::<_, (_, ErrorKind)>().parse(s)
1148/// };
1149///
1150/// assert_eq!(parser(&[0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 12.5)));
1151/// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(7))));
1152/// ```
1153#[inline]
1154pub fn be_f64<I, E: ParseError<I>>() -> impl Parser<I, Output = f64, Error = E>
1155where
1156  I: Input<Item = u8>,
1157{
1158  be_u64().map(f64::from_bits)
1159}
1160
1161/// Recognizes a little endian 4 bytes floating point number.
1162///
1163/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1164/// ```rust
1165/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1166/// use nom::number::le_f32;
1167///
1168/// let parser = |s| {
1169///   le_f32::<_, (_, ErrorKind)>().parse(s)
1170/// };
1171///
1172/// assert_eq!(parser(&[0x00, 0x00, 0x48, 0x41][..]), Ok((&b""[..], 12.5)));
1173/// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(3))));
1174/// ```
1175#[inline]
1176pub fn le_f32<I, E: ParseError<I>>() -> impl Parser<I, Output = f32, Error = E>
1177where
1178  I: Input<Item = u8>,
1179{
1180  le_u32().map(f32::from_bits)
1181}
1182
1183/// Recognizes a little endian 8 bytes floating point number.
1184///
1185/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1186/// ```rust
1187/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1188/// use nom::number::le_f64;
1189///
1190/// let parser = |s| {
1191///   le_f64::<_, (_, ErrorKind)>().parse(s)
1192/// };
1193///
1194/// assert_eq!(parser(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x41][..]), Ok((&b""[..], 3145728.0)));
1195/// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(7))));
1196/// ```
1197#[inline]
1198pub fn le_f64<I, E: ParseError<I>>() -> impl Parser<I, Output = f64, Error = E>
1199where
1200  I: Input<Item = u8>,
1201{
1202  le_u64().map(f64::from_bits)
1203}
1204
1205/// Recognizes a 4 byte floating point number
1206///
1207/// If the parameter is `nom::number::Endianness::Big`, parse a big endian f32 float,
1208/// otherwise if `nom::number::Endianness::Little` parse a little endian f32 float.
1209/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1210/// ```rust
1211/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1212/// # use nom::Needed::Size;
1213/// use nom::number::f32;
1214///
1215/// let be_f32 = |s| {
1216///   f32::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
1217/// };
1218///
1219/// assert_eq!(be_f32(&[0x41, 0x48, 0x00, 0x00][..]), Ok((&b""[..], 12.5)));
1220/// assert_eq!(be_f32(&b"abc"[..]), Err(Err::Incomplete(Needed::new(1))));
1221///
1222/// let le_f32 = |s| {
1223///   f32::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
1224/// };
1225///
1226/// assert_eq!(le_f32(&[0x00, 0x00, 0x48, 0x41][..]), Ok((&b""[..], 12.5)));
1227/// assert_eq!(le_f32(&b"abc"[..]), Err(Err::Incomplete(Needed::new(1))));
1228/// ```
1229#[inline]
1230pub fn f32<I, E: ParseError<I>>(
1231  endian: crate::number::Endianness,
1232) -> impl Parser<I, Output = f32, Error = E>
1233where
1234  I: Input<Item = u8>,
1235{
1236  match endian {
1237    crate::number::Endianness::Big => Either::Left(be_f32()),
1238    crate::number::Endianness::Little => Either::Right(le_f32()),
1239    #[cfg(target_endian = "big")]
1240    crate::number::Endianness::Native => Either::Left(be_f32()),
1241    #[cfg(target_endian = "little")]
1242    crate::number::Endianness::Native => Either::Right(le_f32()),
1243  }
1244}
1245
1246/// Recognizes an 8 byte floating point number
1247///
1248/// If the parameter is `nom::number::Endianness::Big`, parse a big endian f64 float,
1249/// otherwise if `nom::number::Endianness::Little` parse a little endian f64 float.
1250/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1251/// ```rust
1252/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1253/// # use nom::Needed::Size;
1254/// use nom::number::f64;
1255///
1256/// let be_f64 = |s| {
1257///   f64::<_, (_, ErrorKind)>(nom::number::Endianness::Big).parse(s)
1258/// };
1259///
1260/// assert_eq!(be_f64(&[0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 12.5)));
1261/// assert_eq!(be_f64(&b"abc"[..]), Err(Err::Incomplete(Needed::new(5))));
1262///
1263/// let le_f64 = |s| {
1264///   f64::<_, (_, ErrorKind)>(nom::number::Endianness::Little).parse(s)
1265/// };
1266///
1267/// assert_eq!(le_f64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x40][..]), Ok((&b""[..], 12.5)));
1268/// assert_eq!(le_f64(&b"abc"[..]), Err(Err::Incomplete(Needed::new(5))));
1269/// ```
1270#[inline]
1271pub fn f64<I, E: ParseError<I>>(
1272  endian: crate::number::Endianness,
1273) -> impl Parser<I, Output = f64, Error = E>
1274where
1275  I: Input<Item = u8>,
1276{
1277  match endian {
1278    crate::number::Endianness::Big => Either::Left(be_f64()),
1279    crate::number::Endianness::Little => Either::Right(le_f64()),
1280    #[cfg(target_endian = "big")]
1281    crate::number::Endianness::Native => Either::Left(be_f64()),
1282    #[cfg(target_endian = "little")]
1283    crate::number::Endianness::Native => Either::Right(le_f64()),
1284  }
1285}
1286
1287/// Recognizes a floating point number in text format and returns the corresponding part of the input.
1288///
1289/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if it reaches the end of input.
1290///
1291/// ```rust
1292/// # use nom::{Err, error::ErrorKind, Needed, Parser};
1293/// use nom::number::recognize_float;
1294///
1295/// let parser = |s| {
1296///   recognize_float().parse(s)
1297/// };
1298///
1299/// assert_eq!(parser("11e-1;"), Ok((";", "11e-1")));
1300/// assert_eq!(parser("123E-02;"), Ok((";", "123E-02")));
1301/// assert_eq!(parser("123K-01"), Ok(("K-01", "123")));
1302/// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Char))));
1303/// ```
1304#[rustfmt::skip]
1305pub fn recognize_float<T, E:ParseError<T>>() -> impl Parser<T, Output=T,Error= E>
1306where
1307  T: Clone + Offset,
1308  T: Input,
1309  <T as Input>::Item: AsChar,
1310{
1311  recognize((
1312      opt(alt((char('+'), char('-')))),
1313      alt((
1314        map((digit1(), opt(pair(char('.'), opt(digit1())))), |_| ()),
1315        map((char('.'), digit1()), |_| ())
1316      )),
1317      opt((
1318        alt((char('e'), char('E'))),
1319        opt(alt((char('+'), char('-')))),
1320        cut(digit1())
1321      ))
1322  ))
1323}
1324
1325/// float number text parser that also recognizes "nan", "infinity" and "inf" (case insensitive)
1326pub fn recognize_float_or_exceptions<T, E: ParseError<T>>() -> impl Parser<T, Output = T, Error = E>
1327where
1328  T: Clone + Offset,
1329  T: Input + Compare<&'static str>,
1330  <T as Input>::Item: AsChar,
1331{
1332  alt((
1333    recognize_float::<_, E>(),
1334    |i: T| {
1335      crate::bytes::streaming::tag_no_case::<_, _, E>("nan")(i.clone())
1336        .map_err(|_| crate::Err::Error(E::from_error_kind(i, ErrorKind::Float)))
1337    },
1338    |i: T| {
1339      crate::bytes::streaming::tag_no_case::<_, _, E>("infinity")(i.clone())
1340        .map_err(|_| crate::Err::Error(E::from_error_kind(i, ErrorKind::Float)))
1341    },
1342    |i: T| {
1343      crate::bytes::streaming::tag_no_case::<_, _, E>("inf")(i.clone())
1344        .map_err(|_| crate::Err::Error(E::from_error_kind(i, ErrorKind::Float)))
1345    },
1346  ))
1347}
1348
1349/// single precision floating point number parser from text
1350pub fn float<T, E: ParseError<T>>() -> impl Parser<T, Output = f32, Error = E>
1351where
1352  T: Clone + Offset,
1353  T: Input + crate::traits::ParseTo<f32> + Compare<&'static str>,
1354  <T as Input>::Item: AsChar + Clone,
1355  T: AsBytes,
1356  T: for<'a> Compare<&'a [u8]>,
1357{
1358  Float {
1359    o: PhantomData,
1360    e: PhantomData,
1361  }
1362}
1363
1364/// double precision floating point number parser from text
1365pub fn double<T, E: ParseError<T>>() -> impl Parser<T, Output = f64, Error = E>
1366where
1367  T: Clone + Offset,
1368  T: Input + crate::traits::ParseTo<f64> + Compare<&'static str>,
1369  <T as Input>::Item: AsChar + Clone,
1370  T: AsBytes,
1371  T: for<'a> Compare<&'a [u8]>,
1372{
1373  Float {
1374    o: PhantomData,
1375    e: PhantomData,
1376  }
1377}
1378
1379/// f64 parser from text
1380struct Float<O, E> {
1381  o: PhantomData<O>,
1382  e: PhantomData<E>,
1383}
1384
1385impl<I, O, E: ParseError<I>> Parser<I> for Float<O, E>
1386where
1387  I: Clone + Offset,
1388  I: Input + crate::traits::ParseTo<O> + Compare<&'static str>,
1389  <I as Input>::Item: AsChar + Clone,
1390  I: AsBytes,
1391  I: for<'a> Compare<&'a [u8]>,
1392{
1393  type Output = O;
1394  type Error = E;
1395
1396  fn process<OM: crate::OutputMode>(
1397    &mut self,
1398    input: I,
1399  ) -> crate::PResult<OM, I, Self::Output, Self::Error> {
1400    let (i, s) =
1401      recognize_float_or_exceptions().process::<OutputM<Emit, OM::Error, OM::Incomplete>>(input)?;
1402
1403    match s.parse_to() {
1404      Some(f) => Ok((i, OM::Output::bind(|| f))),
1405      None => Err(crate::Err::Error(OM::Error::bind(|| {
1406        E::from_error_kind(i, crate::error::ErrorKind::Float)
1407      }))),
1408    }
1409  }
1410}
1411
1412#[cfg(test)]
1413#[cfg(feature = "std")]
1414mod tests {
1415  use super::*;
1416  use crate::error::ErrorKind;
1417  use crate::internal::Err;
1418
1419  macro_rules! assert_parse(
1420    ($left: expr, $right: expr) => {
1421      let res: $crate::IResult<_, _, (_, ErrorKind)> = $left;
1422      assert_eq!(res, $right);
1423    };
1424  );
1425
1426  #[test]
1427  fn float_test() {
1428    let mut test_cases = vec![
1429      "+3.14",
1430      "3.14",
1431      "-3.14",
1432      "0",
1433      "0.0",
1434      "1.",
1435      ".789",
1436      "-.5",
1437      "1e7",
1438      "-1E-7",
1439      ".3e-2",
1440      "1.e4",
1441      "1.2e4",
1442      "12.34",
1443      "-1.234E-12",
1444      "-1.234e-12",
1445      "0.00000000000000000087",
1446    ];
1447
1448    for test in test_cases.drain(..) {
1449      let expected32 = str::parse::<f32>(test).unwrap();
1450      let expected64 = str::parse::<f64>(test).unwrap();
1451
1452      println!("now parsing: {} -> {}", test, expected32);
1453
1454      assert_parse!(recognize_float().parse_complete(test), Ok(("", test)));
1455
1456      /*assert_parse!(float(test.as_bytes()), Ok((&b""[..], expected32)));
1457      assert_parse!(float(test), Ok(("", expected32)));
1458      */
1459
1460      assert_parse!(
1461        double().parse_complete(test.as_bytes()),
1462        Ok((&b""[..], expected64))
1463      );
1464      assert_parse!(double().parse_complete(test), Ok(("", expected64)));
1465    }
1466
1467    let remaining_exponent = "-1.234E-";
1468    assert_parse!(
1469      recognize_float().parse_complete(remaining_exponent),
1470      Err(Err::Failure(("", ErrorKind::Digit)))
1471    );
1472
1473    /*let (_i, nan) = float::<_, ()>("NaN").unwrap();
1474    assert!(nan.is_nan());
1475
1476    let (_i, inf) = float::<_, ()>("inf").unwrap();
1477    assert!(inf.is_infinite());
1478    let (i, inf) = float::<_, ()>("infinity").unwrap();
1479    assert!(inf.is_infinite());
1480    assert!(i.is_empty());*/
1481  }
1482}