pub mod de;
pub mod enc;
mod ranges;
pub use self::{de::Decoder, enc::Encoder};
use crate::error::{DecodeError, EncodeError};
use crate::types::Constraints;
pub fn decode<T: crate::Decode>(input: &[u8]) -> Result<T, DecodeError> {
T::decode(&mut Decoder::new(
crate::types::BitStr::from_slice(input),
de::DecoderOptions::oer(),
))
}
pub fn encode<T: crate::Encode>(value: &T) -> Result<alloc::vec::Vec<u8>, EncodeError> {
let mut enc = Encoder::new(enc::EncoderOptions::coer());
value.encode(&mut enc)?;
Ok(enc.output())
}
#[allow(dead_code)]
pub fn decode_with_constraints<T: crate::Decode>(
constraints: Constraints,
input: &[u8],
) -> Result<T, DecodeError> {
T::decode_with_constraints(
&mut Decoder::new(
crate::types::BitStr::from_slice(input),
de::DecoderOptions::oer(),
),
constraints,
)
}
#[allow(dead_code)]
pub fn encode_with_constraints<T: crate::Encode>(
constraints: Constraints,
value: &T,
) -> Result<alloc::vec::Vec<u8>, EncodeError> {
let mut enc = Encoder::new(enc::EncoderOptions::coer());
value.encode_with_constraints(&mut enc, constraints)?;
Ok(enc.output())
}
#[cfg(test)]
mod tests {
use crate as rasn;
use crate::prelude::*;
#[test]
fn test_bool() {
for value in 0x01..=0xFEu8 {
let bytes = [value];
decode_error!(coer, bool, &bytes);
decode_ok!(oer, bool, &bytes, true);
}
}
#[test]
fn test_length_determinant() {
decode_error!(coer, Integer, &[0x00, 0x00, 0x00, 0x01, 0x01]);
decode_ok!(oer, Integer, &[0x00, 0x00, 0x00, 0x01, 0x01], 1.into());
decode_error!(coer, Integer, &[0x00, 0x00, 0x00, 0x01, 0x01]);
decode_error!(coer, Integer, &[0b1000_0001, 0x01, 0x01]);
decode_ok!(oer, Integer, &[0b1000_0001, 0x01, 0x01], 1.into());
}
#[test]
fn test_enumerated() {
#[derive(AsnType, Decode, Encode, Debug, Clone, Copy, PartialEq)]
#[rasn(enumerated)]
enum Test {
A = 1,
B = 2,
}
#[derive(AsnType, Decode, Encode, Debug, Clone, Copy, PartialEq)]
#[rasn(enumerated)]
enum TestDefaults {
A,
B,
}
decode_error!(coer, Test, &[0x00, 0x00, 0x00, 0x01, 0x01]);
round_trip!(oer, Test, Test::A, &[0x01]);
round_trip!(oer, TestDefaults, TestDefaults::A, &[0x00]);
decode_ok!(oer, TestDefaults, &[0x00, 0x00], TestDefaults::A);
decode_error!(oer, Test, &[0x00, 0x01]);
decode_error!(oer, Test, &[0x00, 0x81, 0x01]);
decode_ok!(oer, Test, &[0x81, 0x01], Test::A);
decode_ok!(oer, Test, &[0x01], Test::A);
decode_error!(coer, Test, &[0b1000_0001, 0x01]);
decode_ok!(oer, Test, &[0b1000_0001, 0x01], Test::A);
}
}