use crate::extensions::{ CommonPropertiesExtension, CommonPropertiesProp, CommonPropertiesPropName, }; use crate::privileges::UserPrivilegeSet; use crate::resource::{NamedRoute, Resource, ResourceService}; use crate::xml::{Resourcetype, ResourcetypeInner}; use actix_web::dev::ResourceMap; use async_trait::async_trait; use rustical_store::auth::User; use std::marker::PhantomData; #[derive(Clone)] pub struct RootResource(PhantomData); impl Default for RootResource { fn default() -> Self { Self(Default::default()) } } impl Resource for RootResource { type PropName = CommonPropertiesPropName; type Prop = CommonPropertiesProp; type Error = PR::Error; type PrincipalResource = PR; fn get_resourcetype(&self) -> Resourcetype { Resourcetype(&[ResourcetypeInner( Some(crate::namespace::NS_DAV), "collection", )]) } fn get_prop( &self, rmap: &ResourceMap, user: &User, prop: &Self::PropName, ) -> Result { CommonPropertiesExtension::get_prop(self, rmap, user, prop) } fn get_user_privileges(&self, _user: &User) -> Result { Ok(UserPrivilegeSet::all()) } } #[derive(Clone)] pub struct RootResourceService(PhantomData); impl Default for RootResourceService { fn default() -> Self { Self(PhantomData) } } #[async_trait(?Send)] impl ResourceService for RootResourceService { type PathComponents = (); type MemberType = PR; type Resource = RootResource; type Error = PR::Error; async fn get_resource(&self, _: &()) -> Result { Ok(RootResource::::default()) } }