Skip to main content

prefixmap/iri/
deref_iri.rs

1use crate::PrefixMap;
2use crate::error::DerefError;
3use iri_s::IriS;
4
5/// A trait for dereferencing IRIs with an optional base IRI and a [`PrefixMap`]
6pub trait DerefIri {
7    /// Dereferences the IRI using the provided base IRI and [`PrefixMap`]
8    ///
9    /// Returns a new instance with the dereferenced IRI or a [`DerefError`] if dereferencing fails
10    ///
11    /// ## Fields:
12    /// - `base`: An optional base IRI
13    /// - `prefixmap`: An optional [`PrefixMap`]
14    fn deref_iri(self, base: Option<&IriS>, prefixmap: Option<&PrefixMap>) -> Result<Self, DerefError>
15    where
16        Self: Sized;
17}
18
19impl<T: DerefIri> DerefIri for Option<T> {
20    fn deref_iri(self, base: Option<&IriS>, prefixmap: Option<&PrefixMap>) -> Result<Self, DerefError>
21    where
22        Self: Sized,
23    {
24        self.map(|t| t.deref_iri(base, prefixmap)).transpose()
25    }
26}
27
28impl<T: DerefIri> DerefIri for Box<T> {
29    fn deref_iri(self, base: Option<&IriS>, prefixmap: Option<&PrefixMap>) -> Result<Self, DerefError>
30    where
31        Self: Sized,
32    {
33        Ok(Box::new((*self).deref_iri(base, prefixmap)?))
34    }
35}
36
37impl<T: DerefIri> DerefIri for Vec<T> {
38    fn deref_iri(self, base: Option<&IriS>, prefixmap: Option<&PrefixMap>) -> Result<Self, DerefError>
39    where
40        Self: Sized,
41    {
42        self.into_iter().map(|t| t.deref_iri(base, prefixmap)).collect()
43    }
44}