interact/
interact.rs

1use bronzedb_client::Connection;
2use bronzedb_util::status::{Error, Result, StatusCode};
3use std::io::{self, Write};
4use std::net::TcpStream;
5
6fn main() -> Result<()> {
7    let mut addr = String::new();
8    print!("Please enter address: ");
9    io::stdout().flush()?;
10    io::stdin().read_line(&mut addr)?;
11    let stream = TcpStream::connect(addr.trim_end())?;
12    let mut client = Connection::new(stream);
13    loop {
14        let mut buf = String::new();
15        io::stdin().read_line(&mut buf)?;
16        let action: Vec<&str> = buf.trim_end().split(' ').collect();
17        debug_assert!(action.len() > 0);
18        match action[0].to_lowercase().as_str() {
19            "set" => {
20                debug_assert!(action.len() == 3);
21                client.set(
22                    action[1].as_bytes().to_vec().into(),
23                    action[2].as_bytes().to_vec(),
24                )?;
25                println!("OK")
26            }
27
28            "get" => {
29                debug_assert!(action.len() == 2);
30                let value = client.get(action[1].as_bytes().to_vec().into())?;
31                match value {
32                    Some(data) => println!("{}", String::from_utf8(data).unwrap()),
33                    None => println!("<None>"),
34                }
35            }
36
37            "delete" => {
38                debug_assert!(action.len() == 2);
39                client.delete(action[1].as_bytes().to_vec().into())?;
40                println!("OK")
41            }
42
43            "scan" => {
44                let mut lower_key = String::new();
45                let mut upper_key = String::new();
46                print!("lower_bound(default <None>): ");
47                io::stdout().flush()?;
48                io::stdin().read_line(&mut lower_key)?;
49                let lower_bound = match lower_key.trim_end() {
50                    "" => None,
51                    key => Some(key.as_bytes().to_vec().into()),
52                };
53
54                print!("upper_bound(default <None>): ");
55                io::stdout().flush()?;
56                io::stdin().read_line(&mut upper_key)?;
57                let upper_bound = match upper_key.trim_end() {
58                    "" => None,
59                    key => Some(key.as_bytes().to_vec().into()),
60                };
61                let scanner = client.scan(lower_bound, upper_bound)?;
62                let mut counter = 0;
63                for item in scanner {
64                    let (key, value) = item?;
65                    println!(
66                        "{}: {}",
67                        String::from_utf8(key.to_vec()).unwrap(),
68                        String::from_utf8(value).unwrap()
69                    );
70                    counter += 1;
71                }
72                println!("{} items:", counter);
73            }
74            _ => {
75                break Err(Error::new(
76                    StatusCode::UnknownAction,
77                    format!("unknown action: {}", action[0]),
78                ));
79            }
80        }
81    }
82}