bronzedb_client/
connection.rs

1use bronzedb_protocol::request::Action::{Delete, Get, Ping, Scan, Set};
2use bronzedb_protocol::request::Request;
3use bronzedb_protocol::response::Response::{self, *};
4use bronzedb_util::status::StatusCode::*;
5use bronzedb_util::status::{Error, Result};
6use bronzedb_util::types::{Entry, Key, Value};
7use std::io::{Read, Write};
8
9pub struct Connection<T: Read + Write> {
10    inner: T,
11}
12
13impl<T: Read + Write> Connection<T> {
14    pub fn new(connection: T) -> Self {
15        Self { inner: connection }
16    }
17
18    pub fn set(&mut self, key: Key, value: Value) -> Result<()> {
19        Request::Set(key, value).write_to(&mut self.inner)?;
20        match Response::read_from(&mut self.inner, Set)? {
21            Status(status) => match status {
22                OK => Ok(()),
23                code => Err(Error::new(code, "set request error")),
24            },
25            _ => unreachable!(),
26        }
27    }
28
29    pub fn delete(&mut self, key: Key) -> Result<()> {
30        Request::Delete(key).write_to(&mut self.inner)?;
31        match Response::read_from(&mut self.inner, Delete)? {
32            Status(status) => match status {
33                OK => Ok(()),
34                code => Err(Error::new(code, "delete request error")),
35            },
36            _ => unreachable!(),
37        }
38    }
39
40    pub fn get(&mut self, key: Key) -> Result<Option<Value>> {
41        Request::Get(key).write_to(&mut self.inner)?;
42        match Response::read_from(&mut self.inner, Get)? {
43            Status(status) => match status {
44                NotFound => Ok(None),
45                code => Err(Error::new(code, "get request error")),
46            },
47            SingleValue(value) => Ok(Some(value)),
48            _ => unreachable!(),
49        }
50    }
51
52    pub fn scan(
53        &mut self,
54        lower_bound: Option<Key>,
55        upper_bound: Option<Key>,
56    ) -> Result<Box<dyn Iterator<Item = Result<Entry>> + '_>> {
57        Request::Scan {
58            lower_bound,
59            upper_bound,
60        }
61        .write_to(&mut self.inner)?;
62        match Response::read_from(&mut self.inner, Scan)? {
63            Status(status) => Err(Error::new(status, "scan request error")),
64            Scanner(iter) => Ok(iter),
65            _ => unreachable!(),
66        }
67    }
68
69    pub fn ping(&mut self) -> Result<()> {
70        Request::Ping.write_to(&mut self.inner)?;
71        match Response::read_from(&mut self.inner, Ping)? {
72            Status(OK) => Ok(()),
73            Status(status) => Err(Error::new(status, "ping error")),
74            _ => unreachable!(),
75        }
76    }
77
78    pub fn no_response(&mut self) -> Result<()> {
79        Request::NoResponse.write_to(&mut self.inner)?;
80        Ok(())
81    }
82}