use std::sync::mpsc::SyncSender;
use serde_json::Value;
use crate::causal::CausalContext;
use crate::channel::schema::{SchemaId, SchemaValidationError};
use crate::channel::subscription::{SubscriberRegistration, SubscriptionPredicate};
use crate::envelope::{Envelope, PublisherId};
use crate::error::LiminalError;
pub struct ChannelCommand {
pub id: u64,
pub kind: ChannelCommandKind,
}
pub type SubscriberSummary = Vec<u64>;
pub enum ChannelCommandKind {
Boot {
reply: SyncSender<Result<(), LiminalError>>,
},
Publish {
payload: Vec<u8>,
publisher_id: PublisherId,
causal_context: Option<CausalContext>,
reply: SyncSender<Result<PublishOutcome, LiminalError>>,
},
Subscribe {
registration: SubscriberRegistration,
reply: SyncSender<Result<(), LiminalError>>,
},
Unsubscribe {
pid: u64,
reply: SyncSender<Result<(), LiminalError>>,
},
Evolve {
name: String,
field_schema: Value,
default: Value,
reply: SyncSender<Result<SchemaId, SchemaValidationError>>,
},
SchemaId {
reply: SyncSender<Result<SchemaId, LiminalError>>,
},
ListSubscribers {
reply: SyncSender<Result<SubscriberSummary, LiminalError>>,
},
Close {
reply: SyncSender<Result<(), LiminalError>>,
},
}
#[derive(Clone, Debug)]
pub struct PublishOutcome {
pub envelope: Envelope,
pub delivered_count: usize,
}
#[must_use]
pub fn predicate_from<F>(predicate: F) -> SubscriptionPredicate
where
F: Fn(&crate::envelope::Envelope) -> bool + Send + Sync + 'static,
{
std::sync::Arc::new(predicate)
}