use alloc::vec::Vec;
pub mod dec;
pub mod enc;
#[derive(Default)]
pub struct SimpleScriptCodec {
data: Vec<u8>,
cursor: usize,
}
impl SimpleScriptCodec {
pub fn data(self) -> Vec<u8> {
self.data
}
pub fn data_push(&mut self, input: u8) {
self.data.push(input)
}
pub fn from_data(data: Vec<u8>) -> Self {
Self { data, cursor: 0 }
}
pub fn bytes_left(&self) -> usize {
self.data.len() - self.cursor
}
}
fn significant_bytes_count(input: i128) -> usize {
let mut dividend = input.saturating_abs();
let mut counter = 0;
while dividend > 256 {
dividend >>= 8;
counter += 1;
}
counter
}
#[cfg(test)]
mod tests {
use alloc::vec::Vec;
use crate::core::value::Value;
use crate::encoding::codecs::simple::SimpleScriptCodec;
use crate::encoding::dec::Decode;
use crate::encoding::enc::Encode;
#[test]
fn test_boolean_false_codec() {
let value = Value::Boolean(false);
let mut codec = SimpleScriptCodec::default();
value.encode(&mut codec);
let encoded = codec.data();
let expected = Vec::<u8>::from([0]);
assert_eq!(encoded, expected);
codec = SimpleScriptCodec::from_data(expected);
let decoded = Value::decode(&mut &mut codec).unwrap();
assert_eq!(decoded, value);
}
#[test]
fn test_boolean_true_codec() {
let value = Value::Boolean(true);
let mut codec = SimpleScriptCodec::default();
value.encode(&mut codec);
let encoded = codec.data();
let expected = Vec::<u8>::from([1]);
assert_eq!(encoded, expected);
codec = SimpleScriptCodec::from_data(expected);
let decoded = Value::decode(&mut &mut codec).unwrap();
assert_eq!(decoded, value);
}
#[test]
fn test_float_codec() {
let value = Value::Float(3.14);
let mut codec = SimpleScriptCodec::default();
value.encode(&mut codec);
let encoded = codec.data();
let expected = Vec::<u8>::from([2, 31, 133, 235, 81, 184, 30, 9, 64]);
assert_eq!(encoded, expected);
codec = SimpleScriptCodec::from_data(expected);
let decoded = Value::decode(&mut &mut codec).unwrap();
assert_eq!(decoded, value);
}
#[test]
fn test_integer_small_codec() {
let value = Value::Integer(255);
let mut codec = SimpleScriptCodec::default();
value.encode(&mut codec);
let encoded = codec.data();
let expected = Vec::<u8>::from([3, 255]);
assert_eq!(encoded, expected);
codec = SimpleScriptCodec::from_data(expected);
let decoded = Value::decode(&mut &mut codec).unwrap();
assert_eq!(decoded, value);
}
#[test]
fn test_integer_big_codec() {
let value = Value::Integer(999999999999999999);
let mut codec = SimpleScriptCodec::default();
value.encode(&mut codec);
let encoded = codec.data();
let expected = Vec::<u8>::from([10, 255, 255, 99, 167, 179, 182, 224, 13]);
assert_eq!(encoded, expected);
codec = SimpleScriptCodec::from_data(expected);
let decoded = Value::decode(&mut &mut codec).unwrap();
assert_eq!(decoded, value);
}
#[test]
fn test_integer_max_codec() {
let value = Value::Integer(i128::MAX);
let mut codec = SimpleScriptCodec::default();
value.encode(&mut codec);
let encoded = codec.data();
let expected = Vec::<u8>::from([
18, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127,
]);
assert_eq!(encoded, expected);
codec = SimpleScriptCodec::from_data(expected);
let decoded = Value::decode(&mut &mut codec).unwrap();
assert_eq!(decoded, value);
}
#[test]
fn test_integer_min_codec() {
let value = Value::Integer(i128::MIN);
let mut codec = SimpleScriptCodec::default();
value.encode(&mut codec);
let encoded = codec.data();
let expected = Vec::<u8>::from([18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128]);
assert_eq!(encoded, expected);
codec = SimpleScriptCodec::from_data(expected);
let decoded = Value::decode(&mut &mut codec).unwrap();
assert_eq!(decoded, value);
}
#[test]
fn test_string_empty_codec() {
let value = Value::String("".into());
let mut codec = SimpleScriptCodec::default();
value.encode(&mut codec);
let encoded = codec.data();
let expected = Vec::<u8>::from([19]);
assert_eq!(encoded, expected);
codec = SimpleScriptCodec::from_data(expected);
let decoded = Value::decode(&mut &mut codec).unwrap();
assert_eq!(decoded, value);
}
#[test]
fn test_string_regular_codec() {
let value = Value::String("Hello, World!".into());
let mut codec = SimpleScriptCodec::default();
value.encode(&mut codec);
let encoded = codec.data();
let expected = Vec::<u8>::from([
20, 13, 72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33,
]);
assert_eq!(encoded, expected);
codec = SimpleScriptCodec::from_data(expected);
let decoded = Value::decode(&mut &mut codec).unwrap();
assert_eq!(decoded, value);
}
#[test]
fn test_string_massive_codec() {
let value = Value::String(
r#"
En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no ha mucho tiempo que vivÃa un
hidalgo de los de lanza en astillero, adarga antigua, rocÃn flaco y galgo corredor. Una olla de algo
más vaca que carnero, salpicón las más noches, duelos y quebrantos los sábados, lentejas los
viernes, algún palomino de añadidura los domingos, consumÃan las tres partes de su hacienda. El
resto della concluÃan sayo de velarte, calzas de velludo para las fiestas con sus pantuflos de lo
mismo, los dÃas de entre semana se honraba con su vellori de lo más fino. TenÃa en su casa una ama
que pasaba de los cuarenta, y una sobrina que no llegaba a los veinte, y un mozo de campo y plaza,
que asà ensillaba el rocÃn como tomaba la podadera. Frisaba la edad de nuestro hidalgo con los
cincuenta años, era de complexión recia, seco de carnes, enjuto de rostro; gran madrugador y amigo
de la caza. Quieren decir que tenÃa el sobrenombre de Quijada o Quesada (que en esto hay alguna
diferencia en los autores que deste caso escriben), aunque por conjeturas verosÃmiles se deja
entender que se llama Quijana; pero esto importa poco a nuestro cuento; basta que en la narración
dél no se salga un punto de la verdad."#
.into(),
);
let mut codec = SimpleScriptCodec::default();
value.encode(&mut codec);
let encoded = codec.data();
let expected = Vec::<u8>::from([
21, 198, 4, 10, 69, 110, 32, 117, 110, 32, 108, 117, 103, 97, 114, 32, 100, 101, 32,
108, 97, 32, 77, 97, 110, 99, 104, 97, 44, 32, 100, 101, 32, 99, 117, 121, 111, 32,
110, 111, 109, 98, 114, 101, 32, 110, 111, 32, 113, 117, 105, 101, 114, 111, 32, 97,
99, 111, 114, 100, 97, 114, 109, 101, 44, 32, 110, 111, 32, 104, 97, 32, 109, 117, 99,
104, 111, 32, 116, 105, 101, 109, 112, 111, 32, 113, 117, 101, 32, 118, 105, 118, 195,
173, 97, 32, 117, 110, 10, 104, 105, 100, 97, 108, 103, 111, 32, 100, 101, 32, 108,
111, 115, 32, 100, 101, 32, 108, 97, 110, 122, 97, 32, 101, 110, 32, 97, 115, 116, 105,
108, 108, 101, 114, 111, 44, 32, 97, 100, 97, 114, 103, 97, 32, 97, 110, 116, 105, 103,
117, 97, 44, 32, 114, 111, 99, 195, 173, 110, 32, 102, 108, 97, 99, 111, 32, 121, 32,
103, 97, 108, 103, 111, 32, 99, 111, 114, 114, 101, 100, 111, 114, 46, 32, 85, 110, 97,
32, 111, 108, 108, 97, 32, 100, 101, 32, 97, 108, 103, 111, 10, 109, 195, 161, 115, 32,
118, 97, 99, 97, 32, 113, 117, 101, 32, 99, 97, 114, 110, 101, 114, 111, 44, 32, 115,
97, 108, 112, 105, 99, 195, 179, 110, 32, 108, 97, 115, 32, 109, 195, 161, 115, 32,
110, 111, 99, 104, 101, 115, 44, 32, 100, 117, 101, 108, 111, 115, 32, 121, 32, 113,
117, 101, 98, 114, 97, 110, 116, 111, 115, 32, 108, 111, 115, 32, 115, 195, 161, 98,
97, 100, 111, 115, 44, 32, 108, 101, 110, 116, 101, 106, 97, 115, 32, 108, 111, 115,
10, 118, 105, 101, 114, 110, 101, 115, 44, 32, 97, 108, 103, 195, 186, 110, 32, 112,
97, 108, 111, 109, 105, 110, 111, 32, 100, 101, 32, 97, 195, 177, 97, 100, 105, 100,
117, 114, 97, 32, 108, 111, 115, 32, 100, 111, 109, 105, 110, 103, 111, 115, 44, 32,
99, 111, 110, 115, 117, 109, 195, 173, 97, 110, 32, 108, 97, 115, 32, 116, 114, 101,
115, 32, 112, 97, 114, 116, 101, 115, 32, 100, 101, 32, 115, 117, 32, 104, 97, 99, 105,
101, 110, 100, 97, 46, 32, 69, 108, 10, 114, 101, 115, 116, 111, 32, 100, 101, 108,
108, 97, 32, 99, 111, 110, 99, 108, 117, 195, 173, 97, 110, 32, 115, 97, 121, 111, 32,
100, 101, 32, 118, 101, 108, 97, 114, 116, 101, 44, 32, 99, 97, 108, 122, 97, 115, 32,
100, 101, 32, 118, 101, 108, 108, 117, 100, 111, 32, 112, 97, 114, 97, 32, 108, 97,
115, 32, 102, 105, 101, 115, 116, 97, 115, 32, 99, 111, 110, 32, 115, 117, 115, 32,
112, 97, 110, 116, 117, 102, 108, 111, 115, 32, 100, 101, 32, 108, 111, 10, 109, 105,
115, 109, 111, 44, 32, 108, 111, 115, 32, 100, 195, 173, 97, 115, 32, 100, 101, 32,
101, 110, 116, 114, 101, 32, 115, 101, 109, 97, 110, 97, 32, 115, 101, 32, 104, 111,
110, 114, 97, 98, 97, 32, 99, 111, 110, 32, 115, 117, 32, 118, 101, 108, 108, 111, 114,
105, 32, 100, 101, 32, 108, 111, 32, 109, 195, 161, 115, 32, 102, 105, 110, 111, 46,
32, 84, 101, 110, 195, 173, 97, 32, 101, 110, 32, 115, 117, 32, 99, 97, 115, 97, 32,
117, 110, 97, 32, 97, 109, 97, 10, 113, 117, 101, 32, 112, 97, 115, 97, 98, 97, 32,
100, 101, 32, 108, 111, 115, 32, 99, 117, 97, 114, 101, 110, 116, 97, 44, 32, 121, 32,
117, 110, 97, 32, 115, 111, 98, 114, 105, 110, 97, 32, 113, 117, 101, 32, 110, 111, 32,
108, 108, 101, 103, 97, 98, 97, 32, 97, 32, 108, 111, 115, 32, 118, 101, 105, 110, 116,
101, 44, 32, 121, 32, 117, 110, 32, 109, 111, 122, 111, 32, 100, 101, 32, 99, 97, 109,
112, 111, 32, 121, 32, 112, 108, 97, 122, 97, 44, 10, 113, 117, 101, 32, 97, 115, 195,
173, 32, 101, 110, 115, 105, 108, 108, 97, 98, 97, 32, 101, 108, 32, 114, 111, 99, 195,
173, 110, 32, 99, 111, 109, 111, 32, 116, 111, 109, 97, 98, 97, 32, 108, 97, 32, 112,
111, 100, 97, 100, 101, 114, 97, 46, 32, 70, 114, 105, 115, 97, 98, 97, 32, 108, 97,
32, 101, 100, 97, 100, 32, 100, 101, 32, 110, 117, 101, 115, 116, 114, 111, 32, 104,
105, 100, 97, 108, 103, 111, 32, 99, 111, 110, 32, 108, 111, 115, 10, 99, 105, 110, 99,
117, 101, 110, 116, 97, 32, 97, 195, 177, 111, 115, 44, 32, 101, 114, 97, 32, 100, 101,
32, 99, 111, 109, 112, 108, 101, 120, 105, 195, 179, 110, 32, 114, 101, 99, 105, 97,
44, 32, 115, 101, 99, 111, 32, 100, 101, 32, 99, 97, 114, 110, 101, 115, 44, 32, 101,
110, 106, 117, 116, 111, 32, 100, 101, 32, 114, 111, 115, 116, 114, 111, 59, 32, 103,
114, 97, 110, 32, 109, 97, 100, 114, 117, 103, 97, 100, 111, 114, 32, 121, 32, 97, 109,
105, 103, 111, 10, 100, 101, 32, 108, 97, 32, 99, 97, 122, 97, 46, 32, 81, 117, 105,
101, 114, 101, 110, 32, 100, 101, 99, 105, 114, 32, 113, 117, 101, 32, 116, 101, 110,
195, 173, 97, 32, 101, 108, 32, 115, 111, 98, 114, 101, 110, 111, 109, 98, 114, 101,
32, 100, 101, 32, 81, 117, 105, 106, 97, 100, 97, 32, 111, 32, 81, 117, 101, 115, 97,
100, 97, 32, 40, 113, 117, 101, 32, 101, 110, 32, 101, 115, 116, 111, 32, 104, 97, 121,
32, 97, 108, 103, 117, 110, 97, 10, 100, 105, 102, 101, 114, 101, 110, 99, 105, 97, 32,
101, 110, 32, 108, 111, 115, 32, 97, 117, 116, 111, 114, 101, 115, 32, 113, 117, 101,
32, 100, 101, 115, 116, 101, 32, 99, 97, 115, 111, 32, 101, 115, 99, 114, 105, 98, 101,
110, 41, 44, 32, 97, 117, 110, 113, 117, 101, 32, 112, 111, 114, 32, 99, 111, 110, 106,
101, 116, 117, 114, 97, 115, 32, 118, 101, 114, 111, 115, 195, 173, 109, 105, 108, 101,
115, 32, 115, 101, 32, 100, 101, 106, 97, 10, 101, 110, 116, 101, 110, 100, 101, 114,
32, 113, 117, 101, 32, 115, 101, 32, 108, 108, 97, 109, 97, 32, 81, 117, 105, 106, 97,
110, 97, 59, 32, 112, 101, 114, 111, 32, 101, 115, 116, 111, 32, 105, 109, 112, 111,
114, 116, 97, 32, 112, 111, 99, 111, 32, 97, 32, 110, 117, 101, 115, 116, 114, 111, 32,
99, 117, 101, 110, 116, 111, 59, 32, 98, 97, 115, 116, 97, 32, 113, 117, 101, 32, 101,
110, 32, 108, 97, 32, 110, 97, 114, 114, 97, 99, 105, 195, 179, 110, 10, 100, 195, 169,
108, 32, 110, 111, 32, 115, 101, 32, 115, 97, 108, 103, 97, 32, 117, 110, 32, 112, 117,
110, 116, 111, 32, 100, 101, 32, 108, 97, 32, 118, 101, 114, 100, 97, 100, 46,
]);
assert_eq!(encoded, expected);
codec = SimpleScriptCodec::from_data(expected);
let decoded = Value::decode(&mut &mut codec).unwrap();
assert_eq!(decoded, value);
}
}