use std::time::Duration;
pub const BINDING_JSONRPC: &str = "JSONRPC";
pub const BINDING_HTTP_JSON: &str = "HTTP+JSON";
pub const BINDING_REST: &str = "REST";
pub const BINDING_GRPC: &str = "GRPC";
#[derive(Debug, Clone)]
pub enum TlsConfig {
Disabled,
#[cfg(feature = "tls-rustls")]
Rustls,
}
#[allow(clippy::derivable_impls)]
impl Default for TlsConfig {
fn default() -> Self {
#[cfg(feature = "tls-rustls")]
{
Self::Rustls
}
#[cfg(not(feature = "tls-rustls"))]
{
Self::Disabled
}
}
}
#[derive(Debug, Clone)]
pub struct ClientConfig {
pub preferred_bindings: Vec<String>,
pub accepted_output_modes: Vec<String>,
pub history_length: Option<u32>,
pub return_immediately: bool,
pub request_timeout: Duration,
pub stream_connect_timeout: Duration,
pub connection_timeout: Duration,
pub tls: TlsConfig,
pub tenant: Option<String>,
}
impl ClientConfig {
#[must_use]
pub fn default_http() -> Self {
Self {
preferred_bindings: vec![BINDING_JSONRPC.into()],
accepted_output_modes: vec!["text/plain".into(), "application/json".into()],
history_length: None,
return_immediately: false,
request_timeout: Duration::from_secs(30),
stream_connect_timeout: Duration::from_secs(30),
connection_timeout: Duration::from_secs(10),
tls: TlsConfig::Disabled,
tenant: None,
}
}
}
impl Default for ClientConfig {
fn default() -> Self {
Self {
preferred_bindings: vec![BINDING_JSONRPC.into()],
accepted_output_modes: vec!["text/plain".into(), "application/json".into()],
history_length: None,
return_immediately: false,
request_timeout: Duration::from_secs(30),
stream_connect_timeout: Duration::from_secs(30),
connection_timeout: Duration::from_secs(10),
tls: TlsConfig::default(),
tenant: None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_config_has_jsonrpc_binding() {
let cfg = ClientConfig::default();
assert_eq!(cfg.preferred_bindings, vec![BINDING_JSONRPC]);
}
#[test]
fn default_config_timeout() {
let cfg = ClientConfig::default();
assert_eq!(cfg.request_timeout, Duration::from_secs(30));
}
#[test]
fn default_http_config_is_disabled_tls() {
let cfg = ClientConfig::default_http();
assert!(matches!(cfg.tls, TlsConfig::Disabled));
}
#[test]
fn default_http_config_field_values() {
let cfg = ClientConfig::default_http();
assert_eq!(cfg.preferred_bindings, vec![BINDING_JSONRPC]);
assert_eq!(
cfg.accepted_output_modes,
vec!["text/plain", "application/json"]
);
assert!(cfg.history_length.is_none());
assert!(!cfg.return_immediately);
assert_eq!(cfg.request_timeout, Duration::from_secs(30));
assert_eq!(cfg.stream_connect_timeout, Duration::from_secs(30));
assert_eq!(cfg.connection_timeout, Duration::from_secs(10));
}
#[test]
fn default_config_field_values() {
let cfg = ClientConfig::default();
assert_eq!(cfg.preferred_bindings, vec![BINDING_JSONRPC]);
assert_eq!(
cfg.accepted_output_modes,
vec!["text/plain", "application/json"]
);
assert!(cfg.history_length.is_none());
assert!(!cfg.return_immediately);
assert_eq!(cfg.request_timeout, Duration::from_secs(30));
assert_eq!(cfg.stream_connect_timeout, Duration::from_secs(30));
assert_eq!(cfg.connection_timeout, Duration::from_secs(10));
}
#[test]
fn binding_constants_values() {
assert_eq!(BINDING_JSONRPC, "JSONRPC");
assert_eq!(BINDING_HTTP_JSON, "HTTP+JSON");
assert_eq!(BINDING_REST, "REST");
assert_eq!(BINDING_GRPC, "GRPC");
}
}