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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
use std::collections::HashMap; use crate::errors::Error; use crate::errors::Result; use crate::request::{delete, get, get_vec, put}; use crate::{Client, QueryMeta, QueryOptions, WriteMeta, WriteOptions}; #[derive(Clone, Default, Eq, PartialEq, Serialize, Deserialize, Debug)] #[serde(default)] #[allow(clippy::upper_case_acronyms)] pub struct KVPair { pub Key: String, pub CreateIndex: Option<u64>, pub ModifyIndex: Option<u64>, pub LockIndex: Option<u64>, pub Flags: Option<u64>, pub Value: String, pub Session: Option<String>, } #[allow(clippy::upper_case_acronyms)] pub trait KV { fn acquire(&self, _: &KVPair, _: Option<&WriteOptions>) -> Result<(bool, WriteMeta)>; fn delete(&self, _: &str, _: Option<&WriteOptions>) -> Result<(bool, WriteMeta)>; fn get(&self, _: &str, _: Option<&QueryOptions>) -> Result<(Option<KVPair>, QueryMeta)>; fn list(&self, _: &str, _: Option<&QueryOptions>) -> Result<(Vec<KVPair>, QueryMeta)>; fn put(&self, _: &KVPair, _: Option<&WriteOptions>) -> Result<(bool, WriteMeta)>; fn release(&self, _: &KVPair, _: Option<&WriteOptions>) -> Result<(bool, WriteMeta)>; } impl KV for Client { fn acquire(&self, pair: &KVPair, o: Option<&WriteOptions>) -> Result<(bool, WriteMeta)> { let mut params = HashMap::new(); if let Some(i) = pair.Flags { if i != 0 { params.insert(String::from("flags"), i.to_string()); } } if let Some(ref session) = pair.Session { params.insert(String::from("acquire"), session.to_owned()); let path = format!("/v1/kv/{}", pair.Key); put(&path, Some(&pair.Value), &self.config, params, o) } else { Err(Error::from("Session flag is required to acquire lock")) } } fn delete(&self, key: &str, options: Option<&WriteOptions>) -> Result<(bool, WriteMeta)> { let path = format!("/v1/kv/{}", key); delete(&path, &self.config, HashMap::new(), options) } fn get( &self, key: &str, options: Option<&QueryOptions>, ) -> Result<(Option<KVPair>, QueryMeta)> { let path = format!("/v1/kv/{}", key); let x: Result<(Vec<KVPair>, QueryMeta)> = get(&path, &self.config, HashMap::new(), options); x.map(|r| (r.0.first().cloned(), r.1)) } fn list(&self, prefix: &str, o: Option<&QueryOptions>) -> Result<(Vec<KVPair>, QueryMeta)> { let mut params = HashMap::new(); params.insert(String::from("recurse"), String::from("")); let path = format!("/v1/kv/{}", prefix); get_vec(&path, &self.config, params, o) } fn put(&self, pair: &KVPair, o: Option<&WriteOptions>) -> Result<(bool, WriteMeta)> { let mut params = HashMap::new(); if let Some(i) = pair.Flags { if i != 0 { params.insert(String::from("flags"), i.to_string()); } } let path = format!("/v1/kv/{}", pair.Key); put(&path, Some(&pair.Value), &self.config, params, o) } fn release(&self, pair: &KVPair, o: Option<&WriteOptions>) -> Result<(bool, WriteMeta)> { let mut params = HashMap::new(); if let Some(i) = pair.Flags { if i != 0 { params.insert(String::from("flags"), i.to_string()); } } if let Some(ref session) = pair.Session { params.insert(String::from("release"), session.to_owned()); let path = format!("/v1/kv/{}", pair.Key); put(&path, Some(&pair.Value), &self.config, params, o) } else { Err(Error::from("Session flag is required to release a lock")) } } }