use serde::{ser::SerializeStruct, Deserialize, Serialize};
use crate::{
attached_signature::AttachedSignaturePrefix,
basicpre::BasicPrefix,
error_ser::Error,
errors::KrError,
event_message::EventMessage,
identifier_state::IdentifierState,
key_event_message::KeyEvent,
seal::{EventSeal, SourceSeal},
self_signing_pre::SelfSigningPrefix,
serializer::to_string,
EventSemantics,
};
#[derive(Clone, Debug, PartialEq)]
pub enum Message {
Event(Box<SignedEventMessage>),
NontransferableRct(SignedNontransferableReceipt),
TransferableRct(Box<SignedTransferableReceipt>),
#[cfg(feature = "query")]
KeyStateNotice(SignedReply),
#[cfg(feature = "query")]
Query(SignedQuery),
}
#[derive(Debug, Clone, Deserialize)]
pub struct SignedEventMessage {
pub event_message: EventMessage<KeyEvent>,
#[serde(skip_serializing)]
pub signatures: Vec<AttachedSignaturePrefix>,
#[serde(skip_serializing)]
pub delegator_seal: Option<SourceSeal>,
}
impl Serialize for SignedEventMessage {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
if serializer.is_human_readable() {
let mut em = serializer.serialize_struct("EventMessage", 2)?;
em.serialize_field("", &self.event_message)?;
em.end()
} else {
let mut em = serializer.serialize_struct("SignedEventMessage", 2)?;
em.serialize_field("event_message", &self.event_message)?;
em.serialize_field("signatures", &self.signatures)?;
em.end()
}
}
}
impl PartialEq for SignedEventMessage {
fn eq(&self, other: &Self) -> bool {
self.event_message == other.event_message && self.signatures == other.signatures
}
}
impl SignedEventMessage {
pub fn new(
message: &EventMessage<KeyEvent>,
sigs: Vec<AttachedSignaturePrefix>,
delegator_seal: Option<SourceSeal>,
) -> Self {
Self {
event_message: message.clone(),
signatures: sigs,
delegator_seal,
}
}
pub fn serialize(&self) -> Result<Vec<u8>, Error> {
Ok(to_string(&self)?.as_bytes().to_vec())
}
}
impl EventSemantics for SignedEventMessage {
fn apply_to(&self, state: IdentifierState) -> Result<IdentifierState, KrError> {
self.event_message.apply_to(state)
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct SignedTransferableReceipt {
pub validator_seal: EventSeal,
pub signatures: Vec<AttachedSignaturePrefix>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct SignedNontransferableReceipt {
pub couplets: Vec<(BasicPrefix, SelfSigningPrefix)>,
}