From 118fb521b929758c7ac84cd73e52b3c2ef15b74e Mon Sep 17 00:00:00 2001 From: Alex Severin Date: Wed, 3 Jan 2024 20:56:21 +0300 Subject: [PATCH] add raw_client --- memcrab/Cargo.toml | 3 +++ memcrab/README.md | 40 +++++++++++++++++++++++------- memcrab/src/lib.rs | 4 +++ memcrab/src/raw_client.rs | 34 +++++++++++++++++++++++++ memcrab/tests/raw_client.rs | 16 ++++++++++++ memcrab/tests/{run.rs => tonic.rs} | 13 +++++----- 6 files changed, 95 insertions(+), 15 deletions(-) create mode 100644 memcrab/src/raw_client.rs create mode 100644 memcrab/tests/raw_client.rs rename memcrab/tests/{run.rs => tonic.rs} (68%) diff --git a/memcrab/Cargo.toml b/memcrab/Cargo.toml index 8e78da6..80e5277 100644 --- a/memcrab/Cargo.toml +++ b/memcrab/Cargo.toml @@ -14,3 +14,6 @@ repository = "https://github.com/cospectrum/memcrab" [dependencies] prost = { workspace = true } tonic = { workspace = true } + +[dev-dependencies] +anyhow = "1.0.79" diff --git a/memcrab/README.md b/memcrab/README.md index a726152..9d7e0fa 100644 --- a/memcrab/README.md +++ b/memcrab/README.md @@ -4,29 +4,50 @@ ## Examples -### gRPC +### RawClient + +```rust +use memcrab::RawClient; + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + let addr = "http://[::1]:50051"; + let client = RawClient::connect(addr).await?; + + client.set("age", vec![0, 21]).await?; + client.set("year", "2024".into()).await?; + + let name = client.get("name").await?; + match name { + Some(val) => println!("got {:?} from cache", val), + None => println!("cache miss for name"), + } + Ok(()) +} +``` + +### tonic ```rust use memcrab::pb::{cache_rpc_client::CacheRpcClient, GetRequest, SetRequest}; #[tokio::main] -async fn main() { - let dst_addr = "http://[::1]:50051"; - let mut client = CacheRpcClient::connect(dst_addr).await.unwrap(); +async fn main() -> anyhow::Result<()> { + let addr = "http://[::1]:50051"; + let mut client = CacheRpcClient::connect(addr).await?; let msg = GetRequest { key: "name".to_owned(), }; let req = tonic::Request::new(msg); - let resp = client.get(req).await.unwrap().into_inner(); - + let resp = client.get(req).await?.into_inner(); match resp.value { Some(val) => { println!("got bytes from cache: {:?}", val); - }, + } None => { println!("no value in cache"); - }, + } } let msg = SetRequest { @@ -34,6 +55,7 @@ async fn main() { value: vec![1, 3, 4, 5, 6, 7], }; let req = tonic::Request::new(msg); - client.set(req).await.unwrap(); + client.set(req).await?; + Ok(()) } ``` diff --git a/memcrab/src/lib.rs b/memcrab/src/lib.rs index 4aca6df..65ea958 100644 --- a/memcrab/src/lib.rs +++ b/memcrab/src/lib.rs @@ -1,6 +1,10 @@ +mod raw_client; + #[allow(clippy::all)] #[rustfmt::skip] pub mod pb; +pub use raw_client::RawClient; + #[cfg(test)] mod tests {} diff --git a/memcrab/src/raw_client.rs b/memcrab/src/raw_client.rs new file mode 100644 index 0000000..97c6ec6 --- /dev/null +++ b/memcrab/src/raw_client.rs @@ -0,0 +1,34 @@ +use tonic::{transport::Channel, Status}; + +use crate::pb::{cache_rpc_client::CacheRpcClient, GetRequest, SetRequest}; + +type StdError = Box; + +pub struct RawClient { + inner: CacheRpcClient, +} + +impl RawClient { + pub async fn connect(endpoint: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let inner = CacheRpcClient::connect(endpoint).await?; + Ok(Self { inner }) + } + pub async fn get(&self, key: impl Into) -> Result>, Status> { + let key = key.into(); + let msg = GetRequest { key }; + let req = tonic::Request::new(msg); + let resp = self.inner.clone().get(req).await?; + Ok(resp.into_inner().value) + } + pub async fn set(&self, key: impl Into, value: Vec) -> Result<(), Status> { + let key = key.into(); + let msg = SetRequest { key, value }; + let req = tonic::Request::new(msg); + self.inner.clone().set(req).await?; + Ok(()) + } +} diff --git a/memcrab/tests/raw_client.rs b/memcrab/tests/raw_client.rs new file mode 100644 index 0000000..2f45cdd --- /dev/null +++ b/memcrab/tests/raw_client.rs @@ -0,0 +1,16 @@ +use memcrab::RawClient; + +async fn _test_raw_client() -> anyhow::Result<()> { + let addr = "http://[::1]:50051"; + let client = RawClient::connect(addr).await?; + + client.set("age", vec![0, 21]).await?; + client.set("year", "2024".into()).await?; + + let name = client.get("name").await?; + match name { + Some(val) => println!("got {:?} from cache", val), + None => println!("cache miss for name"), + } + Ok(()) +} diff --git a/memcrab/tests/run.rs b/memcrab/tests/tonic.rs similarity index 68% rename from memcrab/tests/run.rs rename to memcrab/tests/tonic.rs index f8a1cf3..d0bdfa9 100644 --- a/memcrab/tests/run.rs +++ b/memcrab/tests/tonic.rs @@ -1,15 +1,14 @@ use memcrab::pb::{cache_rpc_client::CacheRpcClient, GetRequest, SetRequest}; -async fn _test_client() { - let dst_addr = "http://[::1]:50051"; - let mut client = CacheRpcClient::connect(dst_addr).await.unwrap(); +async fn _test_tonic_client() -> anyhow::Result<()> { + let addr = "http://[::1]:50051"; + let mut client = CacheRpcClient::connect(addr).await?; let msg = GetRequest { key: "name".to_owned(), }; let req = tonic::Request::new(msg); - let resp = client.get(req).await.unwrap().into_inner(); - + let resp = client.get(req).await?.into_inner(); match resp.value { Some(val) => { println!("got bytes from cache: {:?}", val); @@ -24,5 +23,7 @@ async fn _test_client() { value: vec![1, 3, 4, 5, 6, 7], }; let req = tonic::Request::new(msg); - client.set(req).await.unwrap(); + client.set(req).await?; + + Ok(()) }