core_json_embedded_io/
lib.rs

1#![cfg_attr(docsrs, feature(doc_cfg))]
2#![doc = include_str!("../README.md")]
3#![deny(missing_docs)]
4#![cfg_attr(not(test), no_std)]
5
6use core::fmt;
7use core_json::Read as CjRead;
8use embedded_io::{ReadExactError, Read};
9
10/// An adapter from [`embedded_io::Read`] to [`core_json::Read`].
11pub struct ReadAdapter<R: Read<Error: Copy>> {
12  reader: R,
13}
14impl<R: Read<Error: Copy>> fmt::Debug for ReadAdapter<R> {
15  fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
16    fmt.debug_struct("ReadAdapter").finish_non_exhaustive()
17  }
18}
19
20impl<R: Read<Error: Copy>> From<R> for ReadAdapter<R> {
21  fn from(reader: R) -> Self {
22    Self { reader }
23  }
24}
25
26impl<R: Read<Error: Copy>> CjRead<'static> for ReadAdapter<R> {
27  type Error = ReadExactError<R::Error>;
28
29  #[inline(always)]
30  fn read_byte(&mut self) -> Result<u8, Self::Error> {
31    let mut res = [0; 1];
32    self.reader.read_exact(&mut res)?;
33    Ok(res[0])
34  }
35
36  #[inline(always)]
37  fn read_exact(&mut self, slice: &mut [u8]) -> Result<(), Self::Error> {
38    self.reader.read_exact(slice)
39  }
40}
41
42#[test]
43fn test_read() {
44  const SERIALIZATION: &[u8] = br#"{ "hello": "goodbye" }"#;
45
46  let reader = ReadAdapter::from(SERIALIZATION);
47  let mut deserializer =
48    core_json::Deserializer::<_, core_json::ConstStack<128>>::new(reader).unwrap();
49  let value = deserializer.value().unwrap();
50  let mut fields = value.fields().unwrap();
51  let field = fields.next().unwrap();
52  let mut field = field.unwrap();
53  assert_eq!(field.key().collect::<Result<String, _>>().unwrap(), "hello");
54  assert_eq!(field.value().to_str().unwrap().collect::<Result<String, _>>().unwrap(), "goodbye");
55  assert!(fields.next().is_none());
56}