#cbor #binary #serde #minicbor

no-std minicbor-ser

A simple implementation of serde for minicbor

3 unstable releases

0.2.0 Nov 28, 2022
0.1.4 Nov 17, 2022
0.1.3 Mar 16, 2022
0.1.2 Nov 13, 2021

#934 in Encoding

Download history 536/week @ 2023-12-11 219/week @ 2023-12-18 136/week @ 2023-12-25 96/week @ 2024-01-01 215/week @ 2024-01-08 192/week @ 2024-01-15 165/week @ 2024-01-22 575/week @ 2024-01-29 195/week @ 2024-02-05 193/week @ 2024-02-12 179/week @ 2024-02-19 181/week @ 2024-02-26 180/week @ 2024-03-04 228/week @ 2024-03-11 335/week @ 2024-03-18 247/week @ 2024-03-25

1,005 downloads per month
Used in 31 crates (via wasmbus-rpc)

MIT license

62KB
2K SLoC

minicbor-ser

crev reviews

This repository provides a simple implementation of serde for minicbor, making it easier to use.

Quick start

Just like using other serde derived libraries:

[dependencies]
minicbor-ser = "0.1.*"
  • Serialization
use minicbor_ser as cbor;
use serde::Serialize;
fn main(){
    #[derive(Debug, Serialize)]
    struct TestStruct {
        hello: String,
    }

    let test_struct = TestStruct {
            hello: "world".to_string(),
    };

    let value = cbor::to_vec(&test_struct).unwrap();
    assert_eq!(
        [0xA1u8, 0x65, 0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x65, 0x77, 0x6F, 0x72, 0x6C, 0x64],
        value.as_slice(),
    )
}
  • Deserialization
use minicbor_ser as cbor;
use serde::Deserialize;
fn main(){
    #[derive(Debug, Deserialize, PartialEq)]
    struct TestStruct {
        hello: String,
    }

    let data = [0xA1u8, 0x65, 0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x65, 0x77, 0x6F, 0x72, 0x6C, 0x64];
    
    let value: TestStruct = cbor::from_slice(&data[..]).unwrap();
    
    assert_eq!(
        TestStruct {
            hello: "world".to_string(),
        },
        value,
    );
}

By default, structs will be serialized as map and tuples will be serialized as array. If you don't want to wrap top-level struct and tuple with map and array, you can use to_vec_flat. To deserialize you should use from_slice_flat.

let expect = [0x01u8, 0x18, 0xff, 0x65, 0x68, 0x65, 0x6c, 0x6c, 0x6f];
let tuple_flatten = (0x01u8, 0xffu8, "hello");
let value = to_vec_flat(&tuple_flatten).unwrap();
assert_eq!(
    expet,
    value.as_slice(),
)

let data = crate::to_vec_flat(&exp).unwrap();
let value = from_slice_flat(&data).unwrap();
assert_eq!(exp, value);

Type mapping table

The following represents how the minicbor-ser will map the types of Rust and CBOR

  • ❌ : Not support
  • ⚠ : Not perfect yet
Rust CBOR
unsigned integer unsigned integer
negative Integer negative Integer
u128
i128
&str String
String String
struct map (if flatten_top is false)
Map map
slice array (if flatten_top is false)
&[u8] bytes
tuple array (if flatten_top is false)
Vec array (if flatten_top is false)
Vec Bytes
newtype variant map
unit variant String
tuple variant array
struct variant map

no-std

The current no-std feature of minicbor-ser requires alloc. If your machine cannot use alloc, it is recommended that you use the derive feature that comes with minicbor.
To enable no-std, use :

[dependencies]
minicbor-ser = { version = "0.1.*", default-features = false }

Note

Some types of serialization and deserialization may be different from minicbor, depending on how minicbor is implemented. If you need the default implementation of minicbor, please use minicbor_ser::cbor to access its API.

Dependencies

~2MB
~43K SLoC