tonic_catch

Crates.iotonic_catch
lib.rstonic_catch
version0.1.3
sourcesrc
created_at2022-01-13 04:33:58.869379
updated_at2023-06-06 15:14:16.143087
descriptioncatch any tonic await error convert into Status
homepage
repositoryhttps://github.com/rmw-lib/tonic_catch
max_upload_size
id513177
size3,783
xxai.art (xxaier)

documentation

README

tonic_catch

catch any tonic await error convert into Status

for issue https://github.com/hyperium/tonic/discussions/716#discussioncomment-991404

use example:

use crate::var::evt::Evt;
use async_std::channel::Sender;
use tonic_catch::{tonic_catch, Result, Error};
use log::info;
use std::net::SocketAddr;
use tonic::{transport::Server, Request, Response};
pub mod proto {
  tonic::include_proto!("proto");
}

use proto::rmw_server::{Rmw, RmwServer};
use proto::Url;

pub struct RmwSrv {
  sender: Sender<Evt>,
}

#[tonic_catch]
impl Rmw for RmwSrv {
  async fn head(&self, request: Request<Url>) -> Result<()> {
    let addr = match request.remote_addr() {
      Some(addr) => addr.to_string(),
      None => String::new(),
    };

    let url = request.into_inner();
    println!("{:?} {}/{}", addr, url.addr, url.path);

    self
      .sender
      .send(Evt::Head(url.addr.parse()?, url.path))
      .await?;

    Ok(Response::new(()))
  }
}

pub async fn run(addr: SocketAddr, sender: Sender<Evt>) -> anyhow::Result<()> {
  let rmw = RmwServer::new(RmwSrv { sender });

  info!("grpc://{}", addr);

  Server::builder()
    .accept_http1(true)
    .add_service(tonic_web::enable(rmw))
    .serve(addr)
    .await?;

  Ok(())
}

About

This project is part of the rmw.link Code Project .

关于

本项目隶属于人民网络(rmw.link) 代码计划。

人民网络

Commit count: 22

cargo fmt