identity_credential/credential/
issuer.rs

1// Copyright 2020-2021 IOTA Stiftung
2// SPDX-License-Identifier: Apache-2.0
3
4use serde::Deserialize;
5use serde::Serialize;
6
7use identity_core::common::Object;
8use identity_core::common::Url;
9
10/// A [`Credential`][crate::credential::Credential] issuer in object form.
11///
12/// [More Info](https://www.w3.org/TR/vc-data-model/#issuer)
13#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
14pub struct IssuerData {
15  /// A Url identifying the credential issuer.
16  pub id: Url,
17  /// Additional properties of the credential issuer.
18  #[serde(flatten)]
19  pub properties: Object,
20}
21
22/// An identifier representing the issuer of a [`Credential`][crate::credential::Credential].
23///
24/// [More Info](https://www.w3.org/TR/vc-data-model/#issuer)
25#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
26#[serde(untagged)]
27pub enum Issuer {
28  /// A credential issuer expressed as a Url.
29  Url(Url),
30  /// A credential issuer expressed as a JSON object.
31  Obj(IssuerData),
32}
33
34impl Issuer {
35  /// Returns a reference to the credential issuer Url.
36  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}