use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
pub use dpp_domain::Audience;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum CredentialRole {
AuthorisedRepairer,
Recycler,
Remanufacturer,
PreparerForReuse,
Distributor,
MarketSurveillanceAuthority,
CustomsAuthority,
NotifiedBody,
Custom(String),
}
impl CredentialRole {
#[must_use]
pub fn audience(&self) -> Audience {
match self {
Self::MarketSurveillanceAuthority | Self::CustomsAuthority | Self::NotifiedBody => {
Audience::Authority
}
_ => Audience::LegitimateInterest,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct DppCredentialSubject {
pub id: String,
pub name: String,
pub role: CredentialRole,
pub country: String,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub sectors: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub product_categories: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct DppAccessCredential {
#[serde(rename = "@context")]
pub context: Vec<String>,
#[serde(rename = "type")]
pub credential_type: Vec<String>,
pub id: String,
pub issuer: String,
pub valid_from: DateTime<Utc>,
pub valid_until: DateTime<Utc>,
pub credential_subject: DppCredentialSubject,
#[serde(skip_serializing_if = "Option::is_none")]
pub credential_status: Option<CredentialStatus>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct CredentialStatus {
pub id: String,
#[serde(rename = "type")]
pub status_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub status_list_index: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status_list_credential: Option<String>,
}