#![no_std]
#![doc(html_root_url = "https://docs.rs/form-net")]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![forbid(unsafe_code)]
#![deny(missing_docs)]
#![cfg_attr(
not(test),
deny(
clippy::unwrap_used,
clippy::expect_used,
clippy::panic,
clippy::indexing_slicing,
clippy::arithmetic_side_effects,
clippy::todo,
clippy::unimplemented,
clippy::unreachable,
clippy::dbg_macro,
clippy::print_stdout,
clippy::print_stderr
)
)]
#[cfg(any(feature = "alloc", test))]
extern crate alloc;
#[cfg(any(feature = "std", test))]
extern crate std;
#[cfg(target_has_atomic = "32")]
mod digest;
mod error;
#[cfg(feature = "alloc")]
mod extract;
mod hook;
#[cfg(feature = "std")]
mod io;
mod kind;
mod limits;
mod multipart;
#[cfg(feature = "random")]
mod random;
mod scan;
#[cfg(feature = "fs")]
mod store;
mod urlencoded;
mod wipe;
#[cfg(feature = "alloc")]
#[doc(hidden)]
pub use alloc::vec::Vec as __Vec;
#[cfg(target_has_atomic = "32")]
#[cfg_attr(docsrs, doc(cfg(target_has_atomic = "32")))]
pub use digest::RefusalDigest;
pub use error::{
EncodingError, ExtractError, FormError, Limit, Location, PolicyRefusal, SyntaxError,
};
#[cfg(feature = "alloc")]
#[doc(hidden)]
pub use extract::{__push_field_error, __unknown, __value_error};
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
pub use extract::{
FileData, FileValue, FormBuilder, FormErrors, FromField, FromForm, Secret, ValueError,
};
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
pub use hook::MemorySink;
pub use hook::{DiscardSink, Inspector, NoInspector, Refusal, Sink, TokenCheck, Verdict};
pub use kind::FormKind;
pub use limits::{
EmptyFilePolicy, ExtendedFilenamePolicy, HeaderPolicy, Limits, PercentPolicy, Policy,
TokenField, TokenPlacement,
};
pub use multipart::boundary::{Boundary, MAX_BOUNDARY_LEN, MAX_DELIMITER_LEN};
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
pub use multipart::driver::{Driver, Progress};
pub use multipart::filename::{FileName, FileNameSource};
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
pub use multipart::owned_head::OwnedPartHead;
pub use multipart::parser::{
Charset, ContentType, Event, Headers, MultipartParser, PartHead, PartKind, PartSummary, Step,
};
#[cfg(feature = "std")]
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
pub use multipart::writer::MultipartWriter;
pub use multipart::writer::encode_part_head;
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
pub use multipart::{
Multipart, Part, parse_multipart, parse_multipart_inspected, parse_multipart_with,
};
pub use urlencoded::decode::decode_into;
pub use urlencoded::encode::encode_into;
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
pub use urlencoded::encode::{Serializer, serialize_urlencoded};
pub use urlencoded::raw::{RawPair, RawPairs, raw_pairs};
pub use urlencoded::stream::{UrlencodedEvent, UrlencodedParser, UrlencodedStep};
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
pub use urlencoded::{
Form, Pairs, pairs, parse_query, parse_urlencoded, parse_urlencoded_inspected,
parse_urlencoded_with,
};
#[cfg(feature = "std")]
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
pub use io::{MultipartReader, PartReader};
#[cfg(feature = "fs")]
#[cfg_attr(docsrs, doc(cfg(feature = "fs")))]
pub use store::{
SpillBudget, SpillMode, SpillQuota, Store, StoreError, StoreSink, StoreStats, StoredFile,
StoredReader, Upload, UploadSession, read_multipart, sweep,
};
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
#[cfg(test)]
mod tests {
use super::VERSION;
#[test]
fn test_version_matches_manifest() {
assert_eq!(VERSION, env!("CARGO_PKG_VERSION"));
assert_eq!(VERSION.split('.').count(), 3, "expected MAJOR.MINOR.PATCH");
}
#[test]
#[cfg(target_pointer_width = "64")]
fn test_the_api_size_table_holds() {
use core::mem::size_of;
assert_eq!(size_of::<super::Boundary>(), 149);
assert!(size_of::<super::FormError>() <= 48);
assert_eq!(size_of::<super::Limits>(), 72);
assert_eq!(size_of::<super::RawPair<'static>>(), 48);
assert!(size_of::<super::MultipartParser<&mut [u8]>>() <= 384);
#[cfg(feature = "alloc")]
assert!(size_of::<super::MultipartParser<alloc::vec::Vec<u8>>>() <= 1024);
#[cfg(feature = "fs")]
assert!(size_of::<super::UploadSession>() <= 1024);
}
#[test]
fn test_public_types_are_send_and_sync() {
fn send_sync<T: Send + Sync>() {}
send_sync::<super::Limits>();
send_sync::<super::Policy>();
send_sync::<super::Boundary>();
send_sync::<super::FormError>();
send_sync::<super::RefusalDigest<2>>();
send_sync::<super::MultipartParser<&mut [u8]>>();
#[cfg(feature = "alloc")]
{
send_sync::<super::MultipartParser<alloc::vec::Vec<u8>>>();
send_sync::<super::Form>();
send_sync::<super::Multipart<'static>>();
send_sync::<super::OwnedPartHead>();
send_sync::<super::MemorySink>();
send_sync::<super::Driver<alloc::vec::Vec<u8>, super::MemorySink>>();
send_sync::<super::FileData>();
send_sync::<super::Secret>();
}
#[cfg(feature = "std")]
send_sync::<super::MultipartReader<std::fs::File>>();
#[cfg(feature = "fs")]
{
send_sync::<super::Store>();
send_sync::<super::StoreSink>();
send_sync::<super::StoredFile>();
send_sync::<super::Upload>();
send_sync::<super::UploadSession>();
}
}
}
#[cfg(all(doctest, feature = "fs", feature = "unicode"))]
#[doc = include_str!("../docs/API.md")]
struct ApiExamples;