a2a_protocol_client/
config.rs1use std::time::Duration;
12
13pub const BINDING_JSONRPC: &str = "JSONRPC";
20
21pub const BINDING_HTTP_JSON: &str = "HTTP+JSON";
23
24pub const BINDING_REST: &str = "REST";
26
27pub const BINDING_GRPC: &str = "GRPC";
29
30#[derive(Debug, Clone)]
37pub enum TlsConfig {
38 Disabled,
40 #[cfg(feature = "tls-rustls")]
44 Rustls,
45}
46
47#[allow(clippy::derivable_impls)]
48impl Default for TlsConfig {
49 fn default() -> Self {
50 #[cfg(feature = "tls-rustls")]
51 {
52 Self::Rustls
53 }
54 #[cfg(not(feature = "tls-rustls"))]
55 {
56 Self::Disabled
57 }
58 }
59}
60
61#[derive(Debug, Clone)]
68pub struct ClientConfig {
69 pub preferred_bindings: Vec<String>,
74
75 pub accepted_output_modes: Vec<String>,
79
80 pub history_length: Option<u32>,
84
85 pub return_immediately: bool,
88
89 pub request_timeout: Duration,
93
94 pub stream_connect_timeout: Duration,
99
100 pub connection_timeout: Duration,
105
106 pub tls: TlsConfig,
108}
109
110impl ClientConfig {
111 #[must_use]
114 pub fn default_http() -> Self {
115 Self {
116 preferred_bindings: vec![BINDING_JSONRPC.into()],
117 accepted_output_modes: vec!["text/plain".into(), "application/json".into()],
118 history_length: None,
119 return_immediately: false,
120 request_timeout: Duration::from_secs(30),
121 stream_connect_timeout: Duration::from_secs(30),
122 connection_timeout: Duration::from_secs(10),
123 tls: TlsConfig::Disabled,
124 }
125 }
126}
127
128impl Default for ClientConfig {
129 fn default() -> Self {
130 Self {
131 preferred_bindings: vec![BINDING_JSONRPC.into()],
132 accepted_output_modes: vec!["text/plain".into(), "application/json".into()],
133 history_length: None,
134 return_immediately: false,
135 request_timeout: Duration::from_secs(30),
136 stream_connect_timeout: Duration::from_secs(30),
137 connection_timeout: Duration::from_secs(10),
138 tls: TlsConfig::default(),
139 }
140 }
141}
142
143#[cfg(test)]
146mod tests {
147 use super::*;
148
149 #[test]
150 fn default_config_has_jsonrpc_binding() {
151 let cfg = ClientConfig::default();
152 assert_eq!(cfg.preferred_bindings, vec![BINDING_JSONRPC]);
153 }
154
155 #[test]
156 fn default_config_timeout() {
157 let cfg = ClientConfig::default();
158 assert_eq!(cfg.request_timeout, Duration::from_secs(30));
159 }
160
161 #[test]
162 fn default_http_config_is_disabled_tls() {
163 let cfg = ClientConfig::default_http();
164 assert!(matches!(cfg.tls, TlsConfig::Disabled));
165 }
166
167 #[test]
168 fn default_http_config_field_values() {
169 let cfg = ClientConfig::default_http();
170 assert_eq!(cfg.preferred_bindings, vec![BINDING_JSONRPC]);
171 assert_eq!(
172 cfg.accepted_output_modes,
173 vec!["text/plain", "application/json"]
174 );
175 assert!(cfg.history_length.is_none());
176 assert!(!cfg.return_immediately);
177 assert_eq!(cfg.request_timeout, Duration::from_secs(30));
178 assert_eq!(cfg.stream_connect_timeout, Duration::from_secs(30));
179 assert_eq!(cfg.connection_timeout, Duration::from_secs(10));
180 }
181
182 #[test]
183 fn default_config_field_values() {
184 let cfg = ClientConfig::default();
185 assert_eq!(cfg.preferred_bindings, vec![BINDING_JSONRPC]);
186 assert_eq!(
187 cfg.accepted_output_modes,
188 vec!["text/plain", "application/json"]
189 );
190 assert!(cfg.history_length.is_none());
191 assert!(!cfg.return_immediately);
192 assert_eq!(cfg.request_timeout, Duration::from_secs(30));
193 assert_eq!(cfg.stream_connect_timeout, Duration::from_secs(30));
194 assert_eq!(cfg.connection_timeout, Duration::from_secs(10));
195 }
196
197 #[test]
198 fn binding_constants_values() {
199 assert_eq!(BINDING_JSONRPC, "JSONRPC");
200 assert_eq!(BINDING_HTTP_JSON, "HTTP+JSON");
201 assert_eq!(BINDING_REST, "REST");
202 assert_eq!(BINDING_GRPC, "GRPC");
203 }
204}