Skip to main content

oxirs_core/model/
node.rs

1//! Common node types used across RDF/XML and JSON-LD
2//!
3//! This module provides node types that are shared between different
4//! RDF serialization formats.
5
6use crate::model::{BlankNode, NamedNode};
7
8/// A node that can be either a named node (IRI) or a blank node
9#[derive(Clone, Debug, PartialEq, Eq)]
10pub enum NamedOrBlankNode {
11    NamedNode(NamedNode),
12    BlankNode(BlankNode),
13}
14
15impl From<NamedNode> for NamedOrBlankNode {
16    fn from(node: NamedNode) -> Self {
17        NamedOrBlankNode::NamedNode(node)
18    }
19}
20
21impl From<BlankNode> for NamedOrBlankNode {
22    fn from(node: BlankNode) -> Self {
23        NamedOrBlankNode::BlankNode(node)
24    }
25}
26
27impl From<NamedOrBlankNode> for crate::model::term::Subject {
28    fn from(node: NamedOrBlankNode) -> Self {
29        match node {
30            NamedOrBlankNode::NamedNode(n) => crate::model::term::Subject::NamedNode(n),
31            NamedOrBlankNode::BlankNode(n) => crate::model::term::Subject::BlankNode(n),
32        }
33    }
34}
35
36impl NamedOrBlankNode {
37    pub fn as_ref(&self) -> NamedOrBlankNodeRef<'_> {
38        match self {
39            NamedOrBlankNode::NamedNode(n) => NamedOrBlankNodeRef::NamedNode(n),
40            NamedOrBlankNode::BlankNode(n) => NamedOrBlankNodeRef::BlankNode(n),
41        }
42    }
43}
44
45/// Reference variant of NamedOrBlankNode
46#[derive(Clone, Copy, Debug, PartialEq, Eq)]
47pub enum NamedOrBlankNodeRef<'a> {
48    NamedNode(&'a NamedNode),
49    BlankNode(&'a BlankNode),
50}
51
52impl<'a> From<&'a NamedOrBlankNode> for NamedOrBlankNodeRef<'a> {
53    fn from(node: &'a NamedOrBlankNode) -> Self {
54        node.as_ref()
55    }
56}
57
58impl From<NamedOrBlankNode> for crate::model::term::Object {
59    fn from(node: NamedOrBlankNode) -> Self {
60        match node {
61            NamedOrBlankNode::NamedNode(n) => crate::model::term::Object::NamedNode(n),
62            NamedOrBlankNode::BlankNode(n) => crate::model::term::Object::BlankNode(n),
63        }
64    }
65}