use std::sync::Arc;
use serde_json::{Value, json};
use super::{LicenceEvent, LicenceEventSink};
use crate::chain::ChainManager;
pub const LICENCE_EVENT_PREFIX: &str = "licence.";
const SOURCE: &str = "licence";
pub struct ChainLicenceSink {
chain: Arc<ChainManager>,
}
impl ChainLicenceSink {
pub fn new(chain: Arc<ChainManager>) -> Self {
Self { chain }
}
pub fn kind(event: &LicenceEvent) -> String {
format!("{LICENCE_EVENT_PREFIX}{}", event.name())
}
pub fn payload(event: &LicenceEvent) -> Value {
match event {
LicenceEvent::BindingRefused(why) => json!({ "reason": why }),
LicenceEvent::BindingConflict(seq) => json!({ "seq": seq }),
LicenceEvent::BindingOrphaned { stored, local } => {
json!({ "stored_mesh_id": stored, "local_mesh_id": local })
}
LicenceEvent::GrantConflict { cog_id, version, seq } => {
json!({ "cog_id": cog_id, "version": version, "seq": seq })
}
LicenceEvent::FloorReset(to) => json!({ "to": to }),
LicenceEvent::SyncBadSignature { peer } => json!({ "peer": peer }),
}
}
}
impl LicenceEventSink for ChainLicenceSink {
fn emit(&self, event: LicenceEvent) {
self.chain
.append(SOURCE, &Self::kind(&event), Some(Self::payload(&event)));
}
}