use std::fmt::Debug;
use std::io::BufRead;
use amplify::confinement::Confined;
use crate::{StrictDecode, StrictEncode, StrictReader, StrictWriter};
pub fn encode<T: StrictEncode + Debug + Eq>(val: &T) -> Vec<u8> {
const MAX: usize = u16::MAX as usize;
let ast_data = StrictWriter::in_memory::<MAX>();
let data = val.strict_encode(ast_data).unwrap().unbox().unconfine();
Confined::<Vec<u8>, 0, MAX>::try_from(data).unwrap().release()
}
pub fn decode<T: StrictDecode + Debug + Eq>(data: impl AsRef<[u8]>) -> T {
const MAX: usize = u16::MAX as usize;
let mut reader = StrictReader::in_memory::<MAX>(data);
let val2 = T::strict_decode(&mut reader).unwrap();
let mut cursor = reader.into_cursor();
assert!(!cursor.fill_buf().unwrap().is_empty(), "data not entirely consumed");
val2
}
#[allow(dead_code)]
pub fn encoding_roundtrip<T: StrictEncode + StrictDecode + Debug + Eq>(val: &T) {
let data = encode(val);
let val2: T = decode(data);
assert_eq!(val, &val2);
}
#[allow(dead_code)]
pub fn encoding<T: StrictEncode + StrictDecode + Debug + Eq>(val: &T, expect: impl AsRef<[u8]>) {
let data = encode(val);
assert_eq!(&data[..], expect.as_ref());
let val2: T = decode(data);
assert_eq!(val, &val2);
}