coil-auth 0.1.0

Authorisation models and auth package support for the Coil framework.
Documentation
use super::*;

#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub(super) struct GraphNode {
    pub(super) object: Object,
    pub(super) relation: Option<String>,
}

#[derive(Debug, Clone)]
pub(super) struct ExplainIndex {
    tuples_by_node: HashMap<GraphNode, Vec<Tuple>>,
}

impl ExplainIndex {
    pub(super) fn new(tuples: &[Tuple]) -> Self {
        let mut tuples_by_node = HashMap::new();

        for tuple in tuples {
            let node = GraphNode {
                object: tuple.object.clone(),
                relation: Some(tuple.relation.clone()),
            };
            tuples_by_node
                .entry(node)
                .or_insert_with(Vec::new)
                .push(tuple.clone());
        }

        Self { tuples_by_node }
    }

    pub(super) fn tuples_for(&self, node: &GraphNode) -> &[Tuple] {
        self.tuples_by_node
            .get(node)
            .map(Vec::as_slice)
            .unwrap_or(&[])
    }
}

pub(super) enum Evaluation {
    Allowed(Vec<ExplainStep>),
    Denied(DeniedExplanation),
}