rdf_types/term/
maybe_iri.rs1use crate::{Id, Term};
2
3pub trait MaybeIri {
5 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
17pub trait TryAsIri: MaybeIri {
20 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
40pub 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
57pub trait FromIri: MaybeIri {
59 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}