dope_core/driver/route/kind/
mod.rs1use core::{marker, mem};
2
3use crate::driver::route::{FrameworkTag, KeyTag, Select};
4
5mod sealed;
6pub(super) use sealed::Sealed;
7
8pub trait Class: Sealed + Copy {
10 const KIND: Kind;
12
13 const CODE: Code = Code::new(Self::KIND as u8);
15}
16
17pub trait Flight: Class {
23 const FLIGHT: Native;
25}
26
27#[derive(Clone, Copy, Debug, Eq, PartialEq)]
29#[repr(u8)]
30pub enum Native {
31 Accept = 1,
32 Recv = 2,
33 Send = 3,
34 Socket = 5,
35 Connect = 6,
36 Open = 11,
37 Tuning = 25,
38 Write = 28,
39 Sync = 29,
40 Read = 30,
41}
42
43#[derive(Clone, Copy, Eq, PartialEq)]
45#[repr(transparent)]
46pub struct Code(u8);
47
48impl Code {
49 pub(crate) const fn new(raw: u8) -> Self {
50 Self(raw)
51 }
52
53 pub(crate) const fn raw(self) -> u8 {
54 self.0
55 }
56}
57
58const _: () = assert!(mem::size_of::<Code>() == mem::size_of::<u8>());
59
60#[derive(Clone, Copy)]
62pub struct Witness<C: Class>(pub(super) marker::PhantomData<C>);
63
64impl<C: Class> Witness<C> {
65 const NEW: Self = Self(marker::PhantomData);
66
67 pub(crate) const fn marker(self) -> marker::PhantomData<C> {
68 self.0
69 }
70}
71
72#[derive(Clone, Copy)]
73#[repr(u8)]
74pub(crate) enum Shape {
75 Socket(Witness<Socket>),
76 Open(Witness<Open>),
77 Accept(Witness<Accept>),
78 Recv(Witness<Recv>),
79 Send(Witness<Send>),
80 Write(Witness<Write>),
81 Read(Witness<Read>),
82 Connect(Witness<Connect>),
83 Sync(Witness<Sync>),
84 Tuning(Witness<Tuning>),
85}
86
87#[derive(Clone, Copy, Eq, PartialEq, Debug)]
88#[repr(u8)]
89pub enum Kind {
90 Unspecified = 0,
91 Accept = 1,
92 Recv = 2,
93 Send = 3,
94 Socket = 5,
95 Connect = 6,
96 Shutdown = 7,
97 Open = 11,
98 OneShot = 19,
99 TaskQueue = 21,
100 Tuning = 25,
101 Write = 28,
102 Sync = 29,
103 Read = 30,
104}
105
106#[derive(Clone, Copy, Debug, Eq, PartialEq)]
107#[repr(transparent)]
108pub struct Unknown(u8);
109
110#[derive(Clone, Copy, Debug)]
111pub enum Any {}
112#[derive(Clone, Copy)]
113pub enum Accept {}
114#[derive(Clone, Copy)]
115pub enum Recv {}
116#[derive(Clone, Copy)]
117pub enum Send {}
118#[derive(Clone, Copy)]
119pub enum Socket {}
120#[derive(Clone, Copy)]
121pub enum Connect {}
122#[derive(Clone, Copy)]
123pub enum Shutdown {}
124#[derive(Clone, Copy)]
125pub enum Open {}
126#[derive(Clone, Copy)]
127pub enum OneShot {}
128#[derive(Clone, Copy)]
129pub enum TaskQueue {}
130#[derive(Clone, Copy)]
131pub enum Tuning {}
132#[derive(Clone, Copy)]
133pub enum Write {}
134#[derive(Clone, Copy)]
135pub enum Sync {}
136#[derive(Clone, Copy)]
137pub enum Read {}
138impl Sealed for Any {}
139impl Sealed for Accept {}
140impl Sealed for Recv {}
141impl Sealed for Send {}
142impl Sealed for Socket {}
143impl Sealed for Connect {}
144impl Sealed for Shutdown {}
145impl Sealed for Open {}
146impl Sealed for OneShot {}
147impl Sealed for TaskQueue {}
148impl Sealed for Tuning {}
149impl Sealed for Write {}
150impl Sealed for Sync {}
151impl Sealed for Read {}
152impl Class for Any {
153 const KIND: Kind = Kind::Unspecified;
154}
155
156impl Class for Accept {
157 const KIND: Kind = Kind::Accept;
158}
159
160impl Class for Recv {
161 const KIND: Kind = Kind::Recv;
162}
163
164impl Class for Send {
165 const KIND: Kind = Kind::Send;
166}
167
168impl Class for Socket {
169 const KIND: Kind = Kind::Socket;
170}
171
172impl Class for Connect {
173 const KIND: Kind = Kind::Connect;
174}
175
176impl Class for Shutdown {
177 const KIND: Kind = Kind::Shutdown;
178}
179
180impl Class for Open {
181 const KIND: Kind = Kind::Open;
182}
183
184impl Class for OneShot {
185 const KIND: Kind = Kind::OneShot;
186}
187
188impl Class for TaskQueue {
189 const KIND: Kind = Kind::TaskQueue;
190}
191
192impl Class for Tuning {
193 const KIND: Kind = Kind::Tuning;
194}
195
196impl Class for Write {
197 const KIND: Kind = Kind::Write;
198}
199
200impl Class for Sync {
201 const KIND: Kind = Kind::Sync;
202}
203
204impl Class for Read {
205 const KIND: Kind = Kind::Read;
206}
207
208impl<const ROUTE: u8> Select<Accept> for KeyTag<ROUTE, Accept> {}
209impl<const ROUTE: u8> Select<Recv> for KeyTag<ROUTE, Recv> {}
210impl<const ROUTE: u8> Select<Send> for KeyTag<ROUTE, Send> {}
211impl<const ROUTE: u8> Select<Socket> for KeyTag<ROUTE, Socket> {}
212impl<const ROUTE: u8> Select<Connect> for KeyTag<ROUTE, Connect> {}
213impl<const ROUTE: u8> Select<Shutdown> for KeyTag<ROUTE, Shutdown> {}
214impl<const ROUTE: u8> Select<Open> for KeyTag<ROUTE, Open> {}
215impl<const ROUTE: u8> Select<OneShot> for KeyTag<ROUTE, OneShot> {}
216impl<const ROUTE: u8> Select<TaskQueue> for KeyTag<ROUTE, TaskQueue> {}
217impl<const ROUTE: u8> Select<Tuning> for KeyTag<ROUTE, Tuning> {}
218impl<const ROUTE: u8> Select<Write> for KeyTag<ROUTE, Write> {}
219impl<const ROUTE: u8> Select<Sync> for KeyTag<ROUTE, Sync> {}
220impl<const ROUTE: u8> Select<Read> for KeyTag<ROUTE, Read> {}
221impl Select<Accept> for FrameworkTag<Accept> {}
222impl Select<Recv> for FrameworkTag<Recv> {}
223impl Select<Send> for FrameworkTag<Send> {}
224impl Select<Socket> for FrameworkTag<Socket> {}
225impl Select<Connect> for FrameworkTag<Connect> {}
226impl Select<Shutdown> for FrameworkTag<Shutdown> {}
227impl Select<Open> for FrameworkTag<Open> {}
228impl Select<OneShot> for FrameworkTag<OneShot> {}
229impl Select<TaskQueue> for FrameworkTag<TaskQueue> {}
230impl Select<Tuning> for FrameworkTag<Tuning> {}
231impl Select<Write> for FrameworkTag<Write> {}
232impl Select<Sync> for FrameworkTag<Sync> {}
233impl Select<Read> for FrameworkTag<Read> {}
234
235impl Flight for Accept {
236 const FLIGHT: Native = Native::Accept;
237}
238
239impl Flight for Recv {
240 const FLIGHT: Native = Native::Recv;
241}
242
243impl Flight for Send {
244 const FLIGHT: Native = Native::Send;
245}
246
247impl Flight for Socket {
248 const FLIGHT: Native = Native::Socket;
249}
250
251impl Flight for Connect {
252 const FLIGHT: Native = Native::Connect;
253}
254
255impl Flight for Open {
256 const FLIGHT: Native = Native::Open;
257}
258
259impl Flight for Tuning {
260 const FLIGHT: Native = Native::Tuning;
261}
262
263impl Flight for Write {
264 const FLIGHT: Native = Native::Write;
265}
266
267impl Flight for Sync {
268 const FLIGHT: Native = Native::Sync;
269}
270
271impl Flight for Read {
272 const FLIGHT: Native = Native::Read;
273}
274
275impl Native {
276 pub(crate) fn witness<C: Flight>(self) -> Option<Witness<C>> {
277 (self == C::FLIGHT).then_some(Witness::NEW)
278 }
279}
280
281impl From<Native> for Shape {
282 fn from(native: Native) -> Self {
283 match native {
284 Native::Socket => Self::Socket(Witness::NEW),
285 Native::Open => Self::Open(Witness::NEW),
286 Native::Accept => Self::Accept(Witness::NEW),
287 Native::Recv => Self::Recv(Witness::NEW),
288 Native::Send => Self::Send(Witness::NEW),
289 Native::Write => Self::Write(Witness::NEW),
290 Native::Read => Self::Read(Witness::NEW),
291 Native::Connect => Self::Connect(Witness::NEW),
292 Native::Sync => Self::Sync(Witness::NEW),
293 Native::Tuning => Self::Tuning(Witness::NEW),
294 }
295 }
296}
297
298impl Unknown {
299 pub(crate) const fn new(raw: u8) -> Self {
300 Self(raw)
301 }
302}
303
304const _: () = {
305 assert!(mem::size_of::<Shape>() == 1);
306 assert!(mem::size_of::<Native>() == mem::size_of::<Kind>());
307};