1use std::fmt;
2
3pub trait Policy {
5 type Request;
7
8 type Denial: fmt::Debug + fmt::Display + Send + Sync + 'static;
10
11 fn evaluate(&self, request: &Self::Request) -> Result<(), Self::Denial>;
13}
14
15impl<T> Policy for &'_ T
16where
17 T: Policy,
18{
19 type Request = T::Request;
20 type Denial = T::Denial;
21
22 fn evaluate(&self, request: &Self::Request) -> Result<(), Self::Denial> {
23 T::evaluate(self, request)
24 }
25}
26
27impl<T> Policy for Box<T>
28where
29 T: Policy,
30{
31 type Request = T::Request;
32 type Denial = T::Denial;
33
34 fn evaluate(&self, request: &Self::Request) -> Result<(), Self::Denial> {
35 T::evaluate(self, request)
36 }
37}
38
39impl<T> Policy for std::rc::Rc<T>
40where
41 T: Policy,
42{
43 type Request = T::Request;
44 type Denial = T::Denial;
45
46 fn evaluate(&self, request: &Self::Request) -> Result<(), Self::Denial> {
47 T::evaluate(self, request)
48 }
49}
50
51impl<T> Policy for std::sync::Arc<T>
52where
53 T: Policy,
54{
55 type Request = T::Request;
56 type Denial = T::Denial;
57
58 fn evaluate(&self, request: &Self::Request) -> Result<(), Self::Denial> {
59 T::evaluate(self, request)
60 }
61}