use onemessagebus::{Registry, SchemaId};
use serde_json::Value;
use crate::event::{Envelope, EventFilter, Labels};
pub const EVENT_ENVELOPE_FAMILY: &str = "agent.event-envelope";
pub const REPLY_ENVELOPE_FAMILY: &str = "agent.reply-envelope";
pub const EVENT_ENVELOPE_READS: &[u32] = &[2, 1];
pub const REPLY_ENVELOPE_READS: &[u32] = &[3, 2];
pub const ARTIFACT_REF: SchemaId = SchemaId::literal("agent", "artifact-ref", 1);
pub const EVENT_FILTER: SchemaId = SchemaId::literal("agent", "event-filter", 1);
const REPLY_ENVELOPE_V2: &str = include_str!("../schemas/reply-envelope-v2.schema.json");
const REPLY_ENVELOPE_V3: &str = include_str!("../schemas/reply-envelope-v3.schema.json");
#[must_use]
pub fn event_envelope_schema(version: u32) -> Value {
let mut schema = schemars::schema_for!(Envelope).to_value();
if let Some(v) = schema.pointer_mut("/properties/v") {
if let Some(object) = v.as_object_mut() {
object.insert("const".to_owned(), Value::from(version));
}
}
schema
}
#[must_use]
pub fn registry() -> Registry {
let mut registry = Registry::new();
for version in EVENT_ENVELOPE_READS {
registry
.register_schema(
SchemaId::literal("agent", "event-envelope", *version),
event_envelope_schema(*version),
)
.expect("the event envelope schema registers");
}
for (version, document) in [(2, REPLY_ENVELOPE_V2), (3, REPLY_ENVELOPE_V3)] {
let schema: Value = serde_json::from_str(document).expect("a committed schema is JSON");
registry
.register_schema(
SchemaId::literal("agent", "reply-envelope", version),
schema,
)
.expect("the reply envelope schema registers");
}
registry
.register_schema(
ARTIFACT_REF,
schemars::schema_for!(crate::ArtifactRef).to_value(),
)
.expect("the artifact reference schema registers");
registry
.register_schema(EVENT_FILTER, schemars::schema_for!(EventFilter).to_value())
.expect("the filter schema registers");
registry
.register::<Labels>()
.expect("the labels schema registers");
registry
.register::<crate::note::Note>()
.expect("the note schema registers");
registry
.register::<crate::channel::Surface>()
.expect("the planner surface schema registers");
registry
.register::<crate::channel::QueuedReply>()
.expect("the queued reply schema registers");
registry
.register::<crate::channel::QueuedCommands>()
.expect("the queued commands schema registers");
registry
.register::<crate::channel::CommandOutcome>()
.expect("the command outcome schema registers");
onemessagebus::transport::register_protocol(&mut registry)
.expect("the transport plugin protocol's schemas register");
registry
}