use crate::Str;
use anyhow::Result;
use bytes::Bytes;
use derive::FromValue;
use netidx_derive::Pack;
use serde_derive::{Deserialize, Serialize};
pub mod cficode;
pub mod cpty;
pub mod market;
pub mod product;
pub mod query;
pub mod route;
pub mod venue;
pub use cpty::CptyId;
pub use market::{Market, MarketId, MarketInfo, MarketKind};
pub use product::{Product, ProductId, ProductKind};
pub use route::{Route, RouteId};
pub use venue::{Venue, VenueId};
pub trait Symbolic: Clone + 'static {
    type Id: Copy + Ord + Eq + From<Str>;
    fn id(&self) -> Self::Id;
    fn name(&self) -> Str;
    fn validate(&self) -> Result<()> {
        Ok(())
    }
}
#[derive(Debug, Clone, Serialize, Deserialize, Pack, FromValue)]
pub struct SymbologyUpdate {
    pub sequence_number: u64,
    pub kind: SymbologyUpdateKind,
}
#[derive(Debug, Clone, Serialize, Deserialize, Pack, FromValue)]
pub enum SymbologyUpdateKind {
    AddRoute(Route),
    RemoveRoute(RouteId),
    AddVenue(Venue),
    RemoveVenue(VenueId),
    AddProduct(Product),
    RemoveProduct(ProductId),
    AddMarket(Market),
    RemoveMarket(MarketId),
    Snapshot {
        original_length: usize,
        compressed: Bytes,
    },
    SnapshotUnchanged(Bytes),
    #[pack(other)]
    Unknown,
}