1*de2e4ac0SBrandon Williams //! This module defines common request/response types as well as the JsonCodec that is used by the 2*de2e4ac0SBrandon Williams //! json.helloworld.Greeter service which is defined manually (instead of via proto files) by the 3*de2e4ac0SBrandon Williams //! `build_json_codec_service` function in the `examples/build.rs` file. 4*de2e4ac0SBrandon Williams 5*de2e4ac0SBrandon Williams use bytes::{Buf, BufMut}; 6*de2e4ac0SBrandon Williams use serde::{Deserialize, Serialize}; 7*de2e4ac0SBrandon Williams use std::marker::PhantomData; 8*de2e4ac0SBrandon Williams use tonic::{ 9*de2e4ac0SBrandon Williams codec::{Codec, DecodeBuf, Decoder, EncodeBuf, Encoder}, 10*de2e4ac0SBrandon Williams Status, 11*de2e4ac0SBrandon Williams }; 12*de2e4ac0SBrandon Williams 13*de2e4ac0SBrandon Williams #[derive(Debug, Deserialize, Serialize)] 14*de2e4ac0SBrandon Williams pub struct HelloRequest { 15*de2e4ac0SBrandon Williams pub name: String, 16*de2e4ac0SBrandon Williams } 17*de2e4ac0SBrandon Williams 18*de2e4ac0SBrandon Williams #[derive(Debug, Deserialize, Serialize)] 19*de2e4ac0SBrandon Williams pub struct HelloResponse { 20*de2e4ac0SBrandon Williams pub message: String, 21*de2e4ac0SBrandon Williams } 22*de2e4ac0SBrandon Williams 23*de2e4ac0SBrandon Williams #[derive(Debug)] 24*de2e4ac0SBrandon Williams pub struct JsonEncoder<T>(PhantomData<T>); 25*de2e4ac0SBrandon Williams 26*de2e4ac0SBrandon Williams impl<T: serde::Serialize> Encoder for JsonEncoder<T> { 27*de2e4ac0SBrandon Williams type Item = T; 28*de2e4ac0SBrandon Williams type Error = Status; 29*de2e4ac0SBrandon Williams encode(&mut self, item: Self::Item, buf: &mut EncodeBuf<'_>) -> Result<(), Self::Error>30*de2e4ac0SBrandon Williams fn encode(&mut self, item: Self::Item, buf: &mut EncodeBuf<'_>) -> Result<(), Self::Error> { 31*de2e4ac0SBrandon Williams serde_json::to_writer(buf.writer(), &item).map_err(|e| Status::internal(e.to_string())) 32*de2e4ac0SBrandon Williams } 33*de2e4ac0SBrandon Williams } 34*de2e4ac0SBrandon Williams 35*de2e4ac0SBrandon Williams #[derive(Debug)] 36*de2e4ac0SBrandon Williams pub struct JsonDecoder<U>(PhantomData<U>); 37*de2e4ac0SBrandon Williams 38*de2e4ac0SBrandon Williams impl<U: serde::de::DeserializeOwned> Decoder for JsonDecoder<U> { 39*de2e4ac0SBrandon Williams type Item = U; 40*de2e4ac0SBrandon Williams type Error = Status; 41*de2e4ac0SBrandon Williams decode(&mut self, buf: &mut DecodeBuf<'_>) -> Result<Option<Self::Item>, Self::Error>42*de2e4ac0SBrandon Williams fn decode(&mut self, buf: &mut DecodeBuf<'_>) -> Result<Option<Self::Item>, Self::Error> { 43*de2e4ac0SBrandon Williams if !buf.has_remaining() { 44*de2e4ac0SBrandon Williams return Ok(None); 45*de2e4ac0SBrandon Williams } 46*de2e4ac0SBrandon Williams 47*de2e4ac0SBrandon Williams let item: Self::Item = 48*de2e4ac0SBrandon Williams serde_json::from_reader(buf.reader()).map_err(|e| Status::internal(e.to_string()))?; 49*de2e4ac0SBrandon Williams Ok(Some(item)) 50*de2e4ac0SBrandon Williams } 51*de2e4ac0SBrandon Williams } 52*de2e4ac0SBrandon Williams 53*de2e4ac0SBrandon Williams /// A [`Codec`] that implements `application/grpc+json` via the serde library. 54*de2e4ac0SBrandon Williams #[derive(Debug, Clone)] 55*de2e4ac0SBrandon Williams pub struct JsonCodec<T, U>(PhantomData<(T, U)>); 56*de2e4ac0SBrandon Williams 57*de2e4ac0SBrandon Williams impl<T, U> Default for JsonCodec<T, U> { default() -> Self58*de2e4ac0SBrandon Williams fn default() -> Self { 59*de2e4ac0SBrandon Williams Self(PhantomData) 60*de2e4ac0SBrandon Williams } 61*de2e4ac0SBrandon Williams } 62*de2e4ac0SBrandon Williams 63*de2e4ac0SBrandon Williams impl<T, U> Codec for JsonCodec<T, U> 64*de2e4ac0SBrandon Williams where 65*de2e4ac0SBrandon Williams T: serde::Serialize + Send + 'static, 66*de2e4ac0SBrandon Williams U: serde::de::DeserializeOwned + Send + 'static, 67*de2e4ac0SBrandon Williams { 68*de2e4ac0SBrandon Williams type Encode = T; 69*de2e4ac0SBrandon Williams type Decode = U; 70*de2e4ac0SBrandon Williams type Encoder = JsonEncoder<T>; 71*de2e4ac0SBrandon Williams type Decoder = JsonDecoder<U>; 72*de2e4ac0SBrandon Williams encoder(&mut self) -> Self::Encoder73*de2e4ac0SBrandon Williams fn encoder(&mut self) -> Self::Encoder { 74*de2e4ac0SBrandon Williams JsonEncoder(PhantomData) 75*de2e4ac0SBrandon Williams } 76*de2e4ac0SBrandon Williams decoder(&mut self) -> Self::Decoder77*de2e4ac0SBrandon Williams fn decoder(&mut self) -> Self::Decoder { 78*de2e4ac0SBrandon Williams JsonDecoder(PhantomData) 79*de2e4ac0SBrandon Williams } 80*de2e4ac0SBrandon Williams } 81