Skip to content

Commit 3fc58ef

Browse files
committed
swap bool out for more descriptive new type on checksum API
1 parent 6b522bd commit 3fc58ef

File tree

6 files changed

+62
-36
lines changed

6 files changed

+62
-36
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "async-io-typed"
3-
version = "2.0.0"
3+
version = "3.0.0"
44
edition = "2021"
55
license = "MIT OR Apache-2.0"
66
description = "Adapts any AsyncRead or AsyncWrite type to send serde compatible types"

src/duplex.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::read::{AsyncReadState, AsyncReadTyped, ChecksumReadState};
22
use crate::write::{AsyncWriteState, AsyncWriteTyped, MessageFeatures};
3-
use crate::{Error, PROTOCOL_VERSION};
3+
use crate::{ChecksumEnabled, Error, PROTOCOL_VERSION};
44
use futures_core::Stream;
55
use futures_io::{AsyncRead, AsyncWrite};
66
use futures_util::{Sink, SinkExt};
@@ -34,7 +34,7 @@ impl<RW: AsyncRead + AsyncWrite + Unpin, T: Serialize + DeserializeOwned + Unpin
3434
/// if both the reader and the writer enable it. If either one disables it, then no checking is performed.**
3535
///
3636
/// Be careful, large size limits might create a vulnerability to a Denial of Service attack.
37-
pub fn new_with_limit(rw: RW, size_limit: u64, checksum_enabled: bool) -> Self {
37+
pub fn new_with_limit(rw: RW, size_limit: u64, checksum_enabled: ChecksumEnabled) -> Self {
3838
Self {
3939
rw: Some(rw),
4040
read_state: AsyncReadState::ReadingVersion {
@@ -48,22 +48,18 @@ impl<RW: AsyncRead + AsyncWrite + Unpin, T: Serialize + DeserializeOwned + Unpin
4848
},
4949
write_buffer: Vec::new(),
5050
primed_values: VecDeque::new(),
51-
checksum_read_state: if checksum_enabled {
52-
ChecksumReadState::Yes
53-
} else {
54-
ChecksumReadState::No
55-
},
51+
checksum_read_state: checksum_enabled.into(),
5652
message_features: MessageFeatures {
5753
size_limit,
58-
checksum_enabled,
54+
checksum_enabled: checksum_enabled.into(),
5955
},
6056
}
6157
}
6258

6359
/// Creates a duplex typed reader and writer, initializing it with a default size limit of 1 MB per message.
6460
/// Checksums are used to validate that messages arrived without corruption. **The checksum will only be used
6561
/// if both the reader and the writer enable it. If either one disables it, then no checking is performed.**
66-
pub fn new(rw: RW, checksum_enabled: bool) -> Self {
62+
pub fn new(rw: RW, checksum_enabled: ChecksumEnabled) -> Self {
6763
Self::new_with_limit(rw, 1024_u64.pow(2), checksum_enabled)
6864
}
6965

src/lib.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,37 @@ pub enum Error {
7474
ChecksumHandshakeFailed { checksum_value: u8 },
7575
}
7676

77+
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
78+
pub enum ChecksumEnabled {
79+
Yes,
80+
No,
81+
}
82+
83+
impl From<bool> for ChecksumEnabled {
84+
fn from(value: bool) -> Self {
85+
if value {
86+
ChecksumEnabled::Yes
87+
} else {
88+
ChecksumEnabled::No
89+
}
90+
}
91+
}
92+
93+
impl From<ChecksumEnabled> for bool {
94+
fn from(value: ChecksumEnabled) -> Self {
95+
value == ChecksumEnabled::Yes
96+
}
97+
}
98+
99+
impl From<ChecksumEnabled> for ChecksumReadState {
100+
fn from(value: ChecksumEnabled) -> Self {
101+
match value {
102+
ChecksumEnabled::Yes => ChecksumReadState::Yes,
103+
ChecksumEnabled::No => ChecksumReadState::No,
104+
}
105+
}
106+
}
107+
77108
fn bincode_options(size_limit: u64) -> impl Options {
78109
// Two of these are defaults, so you might say this is over specified. I say it's future proof, as
79110
// bincode default changes won't introduce accidental breaking changes.

src/read.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{
2-
Error, CHECKSUM_DISABLED, CHECKSUM_ENABLED, PROTOCOL_VERSION, U16_MARKER, U32_MARKER,
3-
U64_MARKER, ZST_MARKER,
2+
ChecksumEnabled, Error, CHECKSUM_DISABLED, CHECKSUM_ENABLED, PROTOCOL_VERSION, U16_MARKER,
3+
U32_MARKER, U64_MARKER, ZST_MARKER,
44
};
55
use bincode::Options;
66
use futures_core::Stream;
@@ -89,7 +89,7 @@ impl<R: AsyncRead + Unpin, T: Serialize + DeserializeOwned + Unpin> AsyncReadTyp
8989
/// Creates a typed reader, initializing it with the given size limit specified in bytes.
9090
///
9191
/// Be careful, large limits might create a vulnerability to a Denial of Service attack.
92-
pub fn new_with_limit(raw: R, size_limit: u64, checksum_enabled: bool) -> Self {
92+
pub fn new_with_limit(raw: R, size_limit: u64, checksum_enabled: ChecksumEnabled) -> Self {
9393
Self {
9494
raw,
9595
size_limit,
@@ -98,17 +98,13 @@ impl<R: AsyncRead + Unpin, T: Serialize + DeserializeOwned + Unpin> AsyncReadTyp
9898
version_in_progress_assigned: 0,
9999
},
100100
item_buffer: Vec::new(),
101-
checksum_read_state: if checksum_enabled {
102-
ChecksumReadState::Yes
103-
} else {
104-
ChecksumReadState::No
105-
},
101+
checksum_read_state: checksum_enabled.into(),
106102
_phantom: PhantomData,
107103
}
108104
}
109105

110106
/// Creates a typed reader, initializing it with a default size limit of 1 MB.
111-
pub fn new(raw: R, checksum_enabled: bool) -> Self {
107+
pub fn new(raw: R, checksum_enabled: ChecksumEnabled) -> Self {
112108
Self::new_with_limit(raw, 1024u64.pow(2), checksum_enabled)
113109
}
114110

src/tests.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ fn basic_channel(max_size_per_write: usize) -> (BasicChannelSender, BasicChannel
131131
#[tokio::test]
132132
async fn bad_protocol_version() {
133133
let (mut sender, receiver) = basic_channel(1024);
134-
let mut typed_receiver = AsyncReadTyped::<_, u8>::new(receiver, false);
134+
let mut typed_receiver = AsyncReadTyped::<_, u8>::new(receiver, ChecksumEnabled::No);
135135
// Intentionally send a message with a bad checksum
136136
let sent_value = 5;
137137
let mut message = Vec::from(0u64.to_le_bytes());
@@ -154,7 +154,7 @@ async fn bad_protocol_version() {
154154
#[tokio::test]
155155
async fn bad_checksum_enabled_value() {
156156
let (mut sender, receiver) = basic_channel(1024);
157-
let mut typed_receiver = AsyncReadTyped::<_, u8>::new(receiver, false);
157+
let mut typed_receiver = AsyncReadTyped::<_, u8>::new(receiver, ChecksumEnabled::No);
158158
// Intentionally send a message with a bad checksum
159159
let sent_value = 5;
160160
const BAD_CHECKSUM_ENABLED_VALUE: u8 = 42;
@@ -177,7 +177,7 @@ async fn bad_checksum_enabled_value() {
177177
#[tokio::test]
178178
async fn checksum_ignored() {
179179
let (mut sender, receiver) = basic_channel(1024);
180-
let mut typed_receiver = AsyncReadTyped::new(receiver, false);
180+
let mut typed_receiver = AsyncReadTyped::new(receiver, ChecksumEnabled::No);
181181
// Intentionally send a message with a bad checksum
182182
let sent_value = 5;
183183
let mut message = Vec::from(PROTOCOL_VERSION.to_le_bytes());
@@ -193,7 +193,7 @@ async fn checksum_ignored() {
193193
#[tokio::test]
194194
async fn checksum_unavailable() {
195195
let (mut sender, receiver) = basic_channel(1024);
196-
let mut typed_receiver = AsyncReadTyped::<_, u8>::new(receiver, true);
196+
let mut typed_receiver = AsyncReadTyped::<_, u8>::new(receiver, ChecksumEnabled::Yes);
197197
assert!(typed_receiver.checksum_enabled());
198198
// Send two message without checksums.
199199
const SENT_VALUE: u8 = 5;
@@ -218,7 +218,7 @@ async fn checksum_unavailable() {
218218
#[tokio::test]
219219
async fn checksum_used() {
220220
let (mut sender, receiver) = basic_channel(1024);
221-
let mut typed_receiver = AsyncReadTyped::<_, u8>::new(receiver, true);
221+
let mut typed_receiver = AsyncReadTyped::<_, u8>::new(receiver, ChecksumEnabled::Yes);
222222
// Intentionally send a message with a bad checksum
223223
const SENT_VALUE: u8 = 5;
224224
const SENT_VALUE_CHECKSUM: u64 = 10536747468361244917;
@@ -251,7 +251,7 @@ async fn checksum_used() {
251251
#[tokio::test]
252252
async fn checksum_unused() {
253253
let (mut sender, receiver) = basic_channel(1024);
254-
let mut typed_receiver = AsyncReadTyped::<_, u8>::new(receiver, true);
254+
let mut typed_receiver = AsyncReadTyped::<_, u8>::new(receiver, ChecksumEnabled::Yes);
255255
// Send two messages with no checksum
256256
const SENT_VALUE: u8 = 5;
257257
const SENT_VALUE_2: u8 = 20;
@@ -273,7 +273,7 @@ async fn checksum_unused() {
273273
#[tokio::test]
274274
async fn checksum_sent() {
275275
let (sender, mut receiver) = basic_channel(1024);
276-
let mut typed_sender = AsyncWriteTyped::new(sender, true);
276+
let mut typed_sender = AsyncWriteTyped::new(sender, ChecksumEnabled::Yes);
277277
const SENT_VALUE: u8 = 5;
278278
const SENT_VALUE_CHECKSUM: u64 = 10536747468361244917;
279279
typed_sender.send(SENT_VALUE).await.unwrap();
@@ -297,7 +297,7 @@ async fn checksum_sent() {
297297
#[tokio::test]
298298
async fn checksum_not_sent() {
299299
let (sender, mut receiver) = basic_channel(1024);
300-
let mut typed_sender = AsyncWriteTyped::new(sender, false);
300+
let mut typed_sender = AsyncWriteTyped::new(sender, ChecksumEnabled::No);
301301
const SENT_VALUE: u8 = 5;
302302
typed_sender.send(SENT_VALUE).await.unwrap();
303303
const SENT_VALUE_2: u8 = 20;
@@ -387,8 +387,8 @@ fn make_channel<T: DeserializeOwned + Serialize + Unpin>(
387387
) {
388388
let (sender, receiver) = basic_channel(max_size_per_write);
389389
(
390-
Some(AsyncWriteTyped::new(sender, sender_checksum_enabled)),
391-
AsyncReadTyped::new(receiver, receiver_checksum_enabled),
390+
Some(AsyncWriteTyped::new(sender, sender_checksum_enabled.into())),
391+
AsyncReadTyped::new(receiver, receiver_checksum_enabled.into()),
392392
)
393393
}
394394

@@ -511,10 +511,13 @@ async fn hello_world_tokio_tcp() {
511511
.await
512512
.unwrap()
513513
.compat(),
514-
true,
514+
ChecksumEnabled::Yes,
515515
);
516516
let (server_stream, _address) = accept_fut.await.unwrap();
517-
let mut server_stream = Some(DuplexStreamTyped::new(server_stream.compat_write(), true));
517+
let mut server_stream = Some(DuplexStreamTyped::new(
518+
server_stream.compat_write(),
519+
ChecksumEnabled::Yes,
520+
));
518521
let message = "Hello, world!".as_bytes().to_vec();
519522
let fut = start_send_helper(server_stream.take().unwrap(), message.clone());
520523
assert_eq!(client_stream.next().await.unwrap().unwrap(), message);

src/write.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{
2-
Error, CHECKSUM_DISABLED, CHECKSUM_ENABLED, PROTOCOL_VERSION, U16_MARKER, U32_MARKER,
3-
U64_MARKER, ZST_MARKER,
2+
ChecksumEnabled, Error, CHECKSUM_DISABLED, CHECKSUM_ENABLED, PROTOCOL_VERSION, U16_MARKER,
3+
U32_MARKER, U64_MARKER, ZST_MARKER,
44
};
55
use bincode::Options;
66
use futures_io::AsyncWrite;
@@ -223,7 +223,7 @@ impl<W: AsyncWrite + Unpin, T: Serialize + DeserializeOwned + Unpin> AsyncWriteT
223223
/// if both the reader and the writer enable it. If either one disables it, then no checking is performed.**
224224
///
225225
/// Be careful, large size limits might create a vulnerability to a Denial of Service attack.
226-
pub fn new_with_limit(raw: W, size_limit: u64, checksum_enabled: bool) -> Self {
226+
pub fn new_with_limit(raw: W, size_limit: u64, checksum_enabled: ChecksumEnabled) -> Self {
227227
Self {
228228
raw: Some(raw),
229229
write_buffer: Vec::new(),
@@ -233,7 +233,7 @@ impl<W: AsyncWrite + Unpin, T: Serialize + DeserializeOwned + Unpin> AsyncWriteT
233233
},
234234
message_features: MessageFeatures {
235235
size_limit,
236-
checksum_enabled,
236+
checksum_enabled: checksum_enabled.into(),
237237
},
238238
primed_values: VecDeque::new(),
239239
}
@@ -242,7 +242,7 @@ impl<W: AsyncWrite + Unpin, T: Serialize + DeserializeOwned + Unpin> AsyncWriteT
242242
/// Creates a typed writer, initializing it with a default size limit of 1 MB per message.
243243
/// Checksums are used to validate that messages arrived without corruption. **The checksum will only be used
244244
/// if both the reader and the writer enable it. If either one disables it, then no checking is performed.**
245-
pub fn new(raw: W, checksum_enabled: bool) -> Self {
245+
pub fn new(raw: W, checksum_enabled: ChecksumEnabled) -> Self {
246246
Self::new_with_limit(raw, 1024u64.pow(2), checksum_enabled)
247247
}
248248

0 commit comments

Comments
 (0)