use bytes::BytesMut; use err::Error; use netpod::{log::Level, BoolNum, EventDataReadStats, EventQueryJsonStringFrame}; use serde::de::{self, Visitor}; use serde::{Deserialize, Serialize}; use std::fmt; #[derive(Debug, Serialize, Deserialize)] pub enum RangeCompletableItem { RangeComplete, Data(T), } #[derive(Debug, Serialize, Deserialize)] pub enum StatsItem { EventDataReadStats(EventDataReadStats), } #[derive(Debug, Serialize, Deserialize)] pub enum StreamItem { DataItem(T), Log(LogItem), Stats(StatsItem), } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct LogItem { pub node_ix: u32, #[serde(with = "levelserde")] pub level: Level, pub msg: String, } impl LogItem { pub fn quick(level: Level, msg: String) -> Self { Self { level, msg, node_ix: 42, } } } pub type Sitemty = Result>, Error>; struct VisitLevel; impl<'de> Visitor<'de> for VisitLevel { type Value = u32; fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result { write!(fmt, "expect u32 Level code") } fn visit_u32(self, v: u32) -> Result where E: de::Error, { Ok(v) } } mod levelserde { use super::Level; use super::VisitLevel; use serde::{Deserializer, Serializer}; pub fn serialize(t: &Level, s: S) -> Result where S: Serializer, { let g = match *t { Level::ERROR => 1, Level::WARN => 2, Level::INFO => 3, Level::DEBUG => 4, Level::TRACE => 5, }; s.serialize_u32(g) } pub fn deserialize<'de, D>(d: D) -> Result where D: Deserializer<'de>, { match d.deserialize_u32(VisitLevel) { Ok(level) => { let g = if level == 1 { Level::ERROR } else if level == 2 { Level::WARN } else if level == 3 { Level::INFO } else if level == 4 { Level::DEBUG } else if level == 5 { Level::TRACE } else { Level::TRACE }; Ok(g) } Err(e) => Err(e), } } } pub const INMEM_FRAME_ENCID: u32 = 0x12121212; pub const INMEM_FRAME_HEAD: usize = 20; pub const INMEM_FRAME_FOOT: usize = 4; pub const INMEM_FRAME_MAGIC: u32 = 0xc6c3b73d; pub trait SubFrId { const SUB: u32; } impl SubFrId for u8 { const SUB: u32 = 3; } impl SubFrId for u16 { const SUB: u32 = 5; } impl SubFrId for u32 { const SUB: u32 = 8; } impl SubFrId for u64 { const SUB: u32 = 10; } impl SubFrId for i8 { const SUB: u32 = 2; } impl SubFrId for i16 { const SUB: u32 = 4; } impl SubFrId for i32 { const SUB: u32 = 7; } impl SubFrId for i64 { const SUB: u32 = 9; } impl SubFrId for f32 { const SUB: u32 = 11; } impl SubFrId for f64 { const SUB: u32 = 12; } impl SubFrId for BoolNum { const SUB: u32 = 13; } pub trait SitemtyFrameType { const FRAME_TYPE_ID: u32; } pub trait FrameType { const FRAME_TYPE_ID: u32; } impl FrameType for EventQueryJsonStringFrame { const FRAME_TYPE_ID: u32 = 0x100; } impl FrameType for Sitemty where T: SitemtyFrameType, { const FRAME_TYPE_ID: u32 = T::FRAME_TYPE_ID; } pub trait ProvidesFrameType { fn frame_type_id(&self) -> u32; } pub trait Framable: Send { fn typeid(&self) -> u32; fn make_frame(&self) -> Result; } // TODO need als Framable for those types defined in other crates. impl Framable for Sitemty where T: SitemtyFrameType + Send, { fn typeid(&self) -> u32 { todo!() } fn make_frame(&self) -> Result { todo!() } } /* impl Framable for Sitemty { fn typeid(&self) -> u32 { EventQueryJsonStringFrame::FRAME_TYPE_ID } fn make_frame(&self) -> Result { panic!() } } impl Framable for Result>, Error> { fn typeid(&self) -> u32 { Self::FRAME_TYPE_ID } fn make_frame(&self) -> Result { make_frame(self) } } impl Framable for Result>, Error> { fn typeid(&self) -> u32 { Self::FRAME_TYPE_ID } fn make_frame(&self) -> Result { make_frame(self) } } impl Framable for Result>>, err::Error> where NTY: NumOps + Serialize, { fn typeid(&self) -> u32 { Self::FRAME_TYPE_ID } fn make_frame(&self) -> Result { make_frame(self) } } impl Framable for Result>>, err::Error> where NTY: NumOps + Serialize, { fn typeid(&self) -> u32 { Self::FRAME_TYPE_ID } fn make_frame(&self) -> Result { make_frame(self) } } impl Framable for Sitemty> where NTY: NumOps + Serialize, { fn typeid(&self) -> u32 { Self::FRAME_TYPE_ID } fn make_frame(&self) -> Result { make_frame(self) } } impl Framable for Sitemty> where NTY: NumOps + Serialize, { fn typeid(&self) -> u32 { Self::FRAME_TYPE_ID } fn make_frame(&self) -> Result { make_frame(self) } } impl Framable for Sitemty> where NTY: NumOps + Serialize, { fn typeid(&self) -> u32 { Self::FRAME_TYPE_ID } fn make_frame(&self) -> Result { make_frame(self) } } impl Framable for Sitemty> where NTY: NumOps + Serialize, { fn typeid(&self) -> u32 { Self::FRAME_TYPE_ID } fn make_frame(&self) -> Result { make_frame(self) } } impl Framable for Sitemty> where NTY: NumOps + Serialize, { fn typeid(&self) -> u32 { Self::FRAME_TYPE_ID } fn make_frame(&self) -> Result { make_frame(self) } } */