#![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;
mod error;
#[cfg(feature = "alloc")]
mod extract;
mod hook;
#[cfg(feature = "std")]
mod io;
mod kind;
mod limits;
mod multipart;
mod scan;
#[cfg(feature = "fs")]
mod store;
mod urlencoded;
mod wipe;
pub use error::{
EncodingError, ExtractError, FormError, Limit, Location, PolicyRefusal, SyntaxError,
};
#[cfg(feature = "alloc")]
#[doc(hidden)]
pub use extract::{__unknown, __value_error};
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
pub use extract::{FileData, FileValue, FormBuilder, 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, 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 = "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};
#[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::{
SpillMode, Store, StoreError, StoreSink, StoreStats, StoredFile, StoredReader, Upload,
UploadSession, read_multipart,
};
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]
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::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>();
}
}
}