Skip to content

Commit be061e1

Browse files
committed
chore: update clap dependency from v3 to v4
Signed-off-by: Matheus Cardoso <matheus@cardo.so>
1 parent b3b1692 commit be061e1

33 files changed

+1968
-667
lines changed

.vscode/launch.json

Lines changed: 538 additions & 0 deletions
Large diffs are not rendered by default.

Cargo.lock

Lines changed: 64 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ async-trait = "0.1"
1717
bindle = { workspace = true }
1818
bytes = "1.1"
1919
chrono = "0.4"
20-
clap = { version = "3.1.15", features = ["derive", "env"] }
20+
clap = { version = "4.1", features = ["derive", "env"] }
21+
clap_complete = { version = "4.1", optional = true }
22+
clap_complete_fig = { version = "4.1", optional = true }
2123
cloud = { path = "crates/cloud" }
2224
cloud-openapi = { git = "https://github.com/fermyon/cloud-openapi" }
2325
comfy-table = "5.0"
@@ -80,12 +82,13 @@ vergen = { version = "7", default-features = false, features = [
8082
] }
8183

8284
[features]
83-
default = []
85+
default = ["generate-completions"]
8486
e2e-tests = []
8587
outbound-redis-tests = []
8688
config-provider-tests = []
8789
outbound-pg-tests = []
8890
outbound-mysql-tests = []
91+
generate-completions = ["dep:clap_complete", "dep:clap_complete_fig"]
8992

9093
[workspace]
9194
members = [

crates/abi-conformance/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ edition = { workspace = true }
77
[dependencies]
88
anyhow = "1.0.44"
99
cap-std = "0.26.1"
10-
clap = { version = "3.1.15", features = ["derive", "env"] }
10+
clap = { version = "4.1", features = ["derive", "env"] }
1111
rand = "0.8.5"
1212
rand_chacha = "0.3.1"
1313
rand_core = "0.6.3"

crates/abi-conformance/src/bin/spin-abi-conformance.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,18 @@ use std::{
88
use wasmtime::{Config, Engine, Module};
99

1010
#[derive(Parser)]
11-
#[clap(author, version, about)]
11+
#[command(author, version, about)]
1212
pub struct Options {
1313
/// Name of Wasm file to test (or stdin if not specified)
14-
#[clap(short, long)]
14+
#[arg(short, long)]
1515
pub input: Option<PathBuf>,
1616

1717
/// Name of JSON file to write report to (or stdout if not specified)
18-
#[clap(short, long)]
18+
#[arg(short, long)]
1919
pub output: Option<PathBuf>,
2020

2121
/// Name of TOML configuration file to use
22-
#[clap(short, long)]
22+
#[arg(short, long)]
2323
pub config: Option<PathBuf>,
2424
}
2525

crates/http/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ doctest = false
1010
[dependencies]
1111
anyhow = "1.0"
1212
async-trait = "0.1"
13-
clap = "3"
13+
clap = "4.1"
1414
futures = "0.3"
1515
futures-util = "0.3.8"
1616
http = "0.2"

crates/http/src/lib.rs

Lines changed: 68 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ mod wagi;
88
use std::{
99
collections::HashMap,
1010
future::ready,
11-
net::{Ipv4Addr, SocketAddr, ToSocketAddrs},
11+
net::{Ipv4Addr, SocketAddr, SocketAddrV4, ToSocketAddrs},
1212
path::PathBuf,
13-
sync::Arc,
13+
sync::Arc, str::FromStr, fmt::Display,
1414
};
1515

1616
use anyhow::{Context, Error, Result};
@@ -56,18 +56,71 @@ pub struct HttpTrigger {
5656
component_trigger_configs: HashMap<String, HttpTriggerConfig>,
5757
}
5858

59-
#[derive(Args)]
59+
#[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Debug)]
60+
pub struct SocketAddress(SocketAddr);
61+
62+
impl SocketAddress {
63+
pub fn new(v4: Ipv4Addr, port: u16) -> Self {
64+
Self(SocketAddr::V4(SocketAddrV4::new(v4, port)))
65+
}
66+
}
67+
68+
impl Into<SocketAddr> for SocketAddress {
69+
fn into(self) -> SocketAddr {
70+
return self.0
71+
}
72+
}
73+
74+
impl ToSocketAddrs for SocketAddress {
75+
type Iter = <SocketAddr as ToSocketAddrs>::Iter;
76+
77+
fn to_socket_addrs(&self) -> std::io::Result<Self::Iter> {
78+
self.0.to_socket_addrs()
79+
}
80+
}
81+
82+
83+
84+
impl Display for SocketAddress {
85+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
86+
self.0.fmt(f)
87+
}
88+
}
89+
90+
impl Default for SocketAddress {
91+
fn default() -> Self {
92+
Self::new(Ipv4Addr::LOCALHOST, 3000)
93+
}
94+
}
95+
96+
impl FromStr for SocketAddress {
97+
type Err = anyhow::Error;
98+
fn from_str(addr: &str) -> Result<SocketAddress> {
99+
let addrs: Vec<SocketAddr> = addr.to_socket_addrs()?.collect();
100+
// Prefer 127.0.0.1 over e.g. [::1] because CHANGE IS HARD
101+
if let Some(addr) = addrs
102+
.iter()
103+
.find(|addr| addr.is_ipv4() && addr.ip() == Ipv4Addr::LOCALHOST)
104+
{
105+
return Ok(Self(*addr));
106+
}
107+
// Otherwise, take the first addr (OS preference)
108+
addrs.into_iter().next().context("couldn't resolve address").map(Self)
109+
}
110+
}
111+
112+
#[derive(Args, Clone)]
60113
pub struct CliArgs {
61114
/// IP address and port to listen on
62-
#[clap(long = "listen", default_value = "127.0.0.1:3000", value_parser = parse_listen_addr)]
63-
pub address: SocketAddr,
115+
#[arg(long = "listen", default_value_t = SocketAddress::default())]
116+
pub address: SocketAddress,
64117

65118
/// The path to the certificate to use for https, if this is not set, normal http will be used. The cert should be in PEM format
66-
#[clap(long, env = "SPIN_TLS_CERT", requires = "tls-key")]
119+
#[arg(long, env = "SPIN_TLS_CERT", requires = "tls_key")]
67120
pub tls_cert: Option<PathBuf>,
68121

69122
/// The path to the certificate key to use for https, if this is not set, normal http will be used. The key should be in PKCS#8 format
70-
#[clap(long, env = "SPIN_TLS_KEY", requires = "tls-cert")]
123+
#[arg(long, env = "SPIN_TLS_KEY", requires = "tls_cert")]
71124
pub tls_key: Option<PathBuf>,
72125
}
73126

@@ -177,11 +230,10 @@ impl TriggerExecutor for HttpTrigger {
177230
}
178231

179232
if let Some(tls) = tls {
180-
self.serve_tls(listen_addr, tls).await?
233+
self.serve_tls(listen_addr, tls).await
181234
} else {
182-
self.serve(listen_addr).await?
183-
};
184-
Ok(())
235+
self.serve(listen_addr).await
236+
}
185237
}
186238
}
187239

@@ -293,7 +345,7 @@ impl HttpTrigger {
293345
.body(Body::empty())?)
294346
}
295347

296-
async fn serve(self, listen_addr: SocketAddr) -> Result<()> {
348+
async fn serve(self, listen_addr: SocketAddress) -> Result<()> {
297349
let self_ = Arc::new(self);
298350
let make_service = make_service_fn(|conn: &AddrStream| {
299351
let self_ = self_.clone();
@@ -307,14 +359,14 @@ impl HttpTrigger {
307359
}
308360
});
309361

310-
Server::try_bind(&listen_addr)
362+
Server::try_bind(&listen_addr.into())
311363
.with_context(|| format!("Unable to listen on {}", listen_addr))?
312364
.serve(make_service)
313365
.await?;
314366
Ok(())
315367
}
316368

317-
async fn serve_tls(self, listen_addr: SocketAddr, tls: TlsConfig) -> Result<()> {
369+
async fn serve_tls(self, listen_addr: SocketAddress, tls: TlsConfig) -> Result<()> {
318370
let self_ = Arc::new(self);
319371
let make_service = make_service_fn(|conn: &TlsStream<TcpStream>| {
320372
let self_ = self_.clone();
@@ -340,7 +392,7 @@ impl HttpTrigger {
340392
}
341393
});
342394

343-
let listener = TcpListener::bind(&listen_addr)
395+
let listener = TcpListener::bind::<SocketAddr>(listen_addr.into())
344396
.await
345397
.with_context(|| format!("Unable to listen on {}", listen_addr))?;
346398

@@ -369,19 +421,6 @@ pub struct AppInfo {
369421
pub bindle_version: Option<String>,
370422
}
371423

372-
fn parse_listen_addr(addr: &str) -> anyhow::Result<SocketAddr> {
373-
let addrs: Vec<SocketAddr> = addr.to_socket_addrs()?.collect();
374-
// Prefer 127.0.0.1 over e.g. [::1] because CHANGE IS HARD
375-
if let Some(addr) = addrs
376-
.iter()
377-
.find(|addr| addr.is_ipv4() && addr.ip() == Ipv4Addr::LOCALHOST)
378-
{
379-
return Ok(*addr);
380-
}
381-
// Otherwise, take the first addr (OS preference)
382-
addrs.into_iter().next().context("couldn't resolve address")
383-
}
384-
385424
fn set_req_uri(req: &mut Request<Body>, scheme: Scheme) -> Result<()> {
386425
const DEFAULT_HOST: &str = "localhost";
387426

@@ -649,7 +688,7 @@ mod tests {
649688

650689
#[test]
651690
fn parse_listen_addr_prefers_ipv4() {
652-
let addr = parse_listen_addr("localhost:12345").unwrap();
691+
let addr = SocketAddr::from_str("localhost:12345").unwrap();
653692
assert_eq!(addr.ip(), Ipv4Addr::LOCALHOST);
654693
assert_eq!(addr.port(), 12345);
655694
}

crates/trigger/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ edition = { workspace = true }
77
[dependencies]
88
anyhow = "1.0"
99
async-trait = "0.1"
10-
clap = { version = "3.1.15", features = ["derive", "env"] }
10+
clap = { version = "4.1", features = ["derive", "env"] }
1111
ctrlc = { version = "3.2", features = ["termination"] }
1212
dirs = "4"
1313
futures = "0.3"

0 commit comments

Comments
 (0)