1#![doc = include_str!("./.crate-docs.md")]
2#![forbid(unsafe_code)]
3#![warn(
4 clippy::cargo,
5 missing_docs,
6 clippy::pedantic,
8 future_incompatible,
9 rust_2018_idioms,
10)]
11#![allow(
12 clippy::missing_errors_doc, clippy::option_if_let_else,
14)]
15
16use std::io::{Read, Write};
17
18pub use ciborium;
19use serde::{de::DeserializeOwned, Serialize};
20pub use transmog;
21use transmog::{Format, OwnedDeserializer};
22
23#[derive(Clone, Default)]
25pub struct Cbor;
26
27impl<'a, T> Format<'a, T> for Cbor
28where
29 T: Serialize,
30{
31 type Error = Error;
32
33 fn serialize_into<W: Write>(&self, value: &T, writer: W) -> Result<(), Self::Error> {
34 ciborium::ser::into_writer(value, writer).map_err(Error::from)
35 }
36}
37
38impl<T> OwnedDeserializer<T> for Cbor
39where
40 T: Serialize + DeserializeOwned,
41{
42 fn deserialize_owned(&self, data: &[u8]) -> Result<T, Self::Error> {
43 self.deserialize_from(data)
44 }
45
46 fn deserialize_from<R: Read>(&self, reader: R) -> Result<T, Self::Error> {
47 ciborium::de::from_reader(reader).map_err(Error::from)
48 }
49}
50
51#[derive(thiserror::Error, Debug)]
53pub enum Error {
54 #[error("serialization error: {0}")]
56 Serialization(#[from] ciborium::ser::Error<std::io::Error>),
57 #[error("serialization error: {0}")]
59 Deserialization(#[from] ciborium::de::Error<std::io::Error>),
60}
61
62impl From<std::io::Error> for Error {
63 fn from(err: std::io::Error) -> Self {
64 Error::Serialization(ciborium::ser::Error::Io(err))
65 }
66}
67
68#[test]
69fn format_tests() {
70 transmog::test_util::test_format(&Cbor);
71}