use bitvec::prelude::*;
use crate::per::PerCodecData;
#[allow(unused)]
use crate::per::common::encode::*;
use crate::PerCodecError;
pub fn encode_choice_idx(
data: &mut PerCodecData,
lb: i128,
ub: i128,
is_extensible: bool,
idx: i128,
extended: bool,
) -> Result<(), PerCodecError> {
encode_choice_idx_common(data, lb, ub, is_extensible, idx, extended, true)
}
pub fn encode_sequence_header(
data: &mut PerCodecData,
is_extensible: bool,
optionals: &BitSlice<u8, Msb0>,
extended: bool,
) -> Result<(), PerCodecError> {
encode_sequence_header_common(data, is_extensible, optionals, extended, true)
}
pub fn encode_integer(
data: &mut PerCodecData,
lb: Option<i128>,
ub: Option<i128>,
is_extensible: bool,
value: i128,
extended: bool,
) -> Result<(), PerCodecError> {
encode_integer_common(data, lb, ub, is_extensible, value, extended, true)
}
pub fn encode_bool(data: &mut PerCodecData, value: bool) -> Result<(), PerCodecError> {
encode_bool_common(data, value, true)
}
pub fn encode_enumerated(
data: &mut PerCodecData,
lb: Option<i128>,
ub: Option<i128>,
is_extensible: bool,
value: i128,
extended: bool,
) -> Result<(), PerCodecError> {
encode_enumerated_common(data, lb, ub, is_extensible, value, extended, true)
}
pub fn encode_bitstring(
data: &mut PerCodecData,
lb: Option<i128>,
ub: Option<i128>,
is_extensible: bool,
bit_string: &BitSlice<u8, Msb0>,
extended: bool,
) -> Result<(), PerCodecError> {
encode_bitstring_common(data, lb, ub, is_extensible, bit_string, extended, true)
}
pub fn encode_octetstring(
data: &mut PerCodecData,
lb: Option<i128>,
ub: Option<i128>,
is_extensible: bool,
octet_string: &Vec<u8>,
extended: bool,
) -> Result<(), PerCodecError> {
encode_octet_string_common(data, lb, ub, is_extensible, octet_string, extended, true)
}
pub fn encode_length_determinent(
data: &mut PerCodecData,
lb: Option<i128>,
ub: Option<i128>,
normally_small: bool,
value: usize,
) -> Result<(), PerCodecError> {
encode_length_determinent_common(data, lb, ub, normally_small, value, true)
}
pub fn encode_visible_string(
data: &mut PerCodecData,
lb: Option<i128>,
ub: Option<i128>,
is_extensible: bool,
value: &String,
extended: bool,
) -> Result<(), PerCodecError> {
encode_string_common(data, lb, ub, is_extensible, value, extended, true)
}
pub fn encode_printable_string(
data: &mut PerCodecData,
lb: Option<i128>,
ub: Option<i128>,
is_extensible: bool,
value: &String,
extended: bool,
) -> Result<(), PerCodecError> {
encode_string_common(data, lb, ub, is_extensible, value, extended, true)
}
pub fn encode_utf8_string(
data: &mut PerCodecData,
lb: Option<i128>,
ub: Option<i128>,
is_extensible: bool,
value: &String,
extended: bool,
) -> Result<(), PerCodecError> {
encode_string_common(data, lb, ub, is_extensible, value, extended, true)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn encode_bool_always_success() {
let mut data = PerCodecData::new_aper();
let result = encode_bool(&mut data, true);
assert!(result.is_ok());
assert_eq!(data.bits.len(), 1);
assert_eq!(data.bits[0], true);
}
#[test]
fn int_too_small() {
assert!(encode_integer(
&mut PerCodecData::new_aper(),
Some(1),
None,
false,
0,
false
)
.is_err());
}
#[test]
fn int_too_big() {
assert!(encode_integer(
&mut PerCodecData::new_aper(),
Some(-1),
Some(0),
false,
1,
false
)
.is_err());
}
#[test]
fn octetstring_too_small() {
assert!(encode_octetstring(
&mut PerCodecData::new_aper(),
Some(2),
None,
false,
&vec![0],
false
)
.is_err());
}
#[test]
fn octetstring_too_big() {
assert!(encode_octetstring(
&mut PerCodecData::new_aper(),
None,
Some(1),
false,
&vec![0, 0],
false
)
.is_err());
}
#[test]
fn string_too_small() {
assert!(encode_visible_string(
&mut PerCodecData::new_aper(),
Some(2),
None,
false,
&"a".to_string(),
false
)
.is_err());
}
#[test]
fn string_too_big() {
assert!(encode_visible_string(
&mut PerCodecData::new_aper(),
None,
Some(1),
false,
&"aa".to_string(),
false
)
.is_err());
}
#[test]
fn length_too_small() {
assert!(
encode_length_determinent(&mut PerCodecData::new_aper(), Some(2), None, false, 1,)
.is_err()
);
}
#[test]
fn length_too_big() {
assert!(
encode_length_determinent(&mut PerCodecData::new_aper(), None, Some(1), false, 2,)
.is_err()
);
}
#[test]
fn big_length_too_big() {
assert!(encode_length_determinent(
&mut PerCodecData::new_aper(),
None,
Some(65536),
false,
65537,
)
.is_err());
}
#[test]
fn bitstring_too_small() {
assert!(encode_bitstring(
&mut PerCodecData::new_aper(),
Some(2),
None,
false,
bits![u8, Msb0; 0],
false
)
.is_err());
}
#[test]
fn bitstring_too_big() {
assert!(encode_bitstring(
&mut PerCodecData::new_aper(),
None,
Some(1),
false,
bits![u8, Msb0; 0, 0],
false
)
.is_err());
}
}