1use crate::{Hash, Uint256, VarInt};
2use encodings::{FromHex, FromHexError, ToHex};
3use std::fmt;
4use std::ops;
5
6#[derive(thiserror::Error, Debug)]
7pub enum BufferError {
8 #[error("Read Out of Bounds")]
9 OutOfBounds,
10 #[error(transparent)]
11 InvalidString(#[from] std::string::FromUtf8Error),
12 #[error("Non-Minimal VarInt")]
13 NonMinimalVarInt,
14}
15
16pub type Result<T> = std::result::Result<T, BufferError>;
17
18#[derive(Default, PartialEq, Clone, Eq)]
20pub struct Buffer {
21 data: Vec<u8>,
22 offset: usize,
23}
24
25impl Buffer {
26 pub fn new() -> Self {
27 Buffer::default()
28 }
29
30 pub fn write_u8(&mut self, data: u8) {
37 self.data.extend_from_slice(&data.to_le_bytes());
38 }
39
40 pub fn write_u16(&mut self, data: u16) {
41 self.data.extend_from_slice(&data.to_le_bytes());
42 }
43
44 pub fn write_u32(&mut self, data: u32) {
45 self.data.extend_from_slice(&data.to_le_bytes());
46 }
47
48 pub fn write_u64(&mut self, data: u64) {
49 self.data.extend_from_slice(&data.to_le_bytes());
50 }
51
52 pub fn write_u256(&mut self, data: Uint256) {
55 self.data.extend_from_slice(&data.to_le_bytes());
56 }
57
58 pub fn write_u8_be(&mut self, data: u8) {
60 self.data.extend_from_slice(&data.to_be_bytes());
61 }
62
63 pub fn write_u16_be(&mut self, data: u16) {
64 self.data.extend_from_slice(&data.to_be_bytes());
65 }
66
67 pub fn write_u32_be(&mut self, data: u32) {
68 self.data.extend_from_slice(&data.to_be_bytes());
69 }
70
71 pub fn write_u64_be(&mut self, data: u64) {
72 self.data.extend_from_slice(&data.to_be_bytes());
73 }
74
75 pub fn write_i8(&mut self, data: i8) {
79 self.data.extend_from_slice(&data.to_le_bytes());
80 }
81
82 pub fn write_i16(&mut self, data: i16) {
83 self.data.extend_from_slice(&data.to_le_bytes());
84 }
85
86 pub fn write_i32(&mut self, data: i32) {
87 self.data.extend_from_slice(&data.to_le_bytes());
88 }
89
90 pub fn write_i64(&mut self, data: i64) {
91 self.data.extend_from_slice(&data.to_le_bytes());
92 }
93
94 pub fn write_i8_be(&mut self, data: i8) {
96 self.data.extend_from_slice(&data.to_be_bytes());
97 }
98
99 pub fn write_i16_be(&mut self, data: i16) {
100 self.data.extend_from_slice(&data.to_be_bytes());
101 }
102
103 pub fn write_i32_be(&mut self, data: i32) {
104 self.data.extend_from_slice(&data.to_be_bytes());
105 }
106
107 pub fn write_i64_be(&mut self, data: i64) {
108 self.data.extend_from_slice(&data.to_be_bytes());
109 }
110
111 pub fn write_bytes(&mut self, bytes: &[u8]) {
112 self.data.extend_from_slice(bytes);
114 }
115
116 pub fn write_var_bytes(&mut self, bytes: &[u8]) {
117 self.write_varint(bytes.len());
118
119 if bytes.is_empty() {
120 return;
121 }
122
123 self.data.extend_from_slice(bytes);
124 }
125
126 pub fn write_str(&mut self, string: &str) {
127 self.data.extend_from_slice(string.as_bytes());
128 }
129
130 pub fn write_string(&mut self, string: String) {
131 self.data.extend_from_slice(string.as_bytes());
132 }
133
134 pub fn write_hash(&mut self, hash: Hash) {
135 self.data.extend(hash.to_array());
136 }
137
138 pub fn write_varint(&mut self, data: usize) {
139 if data < 0xFD {
140 self.write_u8(data as u8);
141 return;
142 }
143
144 if data < 0xFFFF {
145 self.write_u8(0xFD);
146 self.write_u16(data as u16);
147 return;
148 }
149
150 if data < 0xFFFFFFFF {
151 self.write_u8(0xFE);
152 self.write_u32(data as u32);
153 return;
154 }
155
156 self.write_u8(0xFF);
157 self.write_u64(data as u64);
158 }
159
160 pub fn fill(&mut self, value: u8, amount: usize) {
161 let fill_amount = vec![value; amount];
163 self.data.extend(fill_amount);
164 }
165
166 pub fn extend(&mut self, buffer: Buffer) {
167 self.data.extend_from_slice(&buffer);
168 }
169
170 pub fn extend_from_slice(&mut self, slice: &[u8]) {
171 self.data.extend_from_slice(slice);
172 }
173
174 pub fn into_hex(self) -> String {
176 self.data.to_hex()
177 }
178
179 pub fn check(&self, size: usize) -> Result<()> {
181 if self.offset + size > self.data.len() {
182 return Err(BufferError::OutOfBounds);
183 }
184 Ok(())
185 }
186
187 pub fn read_u8(&mut self) -> Result<u8> {
189 self.check(1)?;
190 let result = self.data[self.offset];
191
192 self.offset += 1;
193
194 Ok(result)
195 }
196
197 pub fn read_u16(&mut self) -> Result<u16> {
198 self.check(2)?;
199 let range = self.offset..self.offset + 2;
200
201 let mut buf = [0; 2];
202 buf.copy_from_slice(&self.data[range]);
203
204 let ret = u16::from_le_bytes(buf);
205
206 self.offset += 2;
207
208 Ok(ret)
209 }
210
211 pub fn read_u16_be(&mut self) -> Result<u16> {
212 self.check(2)?;
213 let range = self.offset..self.offset + 2;
214
215 let mut buf = [0; 2];
216 buf.copy_from_slice(&self.data[range]);
217
218 let ret = u16::from_be_bytes(buf);
219
220 self.offset += 2;
221
222 Ok(ret)
223 }
224
225 pub fn read_u32(&mut self) -> Result<u32> {
228 self.check(4)?;
229 let range = self.offset..self.offset + 4;
230
231 let mut buf = [0; 4];
232 buf.copy_from_slice(&self.data[range]);
233
234 let ret = u32::from_le_bytes(buf);
235
236 self.offset += 4;
237
238 Ok(ret)
239 }
240
241 pub fn read_u32_be(&mut self) -> Result<u32> {
242 self.check(4)?;
243 let range = self.offset..self.offset + 4;
244
245 let mut buf = [0; 4];
246 buf.copy_from_slice(&self.data[range]);
247
248 let ret = u32::from_be_bytes(buf);
249
250 self.offset += 4;
251
252 Ok(ret)
253 }
254
255 pub fn read_u64(&mut self) -> Result<u64> {
256 self.check(8)?;
257 let range = self.offset..self.offset + 8;
258
259 let mut buf = [0; 8];
260 buf.copy_from_slice(&self.data[range]);
261
262 let ret = u64::from_le_bytes(buf);
263
264 self.offset += 8;
265
266 Ok(ret)
267 }
268
269 pub fn read_u64_be(&mut self) -> Result<u64> {
270 self.check(8)?;
271 let range = self.offset..self.offset + 8;
272
273 let mut buf = [0; 8];
274 buf.copy_from_slice(&self.data[range]);
275
276 let ret = u64::from_be_bytes(buf);
277
278 self.offset += 8;
279
280 Ok(ret)
281 }
282
283 pub fn read_u256(&mut self) -> Result<Uint256> {
284 self.check(32)?;
285
286 let range = self.offset..self.offset + 32;
287 let ret = Uint256::from_bytes(&self.data[range]);
288
289 self.offset += 32;
290
291 Ok(ret)
292 }
293
294 pub fn read_varint(&mut self) -> Result<VarInt> {
295 let len = self.read_u8()?;
296
297 match len {
298 0xFF => {
299 let num = self.read_u64()?;
300 if num < 0x100000000 {
301 Err(BufferError::NonMinimalVarInt)
302 } else {
303 Ok(VarInt::from(num))
304 }
305 }
306 0xFE => {
307 let num = self.read_u32()?;
308 if num < 0x10000 {
309 Err(BufferError::NonMinimalVarInt)
310 } else {
311 Ok(VarInt::from(num))
312 }
313 }
314 0xFD => {
315 let num = self.read_u16()?;
316 if num < 0xFD {
317 Err(BufferError::NonMinimalVarInt)
318 } else {
319 Ok(VarInt::from(num))
320 }
321 }
322
323 len => Ok(VarInt::from(len)),
324 }
325 }
326
327 pub fn read_string(&mut self, size: usize) -> Result<String> {
328 self.check(size)?;
329
330 let range = self.offset..self.offset + size;
331 let ret = String::from_utf8(self.data[range].to_vec())?;
332
333 self.offset += size;
334
335 Ok(ret)
336 }
337
338 pub fn read_bytes(&mut self, size: usize) -> Result<Vec<u8>> {
339 self.check(size)?;
340
341 let range = self.offset..self.offset + size;
342 let ret = self.data[range].to_vec();
343
344 self.offset += size;
345
346 Ok(ret)
347 }
348
349 pub fn read_var_bytes(&mut self) -> Result<Vec<u8>> {
350 let length = self.read_varint()?;
351
352 let size = length.as_u64() as usize;
354
355 let range = self.offset..self.offset + size;
356 let ret = self.data[range].to_vec();
357
358 self.offset += size;
359
360 Ok(ret)
361 }
362
363 pub fn read_hash(&mut self) -> Result<Hash> {
364 self.check(32)?;
365
366 let mut array = [0; 32];
367
368 let range = self.offset..self.offset + 32;
369 array.copy_from_slice(&self.data[range]);
370
371 let hash = Hash::from(array);
372
373 self.offset += 32;
374
375 Ok(hash)
376 }
377
378 pub fn seek(&mut self, off: usize) -> Result<()> {
380 self.check(off)?;
381
382 self.offset += off;
383
384 Ok(())
385 }
386
387 pub fn to_bytes(&self) -> &[u8] {
388 &self.data
389 }
390
391 pub fn to_vec(&self) -> Vec<u8> {
392 self.data.clone()
393 }
394}
395
396impl From<Vec<u8>> for Buffer {
397 fn from(buf: Vec<u8>) -> Self {
398 Buffer {
399 data: buf,
400 offset: 0,
401 }
402 }
403}
404
405impl From<&[u8]> for Buffer {
406 fn from(buf: &[u8]) -> Self {
407 Buffer {
408 data: buf.to_vec(),
409 offset: 0,
410 }
411 }
412}
413
414impl ops::Deref for Buffer {
441 type Target = Vec<u8>;
442
443 fn deref(&self) -> &Self::Target {
444 &self.data
445 }
446}
447
448impl ops::DerefMut for Buffer {
453 fn deref_mut(&mut self) -> &mut Self::Target {
454 &mut self.data
455 }
456}
457
458impl AsRef<[u8]> for Buffer {
461 fn as_ref(&self) -> &[u8] {
462 &self.data
463 }
464}
465
466impl AsMut<[u8]> for Buffer {
469 fn as_mut(&mut self) -> &mut [u8] {
470 &mut self.data
471 }
472}
473
474impl FromHex for Buffer {
475 type Error = FromHexError;
476
477 fn from_hex<T: AsRef<[u8]>>(hex: T) -> std::result::Result<Self, Self::Error> {
478 Ok(Buffer::from(Vec::from_hex(hex)?))
479 }
480}
481
482impl ToHex for Buffer {
483 fn to_hex(&self) -> String {
484 self.data.to_hex()
485 }
486}
487
488impl fmt::Display for Buffer {
489 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
490 write!(
491 f,
492 "Offset: {}, Buffer: {})",
493 self.offset,
494 self.data.to_hex(),
495 )
496 }
497}
498
499impl fmt::Debug for Buffer {
500 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
501 write!(
502 f,
503 "Offset: {}, Buffer: {})",
504 self.offset,
505 self.data.to_hex(),
506 )
507 }
508}
509
510#[cfg(feature = "serialization")]
511impl serde::Serialize for Buffer {
512 fn serialize<S: serde::Serializer>(&self, s: S) -> std::result::Result<S::Ok, S::Error> {
513 if s.is_human_readable() {
514 s.serialize_str(&self.to_hex())
515 } else {
516 s.serialize_bytes(&self[..])
517 }
518 }
519}
520
521#[cfg(feature = "serialization")]
522impl<'de> serde::Deserialize<'de> for Buffer {
523 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> std::result::Result<Buffer, D::Error> {
524 if d.is_human_readable() {
525 struct HexVisitor;
526
527 impl<'de> serde::de::Visitor<'de> for HexVisitor {
528 type Value = Buffer;
529
530 fn expecting(&self, formatter: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
531 formatter.write_str("an ASCII hex string")
532 }
533
534 fn visit_bytes<E>(self, v: &[u8]) -> std::result::Result<Self::Value, E>
535 where
536 E: ::serde::de::Error,
537 {
538 if let Ok(hex) = ::std::str::from_utf8(v) {
539 Buffer::from_hex(hex).map_err(E::custom)
540 } else {
541 return Err(E::invalid_value(serde::de::Unexpected::Bytes(v), &self));
542 }
543 }
544
545 fn visit_str<E>(self, v: &str) -> std::result::Result<Self::Value, E>
546 where
547 E: ::serde::de::Error,
548 {
549 Buffer::from_hex(v).map_err(E::custom)
550 }
551 }
552
553 d.deserialize_str(HexVisitor)
554 } else {
555 struct BytesVisitor;
556
557 impl<'de> ::serde::de::Visitor<'de> for BytesVisitor {
558 type Value = Buffer;
559
560 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
561 formatter.write_str("a bytestring")
562 }
563
564 fn visit_bytes<E>(self, v: &[u8]) -> std::result::Result<Self::Value, E>
565 where
566 E: ::serde::de::Error,
567 {
568 Ok(Buffer::from(v))
569 }
570 }
571
572 d.deserialize_bytes(BytesVisitor)
573 }
574 }
575}
576
577#[cfg(test)]
578mod tests {
579 use super::*;
580
581 #[test]
582 fn test_write_u32() {
583 let version: u32 = 123456789;
584
585 let mut buffer = Buffer::new();
586
587 buffer.write_u32(version);
588
589 assert_eq!(buffer, Buffer::from([21, 205, 91, 7].to_vec()));
590 }
591
592 #[test]
602 fn test_to_hex() {
603 let version: u32 = 123456789;
604
605 let mut buffer = Buffer::new();
606
607 buffer.write_u32(version);
608
609 assert_eq!(buffer, Buffer::from([21, 205, 91, 7].to_vec()));
610
611 let hex = buffer.to_hex();
612
613 assert_eq!(hex, "15cd5b07")
614 }
615
616 #[test]
617 fn test_into_hex() {
618 let version: u32 = 123456789;
619
620 let mut buffer = Buffer::new();
621
622 buffer.write_u32(version);
623
624 assert_eq!(buffer, Buffer::from([21, 205, 91, 7].to_vec()));
625
626 let hex = buffer.into_hex();
627
628 assert_eq!(hex, "15cd5b07")
629 }
630
631 #[test]
632 fn test_from_hex() {
633 let buffer = Buffer::from_hex("FF00").unwrap();
635
636 dbg!(&buffer);
637
638 assert_eq!(buffer, Buffer::from(vec![255, 0]));
639 }
640
641 #[cfg(feature = "serialization")]
642 #[test]
643 fn test_serde() {
644 use serde_test::{assert_tokens, Configure, Token};
645
646 let version: u32 = 123456789;
647
648 let mut buffer = Buffer::new();
649
650 buffer.write_u32(version);
651
652 static version_bytes: [u8; 4] = [21, 205, 91, 7];
653
654 let buffer_readable = buffer.clone();
655
656 assert_tokens(&buffer.compact(), &[Token::BorrowedBytes(&version_bytes)]);
657 assert_tokens(&buffer_readable.readable(), &[Token::Str("15cd5b07")]);
658 }
659}