From d6b97b00c040bd21f770f33c0d06bbd67a22b1fa Mon Sep 17 00:00:00 2001 From: Dominik Werder Date: Tue, 10 Dec 2024 08:02:02 +0100 Subject: [PATCH] Work around erased serde --- src/channelevents.rs | 79 ++++++++++++++++++-------------------------- src/framable.rs | 9 ----- src/frame.rs | 16 ++++----- 3 files changed, 40 insertions(+), 64 deletions(-) diff --git a/src/channelevents.rs b/src/channelevents.rs index c3ba38e..d4b586e 100644 --- a/src/channelevents.rs +++ b/src/channelevents.rs @@ -237,6 +237,7 @@ mod serde_channel_events { use serde::Deserializer; use serde::Serialize; use serde::Serializer; + use std::cell::RefCell; use std::fmt; macro_rules! trace_serde { ($($arg:tt)*) => ( if false { trace!($($arg)*); }) } @@ -267,7 +268,7 @@ mod serde_channel_events { ($ser:expr, $cont1:ident, $nty:expr, $val:expr) => {{ let ser = $ser; let nty_id = subfr_scalar_type($nty); - let v = $val; + let v = $val.0; type C = $cont1; match nty_id { u8::SUB => try_serialize::>(v, ser), @@ -284,15 +285,16 @@ mod serde_channel_events { String::SUB => try_serialize::>(v, ser), EnumVariant::SUB => try_serialize::>(v, ser), _ => { + *$val.1.borrow_mut() = 1; let msg = format!("serde ser not supported evt id 0x{:x}", nty_id); - error!("{}", msg); + // error!("{}", msg); Err(serde::ser::Error::custom(msg)) } } }}; } - struct EvRef<'a>(&'a dyn BinningggContainerEventsDyn); + struct EvRef<'a>(&'a dyn BinningggContainerEventsDyn, RefCell); struct EvBox(Box); @@ -305,27 +307,24 @@ mod serde_channel_events { ser.serialize_element(&self.0.serde_id())?; ser.serialize_element(&self.0.nty_id())?; let nty_id = self.0.nty_id() as u16; - let x = if is_container_events(self.0.serde_id()) { + if is_container_events(self.0.serde_id()) { if is_pulsed_subfr(nty_id) { if is_vec_subfr(nty_id) { - ser_inner_nty!(&mut ser, C04, nty_id, self.0) + ser_inner_nty!(&mut ser, C04, nty_id, self) } else { - ser_inner_nty!(&mut ser, C03, nty_id, self.0) + ser_inner_nty!(&mut ser, C03, nty_id, self) } } else { if is_vec_subfr(nty_id) { - ser_inner_nty!(&mut ser, C02, nty_id, self.0) + ser_inner_nty!(&mut ser, C02, nty_id, self) } else { - ser_inner_nty!(&mut ser, C01, nty_id, self.0) + ser_inner_nty!(&mut ser, C01, nty_id, self) } } } else { let msg = format!("not supported obj id {}", self.0.serde_id()); Err(serde::ser::Error::custom(msg)) - }; - // warn!("Serialize for EvRef is_ok {}", x.is_ok()); - let _: () = x?; - // warn!("Serialize for EvRef ending"); + }?; ser.end() } } @@ -376,13 +375,7 @@ mod serde_channel_events { String::SUB => get_2nd_or_err::<$cont1, _>(seq), EnumVariant::SUB => get_2nd_or_err::<$cont1, _>(seq), netpod::UnsupEvt::SUB => get_2nd_or_err::<$cont1, _>(seq), - _ => { - error!("TODO serde::de nty 0x{:x}", nty); - if true { - panic!("TODO serde::de nty 0x{:x}", nty); - } - Err(de::Error::custom(&format!("unknown nty 0x{:x}", nty))) - } + _ => Err(de::Error::custom(&format!("unknown nty 0x{:x}", nty))), } }}; } @@ -438,7 +431,7 @@ mod serde_channel_events { } impl Serialize for ChannelEvents { - fn serialize(&self, serializer: S) -> Result + fn serialize(&self, ser: S) -> Result where S: Serializer, { @@ -446,18 +439,17 @@ mod serde_channel_events { let vars = ChannelEventsVis::allowed_variants(); match self { ChannelEvents::Events(obj) => { - let x = serializer.serialize_newtype_variant( - name, - 0, - vars[0], - &EvRef(obj.as_ref()), - ); - // warn!("Serialize for ChannelEvents is_ok {}", x.is_ok()); - x - } - ChannelEvents::Status(val) => { - serializer.serialize_newtype_variant(name, 1, vars[1], val) + let evref = EvRef(obj.as_ref(), RefCell::new(0)); + let x = ser.serialize_newtype_variant(name, 0, vars[0], &evref); + let j = *evref.1.borrow(); + if j != 0 { + let msg = format!("serialization failed"); + Err(serde::ser::Error::custom(msg)) + } else { + x + } } + ChannelEvents::Status(val) => ser.serialize_newtype_variant(name, 1, vars[1], val), } } } @@ -600,22 +592,17 @@ mod test_channel_events_serde { let mut evs = ContainerEvents::new(); evs.push_back(TsNano::from_ns(8), UnsupEvt(4)); let item = ChannelEvents::from(evs); - // let item: Box = Box::new(evs); - let item = sitem_data(item); - match item.make_frame_dyn() { - Ok(frame) => { - panic!("this should have failed"); - let imfr = if let Ok(crate::inmem::ParseResult::Parsed(_, x)) = - InMemoryFrame::parse(&frame) - { - x - } else { - panic!(); - }; - crate::frame::decode_frame::>(&imfr).unwrap(); - } - Err(_) => (), + type _A = items_0::streamitem::StreamItem; + type _B = items_0::streamitem::RangeCompletableItem; + { + let item = item.clone(); + let item = items_0::streamitem::RangeCompletableItem::Data(item); + let x = crate::frame::encode_to_vec(item); + assert_eq!(x.is_ok(), false); } + let item = sitem_data(item); + assert_eq!(crate::frame::make_frame_2(&item, 0xcafe).is_ok(), false); + assert_eq!(item.make_frame_dyn().is_ok(), false); } #[test] diff --git a/src/framable.rs b/src/framable.rs index 2ac07e9..af24370 100644 --- a/src/framable.rs +++ b/src/framable.rs @@ -6,7 +6,6 @@ use crate::frame::make_stats_frame; use bytes::BytesMut; use core::fmt; use daqbuf_err as err; -use items_0::framable::FrameTypeInnerDyn; use items_0::framable::FrameTypeInnerStatic; use items_0::streamitem::LogItem; use items_0::streamitem::RangeCompletableItem; @@ -77,14 +76,6 @@ pub trait Framable { fn make_frame_dyn(&self) -> Result; } -pub trait FramableInner: erased_serde::Serialize + FrameTypeInnerDyn + Send { - fn _dummy(&self); -} - -impl FramableInner for T { - fn _dummy(&self) {} -} - impl Framable for Sitemty where T: Sized + serde::Serialize + FrameType + fmt::Debug, diff --git a/src/frame.rs b/src/frame.rs index e4d2e8a..c584db5 100644 --- a/src/frame.rs +++ b/src/frame.rs @@ -29,6 +29,7 @@ use std::any; use std::io; const USE_JSON: bool = false; +const USE_MSGPACK: bool = false; const EMIT_JSON_DEBUG: bool = false; const EMIT_POSTCARD_DEBUG: bool = false; @@ -250,7 +251,7 @@ where { if USE_JSON { json_to_vec(item) - } else if false { + } else if USE_MSGPACK { msgpack_to_vec(item) } else if false { bincode_to_vec(item) @@ -265,13 +266,10 @@ where { if USE_JSON { json_erased_to_vec(item) - } else if false { + } else if USE_MSGPACK { msgpack_erased_to_vec(item) } else { - let x = postcard_erased_to_vec(item); - // let s = std::any::type_name::(); - // warn!("encode_erased_to_vec is_ok {} T {}", x.is_ok(), s); - x + postcard_erased_to_vec(item) } } @@ -281,7 +279,7 @@ where { if USE_JSON { json_from_slice(buf) - } else if false { + } else if USE_MSGPACK { msgpack_from_slice(buf) } else if false { bincode_from_slice(buf) @@ -292,9 +290,9 @@ where pub fn make_frame_2(item: T, fty: u32) -> Result where - T: erased_serde::Serialize + fmt::Debug, + T: serde::Serialize + fmt::Debug, { - let enc = encode_erased_to_vec(item)?; + let enc = encode_to_vec(item)?; if enc.len() > u32::MAX as usize { return Err(Error::TooLongPayload(enc.len())); }