coil-auth 0.1.1

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

use super::index::GraphNode;

pub(super) fn graph_node_from_subject(subject: &Subject) -> GraphNode {
    match subject {
        Subject::Entity(object) => GraphNode {
            object: object.clone(),
            relation: None,
        },
        Subject::Userset { object, relation } => GraphNode {
            object: object.clone(),
            relation: Some(relation.clone()),
        },
    }
}

pub(super) fn graph_node_from_subject_with_relation(
    subject: &Subject,
    relation: Relation,
) -> GraphNode {
    let object = match subject {
        Subject::Entity(object) | Subject::Userset { object, .. } => object.clone(),
    };

    GraphNode {
        object,
        relation: Some(relation.to_string()),
    }
}

pub(super) fn typed_node(node: &GraphNode) -> Result<ExplainedNode, CoilAuthError> {
    let object = Entity::from_object(&node.object).ok_or_else(|| {
        CoilAuthError::UnsupportedExplainNamespace {
            namespace: node.object.namespace.clone(),
        }
    })?;
    let relation = match &node.relation {
        Some(relation) => Some(parse_relation(relation)?),
        None => None,
    };

    Ok(ExplainedNode { object, relation })
}

pub(super) fn typed_tuple(tuple: &Tuple) -> Result<DefaultTuple, CoilAuthError> {
    DefaultTuple::from_tuple(tuple).ok_or_else(|| {
        if Entity::from_object(&tuple.object).is_none() {
            CoilAuthError::UnsupportedExplainNamespace {
                namespace: tuple.object.namespace.clone(),
            }
        } else {
            CoilAuthError::UnsupportedExplainRelation {
                relation: tuple.relation.clone(),
            }
        }
    })
}

pub(super) fn parse_relation(relation: &str) -> Result<Relation, CoilAuthError> {
    Relation::from_str(relation).ok_or_else(|| CoilAuthError::UnsupportedExplainRelation {
        relation: relation.to_string(),
    })
}