ssi_dids_core/did/url/
reference.rs

1use std::borrow::Cow;
2
3use serde::{Deserialize, Serialize};
4
5use crate::DID;
6
7use super::{relative::RelativeDIDURLBuf, DIDURLBuf, RelativeDIDURL, DIDURL};
8
9pub enum DIDURLReference<'a> {
10    Absolute(&'a DIDURL),
11    Relative(&'a RelativeDIDURL),
12}
13
14impl DIDURLReference<'_> {
15    pub fn resolve(&self, base_id: &DID) -> Cow<DIDURL> {
16        match self {
17            Self::Absolute(a) => Cow::Borrowed(a),
18            Self::Relative(r) => Cow::Owned(r.resolve(base_id)),
19        }
20    }
21}
22
23#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
24#[serde(untagged)]
25pub enum DIDURLReferenceBuf {
26    Absolute(DIDURLBuf),
27    Relative(RelativeDIDURLBuf),
28}
29
30impl DIDURLReferenceBuf {
31    pub fn as_did_reference(&self) -> DIDURLReference {
32        match self {
33            Self::Absolute(a) => DIDURLReference::Absolute(a),
34            Self::Relative(r) => DIDURLReference::Relative(r),
35        }
36    }
37
38    pub fn resolve(&self, base_id: &DID) -> Cow<DIDURL> {
39        match self {
40            Self::Absolute(a) => Cow::Borrowed(a.as_did_url()),
41            Self::Relative(r) => Cow::Owned(r.resolve(base_id)),
42        }
43    }
44}
45
46impl From<DIDURLBuf> for DIDURLReferenceBuf {
47    fn from(value: DIDURLBuf) -> Self {
48        Self::Absolute(value)
49    }
50}
51
52impl From<RelativeDIDURLBuf> for DIDURLReferenceBuf {
53    fn from(value: RelativeDIDURLBuf) -> Self {
54        Self::Relative(value)
55    }
56}