use axum::{extract::Request, response::Response}; use futures_util::future::BoxFuture; use headers::Allow; use http::Method; use std::{convert::Infallible, str::FromStr}; pub type MethodFunction = fn(State, Request) -> BoxFuture<'static, Result>; pub trait AxumMethods: Sized + Send + Sync + 'static { #[inline] fn report() -> Option> { None } #[inline] fn get() -> Option> { None } #[inline] fn head() -> Option> { None } #[inline] fn post() -> Option> { None } #[inline] fn mkcol() -> Option> { None } #[inline] fn mkcalendar() -> Option> { None } #[inline] fn copy() -> Option> { None } #[inline] fn mv() -> Option> { None } #[inline] fn put() -> Option> { None } #[inline] fn allow_header() -> Allow { let mut allow = vec![ Method::from_str("PROPFIND").unwrap(), Method::from_str("PROPPATCH").unwrap(), Method::DELETE, Method::OPTIONS, ]; if Self::report().is_some() { allow.push(Method::from_str("REPORT").unwrap()); } if Self::get().is_some() { allow.push(Method::GET); } if Self::head().is_some() { allow.push(Method::HEAD); } if Self::post().is_some() { allow.push(Method::POST); } if Self::mkcol().is_some() { allow.push(Method::from_str("MKCOL").unwrap()); } if Self::mkcalendar().is_some() { allow.push(Method::from_str("MKCALENDAR").unwrap()); } if Self::copy().is_some() { allow.push(Method::from_str("COPY").unwrap()); } if Self::mv().is_some() { allow.push(Method::from_str("MOVE").unwrap()); } if Self::put().is_some() { allow.push(Method::PUT); } allow.into_iter().collect() } }