diff --git a/src/runtime/mod.rs b/src/runtime/mod.rs index c1acf7cc7637f20dce218a1a06d9bf0ed1e60447..3a098dcca503e27a53d98cbb55a213603094be10 100644 --- a/src/runtime/mod.rs +++ b/src/runtime/mod.rs @@ -20,14 +20,14 @@ pub struct VecSet { // invariant: ordered, deduplicated vec: Vec, } -#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] -pub enum LocalComponentId { +#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, serde::Serialize, serde::Deserialize)] +pub enum ComponentId { Native, Proto(ProtoComponentId), } -#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] +#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, serde::Serialize, serde::Deserialize)] pub enum Route { - LocalComponent(LocalComponentId), + LocalComponent(ComponentId), Endpoint { index: usize }, } #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] @@ -54,9 +54,14 @@ pub enum SetupMsg { SessionGather { unoptimized_map: HashMap }, SessionScatter { optimized_map: HashMap }, } - +#[derive(Debug, Clone)] +pub(crate) struct SerdeProtocolDescription(Arc); #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] -pub struct SessionInfo {} +pub struct SessionInfo { + serde_proto_description: SerdeProtocolDescription, + port_info: PortInfo, + proto_components: HashMap, +} #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] pub struct CommMsg { @@ -86,7 +91,7 @@ pub struct Endpoint { inbox: Vec, stream: TcpStream, } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct ProtoComponent { state: ComponentState, ports: HashSet, @@ -138,7 +143,7 @@ pub struct EndpointManager { undelayed_messages: Vec<(usize, Msg)>, endpoint_exts: Vec, } -#[derive(Debug, Default)] +#[derive(Clone, Debug, Default, serde::Serialize, serde::Deserialize)] pub struct PortInfo { polarities: HashMap, peers: HashMap, @@ -261,7 +266,7 @@ impl Connector { cu.port_info.polarities.insert(i, Getter); cu.port_info.peers.insert(o, i); cu.port_info.peers.insert(i, o); - let route = Route::LocalComponent(LocalComponentId::Native); + let route = Route::LocalComponent(ComponentId::Native); cu.port_info.routes.insert(o, route); cu.port_info.routes.insert(i, route); log!(cu.logger, "Added port pair (out->in) {:?} -> {:?}", o, i); @@ -291,9 +296,7 @@ impl Connector { // 3. remove ports from old component & update port->route let new_id = cu.id_manager.new_proto_component_id(); for port in ports.iter() { - cu.port_info - .routes - .insert(*port, Route::LocalComponent(LocalComponentId::Proto(new_id))); + cu.port_info.routes.insert(*port, Route::LocalComponent(ComponentId::Proto(new_id))); } cu.native_ports.retain(|port| !ports.contains(port)); // 4. add new component @@ -434,3 +437,22 @@ impl Debug for Predicate { .finish() } } + +impl serde::Serialize for SerdeProtocolDescription { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + let inner: &ProtocolDescription = &self.0; + inner.serialize(serializer) + } +} +impl<'de> serde::Deserialize<'de> for SerdeProtocolDescription { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let inner: ProtocolDescription = ProtocolDescription::deserialize(deserializer)?; + Ok(Self(Arc::new(inner))) + } +}