use crate::automaton::{Action, ActionKind, Redispatch, Timeout, Uid};
use serde::{Deserialize, Serialize};
use std::rc::Rc;
use type_uuid::TypeUuid;
#[derive(Clone, PartialEq, Eq, TypeUuid, Serialize, Deserialize, Debug)]
#[uuid = "6ade1356-d5fe-4c28-8fa9-fe4ee2fffc5f"]
pub enum MioEffectfulAction {
PollCreate {
poll: Uid,
on_success: Redispatch<Uid>,
on_error: Redispatch<(Uid, String)>,
},
PollRegisterTcpServer {
poll: Uid, listener: Uid, on_success: Redispatch<Uid>,
on_error: Redispatch<(Uid, String)>,
},
PollRegisterTcpConnection {
poll: Uid, connection: Uid, on_success: Redispatch<Uid>,
on_error: Redispatch<(Uid, String)>,
},
PollDeregisterTcpConnection {
poll: Uid, connection: Uid, on_success: Redispatch<Uid>,
on_error: Redispatch<(Uid, String)>,
},
PollEvents {
uid: Uid, poll: Uid, events: Uid, timeout: Timeout,
on_success: Redispatch<(Uid, Vec<MioEvent>)>,
on_interrupted: Redispatch<Uid>,
on_error: Redispatch<(Uid, String)>,
},
EventsCreate {
uid: Uid,
capacity: usize,
on_success: Redispatch<Uid>,
},
TcpListen {
listener: Uid,
address: String,
on_success: Redispatch<Uid>,
on_error: Redispatch<(Uid, String)>,
},
TcpAccept {
connection: Uid,
listener: Uid, on_success: Redispatch<Uid>,
on_would_block: Redispatch<Uid>,
on_error: Redispatch<(Uid, String)>,
},
TcpConnect {
connection: Uid,
address: String,
on_success: Redispatch<Uid>,
on_error: Redispatch<(Uid, String)>,
},
TcpClose {
connection: Uid, on_success: Redispatch<Uid>,
},
TcpWrite {
uid: Uid, connection: Uid,
#[serde(
serialize_with = "crate::automaton::serialize_rc_bytes",
deserialize_with = "crate::automaton::deserialize_rc_bytes"
)]
data: Rc<[u8]>,
on_success: Redispatch<Uid>,
on_success_partial: Redispatch<(Uid, usize)>,
on_interrupted: Redispatch<Uid>,
on_would_block: Redispatch<Uid>,
on_error: Redispatch<(Uid, String)>,
},
TcpRead {
uid: Uid, connection: Uid, len: usize, on_success: Redispatch<(Uid, Vec<u8>)>,
on_success_partial: Redispatch<(Uid, Vec<u8>)>,
on_interrupted: Redispatch<Uid>,
on_would_block: Redispatch<Uid>,
on_error: Redispatch<(Uid, String)>,
},
TcpGetPeerAddress {
connection: Uid, on_success: Redispatch<(Uid, String)>,
on_error: Redispatch<(Uid, String)>,
},
}
impl Action for MioEffectfulAction {
const KIND: ActionKind = ActionKind::Effectful;
}
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, Debug)]
pub enum TcpWriteResult {
WrittenAll,
WrittenPartial(usize),
Interrupted,
WouldBlock,
Error(String),
}
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, Debug)]
pub enum TcpReadResult {
ReadAll(Vec<u8>),
ReadPartial(Vec<u8>),
Interrupted,
WouldBlock,
Error(String),
}
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, Debug)]
pub enum TcpAcceptResult {
Success,
WouldBlock,
Error(String),
}
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, Debug)]
pub struct MioEvent {
pub token: Uid,
pub readable: bool,
pub writable: bool,
pub error: bool,
pub read_closed: bool,
pub write_closed: bool,
pub priority: bool,
pub aio: bool,
pub lio: bool,
}
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, Debug)]
pub enum PollResult {
Events(Vec<MioEvent>),
Interrupted,
Error(String),
}