Skip to main content

rdfx/term/
maybe_blank.rs

1use crate::{BlankId, BlankIdBuf, Id, LocalTerm, Term};
2
3/// Types that may represent a blank node identifier.
4pub trait MaybeBlankId {
5    /// Inner blank node identifier type.
6    type BlankId;
7}
8
9impl MaybeBlankId for Id {
10    type BlankId = BlankIdBuf;
11}
12
13impl MaybeBlankId for Term {
14    type BlankId = BlankIdBuf;
15}
16
17impl MaybeBlankId for LocalTerm {
18    type BlankId = BlankIdBuf;
19}
20
21/// Types that may have a blank node identifier representation that can be
22/// borrowed.
23pub trait TryAsBlankId: MaybeBlankId {
24    /// Returns a reference to the blank node identifier value, if any.
25    fn try_as_blank(&self) -> Option<&BlankId>;
26
27    fn is_blank(&self) -> bool {
28        self.try_as_blank().is_some()
29    }
30}
31
32impl TryAsBlankId for Id {
33    fn try_as_blank(&self) -> Option<&BlankId> {
34        self.as_blank_id()
35    }
36}
37
38impl TryAsBlankId for Term {
39    fn try_as_blank(&self) -> Option<&BlankId> {
40        None
41    }
42}
43
44impl TryAsBlankId for LocalTerm {
45    fn try_as_blank(&self) -> Option<&BlankId> {
46        self.as_blank_id()
47    }
48}
49
50/// Types that can be turned into a blank node identifier.
51pub trait TryIntoBlankId: MaybeBlankId + Sized {
52    fn try_into_blank(self) -> Result<BlankIdBuf, Self>;
53}
54
55impl TryIntoBlankId for Id {
56    fn try_into_blank(self) -> Result<BlankIdBuf, Self> {
57        match self {
58            Self::BlankId(b) => Ok(b),
59            other => Err(other),
60        }
61    }
62}
63
64impl TryIntoBlankId for Term {
65    fn try_into_blank(self) -> Result<BlankIdBuf, Self> {
66        Err(self)
67    }
68}
69
70impl TryIntoBlankId for LocalTerm {
71    fn try_into_blank(self) -> Result<BlankIdBuf, Self> {
72        match self {
73            Self::BlankId(b) => Ok(b),
74            other => Err(other),
75        }
76    }
77}
78
79/// Types that can be constructed from a blank node identifier.
80pub trait FromBlankId: MaybeBlankId {
81    /// Builds a value from a blank node identifier.
82    fn from_blank(b: BlankIdBuf) -> Self;
83}
84
85impl FromBlankId for Id {
86    fn from_blank(b: BlankIdBuf) -> Self {
87        Self::BlankId(b)
88    }
89}
90
91impl FromBlankId for LocalTerm {
92    fn from_blank(b: BlankIdBuf) -> Self {
93        Self::BlankId(b)
94    }
95}