use base64::{Engine, engine::general_purpose::URL_SAFE}; use p256::ecdsa::VerifyingKey; use serde::Serialize; use crate::event::{Instant, Sequenced}; #[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)] #[serde(tag = "event", rename_all = "snake_case")] pub enum Event { Changed(Changed), } impl Sequenced for Event { fn instant(&self) -> Instant { match self { Self::Changed(event) => event.instant(), } } } #[derive(Clone, Debug, Eq, PartialEq, serde::Serialize)] pub struct Changed { #[serde(flatten)] pub instant: Instant, #[serde(serialize_with = "as_vapid_key")] pub key: VerifyingKey, } impl From for Event { fn from(event: Changed) -> Self { Self::Changed(event) } } impl Sequenced for Changed { fn instant(&self) -> Instant { self.instant } } fn as_vapid_key(key: &VerifyingKey, serializer: S) -> Result where S: serde::Serializer, { let key = key.to_sec1_bytes(); let key = URL_SAFE.encode(key); key.serialize(serializer) }