rdf_types/term/
maybe_iri.rs

1use crate::{Id, Term};
2
3/// Types that may represent an iri.
4pub trait MaybeIri {
5	/// Inner iri type.
6	type Iri;
7}
8
9impl<I, B> MaybeIri for Id<I, B> {
10	type Iri = I;
11}
12
13impl<I: MaybeIri, L> MaybeIri for Term<I, L> {
14	type Iri = I::Iri;
15}
16
17/// Types that may have an iri representation that can be
18/// borrowed.
19pub trait TryAsIri: MaybeIri {
20	/// Returns a reference to the iri value, if any.
21	fn try_as_iri(&self) -> Option<&Self::Iri>;
22
23	fn is_iri(&self) -> bool {
24		self.try_as_iri().is_some()
25	}
26}
27
28impl<I, B> TryAsIri for Id<I, B> {
29	fn try_as_iri(&self) -> Option<&I> {
30		self.as_iri()
31	}
32}
33
34impl<I: TryAsIri, L> TryAsIri for Term<I, L> {
35	fn try_as_iri(&self) -> Option<&Self::Iri> {
36		self.as_iri()
37	}
38}
39
40/// Types that can be turned into an iri.
41pub trait TryIntoIri: MaybeIri + Sized {
42	fn try_into_iri(self) -> Result<Self::Iri, Self>;
43}
44
45impl<I, B> TryIntoIri for Id<I, B> {
46	fn try_into_iri(self) -> Result<I, Self> {
47		self.try_into_iri().map_err(Self::Blank)
48	}
49}
50
51impl<I: TryIntoIri, L> TryIntoIri for Term<I, L> {
52	fn try_into_iri(self) -> Result<Self::Iri, Self> {
53		self.try_into_iri()
54	}
55}
56
57/// Types that can be constructed from an iri.
58pub trait FromIri: MaybeIri {
59	/// Builds a value from an iri.
60	fn from_iri(b: Self::Iri) -> Self;
61}
62
63impl<I, B> FromIri for Id<I, B> {
64	fn from_iri(b: I) -> Self {
65		Self::Iri(b)
66	}
67}
68
69impl<I: FromIri, L> FromIri for Term<I, L> {
70	fn from_iri(b: Self::Iri) -> Self {
71		Self::Id(I::from_iri(b))
72	}
73}