rustical_dav/resources/
root.rs1use 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}