gmt_dos_actors_clients_interface/
select.rs

1//! # Vector element selection
2//!
3//! The module defines the structure [Select]`<U: `[UniqueIdentifier]`, const IDX: usize>` that selects
4//! the element at index `IDX` in a vector for a type `U` that implements the trait [UniqueIdentifier]
5//! with datatype [UniqueIdentifier::DataType]`=`[Vec]`<T>`
6
7use std::marker::PhantomData;
8
9use crate::{Data, UniqueIdentifier, Update, Write};
10
11/// Marker trait for client
12pub trait Selector {}
13
14/**
15Vector element selection type
16
17# Example
18```
19use gmt_dos_actors_clients_interface::{Data, UniqueIdentifier, Update, Write,
20    select::{Select, Selector}};
21pub enum TTT {}
22impl UniqueIdentifier for TTT {
23    type DataType = Vec<u32>;
24}
25pub struct Client {
26    pub data: Vec<u32>,
27}
28impl Update for Client {}
29impl Write<TTT> for Client {
30    fn write(&mut self) -> Option<Data<TTT>> {
31        Some(self.data.clone().into())
32    }
33}
34impl Selector for Client {}
35let mut client = Client {
36    data: vec![1, 2, 3, 4, 5],
37};
38let data = <Client as Write<Select<TTT, 3>>>::write(&mut client);
39```
40*/
41pub 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}