io-calendar 0.0.1

Set of I/O-free coroutines to manage calendars
use std::path::Path;

use io_fs::io::FsIo;
use io_vdir::{
    constants::ICS,
    coroutines::update_item::{
        UpdateItem as UpdateVdirItem, UpdateItemError as UpdateVdirItemError,
        UpdateItemResult as UpdateVdirItemResult,
    },
    item::{Item as VdirItem, ItemKind as VdirItemKind},
};
use thiserror::Error;

use crate::item::CalendarItem;

#[derive(Clone, Debug, Error)]
pub enum UpdateCalendarItemError {
    #[error("Update calendar vdir item error")]
    UpdateVdirItem(#[from] UpdateVdirItemError),
}

#[derive(Clone, Debug)]
pub enum UpdateCalendarItemResult {
    Ok,
    Err(UpdateCalendarItemError),
    Io(FsIo),
}

#[derive(Debug)]
pub struct UpdateCalendarItem(UpdateVdirItem);

impl UpdateCalendarItem {
    pub fn new(root: impl AsRef<Path>, item: CalendarItem) -> Self {
        let kind = VdirItemKind::Ical(item.ical);
        let path = root
            .as_ref()
            .join(item.calendar_id)
            .join(item.id)
            .with_extension(ICS);

        Self(UpdateVdirItem::new(VdirItem { path, kind }))
    }

    pub fn resume(&mut self, input: Option<FsIo>) -> UpdateCalendarItemResult {
        match self.0.resume(input) {
            UpdateVdirItemResult::Ok => UpdateCalendarItemResult::Ok,
            UpdateVdirItemResult::Err(err) => UpdateCalendarItemResult::Err(err.into()),
            UpdateVdirItemResult::Io(io) => UpdateCalendarItemResult::Io(io),
        }
    }
}