aliri_traits/
policy.rs

1use std::fmt;
2
3/// A policy against which a request will be evaluated
4pub trait Policy {
5    /// The request type evaluated by this policy
6    type Request;
7
8    /// The error returned when this policy denies a request
9    type Denial: fmt::Debug + fmt::Display + Send + Sync + 'static;
10
11    /// Evaluates the request, producing an effect
12    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}