use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use super::did::DidBuf;
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct DidDocument {
pub id: DidBuf,
#[serde(flatten)]
pub verification_relationships: VerificationRelationships,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub verification_method: Vec<DidVerificationMethod>,
#[serde(flatten)]
pub property_set: BTreeMap<String, serde_json::Value>,
}
impl DidDocument {
pub fn from_json(json: &str) -> Result<Self, serde_json::Error> {
serde_json::from_str(json)
}
}
#[derive(Debug, Default, Serialize, Deserialize, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct VerificationRelationships {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub authentication: Vec<ValueOrReference>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub assertion_method: Vec<ValueOrReference>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub key_agreement: Vec<ValueOrReference>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub capability_invocation: Vec<ValueOrReference>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub capability_delegation: Vec<ValueOrReference>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
#[serde(untagged)]
#[allow(clippy::large_enum_variant)]
pub enum ValueOrReference {
Reference(DidBuf),
Value(DidVerificationMethod),
}
impl From<DidVerificationMethod> for ValueOrReference {
fn from(value: DidVerificationMethod) -> Self {
Self::Value(value)
}
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
pub struct DidVerificationMethod {
pub id: DidBuf,
#[serde(rename = "type")]
pub type_: String,
pub controller: DidBuf,
#[serde(flatten)]
pub properties: BTreeMap<String, serde_json::Value>,
}