rustical_dav/resources/
root.rs

1use crate::Principal;
2use crate::extensions::{
3    CommonPropertiesExtension, CommonPropertiesProp, CommonPropertiesPropName,
4};
5use crate::privileges::UserPrivilegeSet;
6use crate::resource::{NamedRoute, Resource, ResourceService};
7use crate::xml::{Resourcetype, ResourcetypeInner};
8use actix_web::dev::ResourceMap;
9use async_trait::async_trait;
10use std::marker::PhantomData;
11
12#[derive(Clone)]
13pub struct RootResource<PR: Resource, P: Principal>(PhantomData<PR>, PhantomData<P>);
14
15impl<PR: Resource, P: Principal> Default for RootResource<PR, P> {
16    fn default() -> Self {
17        Self(PhantomData, PhantomData)
18    }
19}
20
21impl<PR: Resource + NamedRoute, P: Principal> CommonPropertiesExtension for RootResource<PR, P> {
22    type PrincipalResource = PR;
23}
24
25impl<PR: Resource + NamedRoute, P: Principal> Resource for RootResource<PR, P> {
26    type Prop = CommonPropertiesProp;
27    type Error = PR::Error;
28    type Principal = P;
29
30    fn get_resourcetype(&self) -> Resourcetype {
31        Resourcetype(&[ResourcetypeInner(
32            Some(crate::namespace::NS_DAV),
33            "collection",
34        )])
35    }
36
37    fn get_prop(
38        &self,
39        rmap: &ResourceMap,
40        user: &P,
41        prop: &CommonPropertiesPropName,
42    ) -> Result<Self::Prop, Self::Error> {
43        CommonPropertiesExtension::get_prop(self, rmap, user, prop)
44    }
45
46    fn get_user_privileges(&self, _user: &P) -> Result<UserPrivilegeSet, Self::Error> {
47        Ok(UserPrivilegeSet::all())
48    }
49}
50
51#[derive(Clone)]
52pub struct RootResourceService<PR: Resource, P: Principal>(PhantomData<PR>, PhantomData<P>);
53
54impl<PR: Resource, P: Principal> Default for RootResourceService<PR, P> {
55    fn default() -> Self {
56        Self(PhantomData, PhantomData)
57    }
58}
59
60#[async_trait(?Send)]
61impl<PR: Resource<Principal = P> + NamedRoute, P: Principal> ResourceService
62    for RootResourceService<PR, P>
63{
64    type PathComponents = ();
65    type MemberType = PR;
66    type Resource = RootResource<PR, P>;
67    type Error = PR::Error;
68    type Principal = P;
69
70    async fn get_resource(&self, _: &()) -> Result<Self::Resource, Self::Error> {
71        Ok(RootResource::<PR, P>::default())
72    }
73}