Skip to content

Commit

Permalink
use new pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
robberphex committed Feb 2, 2023
1 parent f66be94 commit 5611c1b
Show file tree
Hide file tree
Showing 7 changed files with 220 additions and 267 deletions.
52 changes: 20 additions & 32 deletions dubbo-build/src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,51 +66,39 @@ pub fn generate<T: Service>(
#service_doc
#(#struct_attributes)*
#[derive(Debug, Clone, Default)]
pub struct #service_ident<T> {
inner: TripleClient<T>,
pub struct #service_ident {
inner: TripleClient,
}

impl #service_ident<ClientBoxService> {
impl #service_ident {
pub fn connect(host: String) -> Self {
let mut cli = TripleClient::connect(host.clone());
cli = cli.with_directory(Box::new(StaticDirectory::new(&host)));
let cli = TripleClient::connect(host);
#service_ident {
inner: cli,
}
}

pub fn build(builder: ClientBuilder) -> Self {
Self {
inner: TripleClient::with_builder(builder),
}
}
}
// pub fn build(builder: ClientBuilder) -> Self {
// Self {
// inner: TripleClient::new(builder),
// }
// }

impl<T> #service_ident<T>
where
T: Service<http::Request<hyperBody>, Response = http::Response<BoxBody>>,
T::Error: Into<StdError>,
{
pub fn new(inner: T, builder: ClientBuilder) -> Self {
pub fn new(builder: ClientBuilder) -> Self {
Self {
inner: TripleClient::new(inner, builder),
inner: TripleClient::new(builder),
}
}

pub fn with_filter<F>(self, filter: F) -> #service_ident<FilterService<T, F>>
where
F: Filter,
{
let inner = self.inner.with_filter(filter);
#service_ident {
inner,
}
}

pub fn with_directory(mut self, directory: Box<dyn Directory>) -> Self {
self.inner = self.inner.with_directory(directory);
self
}
// pub fn with_filter<F>(self, filter: F) -> #service_ident<FilterService<T, F>>
// where
// F: Filter,
// {
// let inner = self.inner.with_filter(filter);
// #service_ident {
// inner,
// }
// }

#methods

Expand Down
76 changes: 50 additions & 26 deletions dubbo/src/triple/client/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,30 +20,39 @@ use hyper::client::conn::Builder;
use tokio::time::Duration;
use tower::ServiceBuilder;

use crate::cluster::directory::StaticDirectory;
use crate::codegen::{Directory, Filter};
use crate::triple::compression::CompressionEncoding;
use crate::triple::transport::connection::Connection;
use crate::utils::boxed::BoxService;

use super::TripleClient;

pub type ClientBoxService =
BoxService<http::Request<hyper::Body>, http::Response<crate::BoxBody>, crate::Error>;

#[derive(Clone, Debug, Default)]
pub struct ClientBuilder {
pub uri: Uri,
pub timeout: Option<u64>,
pub connector: &'static str,
directory: Option<Box<dyn Directory>>,
}

impl ClientBuilder {
pub fn new() -> ClientBuilder {
ClientBuilder {
uri: Uri::builder().build().unwrap(),
timeout: None,
connector: "",
directory: None,
}
}

pub fn from_static(s: &'static str) -> ClientBuilder {
Self::from(Uri::from_static(s))
pub fn from_static(host: &str) -> ClientBuilder {
Self {
timeout: None,
connector: "",
directory: Some(Box::new(StaticDirectory::new(&host))),
}
}

pub fn with_timeout(self, timeout: u64) -> Self {
Expand All @@ -53,35 +62,50 @@ impl ClientBuilder {
}
}

// pub fn with_filter<F>(self, filter: F) -> Self
// where
// F: Filter,
// {
// Self {
// FilterService::new(self.inner, filter),
// ..self
// }
// }

/// host: http://0.0.0.0:8888
pub fn with_directory(self, directory: Box<dyn Directory>) -> Self {
Self {
directory: Some(directory),
..self
}
}

pub fn with_host(self, host: &'static str) -> Self {
Self {
uri: Uri::from_static(host),
directory: Some(Box::new(StaticDirectory::new(&host))),
..self
}
}

pub fn connect(self) -> ClientBoxService {
let builder = ServiceBuilder::new();
let timeout = self.timeout.unwrap_or(5);
let builder = builder.timeout(Duration::from_secs(timeout));
pub fn build(self) -> TripleClient {
TripleClient {
send_compression_encoding: Some(CompressionEncoding::Gzip),
directory: self.directory,
}
}

let mut b = Builder::new();
let hyper_builder = b.http2_only(true);
let conn = Connection::new()
.with_host(self.uri.clone())
.with_connector(self.connector)
.with_builder(hyper_builder.to_owned());
// pub fn connect1(self) -> ClientBoxService {
// let builder = ServiceBuilder::new();
// let timeout = self.timeout.unwrap_or(5);
// let builder = builder.timeout(Duration::from_secs(timeout));

BoxService::new(builder.service(conn))
}
}
// let mut b = Builder::new();
// let hyper_builder = b.http2_only(true);
// let conn = Connection::new()
// .with_host(self.uri.clone())
// .with_connector(self.connector)
// .with_builder(hyper_builder.to_owned());

impl From<Uri> for ClientBuilder {
fn from(u: Uri) -> Self {
Self {
uri: u,
timeout: None,
connector: "",
}
}
// BoxService::new(builder.service(conn))
// }
}
77 changes: 15 additions & 62 deletions dubbo/src/triple/client/triple.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,77 +36,30 @@ use crate::triple::decode::Decoding;
use crate::triple::encode::encode;

#[derive(Debug, Clone, Default)]
pub struct TripleClient<T> {
builder: Option<ClientBuilder>,
inner: T,
send_compression_encoding: Option<CompressionEncoding>,
directory: Option<Box<dyn Directory>>,
pub struct TripleClient {
pub(crate) send_compression_encoding: Option<CompressionEncoding>,
pub(crate) directory: Option<Box<dyn Directory>>,
}

impl TripleClient<ClientBoxService> {
impl TripleClient {
pub fn connect(host: String) -> Self {
let uri = match http::Uri::from_str(&host) {
Ok(v) => v,
Err(err) => {
tracing::error!("http uri parse error: {}, host: {}", err, host);
panic!("http uri parse error: {}, host: {}", err, host)
}
};

let builder = ClientBuilder::from(uri);

TripleClient {
builder: Some(builder.clone()),
inner: builder.connect(),
send_compression_encoding: Some(CompressionEncoding::Gzip),
directory: None,
}
}

pub fn with_builder(builder: ClientBuilder) -> Self {
TripleClient {
builder: Some(builder.clone()),
inner: builder.connect(),
send_compression_encoding: Some(CompressionEncoding::Gzip),
directory: None,
}
}
}
let builder = ClientBuilder::from_static(&host);

impl<T> TripleClient<T> {
pub fn new(inner: T, builder: ClientBuilder) -> Self {
TripleClient {
builder: Some(builder),
inner,
send_compression_encoding: Some(CompressionEncoding::Gzip),
directory: None,
}
builder.build()
}

pub fn with_filter<F>(self, filter: F) -> TripleClient<FilterService<T, F>>
where
F: Filter,
{
TripleClient::new(
FilterService::new(self.inner, filter),
self.builder.unwrap(),
)
pub fn new(builder: ClientBuilder) -> Self {
builder.build()
}

/// host: http://0.0.0.0:8888
pub fn with_directory(self, directory: Box<dyn Directory>) -> Self {
TripleClient {
directory: Some(directory),
..self
}
}
}
// /// host: http://0.0.0.0:8888
// pub fn with_directory1(self, directory: Box<dyn Directory>) -> Self {
// TripleClient {
// directory: Some(directory),
// ..self
// }
// }

impl<T> TripleClient<T>
where
T: Service<http::Request<hyper::Body>, Response = http::Response<crate::BoxBody>>,
T::Error: Into<crate::Error>,
{
fn map_request(
&self,
uri: http::Uri,
Expand Down
3 changes: 2 additions & 1 deletion examples/echo/src/echo/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ impl Filter for FakeFilter {

#[tokio::main]
async fn main() {
let mut cli = EchoClient::connect("http://127.0.0.1:8888".to_string());
let builder = ClientBuilder::from_static(&"http://127.0.0.1:8888").with_timeout(1000000);
let mut cli = EchoClient::new(builder);
// let mut unary_cli = cli.clone().with_filter(FakeFilter {});
// let mut cli = EchoClient::build(ClientBuilder::from_static("http://127.0.0.1:8888"));
let resp = cli
Expand Down
35 changes: 6 additions & 29 deletions examples/echo/src/echo/grpc.examples.echo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,42 +16,19 @@ pub mod echo_client {
use dubbo::{codegen::*, cluster::directory::StaticDirectory};
/// Echo is the echo service.
#[derive(Debug, Clone, Default)]
pub struct EchoClient<T> {
inner: TripleClient<T>,
pub struct EchoClient {
inner: TripleClient,
}
impl EchoClient<ClientBoxService> {
impl EchoClient {
pub fn connect(host: String) -> Self {
let mut cli = TripleClient::connect(host.clone());
cli = cli.with_directory(Box::new(StaticDirectory::new(&host)));
let cli = TripleClient::connect(host);
EchoClient { inner: cli }
}
pub fn build(builder: ClientBuilder) -> Self {
pub fn new(builder: ClientBuilder) -> Self {
Self {
inner: TripleClient::with_builder(builder),
inner: TripleClient::new(builder),
}
}
}
impl<T> EchoClient<T>
where
T: Service<http::Request<hyperBody>, Response = http::Response<BoxBody>>,
T::Error: Into<StdError>,
{
pub fn new(inner: T, builder: ClientBuilder) -> Self {
Self {
inner: TripleClient::new(inner, builder),
}
}
pub fn with_filter<F>(self, filter: F) -> EchoClient<FilterService<T, F>>
where
F: Filter,
{
let inner = self.inner.with_filter(filter);
EchoClient { inner }
}
pub fn with_directory(mut self, directory: Box<dyn Directory>) -> Self {
self.inner = self.inner.with_directory(directory);
self
}
/// UnaryEcho is unary echo.
pub async fn unary_echo(
&mut self,
Expand Down
Loading

0 comments on commit 5611c1b

Please sign in to comment.