changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate rust/lib/net/src/codec/dm/build.rs

changeset 698: 96958d3eb5b0
parent: c7165d93a9eb
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
17
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
1
 //! builder for dm protocol prefab
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
2
 use tokio_util::codec::{Framed, FramedRead, FramedWrite};
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
3
 use super::{DecodeState, DmCodec};
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
4
 use std::cmp;
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
5
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
6
 use tokio::io::{AsyncRead, AsyncWrite};
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
7
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
8
 // use bytes::{Buf, BufMut, Bytes, BytesMut};
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
9
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
10
 #[derive(Debug, Clone, Copy)]
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
11
 pub struct Builder {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
12
     // Maximum frame length
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
13
     max_frame_len: usize,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
14
     // Number of bytes representing the field length
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
15
     length_field_len: usize,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
16
     // Number of bytes in the header before the length field
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
17
     length_field_offset: usize,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
18
     // Adjust the length specified in the header field by this amount
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
19
     length_adjustment: isize,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
20
     // Total number of bytes to skip before reading the payload, if not set,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
21
     // `length_field_len + length_field_offset`
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
22
     num_skip: Option<usize>,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
23
     // Length field byte order (little or big endian)
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
24
     length_field_is_big_endian: bool,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
25
 }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
26
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
27
 impl Builder {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
28
     pub fn new() -> Self {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
29
         Builder {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
30
             // Default max frame length of 4KB
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
31
             max_frame_len: 4 * 1_024,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
32
             // Default byte length of 4
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
33
             length_field_len: 4,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
34
             // Default to the header field being at the start of the header.
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
35
             length_field_offset: 0,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
36
             length_adjustment: 0,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
37
             // Total number of bytes to skip before reading the payload, if not set,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
38
             // `length_field_len + length_field_offset`
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
39
             num_skip: None,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
40
             // Default to reading the length field in network (big) endian.
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
41
             length_field_is_big_endian: true,            
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
42
         }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
43
     }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
44
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
45
     pub fn big_endian(&mut self) -> &mut Self {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
46
         self.length_field_is_big_endian = true;
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
47
         self
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
48
     }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
49
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
50
     pub fn native_endian(&mut self) -> &mut Self {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
51
         if cfg!(target_endian = "big") {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
52
             self.big_endian()
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
53
         } else {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
54
             self.native_endian()
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
55
         }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
56
     }    
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
57
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
58
     pub fn max_frame_length(&mut self, val: usize) -> &mut Self {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
59
         self.max_frame_len = val;
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
60
         self
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
61
     }    
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
62
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
63
     pub fn length_field_length(&mut self, val: usize) -> &mut Self {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
64
         assert!(val > 0 && val <= 8, "invalid length field length");
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
65
         self.length_field_len = val;
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
66
         self
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
67
     }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
68
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
69
     pub fn length_field_offset(&mut self, val: usize) -> &mut Self {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
70
         self.length_field_offset = val;
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
71
         self
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
72
     }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
73
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
74
     pub fn length_adjustment(&mut self, val: isize) -> &mut Self {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
75
         self.length_adjustment = val;
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
76
         self
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
77
     }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
78
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
79
     pub fn num_skip(&mut self, val: usize) -> &mut Self {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
80
         self.num_skip = Some(val);
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
81
         self
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
82
     }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
83
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
84
     pub fn new_codec(&self) -> DmCodec {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
85
         DmCodec {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
86
             builder: *self,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
87
             state: DecodeState::Head,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
88
         }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
89
     }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
90
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
91
     pub fn new_read<T>(&self, upstream: T) -> FramedRead<T, DmCodec>
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
92
     where
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
93
         T: AsyncRead,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
94
     {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
95
         FramedRead::new(upstream, self.new_codec())
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
96
     }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
97
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
98
     pub fn new_write<T>(&self, inner: T) -> FramedWrite<T, DmCodec>
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
99
     where
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
100
         T: AsyncWrite,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
101
     {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
102
         FramedWrite::new(inner, self.new_codec())
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
103
     }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
104
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
105
     pub fn new_framed<T>(&self, inner: T) -> Framed<T, DmCodec>
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
106
     where
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
107
         T: AsyncRead + AsyncWrite,
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
108
     {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
109
         Framed::new(inner, self.new_codec())
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
110
     }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
111
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
112
     fn num_head_bytes(&self) -> usize {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
113
         let num = self.length_field_offset + self.length_field_len;
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
114
         cmp::max(num, self.num_skip.unwrap_or(0))
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
115
     }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
116
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
117
     fn get_num_skip(&self) -> usize {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
118
         self.num_skip
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
119
             .unwrap_or(self.length_field_offset + self.length_field_len)
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
120
     }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
121
 }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
122
 
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
123
 impl Default for Builder {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
124
     fn default() -> Self {
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
125
         Self::new()
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
126
     }
c7165d93a9eb add obj and net src
ellis <ellis@rwest.io>
parents:
diff changeset
127
 }