1#![allow(dead_code)]
2
3#[macro_use]
4extern crate serde_derive;
5extern crate base64;
6extern crate reqwest;
7extern crate serde_json;
8
9pub mod kv;
10mod config;
11pub mod session;
12pub mod pkg;
13
14use self::kv::*;
15use std::io::Read;
16use crate::pkg::CustomError;
17use base64::{decode};
18
19pub struct Client {
23 pub debug: bool,
24
25 host: String,
26 port: u16,
27
28 kv: KVPair,
29 session: session::Session,
30}
31
32impl Client {
33 pub fn new<S: Into<String>>(host: S, port: u16) -> Client {
34 Client {
35 debug: false,
36 host: host.into(),
37 port: port,
38 kv: KVPair::new(),
39 session: session::Session::new(),
40 }
41 }
42
43 pub fn debug_print(&self, s: &str) {
44 if self.debug {
45 println!("[DEBUG] --- {:?}", s);
46 }
47 }
48
49 pub fn kv_get<S: Into<String>>(&self, key: S) -> String {
50 let res = self.kv.get(self, key);
51 match res {
52 Ok(kvs) => {
53 let kv = kvs.get(0).unwrap();
54 let val = &kv.Value;
55 let val_de = decode(val).unwrap();
56 let val_de_str = String::from_utf8(val_de).unwrap();
57 val_de_str
58 }
59 Err(err) => {
60 err
61 }
62 }
63 }
64
65 pub fn kv_get_folder<S: Into<String>>(&self, folder: S) -> Result<Vec<String>,
66 String> {
67 let folder_keys = self.kv.get_folder_keys(self, folder).unwrap();
68 serde_json::from_str::<Vec<String>>(&folder_keys).map_err(|e| e.to_string())
69 }
70
71 pub fn kv_set<S: Into<String>>(&self, key: S, v: S) -> Result<bool, String> {
72 self.kv.set(self, key, v)
73 }
74
75 pub fn kv_set_with_session<S: Into<String>>(&self, key: S, v: S, session: S)
76 -> Result<bool, String> {
77 self.kv.set_with_session(self, key, v, session)
78 }
79
80 pub fn kv_delete<S: Into<String>>(&self, key: S) -> Result<bool, String> {
81 self.kv.delete(self, key)
82 }
83
84 pub fn kv_delete_both_session<S: Into<String>>(&self, key: S) -> Result<bool, String> {
85 self.kv.delete_both_session(self, key)
86 }
87
88 pub fn session_set(&self, lock_delay: String, name: String, node: String,
97 behavior: String, ttl: String) -> String {
98 let mut s = session::Session::new();
99 s.LockDelay = "0.001s".to_string();
100 if name != "".to_string() {
101 s.name = name;
102 }
103
104 if node != "".to_string() {
105 let nodex = Some(node);
106 s.node = nodex;
107 }
108 s.Behavior = behavior;
109 s.TTL = ttl;
110 self.debug_print(format!("lib session set: {:?}", s).as_str(), );
111 self.session.set(self, &s)
112 }
113
114 pub fn session_renew(&self, sid: &str) -> Result<(), CustomError> {
115 self.session.renew(self, sid)
116 }
117
118 pub fn session_delete(&self, sid: &str) -> String {
119 self.session.delete(self, sid)
120 }
121
122}
123
124#[cfg(test)]
125mod tests {
126 use crate::Client;
127 use base64::Config;
128 use tokio::sync::mpsc;
129 use crate::config;
130 use crate::pkg::CustomError;
131 use crate::kv::KVPair;
132
133 #[test]
173 fn test_kv_delete_both_session() {
174 let host = config::CONFIG["consul_addr"];
175 let client = Client::new(host, 8500);
176 let res = client.kv_delete_both_session("my-key");
177 println!("res ---------- {}", res.unwrap());
178 }
179
180 #[test]
181 fn test_kv_get() {
182 let host = config::CONFIG["consul_addr"];
183 let client = Client::new(host, 8500);
184 let val = client.kv_get("my-key");
185 println!("val ----- {}", val);
186 }
187
188 #[test]
189 fn test_session_set() {
190 let host = config::CONFIG["consul_addr"];
191 let client = Client::new(host, 8500);
192 let se = client.session_set("15s".to_string(), "my-session".to_string(), "node1".to_string(), "release".to_string(), "10m0s".to_string());
193 }
194
195 #[test]
196 fn test_kv_set_with_session() {
197 let host = config::CONFIG["consul_addr"];
198 let client = Client::new(host, 8500);
199 let session = client.session_set("15s".to_string(), "my-session".to_string(), "node1".to_string(), "release".to_string(), "10m0s".to_string());
200
201 let res = client.kv_set_with_session("my-key", "my-val", session.as_str()).unwrap();
202 println!("res ------- {}", res);
203 }
204
205 #[test]
206 fn test_session_renew() {
207 let host = config::CONFIG["consul_addr"];
208 let client = Client::new(host, 8500);
209 let ok = client.session_renew("d5663534-82f9-429b-954c-ae63d59d3502");
210 match ok {
211 Ok(_) => { println!("---ok---");}
212 Err(_) => { println!("---err---");}
213 }
214 }
215
216 #[test]
217 fn test_kv_ge_folder() {
218 let host = config::CONFIG["consul_addr"];
219 let client = Client::new(host, 8500);
220 let res = client.kv_get_folder("pomid/Echo");
221 let svcs = res.unwrap();
222 println!("svcs ------------- {:?}", svcs);
223 }
224
225}
226
227
228
229