1#![no_std]
94#![doc(html_root_url = "https://docs.rs/form-net")]
95#![cfg_attr(docsrs, feature(doc_cfg))]
96#![forbid(unsafe_code)]
97#![deny(missing_docs)]
98#![cfg_attr(
99 not(test),
100 deny(
101 clippy::unwrap_used,
102 clippy::expect_used,
103 clippy::panic,
104 clippy::indexing_slicing,
105 clippy::arithmetic_side_effects,
106 clippy::todo,
107 clippy::unimplemented,
108 clippy::unreachable,
109 clippy::dbg_macro,
110 clippy::print_stdout,
111 clippy::print_stderr
112 )
113)]
114
115#[cfg(any(feature = "alloc", test))]
116extern crate alloc;
117#[cfg(any(feature = "std", test))]
118extern crate std;
119
120mod error;
121#[cfg(feature = "alloc")]
122mod extract;
123mod hook;
124#[cfg(feature = "std")]
125mod io;
126mod kind;
127mod limits;
128mod multipart;
129#[cfg(feature = "random")]
130mod random;
131mod scan;
132#[cfg(feature = "fs")]
133mod store;
134mod urlencoded;
135mod wipe;
136
137#[cfg(feature = "alloc")]
138#[doc(hidden)]
139pub use alloc::vec::Vec as __Vec;
140pub use error::{
141 EncodingError, ExtractError, FormError, Limit, Location, PolicyRefusal, SyntaxError,
142};
143#[cfg(feature = "alloc")]
144#[doc(hidden)]
145pub use extract::{__push_field_error, __unknown, __value_error};
146#[cfg(feature = "alloc")]
147#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
148pub use extract::{
149 FileData, FileValue, FormBuilder, FormErrors, FromField, FromForm, Secret, ValueError,
150};
151#[cfg(feature = "alloc")]
152#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
153pub use hook::MemorySink;
154pub use hook::{DiscardSink, Inspector, NoInspector, Refusal, Sink, Verdict};
155pub use kind::FormKind;
156pub use limits::{
157 EmptyFilePolicy, ExtendedFilenamePolicy, HeaderPolicy, Limits, PercentPolicy, Policy,
158 TokenField, TokenPlacement,
159};
160pub use multipart::boundary::{Boundary, MAX_BOUNDARY_LEN, MAX_DELIMITER_LEN};
161#[cfg(feature = "alloc")]
162#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
163pub use multipart::driver::{Driver, Progress};
164pub use multipart::filename::{FileName, FileNameSource};
165#[cfg(feature = "alloc")]
166#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
167pub use multipart::owned_head::OwnedPartHead;
168pub use multipart::parser::{
169 Charset, ContentType, Event, Headers, MultipartParser, PartHead, PartKind, PartSummary, Step,
170};
171#[cfg(feature = "std")]
172#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
173pub use multipart::writer::MultipartWriter;
174pub use multipart::writer::encode_part_head;
175#[cfg(feature = "alloc")]
176#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
177pub use multipart::{
178 Multipart, Part, parse_multipart, parse_multipart_inspected, parse_multipart_with,
179};
180pub use urlencoded::decode::decode_into;
181pub use urlencoded::encode::encode_into;
182#[cfg(feature = "alloc")]
183#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
184pub use urlencoded::encode::{Serializer, serialize_urlencoded};
185pub use urlencoded::raw::{RawPair, RawPairs, raw_pairs};
186pub use urlencoded::stream::{UrlencodedEvent, UrlencodedParser, UrlencodedStep};
187#[cfg(feature = "alloc")]
188#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
189pub use urlencoded::{
190 Form, Pairs, pairs, parse_query, parse_urlencoded, parse_urlencoded_inspected,
191 parse_urlencoded_with,
192};
193
194#[cfg(feature = "std")]
195#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
196pub use io::{MultipartReader, PartReader};
197#[cfg(feature = "fs")]
198#[cfg_attr(docsrs, doc(cfg(feature = "fs")))]
199pub use store::{
200 SpillBudget, SpillMode, SpillQuota, Store, StoreError, StoreSink, StoreStats, StoredFile,
201 StoredReader, Upload, UploadSession, read_multipart, sweep,
202};
203
204pub const VERSION: &str = env!("CARGO_PKG_VERSION");
206
207#[cfg(test)]
208mod tests {
209 use super::VERSION;
210
211 #[test]
212 fn test_version_matches_manifest() {
213 assert_eq!(VERSION, env!("CARGO_PKG_VERSION"));
214 assert_eq!(VERSION.split('.').count(), 3, "expected MAJOR.MINOR.PATCH");
215 }
216
217 #[test]
218 fn test_public_types_are_send_and_sync() {
219 fn send_sync<T: Send + Sync>() {}
220 send_sync::<super::Limits>();
221 send_sync::<super::Policy>();
222 send_sync::<super::Boundary>();
223 send_sync::<super::FormError>();
224 send_sync::<super::MultipartParser<&mut [u8]>>();
225 #[cfg(feature = "alloc")]
226 {
227 send_sync::<super::MultipartParser<alloc::vec::Vec<u8>>>();
228 send_sync::<super::Form>();
229 send_sync::<super::Multipart<'static>>();
230 send_sync::<super::OwnedPartHead>();
231 send_sync::<super::MemorySink>();
232 send_sync::<super::Driver<alloc::vec::Vec<u8>, super::MemorySink>>();
233 send_sync::<super::FileData>();
234 send_sync::<super::Secret>();
235 }
236 #[cfg(feature = "std")]
237 send_sync::<super::MultipartReader<std::fs::File>>();
238 #[cfg(feature = "fs")]
239 {
240 send_sync::<super::Store>();
241 send_sync::<super::StoreSink>();
242 send_sync::<super::StoredFile>();
243 send_sync::<super::Upload>();
244 send_sync::<super::UploadSession>();
245 }
246 }
247}
248
249#[cfg(all(doctest, feature = "fs", feature = "unicode"))]
252#[doc = include_str!("../docs/API.md")]
253struct ApiExamples;