use axum::http::Method;
use axum::http::Response;
use axum::http::StatusCode;
use axum::http::response::Parts;
use axum::routing::MethodRouter;
use self::request_body::RequestBodyMetadata;
use self::request_part::RequestPartMetadata;
use self::response_body::ResponseBodyMetadata;
use self::response_part::ResponsePartMetadata;
use crate::macro_utils::type_metadata::HasMetadata;
use crate::macro_utils::type_metadata::ShouldHaveMetadata;
pub mod context;
mod impls;
pub mod request_body;
pub mod request_part;
pub mod response_body;
pub mod response_part;
pub trait GalvynHandler {
fn meta(&self) -> HandlerMeta;
fn method_router(&self) -> MethodRouter;
}
#[derive(Clone, Debug)]
pub struct HandlerMeta {
pub method: Method,
pub path: &'static str,
pub deprecated: bool,
pub doc: &'static [&'static str],
pub ident: &'static str,
pub request_parts: Vec<RequestPartMetadata>,
pub request_body: Option<RequestBodyMetadata>,
pub response_modifier: Option<ResponseModifier>,
pub response_parts: Vec<ResponsePartMetadata>,
pub response_body: Option<ResponseBodyMetadata>,
}
#[derive(Clone, Debug)]
pub enum ResponseModifier {
StatusCode,
Parts,
Response,
}
impl<T: HasMetadata<ResponseModifier>> ShouldHaveMetadata<ResponseModifier> for T {}
impl HasMetadata<ResponseModifier> for StatusCode {
fn metadata() -> ResponseModifier {
ResponseModifier::StatusCode
}
}
impl HasMetadata<ResponseModifier> for Parts {
fn metadata() -> ResponseModifier {
ResponseModifier::StatusCode
}
}
impl HasMetadata<ResponseModifier> for Response<()> {
fn metadata() -> ResponseModifier {
ResponseModifier::StatusCode
}
}