1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use std::convert::{TryFrom, TryInto};
use jsonrpc_core::IoHandler;
pub enum LockOptions {
WriteLock = 0,
ReadLock,
NoLock,
}
impl TryFrom<u8> for LockOptions {
type Error = ();
fn try_from(x: u8) -> Result<Self, Self::Error> {
match x {
x if x == LockOptions::WriteLock as u8 => Ok(LockOptions::WriteLock),
x if x == LockOptions::ReadLock as u8 => Ok(LockOptions::ReadLock),
x if x == LockOptions::NoLock as u8 => Ok(LockOptions::NoLock),
_ => Err(()),
}
}
}
impl TryFrom<u32> for LockOptions {
type Error = ();
fn try_from(v: u32) -> Result<Self, Self::Error> {
match v {
x if x == LockOptions::WriteLock as u32 => Ok(LockOptions::WriteLock),
x if x == LockOptions::ReadLock as u32 => Ok(LockOptions::ReadLock),
x if x == LockOptions::NoLock as u32 => Ok(LockOptions::NoLock),
_ => Err(()),
}
}
}
pub struct HttpHandler {
pub lock_option: LockOptions,
pub handler: Option<IoHandler>,
pub server_addr: Option<String>,
}
impl HttpHandler {
pub fn new_from_u8(lock_option: u8, handler: IoHandler) -> Result<HttpHandler, &'static str> {
let lock_option: LockOptions = match lock_option.try_into() {
Ok(LockOptions::WriteLock) => Ok(LockOptions::WriteLock),
Ok(LockOptions::ReadLock) => Ok(LockOptions::ReadLock),
Ok(LockOptions::NoLock) => Ok(LockOptions::NoLock),
_ => Err("Invalid lock option"),
}?;
Ok(HttpHandler {
lock_option,
handler: Some(handler),
server_addr: None,
})
}
}
pub fn test_new_from_u8_http_handler() {
HttpHandler::new_from_u8(2, IoHandler::new()).unwrap();
}
#[test]
#[should_panic]
pub fn fail_new_u8_http_handler() {
HttpHandler::new_from_u8(4, IoHandler::new()).unwrap();
}