docchi_compaction/enc_dec/
encode.rs

1use 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
7/// Serialize KVals and return bytes_written.
8pub fn encode<W : Write>(vec : &[KVal], write : &mut W) -> ComResult<usize>{
9    let mut writer = Writer::new(write);
10
11    //どんぶり勘定
12    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                //if 9 <= vec.len(){ panic!("BigStr is too large"); }
72                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                //ここは本当はu64でencodeすべき。気が向いたら直したい
79                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                //let v : &Vec<u8> = v;
86                tag.append(0b0001_1, 5);
87                //ここは本当はu64でencodeすべき。気が向いたら直したい
88                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    //writer.flush()?;
136    return Ok(writer.bytes_written())
137}