use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum FromType {
#[serde(rename = "from")]
From(Vec<String>),
#[serde(rename = "fromRole")]
FromRole(Vec<String>),
#[serde(rename = "fromAgent")]
FromAgent(Vec<String>),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct RequireAuthorization {
#[serde(skip_serializing_if = "Option::is_none")]
pub from: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub from_role: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub from_agent: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub purpose: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
pub struct RequirePresentation {
#[serde(rename = "@context", skip_serializing_if = "Option::is_none")]
pub context: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub from: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub from_role: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub from_agent: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub about_party: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub about_agent: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub purpose: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub presentation_definition: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub credentials: Option<HashMap<String, Vec<String>>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
pub struct RequireProofOfControl {
#[serde(skip_serializing_if = "Option::is_none")]
pub from: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub from_role: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub from_agent: Option<Vec<String>>,
#[serde(default)]
pub address_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub purpose: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
pub struct RequireRelationshipConfirmation {
#[serde(skip_serializing_if = "Option::is_none")]
pub from_role: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub purpose: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nonce: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "@type")]
pub enum Policy {
RequireAuthorization(RequireAuthorization),
RequirePresentation(RequirePresentation),
RequireProofOfControl(RequireProofOfControl),
RequireRelationshipConfirmation(RequireRelationshipConfirmation),
}
impl Policy {
pub fn validate(&self) -> crate::error::Result<()> {
match self {
Policy::RequireAuthorization(_) => Ok(()),
Policy::RequirePresentation(_) => Ok(()),
Policy::RequireProofOfControl(_) => Ok(()),
Policy::RequireRelationshipConfirmation(_) => Ok(()),
}
}
}
impl Default for RequireAuthorization {
fn default() -> Self {
RequireAuthorization {
from: None,
from_role: None,
from_agent: None,
purpose: None,
}
}
}