Current section

Files

Jump to
multipartkit src multipartkit.gleam
Raw

src/multipartkit.gleam

//// Top-level facade for the multipartkit library.
////
//// Re-exports the public types and the most common functions from the
//// submodules. Less frequently used helpers (header lookup, validation,
//// boundary extraction, content-disposition parsing, ...) live on their
//// dedicated submodules.
import gleam/yielder.{type Yielder}
import multipartkit/content_disposition
import multipartkit/encoder
import multipartkit/error
import multipartkit/form
import multipartkit/limit
import multipartkit/parser
import multipartkit/part
import multipartkit/stream
/// Re-export of `multipartkit/part.Part`.
pub type Part =
part.Part
/// Re-export of `multipartkit/stream.StreamPart`.
pub type StreamPart =
stream.StreamPart
/// Re-export of `multipartkit/form.Form`.
pub type Form =
form.Form
/// Re-export of `multipartkit/limit.Limits`.
pub type Limits =
limit.Limits
/// Re-export of `multipartkit/limit.LimitConfigError`.
pub type LimitConfigError =
limit.LimitConfigError
/// Re-export of `multipartkit/error.MultipartError`.
pub type MultipartError =
error.MultipartError
/// Re-export of `multipartkit/content_disposition.ContentDisposition`.
pub type ContentDisposition =
content_disposition.ContentDisposition
/// Re-export of `multipartkit/parser.parse`.
pub fn parse(
body: BitArray,
content_type: String,
) -> Result(List(Part), MultipartError) {
parser.parse(body, content_type)
}
/// Re-export of `multipartkit/parser.parse_with_limits`.
pub fn parse_with_limits(
body: BitArray,
content_type: String,
limits: Limits,
) -> Result(List(Part), MultipartError) {
parser.parse_with_limits(body, content_type, limits)
}
/// Re-export of `multipartkit/stream.parse_stream`.
pub fn parse_stream(
chunks: Yielder(BitArray),
content_type: String,
) -> Result(Yielder(Result(StreamPart, MultipartError)), MultipartError) {
stream.parse_stream(chunks, content_type)
}
/// Re-export of `multipartkit/stream.parse_stream_with_limits`.
pub fn parse_stream_with_limits(
chunks: Yielder(BitArray),
content_type: String,
limits: Limits,
) -> Result(Yielder(Result(StreamPart, MultipartError)), MultipartError) {
stream.parse_stream_with_limits(chunks, content_type, limits)
}
/// Re-export of `multipartkit/encoder.encode`.
///
/// Returns `Error(InvalidBoundary(value))` when `boundary` does not
/// satisfy the RFC 2046 ยง5.1.1 grammar (empty, > 70 chars, contains
/// CR / LF / NUL / other non-`bchars`, or trails a space). Use
/// `let assert Ok(body) = multipartkit.encode(...)` if your boundary is
/// hard-coded or generated by `encode_form`/`generate_boundary` (always
/// valid).
pub fn encode(
boundary: String,
parts: List(Part),
) -> Result(BitArray, MultipartError) {
encoder.encode(boundary, parts)
}
/// Re-export of `multipartkit/encoder.encode_form`.
pub fn encode_form(the_form: Form) -> #(String, BitArray) {
encoder.encode_form(the_form)
}
/// Re-export of `multipartkit/encoder.encode_stream`.
pub fn encode_stream(
boundary: String,
parts: Yielder(StreamPart),
) -> Yielder(Result(BitArray, MultipartError)) {
encoder.encode_stream(boundary, parts)
}
/// Re-export of `multipartkit/limit.default_limits`.
pub fn default_limits() -> Limits {
limit.default_limits()
}
/// Re-export of `multipartkit/limit.new`. Construct a validated
/// `Limits` value; non-positive fields surface as
/// `LimitConfigError.NonPositiveLimit`.
pub fn new_limits(
max_body_bytes max_body_bytes: Int,
max_part_bytes max_part_bytes: Int,
max_parts max_parts: Int,
max_header_bytes max_header_bytes: Int,
) -> Result(Limits, LimitConfigError) {
limit.new(
max_body_bytes: max_body_bytes,
max_part_bytes: max_part_bytes,
max_parts: max_parts,
max_header_bytes: max_header_bytes,
)
}