use crate::Principal; use crate::extensions::{ CommonPropertiesExtension, CommonPropertiesProp, CommonPropertiesPropName, }; use crate::privileges::UserPrivilegeSet; use crate::resource::{AxumMethods, PrincipalUri, Resource, ResourceName, ResourceService}; use crate::xml::{Resourcetype, ResourcetypeInner}; use async_trait::async_trait; use axum::Router; use axum::extract::FromRequestParts; use std::marker::PhantomData; #[derive(Clone)] pub struct RootResource(PhantomData, PhantomData

); impl Default for RootResource { fn default() -> Self { Self(PhantomData, PhantomData) } } impl Resource for RootResource { type Prop = CommonPropertiesProp; type Error = PR::Error; type Principal = P; fn is_collection(&self) -> bool { true } fn get_resourcetype(&self) -> Resourcetype { Resourcetype(&[ResourcetypeInner( Some(crate::namespace::NS_DAV), "collection", )]) } fn get_displayname(&self) -> Option<&str> { Some("RustiCal DAV root") } fn get_prop( &self, principal_uri: &impl PrincipalUri, user: &P, prop: &CommonPropertiesPropName, ) -> Result { CommonPropertiesExtension::get_prop(self, principal_uri, user, prop) } fn get_user_privileges(&self, _user: &P) -> Result { Ok(UserPrivilegeSet::all()) } } #[derive(Clone)] pub struct RootResourceService( PRS, PhantomData

, PhantomData, ); impl RootResourceService { pub fn new(principal_resource_service: PRS) -> Self { Self(principal_resource_service, PhantomData, PhantomData) } } #[async_trait] impl< PRS: ResourceService + Clone, P: Principal + FromRequestParts, PURI: PrincipalUri, > ResourceService for RootResourceService where PRS::Resource: ResourceName, { type PathComponents = (); type MemberType = PRS::Resource; type Resource = RootResource; type Error = PRS::Error; type Principal = P; type PrincipalUri = PURI; const DAV_HEADER: &str = "1, 3, access-control"; async fn get_resource(&self, _: &()) -> Result { Ok(RootResource::::default()) } fn axum_router(self) -> Router { Router::new() .nest("/principal/{principal}", self.0.clone().axum_router()) .route_service("/", self.axum_service()) } } impl + Clone, P: Principal, PURI: PrincipalUri> AxumMethods for RootResourceService { }