aboutsummaryrefslogtreecommitdiff
path: root/src/endpoint.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/endpoint.rs')
-rw-r--r--src/endpoint.rs78
1 files changed, 5 insertions, 73 deletions
diff --git a/src/endpoint.rs b/src/endpoint.rs
index f31141d..e6b2236 100644
--- a/src/endpoint.rs
+++ b/src/endpoint.rs
@@ -5,79 +5,11 @@ use std::sync::Arc;
use arc_swap::ArcSwapOption;
use async_trait::async_trait;
-use serde::{Deserialize, Serialize};
-
use crate::error::Error;
+use crate::message::*;
use crate::netapp::*;
-use crate::proto::*;
use crate::util::*;
-/// This trait should be implemented by all messages your application
-/// wants to handle
-pub trait Message: SerializeMessage + Send + Sync {
- type Response: SerializeMessage + Send + Sync;
-}
-
-/// A trait for de/serializing messages, with possible associated stream.
-#[async_trait]
-pub trait SerializeMessage: Sized {
- type SerializableSelf: Serialize + for<'de> Deserialize<'de> + Send;
-
- fn serialize_msg(&self) -> (Self::SerializableSelf, Option<AssociatedStream>);
-
- // TODO should return Result
- async fn deserialize_msg(ser_self: Self::SerializableSelf, stream: AssociatedStream) -> Self;
-}
-
-pub trait AutoSerialize: Serialize + for<'de> Deserialize<'de> + Clone + Send + Sync {}
-
-#[async_trait]
-impl<T> SerializeMessage for T
-where
- T: AutoSerialize,
-{
- type SerializableSelf = Self;
- fn serialize_msg(&self) -> (Self::SerializableSelf, Option<AssociatedStream>) {
- (self.clone(), None)
- }
-
- async fn deserialize_msg(ser_self: Self::SerializableSelf, _stream: AssociatedStream) -> Self {
- // TODO verify no stream
- ser_self
- }
-}
-
-impl AutoSerialize for () {}
-
-#[async_trait]
-impl<T, E> SerializeMessage for Result<T, E>
-where
- T: SerializeMessage + Send,
- E: SerializeMessage + Send,
-{
- type SerializableSelf = Result<T::SerializableSelf, E::SerializableSelf>;
-
- fn serialize_msg(&self) -> (Self::SerializableSelf, Option<AssociatedStream>) {
- match self {
- Ok(ok) => {
- let (msg, stream) = ok.serialize_msg();
- (Ok(msg), stream)
- }
- Err(err) => {
- let (msg, stream) = err.serialize_msg();
- (Err(msg), stream)
- }
- }
- }
-
- async fn deserialize_msg(ser_self: Self::SerializableSelf, stream: AssociatedStream) -> Self {
- match ser_self {
- Ok(ok) => Ok(T::deserialize_msg(ok, stream).await),
- Err(err) => Err(E::deserialize_msg(err, stream).await),
- }
- }
-}
-
/// This trait should be implemented by an object of your application
/// that can handle a message of type `M`.
///
@@ -191,9 +123,9 @@ pub(crate) trait GenericEndpoint {
async fn handle(
&self,
buf: &[u8],
- stream: AssociatedStream,
+ stream: ByteStream,
from: NodeID,
- ) -> Result<(Vec<u8>, Option<AssociatedStream>), Error>;
+ ) -> Result<(Vec<u8>, Option<ByteStream>), Error>;
fn drop_handler(&self);
fn clone_endpoint(&self) -> DynEndpoint;
}
@@ -213,9 +145,9 @@ where
async fn handle(
&self,
buf: &[u8],
- stream: AssociatedStream,
+ stream: ByteStream,
from: NodeID,
- ) -> Result<(Vec<u8>, Option<AssociatedStream>), Error> {
+ ) -> Result<(Vec<u8>, Option<ByteStream>), Error> {
match self.0.handler.load_full() {
None => Err(Error::NoHandler),
Some(h) => {