datagram_transport/
lib.rs

1/*----------------------------------------------------------------------------------------------------------
2 *  Copyright (c) Peter Bjorklund. All rights reserved. https://github.com/piot/datagram-transport-rs
3 *  Licensed under the MIT License. See LICENSE in the project root for license information.
4 *--------------------------------------------------------------------------------------------------------*/
5
6pub trait DatagramWrite {
7    fn write(&mut self, buf: &[u8]) -> std::io::Result<()>;
8}
9
10pub trait DatagramRead {
11    fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize>;
12}
13
14pub trait DatagramTransport: DatagramWrite + DatagramRead {}
15
16pub trait DatagramTransportMultiConnection: DatagramWrite {
17    fn id(&self) -> u8;
18}
19
20pub trait DatagramTransportMulti {
21    fn read(
22        &mut self,
23        buf: &mut [u8],
24    ) -> std::io::Result<(impl DatagramTransportMultiConnection, usize)>;
25}
26
27#[cfg(test)]
28mod tests {
29    struct TestTransport {}
30
31    impl DatagramWrite for TestTransport {
32        fn write(&mut self, _data: &[u8]) -> std::io::Result<()> {
33            Ok(())
34        }
35    }
36
37    impl DatagramRead for TestTransport {
38        fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
39            buf[0] = 0xca;
40            Ok(1)
41        }
42    }
43
44    struct TestMultiTransport {}
45    struct TestMultiTransportConnection {
46        id: u8,
47    }
48
49    impl DatagramWrite for TestMultiTransportConnection {
50        fn write(&mut self, _data: &[u8]) -> std::io::Result<()> {
51            Ok(())
52        }
53    }
54
55    impl DatagramTransportMultiConnection for TestMultiTransportConnection {
56        fn id(&self) -> u8 {
57            self.id
58        }
59    }
60
61    impl DatagramTransportMulti for TestMultiTransport {
62        fn read(
63            &mut self,
64            buf: &mut [u8],
65        ) -> std::io::Result<(impl DatagramTransportMultiConnection, usize)> {
66            buf[0] = 0xca;
67            Ok((TestMultiTransportConnection { id: 1 }, 1))
68        }
69    }
70
71    use super::*;
72
73    #[test]
74    fn single_write() {
75        let mut transport = TestTransport {};
76        let data: &[u8] = &[1, 2, 3, 4, 5];
77        let result = transport.write(data);
78        assert!(result.is_ok());
79    }
80
81    #[test]
82    fn multi_read() {
83        let mut transport = TestMultiTransport {};
84        let mut buf = [0; 10];
85        {
86            let (mut connection, size) = transport.read(&mut buf).unwrap();
87            assert!(size == 1);
88            assert!(connection.id() == 1);
89            let out_data: &[u8] = &[1, 2, 3, 4, 5];
90            connection.write(&out_data).unwrap();
91        }
92        assert_eq!(buf[0], 0xca);
93    }
94}