From 707524822543dc14097fe7869a62ac2480523e2a Mon Sep 17 00:00:00 2001 From: Dominik Werder Date: Wed, 27 Nov 2024 07:14:26 +0100 Subject: [PATCH] Conversion to api type --- src/binning/container_events.rs | 30 ++- src/channelevents.rs | 324 +++++--------------------------- 2 files changed, 72 insertions(+), 282 deletions(-) diff --git a/src/binning/container_events.rs b/src/binning/container_events.rs index 331b265..1f82dec 100644 --- a/src/binning/container_events.rs +++ b/src/binning/container_events.rs @@ -748,14 +748,40 @@ impl ToUserFacingApiType for ContainerEvents where EVT: EventValueType, { - fn to_user_facing_api_type(self) -> Box { - let tss: VecDeque<_> = self.tss.into_iter().map(|x| x.ms()).collect(); + fn to_user_facing_api_type(self: Self) -> Box { + let this = self; + let tss: VecDeque<_> = this.tss.into_iter().map(|x| x.ms()).collect(); let ret = ContainerEventsApi { tss: tss.clone(), values: tss.clone(), }; Box::new(ret) } + + fn to_user_facing_api_type_box(self: Box) -> Box { + let this = *self; + this.to_user_facing_api_type() + } +} + +impl ToUserFacingApiType for Box> +where + EVT: EventValueType, +{ + fn to_user_facing_api_type(self: Self) -> Box { + let this = *self; + let tss: VecDeque<_> = this.tss.into_iter().map(|x| x.ms()).collect(); + let ret = ContainerEventsApi { + tss: tss.clone(), + values: tss.clone(), + }; + Box::new(ret) + } + + fn to_user_facing_api_type_box(self: Box) -> Box { + let this = *self; + this.to_user_facing_api_type() + } } impl BinningggContainerEventsDyn for ContainerEvents diff --git a/src/channelevents.rs b/src/channelevents.rs index 07c46e9..332cd2d 100644 --- a/src/channelevents.rs +++ b/src/channelevents.rs @@ -1,9 +1,7 @@ use crate::binning::container_events::ContainerEvents; use crate::binning::container_events::EventValueType; use crate::framable::FrameType; -use crate::jsonbytes::JsonBytes; use crate::log::*; -use crate::Events; use core::ops::Range; use daqbuf_err as err; use items_0::apitypes::ToUserFacingApiType; @@ -19,7 +17,6 @@ use items_0::isodate::IsoDateTime; use items_0::merge::DrainIntoDstResult; use items_0::merge::DrainIntoNewDynResult; use items_0::merge::DrainIntoNewResult; -use items_0::merge::MergeableDyn; use items_0::merge::MergeableTy; use items_0::streamitem::ITEMS_2_CHANNEL_EVENTS_FRAME_TYPE_ID; use items_0::timebin::BinningggContainerEventsDyn; @@ -36,7 +33,6 @@ use netpod::TsMs; use netpod::TsNano; use serde::Deserialize; use serde::Serialize; -use serde_json::map::Keys; use std::any; use std::any::Any; use std::collections::VecDeque; @@ -227,11 +223,8 @@ impl AsAnyMut for ChannelEvents { mod serde_channel_events { use super::ChannelEvents; - use super::Events; use crate::binning::container_events::ContainerEvents; use crate::channelevents::ConnStatusEvent; - use crate::eventsdim0::EventsDim0; - use crate::eventsdim1::EventsDim1; use crate::log::*; use items_0::subfr::SubFrId; use items_0::timebin::BinningggContainerEventsDyn; @@ -319,6 +312,17 @@ mod serde_channel_events { } } + fn get_2nd_or_err<'de, T, A>(seq: &mut A) -> Result + where + A: de::SeqAccess<'de>, + T: Deserialize<'de> + BinningggContainerEventsDyn + 'static, + { + let obj: T = seq + .next_element()? + .ok_or_else(|| de::Error::missing_field("[2] obj"))?; + Ok(EvBox(Box::new(obj))) + } + impl<'de> Visitor<'de> for EvBoxVis { type Value = EvBox; @@ -340,163 +344,32 @@ mod serde_channel_events { .ok_or_else(|| de::Error::missing_field("[1] nty"))?; if cty == C1::::serde_id() { match nty { - u8::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - u16::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - u32::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - u64::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - i8::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - i16::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - i32::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - i64::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - f32::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - f64::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - bool::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - String::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - EnumVariant::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - _ => { - error!("TODO serde cty {cty} nty {nty}"); - Err(de::Error::custom(&format!("unknown nty {nty}"))) - } - } - } else if cty == C1::::serde_id() { - match nty { - u8::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - u16::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - u32::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - u64::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - i8::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - i16::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - i32::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - i64::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - f32::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - f64::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - bool::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } - String::SUB => { - let obj: C1 = seq - .next_element()? - .ok_or_else(|| de::Error::missing_field("[2] obj"))?; - Ok(EvBox(Box::new(obj))) - } + u8::SUB => get_2nd_or_err::, _>(&mut seq), + u16::SUB => get_2nd_or_err::, _>(&mut seq), + u32::SUB => get_2nd_or_err::, _>(&mut seq), + u64::SUB => get_2nd_or_err::, _>(&mut seq), + i8::SUB => get_2nd_or_err::, _>(&mut seq), + i16::SUB => get_2nd_or_err::, _>(&mut seq), + i32::SUB => get_2nd_or_err::, _>(&mut seq), + i64::SUB => get_2nd_or_err::, _>(&mut seq), + f32::SUB => get_2nd_or_err::, _>(&mut seq), + f64::SUB => get_2nd_or_err::, _>(&mut seq), + bool::SUB => get_2nd_or_err::, _>(&mut seq), + String::SUB => get_2nd_or_err::, _>(&mut seq), + EnumVariant::SUB => get_2nd_or_err::, _>(&mut seq), + Vec::::SUB => get_2nd_or_err::>, _>(&mut seq), + Vec::::SUB => get_2nd_or_err::>, _>(&mut seq), + Vec::::SUB => get_2nd_or_err::>, _>(&mut seq), + Vec::::SUB => get_2nd_or_err::>, _>(&mut seq), + Vec::::SUB => get_2nd_or_err::>, _>(&mut seq), + Vec::::SUB => get_2nd_or_err::>, _>(&mut seq), + Vec::::SUB => get_2nd_or_err::>, _>(&mut seq), + Vec::::SUB => get_2nd_or_err::>, _>(&mut seq), + Vec::::SUB => get_2nd_or_err::>, _>(&mut seq), + Vec::::SUB => get_2nd_or_err::>, _>(&mut seq), + Vec::::SUB => get_2nd_or_err::>, _>(&mut seq), + Vec::::SUB => get_2nd_or_err::>, _>(&mut seq), + Vec::::SUB => get_2nd_or_err::>, _>(&mut seq), _ => { error!("TODO serde cty {cty} nty {nty}"); Err(de::Error::custom(&format!("unknown nty {nty}"))) @@ -916,120 +789,6 @@ impl EventsNonObj for ChannelEvents { } } -// impl Events for ChannelEvents { -// fn verify(&self) -> bool { -// todo!() -// } - -// fn output_info(&self) -> String { -// todo!() -// } - -// fn as_collectable_mut(&mut self) -> &mut dyn CollectableDyn { -// todo!() -// } - -// fn as_collectable_with_default_ref(&self) -> &dyn CollectableDyn { -// todo!() -// } - -// fn as_collectable_with_default_mut(&mut self) -> &mut dyn CollectableDyn { -// todo!() -// } - -// fn ts_min(&self) -> Option { -// todo!() -// } - -// fn ts_max(&self) -> Option { -// todo!() -// } - -// fn take_new_events_until_ts(&mut self, _ts_end: u64) -> Box { -// todo!() -// } - -// fn new_empty_evs(&self) -> Box { -// todo!() -// } - -// fn drain_into_evs( -// &mut self, -// dst: &mut dyn Events, -// range: (usize, usize), -// ) -> Result<(), err::Error> { -// todo!() -// } - -// fn find_lowest_index_gt_evs(&self, _ts: u64) -> Option { -// todo!() -// } - -// fn find_lowest_index_ge_evs(&self, _ts: u64) -> Option { -// todo!() -// } - -// fn find_highest_index_lt_evs(&self, _ts: u64) -> Option { -// todo!() -// } - -// fn clone_dyn(&self) -> Box { -// todo!() -// } - -// fn partial_eq_dyn(&self, _other: &dyn Events) -> bool { -// todo!() -// } - -// fn serde_id(&self) -> &'static str { -// todo!() -// } - -// fn nty_id(&self) -> u32 { -// todo!() -// } - -// fn tss(&self) -> &VecDeque { -// todo!() -// } - -// fn pulses(&self) -> &VecDeque { -// todo!() -// } - -// fn frame_type_id(&self) -> u32 { -// todo!() -// } - -// fn to_min_max_avg(&mut self) -> Box { -// todo!() -// } - -// fn to_json_string(&self) -> String { -// todo!() -// } - -// fn to_json_vec_u8(&self) -> Vec { -// todo!() -// } - -// fn to_cbor_vec_u8(&self) -> Vec { -// todo!() -// } - -// fn clear(&mut self) { -// todo!() -// } - -// fn to_dim0_f32_for_binning(&self) -> Box { -// todo!() -// } - -// fn to_container_events(&self) -> Box { -// panic!("should not get used") -// } -// } - impl CollectableDyn for ChannelEvents { fn new_collector(&self) -> Box { Box::new(ChannelEventsCollector::new()) @@ -1214,8 +973,13 @@ impl ToCborValue for ChannelEvents { impl ToUserFacingApiType for ChannelEvents { fn to_user_facing_api_type(self) -> Box { match self { - ChannelEvents::Events(x) => x.to_user_facing_api_type(), - ChannelEvents::Status(x) => todo!(), + ChannelEvents::Events(x) => x.to_user_facing_api_type_box(), + ChannelEvents::Status(x) => Box::new(items_0::apitypes::EmptyStruct::new()), } } + + fn to_user_facing_api_type_box(self: Box) -> Box { + let this = *self; + this.to_user_facing_api_type() + } }