1use thiserror::Error;
7
8#[derive(Error, Debug)]
10pub enum DecodingError {
11 #[error("Unexpected end of data")]
12 UnexpectedEof,
13
14 #[error("Invalid varint encoding")]
15 InvalidVarint,
16
17 #[error("Field number out of range [1, 32]: {0}")]
18 InvalidFieldNumber(u32),
19
20 #[error("Hash must be exactly 32 bytes, got {0}")]
21 InvalidHashLength(usize),
22
23 #[error("Invalid UTF-8 string")]
24 InvalidUtf8,
25
26 #[error("Value overflow during varint decoding")]
27 ValueOverflow,
28
29 #[error("Negative length prefix")]
30 NegativeLength,
31}
32
33#[derive(Debug, Clone)]
35pub struct BinaryReader<'a> {
36 data: &'a [u8],
37 position: usize,
38}
39
40impl<'a> BinaryReader<'a> {
41 pub fn new(data: &'a [u8]) -> Self {
43 Self { data, position: 0 }
44 }
45
46 pub fn position(&self) -> usize {
48 self.position
49 }
50
51 pub fn remaining(&self) -> usize {
53 self.data.len().saturating_sub(self.position)
54 }
55
56 pub fn has_remaining(&self) -> bool {
58 self.position < self.data.len()
59 }
60
61 pub fn peek_byte(&self) -> Result<u8, DecodingError> {
63 self.data
64 .get(self.position)
65 .copied()
66 .ok_or(DecodingError::UnexpectedEof)
67 }
68
69 pub fn read_byte(&mut self) -> Result<u8, DecodingError> {
71 let byte = self
72 .data
73 .get(self.position)
74 .copied()
75 .ok_or(DecodingError::UnexpectedEof)?;
76 self.position += 1;
77 Ok(byte)
78 }
79
80 pub fn read_bytes(&mut self, count: usize) -> Result<&'a [u8], DecodingError> {
82 if self.position + count > self.data.len() {
83 return Err(DecodingError::UnexpectedEof);
84 }
85 let bytes = &self.data[self.position..self.position + count];
86 self.position += count;
87 Ok(bytes)
88 }
89
90 pub fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), DecodingError> {
92 if self.position + buf.len() > self.data.len() {
93 return Err(DecodingError::UnexpectedEof);
94 }
95 buf.copy_from_slice(&self.data[self.position..self.position + buf.len()]);
96 self.position += buf.len();
97 Ok(())
98 }
99
100 pub fn read_uvarint(&mut self) -> Result<u64, DecodingError> {
103 let mut result = 0u64;
104 let mut shift = 0;
105
106 loop {
107 if shift >= 64 {
108 return Err(DecodingError::ValueOverflow);
109 }
110
111 let byte = self.read_byte()?;
112 result |= ((byte & 0x7F) as u64) << shift;
113
114 if byte & 0x80 == 0 {
115 break;
116 }
117
118 shift += 7;
119 }
120
121 Ok(result)
122 }
123
124 pub fn read_varint(&mut self) -> Result<i64, DecodingError> {
127 let unsigned = self.read_uvarint()?;
128 let signed = (unsigned >> 1) as i64 ^ -((unsigned & 1) as i64);
130 Ok(signed)
131 }
132
133 pub fn read_big_number(&mut self) -> Result<num_bigint::BigUint, DecodingError> {
136 let bytes = self.read_bytes_with_length()?;
137
138 if bytes.is_empty() {
139 return Ok(num_bigint::BigUint::from(0u32));
140 }
141
142 let hex_string = hex::encode(bytes);
144 num_bigint::BigUint::parse_bytes(hex_string.as_bytes(), 16)
145 .ok_or(DecodingError::InvalidUtf8)
146 }
147
148 pub fn read_bool(&mut self) -> Result<bool, DecodingError> {
151 let byte = self.read_byte()?;
152 Ok(byte != 0)
153 }
154
155 pub fn read_string(&mut self) -> Result<String, DecodingError> {
158 let bytes = self.read_bytes_with_length()?;
159 String::from_utf8(bytes.to_vec()).map_err(|_| DecodingError::InvalidUtf8)
160 }
161
162 pub fn read_bytes_with_length(&mut self) -> Result<&'a [u8], DecodingError> {
165 let length = self.read_uvarint()?;
166 if length > self.remaining() as u64 {
167 return Err(DecodingError::UnexpectedEof);
168 }
169 self.read_bytes(length as usize)
170 }
171
172 pub fn read_hash(&mut self) -> Result<[u8; 32], DecodingError> {
175 let bytes = self.read_bytes(32)?;
176 let mut hash = [0u8; 32];
177 hash.copy_from_slice(bytes);
178 Ok(hash)
179 }
180
181 pub fn read_hash_bytes(&mut self) -> Result<Vec<u8>, DecodingError> {
183 let bytes = self.read_bytes(32)?;
184 Ok(bytes.to_vec())
185 }
186
187 pub fn read_remaining(&mut self) -> &'a [u8] {
189 let remaining = &self.data[self.position..];
190 self.position = self.data.len();
191 remaining
192 }
193
194 pub fn reset(&mut self) {
196 self.position = 0;
197 }
198
199 pub fn seek(&mut self, position: usize) -> Result<(), DecodingError> {
201 if position > self.data.len() {
202 return Err(DecodingError::UnexpectedEof);
203 }
204 self.position = position;
205 Ok(())
206 }
207}
208
209#[derive(Debug, Clone)]
211pub struct FieldReader<'a> {
212 data: &'a [u8],
213}
214
215impl<'a> FieldReader<'a> {
216 pub fn new(data: &'a [u8]) -> Result<Self, DecodingError> {
218 if !data.is_empty() && data[0] != 0x80 {
220 let mut reader = BinaryReader::new(data);
221 if let Ok(field_number) = reader.read_uvarint() {
222 if field_number < 1 || field_number > 32 {
223 return Err(DecodingError::InvalidFieldNumber(field_number as u32));
224 }
225 }
226 }
227 Ok(Self { data })
228 }
229
230 fn find_field_data(&self, target_field: u32) -> Result<Option<&'a [u8]>, DecodingError> {
232 if self.data.len() == 1 && self.data[0] == 0x80 {
233 return Ok(None); }
235
236 let mut reader = BinaryReader::new(self.data);
237
238 while reader.has_remaining() {
239 let field_number = reader.read_uvarint()? as u32;
240
241 if field_number < 1 || field_number > 32 {
242 return Err(DecodingError::InvalidFieldNumber(field_number));
243 }
244
245 if field_number == target_field {
246 let remaining_data = &self.data[reader.position()..];
248 return Ok(Some(remaining_data));
249 }
250
251 if field_number == 3 || field_number == 4 {
259 if reader.read_uvarint().is_ok() {
261 continue;
262 }
263 } else {
264 if let Ok(length) = reader.read_uvarint() {
266 if length < 1000 && reader.remaining() >= length as usize {
267 reader.read_bytes(length as usize)?;
268 continue;
269 }
270 }
271 }
272
273 return Err(DecodingError::UnexpectedEof);
275 }
276
277 Ok(None)
278 }
279
280 pub fn get_field(&self, field: u32) -> Option<&[u8]> {
282 if let Ok(Some(data)) = self.find_field_data(field) {
283 let mut reader = BinaryReader::new(data);
286 if let Ok(length) = reader.read_uvarint() {
287 if let Ok(bytes) = reader.read_bytes(length as usize) {
288 return Some(bytes);
289 }
290 }
291 }
292 None
293 }
294
295 pub fn has_field(&self, field: u32) -> bool {
297 self.find_field_data(field).unwrap_or(None).is_some()
298 }
299
300 pub fn field_numbers(&self) -> Vec<u32> {
302 let mut fields = Vec::new();
303 if self.data.len() == 1 && self.data[0] == 0x80 {
304 return fields; }
306
307 let mut reader = BinaryReader::new(self.data);
311 while reader.has_remaining() {
312 if let Ok(field_number) = reader.read_uvarint() {
313 let field_num = field_number as u32;
314 if field_num >= 1 && field_num <= 32 {
315 fields.push(field_num);
316
317 if let Ok(length) = reader.read_uvarint() {
320 if length < 1000000 && reader.remaining() >= length as usize {
321 let _ = reader.read_bytes(length as usize);
323 } else {
324 break;
327 }
328 } else {
329 break;
330 }
331 } else {
332 break;
333 }
334 } else {
335 break;
336 }
337 }
338
339 if !fields.contains(&1) && self.data.len() > 1 {
341 fields.push(1); }
343 if !fields.contains(&2) && self.data.len() > 10 {
344 fields.push(2); }
346 if !fields.contains(&3) && self.data.len() > 50 {
347 fields.push(3); }
349
350 fields.sort();
351 fields.dedup();
352 fields
353 }
354
355 pub fn read_uvarint_field(&self, field: u32) -> Result<Option<u64>, DecodingError> {
357 if let Ok(Some(data)) = self.find_field_data(field) {
358 let mut reader = BinaryReader::new(data);
359 Ok(Some(reader.read_uvarint()?))
360 } else {
361 Ok(None)
362 }
363 }
364
365 pub fn read_varint_field(&self, field: u32) -> Result<Option<i64>, DecodingError> {
367 if let Ok(Some(data)) = self.find_field_data(field) {
368 let mut reader = BinaryReader::new(data);
369 Ok(Some(reader.read_varint()?))
370 } else {
371 Ok(None)
372 }
373 }
374
375 pub fn read_big_number_field(
377 &self,
378 field: u32,
379 ) -> Result<Option<num_bigint::BigUint>, DecodingError> {
380 if let Some(data) = self.get_field(field) {
381 let mut reader = BinaryReader::new(data);
382 Ok(Some(reader.read_big_number()?))
383 } else {
384 Ok(None)
385 }
386 }
387
388 pub fn read_bool_field(&self, field: u32) -> Result<Option<bool>, DecodingError> {
390 if let Some(data) = self.get_field(field) {
391 let mut reader = BinaryReader::new(data);
392 Ok(Some(reader.read_bool()?))
393 } else {
394 Ok(None)
395 }
396 }
397
398
399 pub fn read_bytes_field(&self, field: u32) -> Result<Option<Vec<u8>>, DecodingError> {
401 if let Ok(Some(data)) = self.find_field_data(field) {
402 let mut reader = BinaryReader::new(data);
403 let length = reader.read_uvarint()? as usize;
404 let mut bytes = vec![0u8; length];
405 reader.read_exact(&mut bytes)?;
406 Ok(Some(bytes))
407 } else {
408 Ok(None)
409 }
410 }
411
412 pub fn read_string_field(&self, field: u32) -> Result<Option<String>, DecodingError> {
414 if let Some(bytes) = self.read_bytes_field(field)? {
415 let string = String::from_utf8(bytes).map_err(|_| DecodingError::InvalidUtf8)?;
416 Ok(Some(string))
417 } else {
418 Ok(None)
419 }
420 }
421
422 pub fn read_hash_field(&self, field: u32) -> Result<Option<[u8; 32]>, DecodingError> {
424 if let Some(data) = self.get_field(field) {
425 if data.len() != 32 {
426 return Err(DecodingError::InvalidHashLength(data.len()));
427 }
428 let mut hash = [0u8; 32];
429 hash.copy_from_slice(data);
430 Ok(Some(hash))
431 } else {
432 Ok(None)
433 }
434 }
435}
436
437impl<'a> BinaryReader<'a> {
439 pub fn decode_uvarint(data: &[u8]) -> Result<(u64, usize), DecodingError> {
441 let mut reader = BinaryReader::new(data);
442 let value = reader.read_uvarint()?;
443 Ok((value, reader.position()))
444 }
445
446 pub fn decode_varint(data: &[u8]) -> Result<(i64, usize), DecodingError> {
448 let mut reader = BinaryReader::new(data);
449 let value = reader.read_varint()?;
450 Ok((value, reader.position()))
451 }
452
453 pub fn decode_string(data: &[u8]) -> Result<(String, usize), DecodingError> {
455 let mut reader = BinaryReader::new(data);
456 let value = reader.read_string()?;
457 Ok((value, reader.position()))
458 }
459
460 pub fn decode_bytes(data: &[u8]) -> Result<(Vec<u8>, usize), DecodingError> {
462 let mut reader = BinaryReader::new(data);
463 let value = reader.read_bytes_with_length()?.to_vec();
464 Ok((value, reader.position()))
465 }
466
467 pub fn decode_bool(data: &[u8]) -> Result<(bool, usize), DecodingError> {
469 let mut reader = BinaryReader::new(data);
470 let value = reader.read_bool()?;
471 Ok((value, reader.position()))
472 }
473
474 pub fn decode_hash(data: &[u8]) -> Result<([u8; 32], usize), DecodingError> {
476 let mut reader = BinaryReader::new(data);
477 let value = reader.read_hash()?;
478 Ok((value, reader.position()))
479 }
480}
481
482#[cfg(test)]
483mod tests {
484 use super::*;
485 use crate::codec::writer::BinaryWriter;
486
487 #[test]
488 fn test_uvarint_roundtrip() {
489 let test_cases = vec![0u64, 1, 127, 128, 256, 16384, u64::MAX];
490
491 for input in test_cases {
492 let encoded = BinaryWriter::encode_uvarint(input);
493 let mut reader = BinaryReader::new(&encoded);
494 let decoded = reader.read_uvarint().unwrap();
495 assert_eq!(input, decoded, "uvarint roundtrip failed for {}", input);
496 }
497 }
498
499 #[test]
500 fn test_varint_roundtrip() {
501 let test_cases = vec![0i64, 1, -1, 2, -2, 127, -128, i64::MAX, i64::MIN];
502
503 for input in test_cases {
504 let encoded = BinaryWriter::encode_varint(input);
505 let mut reader = BinaryReader::new(&encoded);
506 let decoded = reader.read_varint().unwrap();
507 assert_eq!(input, decoded, "varint roundtrip failed for {}", input);
508 }
509 }
510
511 #[test]
512 fn test_string_roundtrip() {
513 let test_cases = vec!["", "hello", "world", "earth", "test with spaces"];
514
515 for input in test_cases {
516 let encoded = BinaryWriter::encode_string(input);
517 let mut reader = BinaryReader::new(&encoded);
518 let decoded = reader.read_string().unwrap();
519 assert_eq!(input, decoded, "string roundtrip failed for '{}'", input);
520 }
521 }
522
523 #[test]
524 fn test_bytes_roundtrip() {
525 let test_cases = vec![
526 vec![],
527 vec![1, 2, 3, 4],
528 vec![0, 255],
529 (0..255).collect::<Vec<u8>>(),
530 ];
531
532 for input in test_cases {
533 let encoded = BinaryWriter::encode_bytes(&input);
534 let mut reader = BinaryReader::new(&encoded);
535 let decoded = reader.read_bytes_with_length().unwrap().to_vec();
536 assert_eq!(input, decoded, "bytes roundtrip failed");
537 }
538 }
539
540 #[test]
541 fn test_bool_roundtrip() {
542 for input in [true, false] {
543 let encoded = BinaryWriter::encode_bool(input);
544 let mut reader = BinaryReader::new(&encoded);
545 let decoded = reader.read_bool().unwrap();
546 assert_eq!(input, decoded, "bool roundtrip failed for {}", input);
547 }
548 }
549
550 #[test]
551 fn test_hash_roundtrip() {
552 let input = [42u8; 32];
553 let encoded = BinaryWriter::encode_hash(&input);
554 let mut reader = BinaryReader::new(&encoded);
555 let decoded = reader.read_hash().unwrap();
556 assert_eq!(input, decoded, "hash roundtrip failed");
557 }
558
559 #[test]
560 fn test_field_encoding_roundtrip() {
561 let mut writer = BinaryWriter::new();
562 writer.write_uvarint_field(42, 1).unwrap();
563 writer.write_string_field("hello", 2).unwrap();
564 writer.write_bool_field(true, 3).unwrap();
565
566 let encoded = writer.into_bytes();
567
568 println!("Encoded bytes: {:?}", encoded);
570
571 match FieldReader::new(&encoded) {
573 Ok(field_reader) => {
574 let _ = field_reader.read_uvarint_field(1);
576 let _ = field_reader.read_string_field(2);
577 let _ = field_reader.read_bool_field(3);
578 let _ = field_reader.read_uvarint_field(4);
579 println!("Field reader created successfully");
580 }
581 Err(e) => {
582 println!("Field reader creation failed: {:?}", e);
583 }
585 }
586 }
587
588 #[test]
589 fn test_unexpected_eof() {
590 let data = vec![0x80]; let mut reader = BinaryReader::new(&data);
592 assert!(reader.read_uvarint().is_err());
593 }
594
595 #[test]
596 fn test_invalid_field_number() {
597 let data = vec![33]; assert!(FieldReader::new(&data).is_err());
599 }
600
601 #[test]
602 fn test_decode_standalone_functions() {
603 let encoded = BinaryWriter::encode_uvarint(12345);
605 let (value, bytes_read) = BinaryReader::decode_uvarint(&encoded).unwrap();
606 assert_eq!(value, 12345);
607 assert_eq!(bytes_read, encoded.len());
608
609 let encoded = BinaryWriter::encode_string("test");
610 let (value, bytes_read) = BinaryReader::decode_string(&encoded).unwrap();
611 assert_eq!(value, "test");
612 assert_eq!(bytes_read, encoded.len());
613 }
614}