docchi_compaction/enc_dec/
encode.rs1use crate::kval_enum::KVal;
2use crate::enc_dec::tag_storage::TagStorage;
3use std::io::Write;
4use crate::enc_dec::writer::Writer;
5use crate::error::ComResult;
6
7pub fn encode<W : Write>(vec : &[KVal], write : &mut W) -> ComResult<usize>{
9 let mut writer = Writer::new(write);
10
11 let mut data : Vec<u8> = Vec::with_capacity(vec.len() * 2);
13 let mut tag = TagStorage::new();
14 for item in vec{
15 match item{
16 KVal::Null =>{ tag.append(0b0100_1, 5) }
17 KVal::Bit(b) =>{ tag.append(0b10 + *b as u64, 2) }
18 KVal::Bool(b) =>{ tag.append(0b0100_010 + *b as u64, 7) }
19 KVal::Byte(i) =>{
20 tag.append(0b011, 3);
21 data.push(*i as u8);
22 },
23 KVal::Str16(s) =>{
24 tag.append(0b0101, 4);
25 if s.len() < 16 {
26 tag.append(s.len() as u64, 4);
27 } else{
28 panic!("Small str's len must be within 15");
29 }
30 data.extend_from_slice(s.as_bytes());
31 },
32 KVal::Int(i) => {
33 let ans = super::var_int::encode(*i);
34 let size = ans.len();
35 if size == 0 || 9 <= size { unreachable!("Int's size must be 1..=8"); }
36 tag.append(0b0011, 4);
37 tag.append((size - 1) as u64, 3);
38 data.extend_from_slice(&ans);
39 },
40 KVal::Float(f) =>{
41 tag.append(0b0010_0001, 8);
42 data.extend_from_slice(&f.to_be_bytes());
43 },
44 KVal::Str256(s) =>{
45 tag.append(0b0010_1, 5);
46 if 256 <= s.len(){
47 panic!("Str256's len must be 0..=255")
48 }
49 data.push(s.len() as u8);
50 data.extend_from_slice(s.as_bytes());
51 },
52 KVal::Double(d) =>{
53 tag.append(0b0010_01, 6);
54 data.extend_from_slice(&d.to_be_bytes());
55 },
56 KVal::Decimal(d) => {
57 let i = d.int;
58 let dot = d.dot;
59 let ans = super::var_int::encode128(i);
60 let size = ans.len();
61 if size == 0 || 17 <= size { unreachable!("decimal's size must be 1..=16"); }
62
63 tag.append(0b0100_001, 7);
64 tag.append((size - 1) as u64, 4);
65 data.extend_from_slice(&ans);
66 data.push(dot);
67 }
68 KVal::BigStr(s)=>{
69 tag.append(0b0010_001, 7);
70 let vec = super::var_int::encode(s.len() as i64);
71 tag.append((vec.len() - 1) as u64, 3);
73 data.extend_from_slice(&vec);
74 data.extend_from_slice(s.as_bytes());
75 },
76 KVal::Binary(v) =>{
77 tag.append(0b0001_1, 5);
78 let vec = super::var_int::encode(v.len() as i64);
80 tag.append((vec.len() - 1) as u64, 3);
81 data.extend_from_slice(&vec);
82 data.extend_from_slice(v);
83 },
84 KVal::BinaryArc(v) =>{
85 tag.append(0b0001_1, 5);
87 let vec = super::var_int::encode(v.len() as i64);
89 tag.append((vec.len() - 1) as u64, 3);
90 data.extend_from_slice(&vec);
91 data.extend_from_slice(v);
92 },
93 KVal::Binary8(v) =>{
94 tag.append(0b0001_01, 6);
95 let vec = super::var_int::encode(v.len() as i64);
96 tag.append((vec.len() - 1) as u64, 3);
97 data.extend_from_slice(&vec);
98 for i in v{
99 data.write_all(&i.to_le_bytes())?;
100 }
101 },
102 KVal::Binary4(v) =>{
103 tag.append(0b0001_001, 7);
104 let vec = super::var_int::encode(v.len() as i64);
105 tag.append((vec.len() - 1) as u64, 3);
106 data.extend_from_slice(&vec);
107 for i in v{
108 data.write_all(&i.to_le_bytes())?;
109 }
110 },
111 KVal::Binary2(v) =>{
112 tag.append(0b0001_0001, 8);
113 let vec = super::var_int::encode(v.len() as i64);
114 tag.append((vec.len() - 1) as u64, 3);
115 data.extend_from_slice(&vec);
116 for i in v{
117 data.write_all(&i.to_le_bytes())?;
118 }
119 },
120 KVal::Undefined(i)=>{
121 if 8 <= *i{ panic!("Undefined must be 0..=7") }
122 tag.append(0b0000_1, 5);
123 tag.append(0, *i as usize);
124 tag.append(1, 1);
125 },
126
127 }
128 }
129 let tag_vec = tag.to_vec();
130
131 super::var_int::write(vec.len() as i64, &mut writer)?;
132 super::var_int::write(tag_vec.len() as i64, &mut writer)?;
133 writer.write(&tag_vec)?;
134 writer.write(&data)?;
135 return Ok(writer.bytes_written())
137}