graph-api-derive 0.1.4

Derive macros for the graph-api ecosystem - provides type-safe vertex and edge extensions
Documentation
---
source: graph-api-derive/src/render.rs
expression: formatted
---
#[derive(PartialEq, Eq, Clone, Copy, Hash, Debug)]
pub enum EdgeLabel {
    Knows,
    Created,
    Language,
}
impl graph_api_lib::Label for EdgeLabel {
    type Index = EdgeIndex;
    fn variants() -> &'static [EdgeLabel] {
        static VARIANTS: [EdgeLabel; 3usize] = [
            EdgeLabel::Knows,
            EdgeLabel::Created,
            EdgeLabel::Language,
        ];
        &VARIANTS
    }
    fn indexes(&self) -> &'static [EdgeIndex] {
        match self {
            EdgeLabel::Knows => {
                static INDEXES: [EdgeIndex; 0usize] = [];
                &INDEXES
            }
            EdgeLabel::Created => {
                static INDEXES: [EdgeIndex; 0usize] = [];
                &INDEXES
            }
            EdgeLabel::Language => {
                static INDEXES: [EdgeIndex; 0usize] = [];
                &INDEXES
            }
        }
    }
    fn ordinal(&self) -> usize {
        *self as usize
    }
    fn name(&self) -> &'static str {
        match self {
            EdgeLabel::Knows => stringify!(Knows),
            EdgeLabel::Created => stringify!(Created),
            EdgeLabel::Language => stringify!(Language),
        }
    }
}
#[derive(PartialEq, Eq, Clone, Copy, Hash, Debug)]
pub enum EdgeIndex {}
impl graph_api_lib::Index for EdgeIndex {
    fn ty(&self) -> core::any::TypeId {
        unreachable!("this index enum has no variants")
    }
    fn ordinal(&self) -> usize {
        unreachable!("this index enum has no variants")
    }
    fn index_type(&self) -> graph_api_lib::IndexType {
        unreachable!("this index enum has no variants")
    }
}
impl graph_api_lib::Element for Edge {
    type Label = EdgeLabel;
    fn label(&self) -> Self::Label {
        match self {
            Edge::Knows { .. } => EdgeLabel::Knows,
            Edge::Created => EdgeLabel::Created,
            Edge::Language(_) => EdgeLabel::Language,
        }
    }
}
impl Edge {
    pub fn knows<'search, Graph>() -> graph_api_lib::EdgeSearch<'search, Graph>
    where
        Graph: graph_api_lib::Graph<Edge = Edge> + graph_api_lib::SupportsEdgeLabelIndex,
    {
        graph_api_lib::EdgeSearch::label(EdgeLabel::Knows)
    }
    pub fn created<'search, Graph>() -> graph_api_lib::EdgeSearch<'search, Graph>
    where
        Graph: graph_api_lib::Graph<Edge = Edge> + graph_api_lib::SupportsEdgeLabelIndex,
    {
        graph_api_lib::EdgeSearch::label(EdgeLabel::Created)
    }
    pub fn language<'search, Graph>() -> graph_api_lib::EdgeSearch<'search, Graph>
    where
        Graph: graph_api_lib::Graph<Edge = Edge> + graph_api_lib::SupportsEdgeLabelIndex,
    {
        graph_api_lib::EdgeSearch::label(EdgeLabel::Language)
    }
}
pub use __edge_projection_edge_knows::Knows;
pub use __edge_projection_edge_knows::KnowsMut;
mod __edge_projection_edge_knows {
    use super::*;
    pub struct Knows<'reference, Element> {
        _phantom: std::marker::PhantomData<Element>,
        since: &'reference i32,
    }
    impl<'reference, Element> Knows<'reference, Element> {
        pub fn since<'a>(&self) -> i32 {
            *self.since
        }
    }
    pub struct KnowsMut<'reference, Element, MutationListener> {
        _phantom: std::marker::PhantomData<Element>,
        __listener: MutationListener,
        since: &'reference mut i32,
    }
    impl<
        'reference,
        Element,
        MutationListener,
    > KnowsMut<'reference, Element, MutationListener> {
        pub fn since<'a>(&self) -> i32 {
            *self.since
        }
        pub fn set_since(&mut self, value: i32) {
            *self.since = value;
        }
    }
    impl<'reference> graph_api_lib::Project<'reference, Edge>
    for Knows<'reference, Edge> {
        fn project(weight: &'reference Edge) -> Option<Self> {
            if let Edge::Knows { since } = weight {
                Some(Knows {
                    _phantom: std::default::Default::default(),
                    since,
                })
            } else {
                None
            }
        }
    }
    impl<
        'reference,
        MutationListener,
    > graph_api_lib::ProjectMut<'reference, Edge, MutationListener>
    for KnowsMut<'reference, Edge, MutationListener>
    where
        MutationListener: graph_api_lib::MutationListener<'reference, Edge>,
    {
        fn project_mut(
            weight: &'reference mut Edge,
            mutation_listener: MutationListener,
        ) -> Option<Self> {
            if let Edge::Knows { since } = weight {
                Some(KnowsMut {
                    _phantom: std::default::Default::default(),
                    __listener: mutation_listener,
                    since,
                })
            } else {
                None
            }
        }
    }
}
pub trait EdgeExt<'graph, Mutability, Graph, Walker>
where
    Walker: graph_api_lib::EdgeWalker<'graph, Graph = Graph>,
    Graph: graph_api_lib::Graph<Edge = Edge>,
{
    fn filter_by_knows<F: Fn(Knows<Graph::Edge>, &Walker::Context) -> bool>(
        self,
        filter: F,
    ) -> graph_api_lib::EdgeWalkerBuilder<
        'graph,
        Mutability,
        Graph,
        impl graph_api_lib::EdgeWalker<'graph, Graph = Graph, Context = Walker::Context>,
    >;
    fn filter_knows(
        self,
    ) -> graph_api_lib::EdgeWalkerBuilder<
        'graph,
        Mutability,
        Graph,
        impl graph_api_lib::EdgeWalker<'graph, Graph = Graph, Context = Walker::Context>,
    >;
    fn filter_created(
        self,
    ) -> graph_api_lib::EdgeWalkerBuilder<
        'graph,
        Mutability,
        Graph,
        impl graph_api_lib::EdgeWalker<'graph, Graph = Graph, Context = Walker::Context>,
    >;
    fn filter_by_language<F: Fn(&Language, &Walker::Context) -> bool>(
        self,
        filter: F,
    ) -> graph_api_lib::EdgeWalkerBuilder<
        'graph,
        Mutability,
        Graph,
        impl graph_api_lib::EdgeWalker<'graph, Graph = Graph, Context = Walker::Context>,
    >;
    fn filter_language(
        self,
    ) -> graph_api_lib::EdgeWalkerBuilder<
        'graph,
        Mutability,
        Graph,
        impl graph_api_lib::EdgeWalker<'graph, Graph = Graph, Context = Walker::Context>,
    >;
}
impl<'graph, Mutability, Graph, Walker> EdgeExt<'graph, Mutability, Graph, Walker>
for graph_api_lib::EdgeWalkerBuilder<'graph, Mutability, Graph, Walker>
where
    Walker: graph_api_lib::EdgeWalker<'graph, Graph = Graph>,
    Graph: graph_api_lib::Graph<Edge = Edge>,
{
    fn filter_by_knows<F: Fn(Knows<Graph::Edge>, &Walker::Context) -> bool>(
        self,
        filter: F,
    ) -> graph_api_lib::EdgeWalkerBuilder<
        'graph,
        Mutability,
        Graph,
        impl graph_api_lib::EdgeWalker<'graph, Graph = Graph, Context = Walker::Context>,
    > {
        self.filter(move |f, c| {
            if let Some(projection) = graph_api_lib::EdgeReference::project(f) {
                (filter)(projection, c)
            } else {
                false
            }
        })
    }
    fn filter_knows(
        self,
    ) -> graph_api_lib::EdgeWalkerBuilder<
        'graph,
        Mutability,
        Graph,
        impl graph_api_lib::EdgeWalker<'graph, Graph = Graph, Context = Walker::Context>,
    > {
        self.filter(move |f, _| match graph_api_lib::EdgeReference::weight(f) {
            Edge::Knows { .. } => true,
            _ => false,
        })
    }
    fn filter_created(
        self,
    ) -> graph_api_lib::EdgeWalkerBuilder<
        'graph,
        Mutability,
        Graph,
        impl graph_api_lib::EdgeWalker<'graph, Graph = Graph, Context = Walker::Context>,
    > {
        self.filter(|f, _| match graph_api_lib::EdgeReference::weight(f) {
            Edge::Created { .. } => true,
            _ => false,
        })
    }
    fn filter_by_language<F: Fn(&Language, &Walker::Context) -> bool>(
        self,
        filter: F,
    ) -> graph_api_lib::EdgeWalkerBuilder<
        'graph,
        Mutability,
        Graph,
        impl graph_api_lib::EdgeWalker<'graph, Graph = Graph, Context = Walker::Context>,
    > {
        self.filter(move |f, c| match graph_api_lib::EdgeReference::weight(f) {
            Edge::Language(param0) => (filter)(param0, c),
            _ => false,
        })
    }
    fn filter_language(
        self,
    ) -> graph_api_lib::EdgeWalkerBuilder<
        'graph,
        Mutability,
        Graph,
        impl graph_api_lib::EdgeWalker<'graph, Graph = Graph, Context = Walker::Context>,
    > {
        self.filter(move |f, _| match graph_api_lib::EdgeReference::weight(f) {
            Edge::Language(..) => true,
            _ => false,
        })
    }
}