bronzedb_client/
connection.rs1use 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}