- Add an example of usage - Add a minimal README, including the example code - Document public items - Add more info to Cargo.toml
91 lines
3.0 KiB
Rust
91 lines
3.0 KiB
Rust
// Copyright 2021 Google LLC
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//! Example program demonstrating cbor usage.
|
|
|
|
extern crate alloc;
|
|
|
|
use sk_cbor::values::{SimpleValue, Value};
|
|
use sk_cbor::{cbor_array, cbor_bytes, cbor_map, cbor_null, cbor_true};
|
|
|
|
fn hexify(data: &[u8]) -> String {
|
|
let mut s = String::new();
|
|
for b in data {
|
|
s.push_str(&format!("{:02x}", b));
|
|
}
|
|
s
|
|
}
|
|
|
|
fn main() {
|
|
// Build a CBOR object with various different types included. Note that this
|
|
// object is not built in canonical order.
|
|
let manual_object = Value::Map(vec![
|
|
(
|
|
Value::Unsigned(1),
|
|
Value::Array(vec![Value::Unsigned(2), Value::Unsigned(3)]),
|
|
),
|
|
(
|
|
Value::TextString("tstr".to_owned()),
|
|
Value::ByteString(vec![1, 2, 3]),
|
|
),
|
|
(Value::Negative(-2), Value::Simple(SimpleValue::NullValue)),
|
|
(Value::Unsigned(3), Value::Simple(SimpleValue::TrueValue)),
|
|
]);
|
|
|
|
// Build the same object using the crate's convenience macros.
|
|
let macro_object = cbor_map! {
|
|
1 => cbor_array![2, 3],
|
|
"tstr" => cbor_bytes!(vec![1, 2, 3]),
|
|
-2 => cbor_null!(),
|
|
3 => cbor_true!(),
|
|
};
|
|
|
|
assert_eq!(manual_object, macro_object);
|
|
println!("Object {:?}", manual_object);
|
|
|
|
// Serialize to bytes.
|
|
let mut manual_data = vec![];
|
|
sk_cbor::writer::write(manual_object, &mut manual_data);
|
|
let hex_manual_data = hexify(&manual_data);
|
|
let mut macro_data = vec![];
|
|
sk_cbor::writer::write(macro_object, &mut macro_data);
|
|
let hex_macro_data = hexify(¯o_data);
|
|
|
|
assert_eq!(hex_manual_data, hex_macro_data);
|
|
|
|
// Serialized version is in canonical order.
|
|
println!("Serializes to {}", hex_manual_data);
|
|
assert_eq!(
|
|
hex_manual_data,
|
|
concat!(
|
|
"a4", // 4-map
|
|
"01", // int(1) =>
|
|
"820203", // 2-array [2, 3],
|
|
"03", // int(3) =>
|
|
"f5", // true,
|
|
"21", // nint(-2) =>
|
|
"f6", // null,
|
|
"6474737472", // 4-tstr "tstr" =>
|
|
"43010203" // 3-bstr
|
|
)
|
|
);
|
|
|
|
// Convert back to an object. This is different than the original object,
|
|
// because the map is now in canonical order.
|
|
let recovered_object = sk_cbor::reader::read(&manual_data).unwrap();
|
|
println!("Deserializes to {:?}", recovered_object);
|
|
}
|