use serde::{Deserialize, Serialize};
use crate::keys::KeyType;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DidSecretsBundle {
pub did: String,
pub secrets: Vec<SecretEntry>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SecretEntry {
pub key_id: String,
pub key_type: KeyType,
pub private_key_multibase: String,
}
#[cfg(feature = "client")]
impl From<crate::client::GetKeySecretResponse> for SecretEntry {
fn from(resp: crate::client::GetKeySecretResponse) -> Self {
Self {
key_id: resp.key_id,
key_type: resp.key_type,
private_key_multibase: resp.private_key_multibase,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_serde_json_roundtrip() {
let bundle = DidSecretsBundle {
did: "did:webvh:abc123:example.com".to_string(),
secrets: vec![
SecretEntry {
key_id: "did:webvh:abc123:example.com#key-0".to_string(),
key_type: KeyType::Ed25519,
private_key_multibase: "z6Mk...signing".to_string(),
},
SecretEntry {
key_id: "did:webvh:abc123:example.com#key-1".to_string(),
key_type: KeyType::X25519,
private_key_multibase: "z6Mk...ka".to_string(),
},
],
};
let json = serde_json::to_string(&bundle).unwrap();
let decoded: DidSecretsBundle = serde_json::from_str(&json).unwrap();
assert_eq!(decoded.did, bundle.did);
assert_eq!(decoded.secrets.len(), 2);
assert_eq!(decoded.secrets[0].key_id, bundle.secrets[0].key_id);
assert_eq!(decoded.secrets[0].key_type, KeyType::Ed25519);
assert_eq!(
decoded.secrets[0].private_key_multibase,
bundle.secrets[0].private_key_multibase
);
assert_eq!(decoded.secrets[1].key_type, KeyType::X25519);
}
#[test]
fn test_serde_json_empty_secrets() {
let bundle = DidSecretsBundle {
did: "did:example:123".to_string(),
secrets: vec![],
};
let json = serde_json::to_string(&bundle).unwrap();
let decoded: DidSecretsBundle = serde_json::from_str(&json).unwrap();
assert_eq!(decoded.did, "did:example:123");
assert!(decoded.secrets.is_empty());
}
}