Compare commits

...

3 Commits

Author SHA1 Message Date
Lennart
1e9be6c134 Dockerfile: Update Rust to 1.90 2025-09-21 20:15:07 +02:00
Lennart
b6bfb5a620 ical: Remove abstraction structs around journal and todo 2025-09-19 14:47:44 +02:00
Lennart
53f30fce3f version 0.9.8: revert to Rust 1.89 since 1.90 fully online yet 2025-09-18 21:20:07 +02:00
7 changed files with 32 additions and 63 deletions

22
Cargo.lock generated
View File

@@ -3024,7 +3024,7 @@ dependencies = [
[[package]]
name = "rustical"
version = "0.9.7"
version = "0.9.8"
dependencies = [
"anyhow",
"argon2",
@@ -3067,7 +3067,7 @@ dependencies = [
[[package]]
name = "rustical_caldav"
version = "0.9.7"
version = "0.9.8"
dependencies = [
"async-std",
"async-trait",
@@ -3107,7 +3107,7 @@ dependencies = [
[[package]]
name = "rustical_carddav"
version = "0.9.7"
version = "0.9.8"
dependencies = [
"async-trait",
"axum",
@@ -3139,7 +3139,7 @@ dependencies = [
[[package]]
name = "rustical_dav"
version = "0.9.7"
version = "0.9.8"
dependencies = [
"async-trait",
"axum",
@@ -3164,7 +3164,7 @@ dependencies = [
[[package]]
name = "rustical_dav_push"
version = "0.9.7"
version = "0.9.8"
dependencies = [
"async-trait",
"axum",
@@ -3189,7 +3189,7 @@ dependencies = [
[[package]]
name = "rustical_frontend"
version = "0.9.7"
version = "0.9.8"
dependencies = [
"askama",
"askama_web",
@@ -3222,7 +3222,7 @@ dependencies = [
[[package]]
name = "rustical_ical"
version = "0.9.7"
version = "0.9.8"
dependencies = [
"axum",
"chrono",
@@ -3240,7 +3240,7 @@ dependencies = [
[[package]]
name = "rustical_oidc"
version = "0.9.7"
version = "0.9.8"
dependencies = [
"async-trait",
"axum",
@@ -3255,7 +3255,7 @@ dependencies = [
[[package]]
name = "rustical_store"
version = "0.9.7"
version = "0.9.8"
dependencies = [
"anyhow",
"async-trait",
@@ -3289,7 +3289,7 @@ dependencies = [
[[package]]
name = "rustical_store_sqlite"
version = "0.9.7"
version = "0.9.8"
dependencies = [
"async-trait",
"chrono",
@@ -3310,7 +3310,7 @@ dependencies = [
[[package]]
name = "rustical_xml"
version = "0.9.7"
version = "0.9.8"
dependencies = [
"quick-xml",
"thiserror 2.0.16",

View File

@@ -2,7 +2,7 @@
members = ["crates/*"]
[workspace.package]
version = "0.9.7"
version = "0.9.8"
edition = "2024"
description = "A CalDAV server"
documentation = "https://lennart-k.github.io/rustical/"

View File

@@ -8,7 +8,7 @@ use http::{HeaderValue, Method, StatusCode, header};
use ical::generator::{Emitter, IcalCalendarBuilder};
use ical::property::Property;
use percent_encoding::{CONTROLS, utf8_percent_encode};
use rustical_ical::{CalendarObjectComponent, EventObject, JournalObject, TodoObject};
use rustical_ical::{CalendarObjectComponent, EventObject};
use rustical_store::{CalendarStore, SubscriptionStore, auth::Principal};
use std::collections::HashMap;
use std::str::FromStr;
@@ -83,16 +83,16 @@ pub async fn route_get<C: CalendarStore, S: SubscriptionStore>(
ical_calendar_builder.add_event(_override.event.clone());
}
}
CalendarObjectComponent::Todo(TodoObject(todo), overrides) => {
CalendarObjectComponent::Todo(todo, overrides) => {
ical_calendar_builder = ical_calendar_builder.add_todo(todo.clone());
for _override in overrides {
ical_calendar_builder = ical_calendar_builder.add_todo(_override.0.clone());
ical_calendar_builder = ical_calendar_builder.add_todo(_override.clone());
}
}
CalendarObjectComponent::Journal(JournalObject(journal), overrides) => {
CalendarObjectComponent::Journal(journal, overrides) => {
ical_calendar_builder = ical_calendar_builder.add_journal(journal.clone());
for _override in overrides {
ical_calendar_builder = ical_calendar_builder.add_journal(_override.0.clone());
ical_calendar_builder = ical_calendar_builder.add_journal(_override.clone());
}
}
}

View File

@@ -1,11 +0,0 @@
use derive_more::From;
use ical::parser::ical::component::IcalJournal;
#[derive(Debug, Clone, From)]
pub struct JournalObject(pub IcalJournal);
impl JournalObject {
pub fn get_uid(&self) -> &str {
self.0.get_uid()
}
}

View File

@@ -1,9 +1,5 @@
mod event;
mod journal;
mod object;
mod todo;
pub use event::*;
pub use journal::*;
pub use object::*;
pub use todo::*;

View File

@@ -1,11 +1,13 @@
use super::{EventObject, JournalObject, TodoObject};
use super::EventObject;
use crate::CalDateTime;
use crate::Error;
use chrono::DateTime;
use chrono::Utc;
use derive_more::Display;
use ical::generator::{Emitter, IcalCalendar};
use ical::parser::ical::component::IcalJournal;
use ical::parser::ical::component::IcalTimeZone;
use ical::parser::ical::component::IcalTodo;
use ical::property::Property;
use serde::Deserialize;
use serde::Serialize;
@@ -57,8 +59,8 @@ impl rustical_xml::ValueDeserialize for CalendarObjectType {
#[derive(Debug, Clone)]
pub enum CalendarObjectComponent {
Event(EventObject, Vec<EventObject>),
Todo(TodoObject, Vec<TodoObject>),
Journal(JournalObject, Vec<JournalObject>),
Todo(IcalTodo, Vec<IcalTodo>),
Journal(IcalJournal, Vec<IcalJournal>),
}
impl CalendarObjectComponent {
@@ -82,9 +84,9 @@ impl CalendarObjectComponent {
}
Ok(Self::Event(main_event, overrides))
}
fn from_todos(mut todos: Vec<TodoObject>) -> Result<Self, Error> {
fn from_todos(mut todos: Vec<IcalTodo>) -> Result<Self, Error> {
let main_todo = todos
.extract_if(.., |todo| todo.0.get_recurrence_id().is_none())
.extract_if(.., |todo| todo.get_recurrence_id().is_none())
.next()
.expect("there must be one main event");
let overrides = todos;
@@ -94,7 +96,7 @@ impl CalendarObjectComponent {
"Calendar object contains multiple UIDs".to_owned(),
));
}
if todo.0.get_recurrence_id().is_none() {
if todo.get_recurrence_id().is_none() {
return Err(Error::InvalidData(
"Calendar object can only contain one main component".to_owned(),
));
@@ -102,9 +104,9 @@ impl CalendarObjectComponent {
}
Ok(Self::Todo(main_todo, overrides))
}
fn from_journals(mut journals: Vec<JournalObject>) -> Result<Self, Error> {
fn from_journals(mut journals: Vec<IcalJournal>) -> Result<Self, Error> {
let main_journal = journals
.extract_if(.., |journal| journal.0.get_recurrence_id().is_none())
.extract_if(.., |journal| journal.get_recurrence_id().is_none())
.next()
.expect("there must be one main event");
let overrides = journals;
@@ -114,7 +116,7 @@ impl CalendarObjectComponent {
"Calendar object contains multiple UIDs".to_owned(),
));
}
if journal.0.get_recurrence_id().is_none() {
if journal.get_recurrence_id().is_none() {
return Err(Error::InvalidData(
"Calendar object can only contain one main component".to_owned(),
));
@@ -179,16 +181,9 @@ impl CalendarObject {
.collect(),
)?
} else if !cal.todos.is_empty() {
CalendarObjectComponent::from_todos(
cal.todos.into_iter().map(|todo| todo.into()).collect(),
)?
CalendarObjectComponent::from_todos(cal.todos)?
} else if !cal.journals.is_empty() {
CalendarObjectComponent::from_journals(
cal.journals
.into_iter()
.map(|journal| journal.into())
.collect(),
)?
CalendarObjectComponent::from_journals(cal.journals)?
} else {
return Err(Error::InvalidData(
"iCalendar component type not supported :(".to_owned(),
@@ -215,9 +210,9 @@ impl CalendarObject {
match &self.data {
// We've made sure before that the first component exists and all components share the
// same UID
CalendarObjectComponent::Todo(todo, _) => todo.0.get_uid(),
CalendarObjectComponent::Todo(todo, _) => todo.get_uid(),
CalendarObjectComponent::Event(event, _) => event.event.get_uid(),
CalendarObjectComponent::Journal(journal, _) => journal.0.get_uid(),
CalendarObjectComponent::Journal(journal, _) => journal.get_uid(),
}
}

View File

@@ -1,11 +0,0 @@
use derive_more::From;
use ical::parser::ical::component::IcalTodo;
#[derive(Debug, Clone, From)]
pub struct TodoObject(pub IcalTodo);
impl TodoObject {
pub fn get_uid(&self) -> &str {
self.0.get_uid()
}
}