use bitvec::prelude::*;
use crate::aper::AperCodecData;
use crate::aper::AperCodecError;
mod decode_internal;
use decode_internal::*;
pub use decode_internal::decode_length_determinent;
pub fn decode_choice_idx(
data: &mut AperCodecData,
lb: i128,
ub: i128,
is_extensible: bool,
) -> Result<(i128, bool), AperCodecError> {
eprintln!("decode_choice_idx");
data.dump();
let (idx, extended) = if is_extensible {
let extended = data.decode_bool()?;
if !extended {
let (idx, _) = decode_integer(data, Some(lb), Some(ub), false)?;
(idx, extended)
} else {
let idx = decode_normally_small_non_negative_whole_number(data)?;
(idx, extended)
}
} else {
let (idx, _) = decode_integer(data, Some(lb), Some(ub), false)?;
(idx, false)
};
data.dump();
Ok((idx, extended))
}
pub fn decode_sequence_header(
data: &mut AperCodecData,
is_extensible: bool,
optional_count: usize,
) -> Result<(BitVec<Msb0, u8>, bool), AperCodecError> {
eprintln!("decode_sequence_header");
data.dump();
let extended = if is_extensible {
data.decode_bool()?
} else {
false
};
let mut bitmap = BitVec::new();
if optional_count > 0 {
bitmap.extend(data.get_bitvec(optional_count)?);
}
data.dump();
Ok((bitmap, extended))
}
pub fn decode_integer(
data: &mut AperCodecData,
lb: Option<i128>,
ub: Option<i128>,
is_extensible: bool,
) -> Result<(i128, bool), AperCodecError> {
eprintln!("decode_integer");
data.dump();
let extended_value = if is_extensible {
let v = data.decode_bool()?;
v
} else {
false
};
let value = if extended_value {
decode_unconstrained_whole_number(data)?
} else {
if lb.is_none() {
decode_unconstrained_whole_number(data)?
} else {
let lb = lb.unwrap();
if ub.is_none() {
decode_semi_constrained_whole_number(data, lb)?
} else {
let ub = ub.unwrap();
eprintln!("decode_constrained_whole_number: {}, {}", lb, ub);
decode_constrained_whole_number(data, lb, ub)?
}
}
};
data.dump();
Ok((value, extended_value))
}
pub fn decode_bool(data: &mut AperCodecData) -> Result<bool, AperCodecError> {
eprintln!("decode_bool");
data.dump();
data.decode_bool()
}
pub fn decode_enumerated(
data: &mut AperCodecData,
lb: Option<i128>,
ub: Option<i128>,
is_extensible: bool,
) -> Result<(i128, bool), AperCodecError> {
eprintln!("decode_enumerated");
data.dump();
let is_extended = if is_extensible {
let is_extended = data.decode_bool()?;
is_extended
} else {
false
};
let decoded = if !is_extended {
let decoded = decode_integer(data, lb, ub, false)?;
decoded.0
} else {
decode_normally_small_non_negative_whole_number(data)?
};
data.dump();
Ok((decoded, is_extended))
}
pub fn decode_bitstring(
data: &mut AperCodecData,
lb: Option<i128>,
ub: Option<i128>,
is_extensible: bool,
) -> Result<BitVec<Msb0, u8>, AperCodecError> {
let is_extended = if is_extensible {
data.decode_bool()?
} else {
false
};
let mut bv = BitVec::new();
loop {
let length = if is_extended {
decode_length_determinent(data, None, None, false)?
} else {
decode_length_determinent(data, lb, ub, false)?
};
if length > 0 {
if length > 16 {
let _ = data.decode_align()?;
}
bv.extend(data.get_bitvec(length)?);
}
if length >= 16384 {
continue;
} else {
break;
}
}
Ok(bv)
}
pub fn decode_octetstring(
data: &mut AperCodecData,
lb: Option<i128>,
ub: Option<i128>,
is_extensible: bool,
) -> Result<Vec<u8>, AperCodecError> {
let is_extended = if is_extensible {
data.decode_bool()?
} else {
false
};
let mut octets = Vec::new();
loop {
let length = if is_extended {
decode_length_determinent(data, None, None, false)?
} else {
decode_length_determinent(data, lb, ub, false)?
};
if length > 0 {
if length > 2 {
let _ = data.decode_align()?;
}
octets.extend(data.get_bytes(length)?);
}
if length >= 16384 {
continue;
} else {
break;
}
}
Ok(octets)
}
mod decode_charstrings;
pub use decode_charstrings::*;