Work around erased serde
This commit is contained in:
@@ -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<T> = $cont1<T>;
|
||||
match nty_id {
|
||||
u8::SUB => try_serialize::<S, C<u8>>(v, ser),
|
||||
@@ -284,15 +285,16 @@ mod serde_channel_events {
|
||||
String::SUB => try_serialize::<S, C<String>>(v, ser),
|
||||
EnumVariant::SUB => try_serialize::<S, C<EnumVariant>>(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<u8>);
|
||||
|
||||
struct EvBox(Box<dyn BinningggContainerEventsDyn>);
|
||||
|
||||
@@ -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<String>, _>(seq),
|
||||
EnumVariant::SUB => get_2nd_or_err::<$cont1<EnumVariant>, _>(seq),
|
||||
netpod::UnsupEvt::SUB => get_2nd_or_err::<$cont1<netpod::UnsupEvt>, _>(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<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
|
||||
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<dyn BinningggContainerEventsDyn> = 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::<Sitemty<ChannelEvents>>(&imfr).unwrap();
|
||||
}
|
||||
Err(_) => (),
|
||||
type _A<T> = items_0::streamitem::StreamItem<T>;
|
||||
type _B<T> = items_0::streamitem::RangeCompletableItem<T>;
|
||||
{
|
||||
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]
|
||||
|
||||
@@ -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<BytesMut, Error>;
|
||||
}
|
||||
|
||||
pub trait FramableInner: erased_serde::Serialize + FrameTypeInnerDyn + Send {
|
||||
fn _dummy(&self);
|
||||
}
|
||||
|
||||
impl<T: erased_serde::Serialize + FrameTypeInnerDyn + Send> FramableInner for T {
|
||||
fn _dummy(&self) {}
|
||||
}
|
||||
|
||||
impl<T> Framable for Sitemty<T>
|
||||
where
|
||||
T: Sized + serde::Serialize + FrameType + fmt::Debug,
|
||||
|
||||
16
src/frame.rs
16
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::<T>();
|
||||
// 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<T>(item: T, fty: u32) -> Result<BytesMut, Error>
|
||||
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()));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user