mod task;
mod tasks_meta;
mod util;
use std::error::Error as StdError;
use std::fmt::Display;
use std::fmt::Formatter;
use std::fmt::Result as FmtResult;
use std::ops::Deref;
use anyhow::Error;
use anyhow::Result;
use super::Backend;
#[derive(Debug)]
pub struct E(Box<dyn StdError + Send + Sync>);
impl Display for E {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
Display::fmt(&self.0, f)
}
}
impl StdError for E {
fn source(&self) -> Option<&(dyn StdError + 'static)> {
Some(self.0.deref())
}
}
trait SerICal
where
Self: Sized,
{
fn to_ical_string(&self) -> String;
fn from_ical_string(data: &str) -> Result<Self, Error>;
}
#[expect(non_camel_case_types)]
#[derive(Clone, Copy, Debug)]
pub struct iCal;
impl<T> Backend<T> for iCal
where
T: SerICal,
{
type Error = E;
#[inline]
fn serialize(object: &T) -> Result<Vec<u8>, Self::Error> {
Ok(T::to_ical_string(object).into_bytes())
}
#[inline]
fn deserialize(data: &[u8]) -> Result<T, Self::Error> {
let string = String::from_utf8(data.to_vec())
.map_err(Box::from)
.map_err(E)?;
T::from_ical_string(&string).map_err(Box::from).map_err(E)
}
}