identity_credential/credential/
issuer.rs1use serde::Deserialize;
5use serde::Serialize;
6
7use identity_core::common::Object;
8use identity_core::common::Url;
9
10#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
14pub struct IssuerData {
15 pub id: Url,
17 #[serde(flatten)]
19 pub properties: Object,
20}
21
22#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
26#[serde(untagged)]
27pub enum Issuer {
28 Url(Url),
30 Obj(IssuerData),
32}
33
34impl Issuer {
35 pub fn url(&self) -> &Url {
37 match self {
38 Self::Url(url) => url,
39 Self::Obj(obj) => &obj.id,
40 }
41 }
42}
43impl<T> From<T> for Issuer
44where
45 T: Into<Url>,
46{
47 fn from(other: T) -> Self {
48 Self::Url(other.into())
49 }
50}
51
52#[cfg(test)]
53mod tests {
54 use identity_core::convert::FromJson;
55
56 use crate::credential::Issuer;
57
58 const JSON1: &str = include_str!("../../tests/fixtures/issuer-1.json");
59 const JSON2: &str = include_str!("../../tests/fixtures/issuer-2.json");
60
61 #[test]
62 fn test_from_json() {
63 let issuer: Issuer = Issuer::from_json(JSON1).unwrap();
64 assert!(matches!(issuer, Issuer::Url(_)));
65 assert_eq!(issuer.url(), "https://example.edu/issuers/14");
66
67 let issuer: Issuer = Issuer::from_json(JSON2).unwrap();
68 assert!(matches!(issuer, Issuer::Obj(_)));
69 assert_eq!(issuer.url(), "did:example:76e12ec712ebc6f1c221ebfeb1f");
70 }
71}