summaryrefslogtreecommitdiff
path: root/src/backend.rs
blob: fce8a26a7163ceb4cdad2452b6cd3fdf8784ecdb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use crate::{
    codec::Codec,
    context::Context,
    event::handler::EventHandler,
    transport::{ConnectionOf, Result, Transport, receiver::PacketReceiver, sender::PacketSender},
};

// TODO : check backend ! maybe better implementations
// TODO : maybe add default functions implementation
// TODO : not sure about send/recv functions

pub trait Backend<Packet, Data = (), Uid = u64>
where
    Uid: PartialEq,
    Data: Send + Sync + 'static,
    Packet: Codec<Data> + Send + Sync + 'static,
    Self::Transport: Transport<Uid, Data = Data>,
    <Self::Transport as Transport<Uid>>::Sender: PacketSender<Data> + Clone,
    <Self::Transport as Transport<Uid>>::Receiver: PacketReceiver<Data, Uid>,
{
    type Transport: Transport<Uid, Data = Data>;

    fn transport(&self) -> &Self::Transport;
    fn event_handler(&self) -> &EventHandler<Packet, Data, Uid>;
    fn make_context(&self) -> Context<Data>;

    fn recv(
        &self,
        conn: &ConnectionOf<Uid, Self::Transport>,
        ctx: &Context<Data>,
    ) -> Result<(Uid, Packet)>;

    fn send(
        &self,
        conn: &ConnectionOf<Uid, Self::Transport>,
        packet: &Packet,
        ctx: &Context<Data>,
    ) -> Result<()>;

    fn connect(
        &self,
        addr: <Self::Transport as Transport<Uid>>::Addr,
    ) -> Result<ConnectionOf<Uid, Self::Transport>>;

    fn serve<A>(&self, addr: <Self::Transport as Transport<Uid>>::Addr, on_accept: A) -> Result<()>
    where
        A: Fn(&Self, &ConnectionOf<Uid, Self::Transport>, &Context<Data>) + Send + Sync + 'static;
}