aws_kms_tls_auth/
codec.rs1use byteorder::{BigEndian, ReadBytesExt};
22use std::io::{self, ErrorKind, Read, Write};
23
24pub trait DecodeByteSource<T: DecodeValue>: Sized {
26 fn decode_value(&self) -> io::Result<(T, Self)>;
27}
28
29pub trait EncodeBytesSink<T: EncodeValue>: Sized {
35 fn encode_value(&mut self, value: &T) -> io::Result<()>;
36}
37
38pub trait DecodeValue: Sized {
40 fn decode_from(buffer: &[u8]) -> std::io::Result<(Self, &[u8])>;
41
42 fn decode_from_exact(buffer: &[u8]) -> std::io::Result<Self> {
46 let (value, buffer) = Self::decode_from(buffer)?;
47 if !buffer.is_empty() {
48 Err(std::io::Error::new(
49 ErrorKind::InvalidData,
50 "unexpected data left over",
51 ))
52 } else {
53 Ok(value)
54 }
55 }
56}
57
58pub trait EncodeValue: Sized {
60 fn encode_to(&self, buffer: &mut Vec<u8>) -> std::io::Result<()>;
61
62 fn encode_to_vec(&self) -> std::io::Result<Vec<u8>> {
63 let mut buffer = Vec::new();
64 self.encode_to(&mut buffer)?;
65 Ok(buffer)
66 }
67}
68
69impl<T: DecodeValue> DecodeByteSource<T> for &[u8] {
72 fn decode_value(&self) -> io::Result<(T, Self)> {
73 T::decode_from(self)
74 }
75}
76
77impl<T: EncodeValue> EncodeBytesSink<T> for Vec<u8> {
78 fn encode_value(&mut self, value: &T) -> io::Result<()> {
79 value.encode_to(self)
80 }
81}
82
83impl DecodeValue for u8 {
86 fn decode_from(mut buffer: &[u8]) -> std::io::Result<(Self, &[u8])> {
87 let value = buffer.read_u8()?;
88 Ok((value, buffer))
89 }
90}
91
92impl DecodeValue for u16 {
93 fn decode_from(mut buffer: &[u8]) -> std::io::Result<(Self, &[u8])> {
94 let value = buffer.read_u16::<BigEndian>()?;
95 Ok((value, buffer))
96 }
97}
98
99impl DecodeValue for u32 {
100 fn decode_from(mut buffer: &[u8]) -> std::io::Result<(Self, &[u8])> {
101 let value = buffer.read_u32::<BigEndian>()?;
102 Ok((value, buffer))
103 }
104}
105
106impl DecodeValue for u64 {
107 fn decode_from(mut buffer: &[u8]) -> std::io::Result<(Self, &[u8])> {
108 let value = buffer.read_u64::<BigEndian>()?;
109 Ok((value, buffer))
110 }
111}
112
113impl EncodeValue for u8 {
114 fn encode_to(&self, buffer: &mut Vec<u8>) -> std::io::Result<()> {
115 buffer.write_all(&[*self])?;
116 Ok(())
117 }
118}
119
120impl EncodeValue for u16 {
121 fn encode_to(&self, buffer: &mut Vec<u8>) -> std::io::Result<()> {
122 buffer.write_all(&self.to_be_bytes())?;
123 Ok(())
124 }
125}
126
127impl EncodeValue for u32 {
128 fn encode_to(&self, buffer: &mut Vec<u8>) -> std::io::Result<()> {
129 buffer.write_all(&self.to_be_bytes())?;
130 Ok(())
131 }
132}
133
134impl EncodeValue for u64 {
135 fn encode_to(&self, buffer: &mut Vec<u8>) -> std::io::Result<()> {
136 buffer.write_all(&self.to_be_bytes())?;
137 Ok(())
138 }
139}
140
141impl<const L: usize> DecodeValue for [u8; L] {
144 fn decode_from(mut buffer: &[u8]) -> std::io::Result<(Self, &[u8])> {
145 let mut value = [0; L];
146 buffer.read_exact(&mut value)?;
147 Ok((value, buffer))
148 }
149}
150
151impl<const L: usize> EncodeValue for [u8; L] {
152 fn encode_to(&self, buffer: &mut Vec<u8>) -> std::io::Result<()> {
153 buffer.write_all(self)?;
154 Ok(())
155 }
156}