Skip to content

Commit ff132fd

Browse files
zypsgued
authored andcommitted
Add optional embedded_io::Write impl for Vec.
1 parent bbe988d commit ff132fd

File tree

5 files changed

+69
-2
lines changed

5 files changed

+69
-2
lines changed

.github/workflows/build.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ jobs:
4848
components: miri
4949

5050
- name: Run miri
51-
run: MIRIFLAGS=-Zmiri-ignore-leaks cargo miri test --features="alloc,defmt,mpmc_large,portable-atomic-critical-section,serde,ufmt,bytes,zeroize"
51+
run: MIRIFLAGS=-Zmiri-ignore-leaks cargo miri test --features="alloc,defmt,mpmc_large,portable-atomic-critical-section,serde,ufmt,bytes,zeroize,embedded-io"
5252

5353
# Run cargo test
5454
test:
@@ -84,7 +84,7 @@ jobs:
8484
toolchain: stable
8585

8686
- name: Run cargo test
87-
run: cargo test --features="alloc,defmt,mpmc_large,portable-atomic-critical-section,serde,ufmt,bytes,zeroize"
87+
run: cargo test --features="alloc,defmt,mpmc_large,portable-atomic-critical-section,serde,ufmt,bytes,zeroize,embedded-io"
8888

8989
# Run cargo fmt --check
9090
style:
@@ -177,6 +177,7 @@ jobs:
177177
cargo check --target="${target}" --features="serde"
178178
cargo check --target="${target}" --features="ufmt"
179179
cargo check --target="${target}" --features="zeroize"
180+
cargo check --target="${target}" --features="embedded-io"
180181
env:
181182
target: ${{ matrix.target }}
182183

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
2121

2222
- Added `String::insert` and `String::insert_str`.
2323

24+
### Added
25+
26+
- Added optional `embedded_io::Write` impl for `Vec`.
27+
2428
### Changed
2529

2630
- `bytes::BufMut` is now implemented on `VecInner`.

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ defmt = ["dep:defmt"]
5050
# Implement `zeroize::Zeroize` trait.
5151
zeroize = ["dep:zeroize"]
5252

53+
# Implement `embedded_io::Write`
54+
embedded-io = ["dep:embedded-io"]
55+
5356
# Enable larger MPMC sizes.
5457
mpmc_large = []
5558

@@ -67,6 +70,7 @@ ufmt = { version = "0.2", optional = true }
6770
ufmt-write = { version = "0.1", optional = true }
6871
defmt = { version = "1.0.1", optional = true }
6972
zeroize = { version = "1.8", optional = true, default-features = false, features = ["derive"] }
73+
embedded-io = { version = "0.6", optional = true }
7074

7175
# for the pool module
7276
[target.'cfg(any(target_arch = "arm", target_pointer_width = "32", target_pointer_width = "64"))'.dependencies]

src/embedded_io.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
use embedded_io::{Error, ErrorKind, ErrorType, Write};
2+
3+
use crate::{
4+
len_type::LenType,
5+
vec::{VecInner, VecStorage},
6+
CapacityError,
7+
};
8+
9+
impl Error for CapacityError {
10+
fn kind(&self) -> ErrorKind {
11+
ErrorKind::OutOfMemory
12+
}
13+
}
14+
15+
impl<LenT: LenType, S: VecStorage<u8> + ?Sized> ErrorType for VecInner<u8, LenT, S> {
16+
type Error = CapacityError;
17+
}
18+
19+
impl<LenT: LenType, S: VecStorage<u8> + ?Sized> Write for VecInner<u8, LenT, S> {
20+
#[inline]
21+
fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> {
22+
self.extend_from_slice(buf)?;
23+
Ok(buf.len())
24+
}
25+
26+
#[inline]
27+
fn flush(&mut self) -> Result<(), Self::Error> {
28+
Ok(())
29+
}
30+
}
31+
32+
#[cfg(test)]
33+
mod tests {
34+
use crate::Vec;
35+
use embedded_io::{Error, ErrorKind, Write};
36+
37+
fn write(w: &mut impl Write, data: &[u8]) -> Result<(), ErrorKind> {
38+
w.write_all(data).map_err(|e| e.kind())
39+
}
40+
41+
#[test]
42+
fn test_write() {
43+
let mut v: Vec<u8, 4> = Vec::new();
44+
assert_eq!(v.len(), 0);
45+
write(&mut v, &[1, 2]).unwrap();
46+
assert_eq!(v.len(), 2);
47+
assert_eq!(v.as_slice(), &[1, 2]);
48+
write(&mut v, &[3]).unwrap();
49+
assert_eq!(v.len(), 3);
50+
assert_eq!(v.as_slice(), &[1, 2, 3]);
51+
assert!(write(&mut v, &[4, 5]).is_err());
52+
assert_eq!(v.len(), 3);
53+
assert_eq!(v.as_slice(), &[1, 2, 3]);
54+
}
55+
}

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,9 @@ pub mod spsc;
230230
#[cfg(feature = "ufmt")]
231231
mod ufmt;
232232

233+
#[cfg(feature = "embedded-io")]
234+
mod embedded_io;
235+
233236
/// Implementation details for macros.
234237
/// Do not use. Used for macros only. Not covered by semver guarantees.
235238
#[doc(hidden)]

0 commit comments

Comments
 (0)