jsonld-core 0.23.1

JSON-LD core types and traits
Documentation
use ld_core::{
    BorrowedRdfTerm,
    CowRdfTerm,
    LinkedData,
    LinkedDataGraph,
    LinkedDataPredicateObjects,
    LinkedDataResource,
    LinkedDataSubject,
    ResourceInterpretation,
};
use rdfx::Interpretation;

use crate::{
    IndexedObject,
    object::List,
    rdf::{RDF_FIRST, RDF_NIL, RDF_REST},
};

impl<T, B, I: Interpretation> LinkedDataResource<I> for List<T, B> {
    fn interpretation(&self, _interpretation: &mut I) -> ResourceInterpretation<'_, I> {
        ResourceInterpretation::Uninterpreted(None)
    }
}

impl<T, B, I: Interpretation> LinkedDataSubject<I> for List<T, B>
where
    T: LinkedDataResource<I> + LinkedDataSubject<I>,
    B: LinkedDataResource<I> + LinkedDataSubject<I>,
{
    fn visit_subject<S>(&self, visitor: S) -> Result<S::Ok, S::Error>
    where
        S: ld_core::SubjectVisitor<I>,
    {
        Rest(self.as_slice()).visit_subject(visitor)
    }
}

impl<T, B, I: Interpretation> LinkedDataPredicateObjects<I> for List<T, B>
where
    T: LinkedDataResource<I> + LinkedDataSubject<I>,
    B: LinkedDataResource<I> + LinkedDataSubject<I>,
{
    fn visit_objects<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
    where
        S: ld_core::PredicateObjectsVisitor<I>,
    {
        visitor.object(self)?;
        visitor.end()
    }
}

impl<T, B, I: Interpretation> LinkedDataGraph<I> for List<T, B>
where
    T: LinkedDataResource<I> + LinkedDataSubject<I>,
    B: LinkedDataResource<I> + LinkedDataSubject<I>,
{
    fn visit_graph<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
    where
        S: ld_core::GraphVisitor<I>,
    {
        visitor.subject(self)?;
        visitor.end()
    }
}

impl<T, B, I: Interpretation> LinkedData<I> for List<T, B>
where
    T: LinkedDataResource<I> + LinkedDataSubject<I>,
    B: LinkedDataResource<I> + LinkedDataSubject<I>,
{
    fn visit<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
    where
        S: ld_core::Visitor<I>,
    {
        visitor.default_graph(self)?;
        visitor.end()
    }
}

struct Rest<'a, T, B>(&'a [IndexedObject<T, B>]);

impl<T, B, I: Interpretation> LinkedDataResource<I> for Rest<'_, T, B> {
    fn interpretation(&self, _interpretation: &mut I) -> ResourceInterpretation<'_, I> {
        if self.0.is_empty() {
            // The empty list is the well-known `rdf:nil` resource, not a
            // fresh anonymous node.
            ResourceInterpretation::Uninterpreted(Some(CowRdfTerm::Borrowed(BorrowedRdfTerm::Iri(RDF_NIL))))
        } else {
            ResourceInterpretation::Uninterpreted(None)
        }
    }
}

impl<T, B, I: Interpretation> LinkedDataSubject<I> for Rest<'_, T, B>
where
    T: LinkedDataResource<I> + LinkedDataSubject<I>,
    B: LinkedDataResource<I> + LinkedDataSubject<I>,
{
    fn visit_subject<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
    where
        S: ld_core::SubjectVisitor<I>,
    {
        if let Some((first, rest)) = self.0.split_first() {
            visitor.predicate(&RDF_FIRST, first.inner())?;
            visitor.predicate(&RDF_REST, &Rest(rest))?;
        }

        visitor.end()
    }
}

impl<T, B, I: Interpretation> LinkedDataPredicateObjects<I> for Rest<'_, T, B>
where
    T: LinkedDataResource<I> + LinkedDataSubject<I>,
    B: LinkedDataResource<I> + LinkedDataSubject<I>,
{
    fn visit_objects<S>(&self, mut visitor: S) -> Result<S::Ok, S::Error>
    where
        S: ld_core::PredicateObjectsVisitor<I>,
    {
        visitor.object(self)?;
        visitor.end()
    }
}