rustical_dav/header/
overwrite.rs

1use 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}