Skip to content

Commit fa1add2

Browse files
committed
refactor(cli): rename --transport/Transport to --enabled-binding/Binding
Signed-off-by: Sam Betts <1769706+Tehsmash@users.noreply.github.com>
1 parent c3a2fe7 commit fa1add2

3 files changed

Lines changed: 45 additions & 45 deletions

File tree

a2acli/src/config.rs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ use std::path::{Path, PathBuf};
77
use serde::Deserialize;
88
use thiserror::Error;
99

10-
use crate::{Cli, HeaderArg, OutputFormat, Transport};
10+
use crate::{Binding, Cli, HeaderArg, OutputFormat};
1111

1212
#[derive(Debug, Clone, Default, Deserialize)]
1313
#[serde(deny_unknown_fields)]
1414
pub struct Config {
1515
#[serde(default)]
16-
pub transports: Vec<String>,
16+
pub enabled_bindings: Vec<String>,
1717
#[serde(default)]
1818
pub bearer_token: Option<String>,
1919
#[serde(default)]
@@ -84,13 +84,13 @@ pub fn apply_config(
8484
let placeholder = PathBuf::from("<config>");
8585
let p = path.as_ref().unwrap_or(&placeholder);
8686

87-
// Transports: CLI wins if any flags were given
88-
if cli.transports.is_empty() && !config.transports.is_empty() {
89-
for s in &config.transports {
90-
let transport = parse_transport_str(s).ok_or_else(|| {
87+
// Enabled bindings: CLI wins if any flags were given
88+
if cli.enabled_bindings.is_empty() && !config.enabled_bindings.is_empty() {
89+
for s in &config.enabled_bindings {
90+
let binding = parse_binding_str(s).ok_or_else(|| {
9191
ConfigError::Invalid(p.clone(), format!("unknown transport: {s:?}"))
9292
})?;
93-
cli.transports.push(transport);
93+
cli.enabled_bindings.push(binding);
9494
}
9595
}
9696

@@ -125,12 +125,12 @@ pub fn apply_config(
125125
Ok(())
126126
}
127127

128-
fn parse_transport_str(s: &str) -> Option<Transport> {
128+
fn parse_binding_str(s: &str) -> Option<Binding> {
129129
match s {
130-
"jsonrpc" => Some(Transport::Jsonrpc),
131-
"http-json" => Some(Transport::HttpJson),
130+
"jsonrpc" => Some(Binding::Jsonrpc),
131+
"http-json" => Some(Binding::HttpJson),
132132
#[cfg(feature = "slimrpc")]
133-
"slimrpc" => Some(Transport::Slimrpc),
133+
"slimrpc" => Some(Binding::Slimrpc),
134134
_ => None,
135135
}
136136
}
@@ -146,7 +146,7 @@ fn parse_output_format(s: &str) -> Option<OutputFormat> {
146146
#[cfg(test)]
147147
mod tests {
148148
use super::*;
149-
use crate::{OutputFormat, Transport};
149+
use crate::{Binding, OutputFormat};
150150

151151
fn parse_config(yaml: &str) -> Config {
152152
serde_yaml::from_str(yaml).unwrap()
@@ -155,7 +155,7 @@ mod tests {
155155
fn empty_cli() -> Cli {
156156
use crate::Command;
157157
Cli {
158-
transports: vec![],
158+
enabled_bindings: vec![],
159159
bearer_token: None,
160160
headers: vec![],
161161
output: None,
@@ -218,8 +218,8 @@ mod tests {
218218

219219
#[test]
220220
fn test_parse_valid_config() {
221-
let cfg = parse_config("transports:\n - jsonrpc\nbearer_token: tok\noutput: json\n");
222-
assert_eq!(cfg.transports, vec!["jsonrpc"]);
221+
let cfg = parse_config("enabled_bindings:\n - jsonrpc\nbearer_token: tok\noutput: json\n");
222+
assert_eq!(cfg.enabled_bindings, vec!["jsonrpc"]);
223223
assert_eq!(cfg.bearer_token.as_deref(), Some("tok"));
224224
assert_eq!(cfg.output.as_deref(), Some("json"));
225225
}
@@ -233,20 +233,20 @@ mod tests {
233233
#[test]
234234
fn test_apply_fills_empty_cli() {
235235
let mut cli = empty_cli();
236-
let cfg = parse_config("transports:\n - http-json\nbearer_token: tok\noutput: json\n");
236+
let cfg = parse_config("enabled_bindings:\n - http-json\nbearer_token: tok\noutput: json\n");
237237
apply_config(&mut cli, &cfg, &None).unwrap();
238-
assert_eq!(cli.transports, vec![crate::Transport::HttpJson]);
238+
assert_eq!(cli.enabled_bindings, vec![crate::Binding::HttpJson]);
239239
assert_eq!(cli.bearer_token.as_deref(), Some("tok"));
240240
assert_eq!(cli.output, Some(OutputFormat::Json));
241241
}
242242

243243
#[test]
244-
fn test_cli_transports_take_precedence() {
244+
fn test_cli_bindings_take_precedence() {
245245
let mut cli = empty_cli();
246-
cli.transports = vec![Transport::Jsonrpc];
247-
let cfg = parse_config("transports:\n - http-json\n");
246+
cli.enabled_bindings = vec![Binding::Jsonrpc];
247+
let cfg = parse_config("enabled_bindings:\n - http-json\n");
248248
apply_config(&mut cli, &cfg, &None).unwrap();
249-
assert_eq!(cli.transports, vec![Transport::Jsonrpc]);
249+
assert_eq!(cli.enabled_bindings, vec![Binding::Jsonrpc]);
250250
}
251251

252252
#[test]
@@ -264,9 +264,9 @@ mod tests {
264264
}
265265

266266
#[test]
267-
fn test_invalid_transport_errors() {
267+
fn test_invalid_binding_errors() {
268268
let mut cli = empty_cli();
269-
let cfg = parse_config("transports:\n - bogus\n");
269+
let cfg = parse_config("enabled_bindings:\n - bogus\n");
270270
let err = apply_config(&mut cli, &cfg, &None).unwrap_err();
271271
assert!(err.to_string().contains("unknown transport"));
272272
}

a2acli/src/lib.rs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ use thiserror::Error;
1616
#[derive(Debug, Clone, Parser, PartialEq, Eq)]
1717
#[command(name = "a2a", version, about = "A2A client CLI")]
1818
pub struct Cli {
19-
/// Enabled transports in preference order (first = most preferred).
20-
/// Repeat the flag to enable multiple transports, e.g. --transport jsonrpc --transport http-json.
21-
/// Only transports listed here will be used; the order overrides the server's preference.
22-
#[arg(long = "transport", global = true, value_enum)]
23-
pub transports: Vec<Transport>,
19+
/// Enabled protocol bindings in preference order (first = most preferred).
20+
/// Repeat the flag to enable multiple bindings, e.g. --enabled-binding jsonrpc --enabled-binding http-json.
21+
/// Only bindings listed here will be used; the order overrides the server's preference.
22+
#[arg(long = "enabled-binding", global = true, value_enum)]
23+
pub enabled_bindings: Vec<Binding>,
2424

2525
/// Bearer token attached to the agent-card fetch and client calls.
2626
#[arg(long, global = true, env = "A2A_BEARER_TOKEN")]
@@ -291,21 +291,21 @@ pub struct HeaderArg {
291291
}
292292

293293
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
294-
pub enum Transport {
294+
pub enum Binding {
295295
Jsonrpc,
296296
HttpJson,
297297
}
298298

299-
impl Transport {
299+
impl Binding {
300300
fn protocol(self) -> &'static str {
301301
match self {
302-
Transport::Jsonrpc => TRANSPORT_PROTOCOL_JSONRPC,
303-
Transport::HttpJson => TRANSPORT_PROTOCOL_HTTP_JSON,
302+
Binding::Jsonrpc => TRANSPORT_PROTOCOL_JSONRPC,
303+
Binding::HttpJson => TRANSPORT_PROTOCOL_HTTP_JSON,
304304
}
305305
}
306306
}
307307

308-
const DEFAULT_TRANSPORTS: &[Transport] = &[Transport::Jsonrpc, Transport::HttpJson];
308+
const DEFAULT_BINDINGS: &[Binding] = &[Binding::Jsonrpc, Binding::HttpJson];
309309

310310
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
311311
pub enum TaskStateArg {
@@ -609,15 +609,15 @@ async fn resolve_client(
609609
) -> Result<A2AClient<Box<dyn a2a_client::Transport>>, CliError> {
610610
let card = resolve_agent_card(agent_ref, cli).await?;
611611

612-
let effective_transports = if cli.transports.is_empty() {
613-
DEFAULT_TRANSPORTS.to_vec()
612+
let effective_bindings = if cli.enabled_bindings.is_empty() {
613+
DEFAULT_BINDINGS.to_vec()
614614
} else {
615-
cli.transports.clone()
615+
cli.enabled_bindings.clone()
616616
};
617617

618-
let preferred: Vec<String> = effective_transports
618+
let preferred: Vec<String> = effective_bindings
619619
.iter()
620-
.map(|t| t.protocol().to_string())
620+
.map(|b| b.protocol().to_string())
621621
.collect();
622622

623623
let mut builder = A2AClientFactory::builder().preferred_bindings(preferred);
@@ -1346,7 +1346,7 @@ mod tests {
13461346
#[test]
13471347
fn test_cli_parse_send_command() {
13481348
let cli = parse_cli(&[
1349-
"--transport",
1349+
"--enabled-binding",
13501350
"jsonrpc",
13511351
"--header",
13521352
"X-Test:123",
@@ -1357,7 +1357,7 @@ mod tests {
13571357
"2",
13581358
]);
13591359

1360-
assert_eq!(cli.transports, vec![crate::Transport::Jsonrpc]);
1360+
assert_eq!(cli.enabled_bindings, vec![crate::Binding::Jsonrpc]);
13611361
assert_eq!(cli.headers.len(), 1);
13621362
assert!(matches!(cli.command, Command::Send(_)));
13631363
}
@@ -1461,9 +1461,9 @@ mod tests {
14611461
}
14621462

14631463
#[test]
1464-
fn test_transport_protocols() {
1465-
assert_eq!(crate::Transport::Jsonrpc.protocol(), TRANSPORT_PROTOCOL_JSONRPC);
1466-
assert_eq!(crate::Transport::HttpJson.protocol(), TRANSPORT_PROTOCOL_HTTP_JSON);
1464+
fn test_binding_protocols() {
1465+
assert_eq!(crate::Binding::Jsonrpc.protocol(), TRANSPORT_PROTOCOL_JSONRPC);
1466+
assert_eq!(crate::Binding::HttpJson.protocol(), TRANSPORT_PROTOCOL_HTTP_JSON);
14671467
}
14681468

14691469
#[test]
@@ -1678,7 +1678,7 @@ mod tests {
16781678
.await
16791679
.unwrap();
16801680
run(parse_cli(&[
1681-
"--transport",
1681+
"--enabled-binding",
16821682
"jsonrpc",
16831683
"--bearer-token",
16841684
"secret",

a2acli/tests/e2e.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,7 @@ async fn card_and_extended_card_commands_work() {
478478
assert_eq!(headers[0].1.as_deref(), Some("abc"));
479479

480480
let compact = run_cli_success(&[
481-
"--transport",
481+
"--enabled-binding",
482482
"http-json",
483483
"-o",
484484
"json",

0 commit comments

Comments
 (0)