Documentation
#[cfg(feature = "cookie")]
pub mod cookie;

#[cfg(feature = "form")]
mod form_data;
#[cfg(feature = "form")]
mod form_urlencoded;
#[cfg(feature = "form")]
pub mod form {
    pub use super::form_data::{FormData, FromMultipartNull};
    pub use super::form_urlencoded::FormUrlencoded;
    pub use mincat_macro::Form;
    pub use multer::Multipart;
    pub use multer_derive::{Error, FormContext, FormFile, FromMultipart, MultipartForm};
}

use http::StatusCode;
use mincat_core::response::{IntoResponse, Response};
use std::{error::Error, fmt::Display};

#[cfg(feature = "json")]
mod json;
#[cfg(feature = "json")]
pub use json::Json;

#[cfg(feature = "path")]
mod path;
#[cfg(feature = "path")]
pub use path::Path;

#[cfg(feature = "query")]
mod query;
#[cfg(feature = "query")]
pub use query::Query;

#[cfg(feature = "session")]
mod session;
#[cfg(feature = "session")]
pub use session::Session;

#[cfg(feature = "state")]
mod state;
#[cfg(feature = "state")]
pub use state::State;

#[cfg(feature = "websocket")]
pub mod websocket;

#[derive(Debug)]
pub struct ExtractError(pub String);

impl Display for ExtractError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", self.0)
    }
}

impl Error for ExtractError {}

impl serde::de::Error for ExtractError {
    fn custom<T>(msg: T) -> Self
    where
        T: Display,
    {
        ExtractError(msg.to_string())
    }
}

impl ExtractError {
    pub fn from<T: std::error::Error>(e: T) -> Self {
        Self(e.to_string())
    }
}

impl IntoResponse for ExtractError {
    fn into_response(self) -> Response {
        (StatusCode::BAD_REQUEST, self.0).into_response()
    }
}