orientdb-client 0.2.1

A Rust client for OrientDB™
Documentation
use crate::common::types::rid::ORecordID;
use crate::OrientResult;
use async_std::prelude::*;
use byteorder::{BigEndian, ReadBytesExt};
use std::io::Cursor;

use async_std::io::BufReader;
use async_std::net::TcpStream;

pub async fn read_i8(buf: &mut BufReader<&TcpStream>) -> OrientResult<i8> {
    let mut buffer = vec![0u8; 1];
    buf.read(&mut buffer).await?;
    let mut cursor = Cursor::new(buffer);
    let res = cursor.read_i8()?;
    Ok(res)
}

pub async fn read_i32(buf: &mut BufReader<&TcpStream>) -> OrientResult<i32> {
    let mut buffer = vec![0u8; 4];
    buf.read(&mut buffer).await?;
    let mut cursor = Cursor::new(buffer);
    let res = cursor.read_i32::<BigEndian>()?;
    Ok(res)
}

pub async fn read_i64(buf: &mut BufReader<&TcpStream>) -> OrientResult<i64> {
    let mut buffer = vec![0u8; 8];
    buf.read(&mut buffer).await?;
    let mut cursor = Cursor::new(buffer);
    let res = cursor.read_i64::<BigEndian>()?;
    Ok(res)
}

pub async fn read_identity(buf: &mut BufReader<&TcpStream>) -> OrientResult<ORecordID> {
    let cluster_id = read_i16(buf).await?;
    let cluster_position = read_i64(buf).await?;
    Ok(ORecordID::new(cluster_id, cluster_position))
}

pub async fn read_i16(buf: &mut BufReader<&TcpStream>) -> OrientResult<i16> {
    let mut buffer = vec![0u8; 2];
    buf.read(&mut buffer).await?;
    let mut cursor = Cursor::new(buffer);
    let res = cursor.read_i16::<BigEndian>()?;
    Ok(res)
}

pub async fn read_bool(buf: &mut BufReader<&TcpStream>) -> OrientResult<bool> {
    let e = read_i8(buf).await?;
    let val = match e {
        0 => false,
        1 => true,
        _ => panic!("Cannot convert value to bool"),
    };
    Ok(val)
}

pub async fn read_optional_bytes(buf: &mut BufReader<&TcpStream>) -> OrientResult<Option<Vec<u8>>> {
    let size = read_i32(buf).await?;
    let mut buff;
    if size == -1 {
        return Ok(None);
    } else {
        buff = vec![0; size as usize];
        buf.read(&mut buff).await?;
    }
    Ok(Some(buff))
}

pub async fn read_bytes(buf: &mut BufReader<&TcpStream>) -> OrientResult<Vec<u8>> {
    let size = read_i32(buf).await?;
    let mut buff;
    if size == -1 {
        buff = vec![];
    } else {
        buff = vec![0; size as usize];
        buf.read(&mut buff).await?;
    }
    Ok(buff)
}

pub async fn read_string(buf: &mut BufReader<&TcpStream>) -> OrientResult<String> {
    let bytes = read_bytes(buf).await?;
    let res = String::from_utf8(bytes)?;
    Ok(res)
}