Coverage Report

Created: 2025-11-16 06:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/winnow-0.7.13/src/lib.rs
Line
Count
Source
1
//! > winnow, making parsing a breeze
2
//!
3
//! `winnow` is a parser combinator library
4
//!
5
//! Quick links:
6
//! - [List of combinators][crate::combinator]
7
//! - [Tutorial][_tutorial::chapter_0]
8
//! - [Special Topics][_topic]
9
//! - [Discussions](https://github.com/winnow-rs/winnow/discussions)
10
//! - [CHANGELOG](https://github.com/winnow-rs/winnow/blob/v0.7.13/CHANGELOG.md) (includes major version migration
11
//!   guides)
12
//!
13
//! ## Aspirations
14
//!
15
//! `winnow` aims to be your "do everything" parser, much like people treat regular expressions.
16
//!
17
//! In roughly priority order:
18
//! 1. Support writing parser declaratively while not getting in the way of imperative-style
19
//!    parsing when needed, working as an open-ended toolbox rather than a close-ended framework.
20
//! 2. Flexible enough to be used for any application, including parsing strings, binary data,
21
//!    or separate [lexing and parsing phases][_topic::lexing]
22
//! 3. Zero-cost abstractions, making it easy to write high performance parsers
23
//! 4. Easy to use, making it trivial for one-off uses
24
//!
25
//! In addition:
26
//! - Resilient maintainership, including
27
//!   - Willing to break compatibility rather than batching up breaking changes in large releases
28
//!   - Leverage feature flags to keep one active branch
29
//! - We will support the last 6 months of rust releases (MSRV, currently 1.64.0)
30
//!
31
//! See also [Special Topic: Why winnow?][crate::_topic::why]
32
//!
33
//! ## Example
34
//!
35
//! Run
36
//! ```console
37
//! $ cargo add winnow
38
//! ```
39
//!
40
//! Then use it to parse:
41
//! ```rust
42
//! # #[cfg(feature = "alloc")] {
43
#![doc = include_str!("../examples/css/parser.rs")]
44
//! # }
45
//! ```
46
//!
47
//! See also the [Tutorial][_tutorial::chapter_0] and [Special Topics][_topic]
48
49
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
50
#![cfg_attr(docsrs, feature(doc_cfg))]
51
#![cfg_attr(docsrs, feature(extended_key_value_attributes))]
52
#![cfg_attr(all(not(feature = "std"), not(test)), no_std)]
53
#![warn(missing_docs)]
54
#![warn(clippy::std_instead_of_core)]
55
#![warn(clippy::std_instead_of_alloc)]
56
#![warn(clippy::print_stderr)]
57
#![warn(clippy::print_stdout)]
58
59
#[cfg(feature = "alloc")]
60
#[cfg_attr(test, macro_use)]
61
#[allow(unused_extern_crates)]
62
extern crate alloc;
63
64
#[doc = include_str!("../README.md")]
65
#[cfg(doctest)]
66
pub struct ReadmeDoctests;
67
68
/// Lib module to re-export everything needed from `std` or `core`/`alloc`. This is how `serde` does
69
/// it, albeit there it is not public.
70
#[doc(hidden)]
71
pub(crate) mod lib {
72
    #![allow(unused_imports)]
73
74
    /// `std` facade allowing `std`/`core` to be interchangeable. Reexports `alloc` crate optionally,
75
    /// as well as `core` or `std`
76
    #[cfg(not(feature = "std"))]
77
    /// internal std exports for no_std compatibility
78
    pub(crate) mod std {
79
        #[doc(hidden)]
80
        #[cfg(not(feature = "alloc"))]
81
        pub(crate) use core::borrow;
82
83
        #[cfg(feature = "alloc")]
84
        #[doc(hidden)]
85
        pub(crate) use alloc::{borrow, boxed, collections, string, vec};
86
87
        #[doc(hidden)]
88
        pub(crate) use core::{
89
            cmp, convert, fmt, hash, iter, mem, ops, option, result, slice, str,
90
        };
91
    }
92
93
    #[cfg(feature = "std")]
94
    /// internal std exports for `no_std` compatibility
95
    pub(crate) mod std {
96
        #![allow(clippy::std_instead_of_core)]
97
        #![allow(clippy::std_instead_of_alloc)]
98
        #[doc(hidden)]
99
        pub(crate) use std::{
100
            borrow, boxed, cmp, collections, convert, fmt, hash, iter, mem, ops, result, slice,
101
            str, string, vec,
102
        };
103
    }
104
}
105
106
pub(crate) mod util {
107
    #[allow(dead_code)]
108
0
    pub(crate) fn from_fn<F: Fn(&mut core::fmt::Formatter<'_>) -> core::fmt::Result>(
109
0
        f: F,
110
0
    ) -> FromFn<F> {
111
0
        FromFn(f)
112
0
    }
113
114
    pub(crate) struct FromFn<F>(F)
115
    where
116
        F: Fn(&mut core::fmt::Formatter<'_>) -> core::fmt::Result;
117
118
    impl<F> core::fmt::Debug for FromFn<F>
119
    where
120
        F: Fn(&mut core::fmt::Formatter<'_>) -> core::fmt::Result,
121
    {
122
0
        fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
123
0
            (self.0)(f)
124
0
        }
125
    }
126
127
    impl<F> core::fmt::Display for FromFn<F>
128
    where
129
        F: Fn(&mut core::fmt::Formatter<'_>) -> core::fmt::Result,
130
    {
131
0
        fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
132
0
            (self.0)(f)
133
0
        }
134
    }
135
}
136
137
#[macro_use]
138
mod macros;
139
140
#[macro_use]
141
pub mod error;
142
143
mod parser;
144
145
pub mod stream;
146
147
pub mod ascii;
148
pub mod binary;
149
pub mod combinator;
150
pub mod token;
151
152
#[cfg(feature = "unstable-doc")]
153
pub mod _topic;
154
#[cfg(feature = "unstable-doc")]
155
pub mod _tutorial;
156
157
/// Core concepts available for glob import
158
///
159
/// Including
160
/// - [`StreamIsPartial`][crate::stream::StreamIsPartial]
161
/// - [`Parser`]
162
///
163
/// ## Example
164
///
165
/// ```rust
166
/// use winnow::prelude::*;
167
///
168
/// fn parse_data(input: &mut &str) -> ModalResult<u64> {
169
///     // ...
170
/// #   winnow::ascii::dec_uint(input)
171
/// }
172
///
173
/// fn main() {
174
///   let result = parse_data.parse("100");
175
///   assert_eq!(result, Ok(100));
176
/// }
177
/// ```
178
pub mod prelude {
179
    pub use crate::error::ModalError as _;
180
    pub use crate::error::ParserError as _;
181
    pub use crate::stream::AsChar as _;
182
    pub use crate::stream::ContainsToken as _;
183
    pub use crate::stream::Stream as _;
184
    pub use crate::stream::StreamIsPartial as _;
185
    pub use crate::ModalParser;
186
    pub use crate::ModalResult;
187
    pub use crate::Parser;
188
    #[cfg(feature = "unstable-recover")]
189
    #[cfg(feature = "std")]
190
    pub use crate::RecoverableParser as _;
191
192
    #[cfg(test)]
193
    pub(crate) use crate::TestResult;
194
}
195
196
pub use error::ModalResult;
197
pub use error::Result;
198
pub use parser::*;
199
pub use stream::BStr;
200
pub use stream::Bytes;
201
pub use stream::LocatingSlice;
202
pub use stream::Partial;
203
pub use stream::Stateful;
204
pub use stream::Str;
205
206
#[cfg(test)]
207
pub(crate) use error::TestResult;