Macro bsn1::constructed_ber[][src]

macro_rules! constructed_ber {
    ($id:expr $(, ($id_n:expr, $contents_n:expr))*) => { ... };
    ($id:expr $(, ($id_n:expr, $contents_n:expr))*,) => { ... };
}
Expand description

Builds a Ber instance representing Constructed BER effectively.

Formula

constructed_ber!(id: &IdRef [, (id_1, contents_1) [, (id_2, contents_2) [...]]]) => Ber

id_n and contents_n must be bounded on AsRef<[u8]> .

Examples

Empty contents.

use bsn1::{Ber, IdRef};

let id = IdRef::sequence();
let expected = Ber::new(id, &[]);
let ber = constructed_ber!(id);

assert_eq!(expected, ber);

Sequence of 2 BERs.

use bsn1::{contents, Ber, BerRef, IdRef};
use std::convert::TryFrom;

let id = IdRef::sequence();
let id1 = IdRef::octet_string();
let contents1: [u8; 3] = [1, 2, 3];
let id2 = IdRef::integer();
let contents2 = contents::from_integer(10);

let ber = constructed_ber!(id, (id1.to_owned(), contents1), (id2, &contents2));

assert_eq!(id, ber.id());

let bytes = ber.contents();
let ber1 = <&BerRef>::try_from(bytes).unwrap();
assert_eq!(id1, ber1.id());
assert_eq!(contents1, ber1.contents());

let bytes = &bytes[ber1.as_ref().len()..];
let ber2 = <&BerRef>::try_from(bytes).unwrap();
assert_eq!(id2, ber2.id());
assert_eq!(contents2.as_ref(), ber2.contents());