diff options
| author | n1c00o <git.n1c00o@gmail.com> | 2021-07-30 22:38:45 +0200 |
|---|---|---|
| committer | n1c00o <git.n1c00o@gmail.com> | 2021-07-30 22:38:45 +0200 |
| commit | 99222e405e5682f5e5aea408fe0ecd4de183bad1 (patch) | |
| tree | 333e19e744390dd5fe506d307bac0ef21023583d | |
| parent | 8db17f9e336f05ed50552f3fe0bbf544e1993271 (diff) | |
feat: implement gRPC server, add a sample client
| -rw-r--r-- | src/client.rs | 23 | ||||
| -rw-r--r-- | src/server.rs | 63 |
2 files changed, 86 insertions, 0 deletions
diff --git a/src/client.rs b/src/client.rs new file mode 100644 index 0000000..750fe1a --- /dev/null +++ b/src/client.rs @@ -0,0 +1,23 @@ +use clawflake::clawflake_client::ClawflakeClient; +use clawflake::IdRequest; + +pub mod clawflake { + tonic::include_proto!("clawflake"); +} + +#[tokio::main] +async fn main() -> Result<(), Box<dyn std::error::Error>> { + let addr = "http://[::1]:50051"; + + let mut client = ClawflakeClient::connect(addr).await?; + + println!("Client connected to {}", addr); + let request = tonic::Request::new(IdRequest {}); + + println!("Trying to get an ID"); + let response = client.get_id(request).await?; + + println!("Received: {:?}", response); + + Ok(()) +} diff --git a/src/server.rs b/src/server.rs new file mode 100644 index 0000000..edb69ef --- /dev/null +++ b/src/server.rs @@ -0,0 +1,63 @@ +use std::net::SocketAddr; +use std::process::exit; + +use log::info; +mod logger; +use tonic::{transport::Server, Request, Response, Status}; + +use clawflake::clawflake_server::{Clawflake, ClawflakeServer}; +use clawflake::{IdReply, IdRequest}; + +pub mod clawflake { + tonic::include_proto!("clawflake"); +} + +mod id_worker; +use id_worker::IdWorker; + +#[derive(Debug, Default)] +pub struct MyClawflakeService { +} + +#[tonic::async_trait] +impl Clawflake for MyClawflakeService { + async fn get_id( + &self, + _: Request<IdRequest>, + ) -> Result<Response<IdReply>, Status> { + info!("request on GetID"); + + let mut worker: IdWorker = IdWorker::new(1_564_790_400_000, 0, 0); + + let reply: IdReply = clawflake::IdReply { + id: format!("{}", worker.next_id()).into(), + }; + + Ok(Response::new(reply)) + } +} + +#[tokio::main] +async fn main() -> Result<(), Box<dyn std::error::Error>> { + // init logger + match logger::init() { + Err(e) => { + eprintln!("failed to init logger: {}", &e); + exit(1); + } + _ => {} + } + + // init tonic and IdWorker + let addr: SocketAddr = "[::1]:50051".parse()?; + let srv: MyClawflakeService = MyClawflakeService::default(); + + println!("Service listening on {}", addr); + + Server::builder() + .add_service(ClawflakeServer::new(srv)) + .serve(addr) + .await?; + + Ok(()) +} |
