rdf_types/term/
maybe_blank.rs

1use crate::{Id, 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<I, B> MaybeBlankId for Id<I, B> {
10	type BlankId = B;
11}
12
13impl<I: MaybeBlankId, L> MaybeBlankId for Term<I, L> {
14	type BlankId = I::BlankId;
15}
16
17/// Types that may have a blank node identifier representation that can be
18/// borrowed.
19pub trait TryAsBlankId: MaybeBlankId {
20	/// Returns a reference to the blank node identifier value, if any.
21	fn try_as_blank(&self) -> Option<&Self::BlankId>;
22
23	fn is_blank(&self) -> bool {
24		self.try_as_blank().is_some()
25	}
26}
27
28impl<I, B> TryAsBlankId for Id<I, B> {
29	fn try_as_blank(&self) -> Option<&Self::BlankId> {
30		self.as_blank()
31	}
32}
33
34impl<I: TryAsBlankId, L> TryAsBlankId for Term<I, L> {
35	fn try_as_blank(&self) -> Option<&Self::BlankId> {
36		self.as_blank()
37	}
38}
39
40/// Types that can be turned into a blank node identifier.
41pub trait TryIntoBlankId: MaybeBlankId + Sized {
42	fn try_into_blank(self) -> Result<Self::BlankId, Self>;
43}
44
45impl<I, B> TryIntoBlankId for Id<I, B> {
46	fn try_into_blank(self) -> Result<Self::BlankId, Self> {
47		self.try_into_blank().map_err(Self::Iri)
48	}
49}
50
51impl<I: TryIntoBlankId, L> TryIntoBlankId for Term<I, L> {
52	fn try_into_blank(self) -> Result<Self::BlankId, Self> {
53		self.try_into_blank()
54	}
55}
56
57/// Types that can be constructed from a blank node identifier.
58pub trait FromBlankId: MaybeBlankId {
59	/// Builds a value from a blank node identifier.
60	fn from_blank(b: Self::BlankId) -> Self;
61}
62
63impl<I, B> FromBlankId for Id<I, B> {
64	fn from_blank(b: Self::BlankId) -> Self {
65		Self::Blank(b)
66	}
67}
68
69impl<I: FromBlankId, L> FromBlankId for Term<I, L> {
70	fn from_blank(b: Self::BlankId) -> Self {
71		Self::Id(I::from_blank(b))
72	}
73}