#[macro_export]
macro_rules! client_config_setters {
($config:ident) => {
pub fn base_url(mut self, url: impl Into<String>) -> Self {
self.$config.base_url = url.into();
self
}
pub fn timeout_ms(mut self, timeout: u64) -> Self {
self.$config.timeout_ms = timeout;
self
}
pub fn pool_size(mut self, size: usize) -> Self {
self.$config.pool_size = size;
self
}
pub fn with_retry_config(mut self, config: $crate::RetryConfig) -> Self {
self.$config.retry_config = Some(config);
self
}
pub fn max_concurrent(mut self, max: usize) -> Self {
self.$config.max_concurrent = Some(max);
self
}
pub fn http_transport(
mut self,
transport: ::std::sync::Arc<dyn $crate::HttpTransport>,
) -> Self {
self.$config.http_transport = Some(transport);
self
}
pub fn runtime(mut self, runtime: ::std::sync::Arc<dyn $crate::__rt::Runtime>) -> Self {
self.$config.runtime = Some(runtime);
self
}
};
}
#[macro_export]
macro_rules! namespaces {
(@accessors [$($field:ident),+]) => {};
(@accessors [$($field:ident),+]
$(#[$meta:meta])* $name:ident: $ns:path { $($to:ident: $from:ident),+ $(,)? }
$(, $($rest:tt)*)?
) => {
$(#[$meta])*
pub fn $name(&self) -> $ns {
$ns { $($to: self.$from.clone()),+ }
}
$crate::namespaces!(@accessors [$($field),+] $($($rest)*)?);
};
(@accessors [$($field:ident),+]
$(#[$meta:meta])* $name:ident: $ns:path
$(, $($rest:tt)*)?
) => {
$(#[$meta])*
pub fn $name(&self) -> $ns {
$ns { $($field: self.$field.clone()),+ }
}
$crate::namespaces!(@accessors [$($field),+] $($($rest)*)?);
};
($($field:ident),+; $($accessors:tt)*) => {
$crate::namespaces!(@accessors [$($field),+] $($accessors)*);
};
}
#[macro_export]
macro_rules! query_setters {
(@setters $field:ident;) => {};
(@setters $field:ident;
$(#[$meta:meta])* $name:ident: impl Into<String> => $key:literal
$(, $($rest:tt)*)?
) => {
$(#[$meta])*
pub fn $name(mut self, value: impl Into<String>) -> Self {
#[allow(unused_imports)]
use $crate::QueryBuilder as _;
self.$field = self.$field.query($key, value.into());
self
}
$crate::query_setters!(@setters $field; $($($rest)*)?);
};
(@setters $field:ident;
$(#[$meta:meta])* $name:ident: many $ty:ty => $key:literal
$(, $($rest:tt)*)?
) => {
$(#[$meta])*
pub fn $name(mut self, values: $ty) -> Self {
#[allow(unused_imports)]
use $crate::QueryBuilder as _;
self.$field = self.$field.query_many($key, values);
self
}
$crate::query_setters!(@setters $field; $($($rest)*)?);
};
(@setters $field:ident;
$(#[$meta:meta])* $name:ident: csv<I, S> => $key:literal
$(, $($rest:tt)*)?
) => {
$(#[$meta])*
pub fn $name<I, S>(mut self, values: I) -> Self
where
I: IntoIterator<Item = S>,
S: ToString,
{
#[allow(unused_imports)]
use $crate::QueryBuilder as _;
if let Some(joined) = $crate::csv(values) {
self.$field = self.$field.query($key, joined);
}
self
}
$crate::query_setters!(@setters $field; $($($rest)*)?);
};
(@setters $field:ident;
$(#[$meta:meta])* $name:ident: csv $ty:ty => $key:literal
$(, $($rest:tt)*)?
) => {
$(#[$meta])*
pub fn $name(mut self, values: $ty) -> Self {
#[allow(unused_imports)]
use $crate::QueryBuilder as _;
if let Some(joined) = $crate::csv(values) {
self.$field = self.$field.query($key, joined);
}
self
}
$crate::query_setters!(@setters $field; $($($rest)*)?);
};
(@setters $field:ident;
$(#[$meta:meta])* $name:ident($arg:ident: $ty:ty) => csv $key:literal = $value:expr
$(, $($rest:tt)*)?
) => {
$(#[$meta])*
pub fn $name(mut self, $arg: $ty) -> Self {
#[allow(unused_imports)]
use $crate::QueryBuilder as _;
if let Some(joined) = $crate::csv($value) {
self.$field = self.$field.query($key, joined);
}
self
}
$crate::query_setters!(@setters $field; $($($rest)*)?);
};
(@setters $field:ident;
$(#[$meta:meta])* $name:ident($arg:ident: $ty:ty) => $key:literal = $value:expr
$(, $($rest:tt)*)?
) => {
$(#[$meta])*
pub fn $name(mut self, $arg: $ty) -> Self {
#[allow(unused_imports)]
use $crate::QueryBuilder as _;
self.$field = self.$field.query($key, $value);
self
}
$crate::query_setters!(@setters $field; $($($rest)*)?);
};
(@setters $field:ident;
$(#[$meta:meta])* $name:ident($arg:ident: $ty:ty) => $key:literal if $cond:expr
$(, $($rest:tt)*)?
) => {
$(#[$meta])*
pub fn $name(mut self, $arg: $ty) -> Self {
#[allow(unused_imports)]
use $crate::QueryBuilder as _;
if $cond {
self.$field = self.$field.query($key, $arg);
}
self
}
$crate::query_setters!(@setters $field; $($($rest)*)?);
};
(@setters $field:ident;
$(#[$meta:meta])* $name:ident: $ty:ty => $key:literal
$(, $($rest:tt)*)?
) => {
$(#[$meta])*
pub fn $name(mut self, value: $ty) -> Self {
#[allow(unused_imports)]
use $crate::QueryBuilder as _;
self.$field = self.$field.query($key, value);
self
}
$crate::query_setters!(@setters $field; $($($rest)*)?);
};
(self.$field:ident; $($setters:tt)*) => {
$crate::query_setters!(@setters $field; $($setters)*);
};
($($setters:tt)*) => {
$crate::query_setters!(@setters request; $($setters)*);
};
}