rdfx 0.23.1

RDF 1.2 data-structures, traits and utilities: terms (incl. triple terms), triples, quads, interpretations, graphs, datasets, unstar/restar reification helpers.
Documentation
use crate::vocabulary::EmbedIntoVocabulary;

/// Resource or variable.
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ResourceOrVar<T, X> {
    Resource(T),
    Var(X),
}

impl<T: crate::__seal::Sealed, X> crate::__seal::Sealed for ResourceOrVar<T, X> {}
impl<T: crate::IsSubject, X> crate::IsSubject for ResourceOrVar<T, X> {}
impl<T: crate::IsPredicate, X> crate::IsPredicate for ResourceOrVar<T, X> {}
impl<T: crate::IsObject, X> crate::IsObject for ResourceOrVar<T, X> {}
impl<T: crate::IsGraph, X> crate::IsGraph for ResourceOrVar<T, X> {}

impl<T, X> ResourceOrVar<T, X> {
    pub fn map<U>(self, f: impl Fn(T) -> U) -> ResourceOrVar<U, X> {
        match self {
            Self::Resource(t) => ResourceOrVar::Resource(f(t)),
            Self::Var(x) => ResourceOrVar::Var(x),
        }
    }

    pub const fn as_ref(&self) -> ResourceOrVar<&T, &X> {
        match self {
            Self::Resource(t) => ResourceOrVar::Resource(t),
            Self::Var(x) => ResourceOrVar::Var(x),
        }
    }

    pub fn is_id_or(&self, f: impl FnOnce(&X) -> bool) -> bool {
        match self {
            Self::Resource(_) => true,
            Self::Var(x) => f(x),
        }
    }
}

impl<T, X> From<T> for ResourceOrVar<T, X> {
    fn from(value: T) -> Self {
        Self::Resource(value)
    }
}

impl<V, T: EmbedIntoVocabulary<V>, X> EmbedIntoVocabulary<V> for ResourceOrVar<T, X> {
    type Embedded = ResourceOrVar<T::Embedded, X>;

    fn embed_into_vocabulary(self, vocabulary: &mut V) -> Self::Embedded {
        match self {
            Self::Resource(term) => ResourceOrVar::Resource(term.embed_into_vocabulary(vocabulary)),
            Self::Var(x) => ResourceOrVar::Var(x),
        }
    }
}