io-calendar 0.0.1

Set of I/O-free coroutines to manage calendars
use io_stream::io::StreamIo;
use io_vdir::constants::ICS;
use serde::Deserialize;

use crate::caldav::{config::CaldavConfig, request::Request, response::StatusResponse};

use super::send::{Send, SendOk, SendResult};

#[derive(Debug)]
pub struct DeleteCalendarItem(Send<Option<Response>>);

impl DeleteCalendarItem {
    const BODY: &'static str = "";

    pub fn new(
        config: &CaldavConfig,
        calendar_id: impl AsRef<str>,
        item_id: impl AsRef<str>,
    ) -> Self {
        let calendar_id = calendar_id.as_ref();
        let item_id = item_id.as_ref();
        let path = &format!("/{calendar_id}/{item_id}.{ICS}");
        let request = Request::delete(config, path).content_type_xml();
        Self(Send::new(request, Self::BODY.as_bytes().to_vec()))
    }

    pub fn resume(&mut self, arg: Option<StreamIo>) -> SendResult<bool> {
        let ok = match self.0.resume(arg) {
            SendResult::Ok(ok) => ok,
            SendResult::Err(err) => return SendResult::Err(err),
            SendResult::Io(io) => return SendResult::Io(io),
        };

        let has_no_content = ok.response.status() == 204;

        SendResult::Ok(SendOk {
            request: ok.request,
            response: ok.response,
            keep_alive: ok.keep_alive,
            body: match ok.body {
                Some(body) => body.response.status.is_success(),
                None => has_no_content,
            },
        })
    }
}

#[derive(Clone, Debug, Deserialize)]
pub struct Response {
    pub response: StatusResponse,
}