gmt_dos_actors_clients_interface/
select.rs1use std::marker::PhantomData;
8
9use crate::{Data, UniqueIdentifier, Update, Write};
10
11pub trait Selector {}
13
14pub struct Select<U: UniqueIdentifier, const IDX: usize>(PhantomData<U>);
42
43impl<U: UniqueIdentifier, const IDX: usize> UniqueIdentifier for Select<U, IDX> {
44 type DataType = <U as UniqueIdentifier>::DataType;
45
46 const PORT: u16 = <U as UniqueIdentifier>::PORT + 11 * IDX as u16;
47}
48
49impl<U: UniqueIdentifier, const IDX: usize> Update for Select<U, IDX> {}
50
51impl<T, C, U, const IDX: usize> Write<Select<U, IDX>> for C
52where
53 T: Copy,
54 C: Write<U> + Selector,
55 U: UniqueIdentifier<DataType = Vec<T>>,
56{
57 fn write(&mut self) -> Option<Data<Select<U, IDX>>> {
58 let Some(data) = <C as Write<U>>::write(self) else {
59 return None;
60 };
61 let inner: &[T] = (&data).into();
62 let value = vec![inner[IDX]];
63 Some(value.into())
64 }
65}
66
67#[cfg(test)]
68mod tests {
69 use crate::{Data, UniqueIdentifier, Update, Write};
70
71 use super::{Select, Selector};
72
73 pub enum TTT {}
74 impl UniqueIdentifier for TTT {
75 type DataType = Vec<u32>;
76 }
77
78 pub struct Client {
79 pub data: Vec<u32>,
80 }
81
82 impl Update for Client {}
83
84 impl Write<TTT> for Client {
85 fn write(&mut self) -> Option<crate::Data<TTT>> {
86 Some(self.data.clone().into())
87 }
88 }
89
90 impl Selector for Client {}
91
92 #[test]
93 fn select() {
94 let mut client = Client {
95 data: vec![1, 2, 3, 4, 5],
96 };
97
98 let data = <Client as Write<Select<TTT, 3>>>::write(&mut client);
99 dbg!(data);
100 }
101}