rustical_dav/header/
overwrite.rs1use axum::{body::Body, extract::FromRequestParts, response::IntoResponse};
2use thiserror::Error;
3
4#[derive(Error, Debug)]
5#[error("Invalid Overwrite header")]
6pub struct InvalidOverwriteHeader;
7
8impl IntoResponse for InvalidOverwriteHeader {
9 fn into_response(self) -> axum::response::Response {
10 axum::response::Response::builder()
11 .status(axum::http::StatusCode::BAD_REQUEST)
12 .body(Body::new("Invalid Overwrite header".to_string()))
13 .expect("this always works")
14 }
15}
16
17#[derive(Debug, PartialEq, Default)]
18pub enum Overwrite {
19 #[default]
20 T,
21 F,
22}
23
24impl Overwrite {
25 pub fn is_true(&self) -> bool {
26 matches!(self, Self::T)
27 }
28}
29
30impl<S: Send + Sync> FromRequestParts<S> for Overwrite {
31 type Rejection = InvalidOverwriteHeader;
32
33 async fn from_request_parts(
34 parts: &mut axum::http::request::Parts,
35 _state: &S,
36 ) -> Result<Self, Self::Rejection> {
37 if let Some(overwrite_header) = parts.headers.get("Overwrite") {
38 overwrite_header.as_bytes().try_into()
39 } else {
40 Ok(Self::default())
41 }
42 }
43}
44
45impl TryFrom<&[u8]> for Overwrite {
46 type Error = InvalidOverwriteHeader;
47
48 fn try_from(value: &[u8]) -> Result<Self, Self::Error> {
49 match value {
50 b"T" => Ok(Overwrite::T),
51 b"F" => Ok(Overwrite::F),
52 _ => Err(InvalidOverwriteHeader),
53 }
54 }
55}