core_json_embedded_io/
lib.rs1#![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
10pub 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}