Skip to content

Commit 99588da

Browse files
committed
add adapter for digest crate
1 parent de0d966 commit 99588da

File tree

3 files changed

+103
-0
lines changed

3 files changed

+103
-0
lines changed

embedded-io-adapters/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@ categories = [
1313
]
1414

1515
[features]
16+
default = ["digest"]
1617
std = ["embedded-io/std"]
1718
tokio-1 = ["std", "dep:tokio", "dep:embedded-io-async", "embedded-io-async?/std"]
1819
futures-03 = ["std", "dep:futures", "dep:embedded-io-async", "embedded-io-async?/std"]
1920

2021
[dependencies]
22+
digest = { version = "0.10.7", default-features = false, optional = true }
2123
embedded-io = { version = "0.6", path = "../embedded-io" }
2224
embedded-io-async = { version = "0.6.1", path = "../embedded-io-async", optional = true }
2325

embedded-io-adapters/src/digest.rs

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
//! Adapters to/from `digest::Digest` traits e.g. sha2::Sha256
2+
3+
use core::convert::Infallible;
4+
use digest::Update;
5+
use embedded_io::{ErrorType, Write};
6+
7+
/// Adapter from `digest::Digest` traits.
8+
#[derive(Clone)]
9+
pub struct FromDigest<T: ?Sized> {
10+
inner: T,
11+
}
12+
13+
impl <T> FromDigest<T> {
14+
/// Create a new adapter.
15+
pub fn new(inner: T) -> Self {
16+
Self { inner }
17+
}
18+
19+
/// Consume the adapter, returning the inner object.
20+
pub fn into_inner(self) -> T {
21+
self.inner
22+
}
23+
}
24+
25+
impl <T: ?Sized> FromDigest<T> {
26+
/// Borrow the inner object.
27+
pub fn inner(&self) -> &T {
28+
&self.inner
29+
}
30+
31+
/// Mutably borrow the inner object.
32+
pub fn inner_mut(&mut self) -> &mut T {
33+
&mut self.inner
34+
}
35+
}
36+
37+
impl <T> ErrorType for FromDigest<T> {
38+
type Error = Infallible;
39+
}
40+
41+
impl <T: Update> Write for FromDigest<T> {
42+
fn write(&mut self, data: &[u8]) -> Result<usize, <Self as ErrorType>::Error> {
43+
T::update(&mut self.inner, data);
44+
Ok(data.len())
45+
}
46+
fn flush(&mut self) -> Result<(), <Self as ErrorType>::Error> { Ok(()) }
47+
}
48+
49+
impl <T: Default> Default for FromDigest<T> {
50+
fn default() -> Self {
51+
Self { inner: T::default() }
52+
}
53+
}
54+
55+
/// Adapter to `digest::Digest` traits.
56+
#[derive(Clone)]
57+
pub struct ToDigest<T: ?Sized> {
58+
inner: T,
59+
}
60+
61+
impl <T> ToDigest<T> {
62+
/// Create a new adapter.
63+
pub fn new(inner: T) -> Self {
64+
Self { inner }
65+
}
66+
67+
/// Consume the adapter, returning the inner object.
68+
pub fn into_inner(self) -> T {
69+
self.inner
70+
}
71+
}
72+
73+
impl <T: ?Sized> ToDigest<T> {
74+
/// Borrow the inner object.
75+
pub fn inner(&self) -> &T {
76+
&self.inner
77+
}
78+
79+
/// Mutably borrow the inner object.
80+
pub fn inner_mut(&mut self) -> &mut T {
81+
&mut self.inner
82+
}
83+
}
84+
85+
impl <T: Default> Default for ToDigest<T> {
86+
fn default() -> Self {
87+
Self { inner: T::default() }
88+
}
89+
}
90+
91+
impl <T: ErrorType<Error=Infallible> + Write> Update for ToDigest<T> {
92+
fn update(&mut self, data: &[u8]) {
93+
match self.inner.write_all(data) {
94+
Ok(()) => {},
95+
Err(_) => unreachable!(),
96+
}
97+
}
98+
}

embedded-io-adapters/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,6 @@ pub mod futures_03;
1616
#[cfg(feature = "tokio-1")]
1717
#[cfg_attr(docsrs, doc(cfg(feature = "tokio-1")))]
1818
pub mod tokio_1;
19+
20+
#[cfg(feature = "digest")]
21+
pub mod digest;

0 commit comments

Comments
 (0)