orientdb_client/common/protocol/
buffer.rs1use crate::common::OrientResult;
2use byteorder::{BigEndian, WriteBytesExt};
3use std::io::Write;
4
5pub struct OBuffer {
6 inner: Vec<u8>,
7}
8
9impl Default for OBuffer {
10 fn default() -> Self {
11 OBuffer::new()
12 }
13}
14
15impl OBuffer {
16 pub fn new() -> OBuffer {
17 OBuffer { inner: Vec::new() }
18 }
19
20 pub fn as_slice(&self) -> &[u8] {
21 self.inner.as_slice()
22 }
23
24 pub fn put_i8(&mut self, n: i8) -> OrientResult<()> {
25 self.inner.write_i8(n)?;
26 Ok(())
27 }
28
29 pub fn put_u8(&mut self, n: u8) -> OrientResult<()> {
30 self.inner.write_u8(n)?;
31 Ok(())
32 }
33
34 pub fn put_i32(&mut self, n: i32) -> OrientResult<()> {
35 self.inner.write_i32::<BigEndian>(n)?;
36 Ok(())
37 }
38 pub fn put_i16(&mut self, n: i16) -> OrientResult<()> {
39 self.inner.write_i16::<BigEndian>(n)?;
40 Ok(())
41 }
42
43 pub fn put_slice(&mut self, src: &[u8]) -> OrientResult<()> {
44 self.inner.write_all(src)?;
45 Ok(())
46 }
47
48 pub fn write_str(&mut self, str: &str) -> OrientResult<()> {
49 let bytes = str.as_bytes();
50 let size = bytes.len();
51 self.put_i32(size as i32)?;
52 self.put_slice(bytes)?;
53 Ok(())
54 }
55 pub fn write_slice(&mut self, bytes: &[u8]) -> OrientResult<()> {
56 let size = bytes.len();
57 self.put_i32(size as i32)?;
58 self.put_slice(bytes)?;
59 Ok(())
60 }
61
62 pub fn write_bool(&mut self, boolean: bool) -> OrientResult<()> {
63 if boolean {
64 self.put_i8(1)
65 } else {
66 self.put_i8(0)
67 }?;
68 Ok(())
69 }
70
71 pub fn write_varint(&mut self, number: i64) -> OrientResult<()> {
72 let mut real_value: u64 = ((number << 1) ^ (number >> 63)) as u64;
73 while real_value & 0xFFFF_FFFF_FFFF_FF80 != 0 {
74 self.put_u8(((real_value & 0x7F) | 0x80) as u8)?;
75 real_value >>= 7;
76 }
77 self.put_u8((real_value & 0x7F) as u8)?;
78 Ok(())
79 }
80
81 pub fn write_string(&mut self, val: &str) -> OrientResult<()> {
82 self.write_varint(val.len() as i64)?;
83 self.put_slice(val.as_bytes())?;
84 Ok(())
85 }
86}