use monostate::MustBe;
use ppppp_crypto::{Nonce, Signature, VerifyingKey};
use serde::{Deserialize, Serialize};
use std::fmt::Display;
use crate::MsgId;
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(untagged)]
pub enum AccountId {
Tangle(MsgId),
#[serde(rename = "self")]
SelfIdentity,
#[serde(rename = "any")]
Any,
}
impl Display for AccountId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
AccountId::Tangle(msg_id) => write!(f, "AccountId::Tangle({}", msg_id),
AccountId::SelfIdentity => write!(f, "AccountId::SelfIdentity"),
AccountId::Any => write!(f, "AccountId::Any"),
}
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(tag = "action", rename = "kebab-case")]
pub enum AccountMsgData {
Add {
key: AccountKey,
nonce: Option<Nonce>,
consent: Option<AccountConsent>,
#[serde(rename = "accountPowers", default)]
account_powers: Vec<AccountPower>,
},
Del {
key: AccountKey,
},
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct AccountConsent(Signature);
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename = "kebab-case")]
pub enum AccountPower {
Add,
Del,
InternalEncryption,
ExternalEncryption,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(tag = "purpose", rename = "kebab-case")]
pub enum AccountKey {
ShsAndExternalSignature {
algorithm: MustBe!("ed25519"),
bytes: VerifyingKey,
},
ExternalEncryption {
algorithm: MustBe!("x25519-xsalsa20-poly1305"),
},
InternalSignature {
algorithm: MustBe!("ed25519"),
bytes: VerifyingKey,
},
}