diff --git a/Cargo.lock b/Cargo.lock index 9d3578c..190dba9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -55,6 +55,21 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.6.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +dependencies = [ + "anstyle", + "anstyle-parse 0.2.7", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + [[package]] name = "anstream" version = "1.0.0" @@ -62,7 +77,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", - "anstyle-parse", + "anstyle-parse 1.0.0", "anstyle-query", "anstyle-wincon", "colorchoice", @@ -76,6 +91,15 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + [[package]] name = "anstyle-parse" version = "1.0.0" @@ -362,9 +386,9 @@ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-lc-rs" -version = "1.17.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" +checksum = "4342d8937fc7e5dd9b1c60292261c0670c882a2cd1719cfc11b1af41731e32ad" dependencies = [ "aws-lc-sys", "zeroize", @@ -372,14 +396,15 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.41.0" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" +checksum = "6d9ceb1da931507a12f4fccea479dccd00da1943e1b4ae72d8e502d707361444" dependencies = [ "cc", "cmake", "dunce", "fs_extra", + "pkg-config", ] [[package]] @@ -690,7 +715,7 @@ version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ - "anstream", + "anstream 1.0.0", "anstyle", "clap_lex", "strsim", @@ -730,6 +755,16 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" +[[package]] +name = "colorchoice-clap" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb349f1be51d537c77d89ba5d1ba4344385175446eb01dacde8e1eace4094226" +dependencies = [ + "clap", + "colorchoice", +] + [[package]] name = "combine" version = "4.6.7" @@ -2258,9 +2293,9 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" dependencies = [ "libc", ] @@ -3629,9 +3664,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046" dependencies = [ "web-time", "zeroize", @@ -4324,9 +4359,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.51" +version = "0.3.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c17d80feb7334b40c484e45ed1a5273dfd8bfda537c3be2e74a06a6686f327" +checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50" dependencies = [ "deranged", "num-conv", @@ -4344,9 +4379,9 @@ checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.30" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcef1a61bdb119096e153208ec5cbec23944ce8bca13be5c7f60c634f7403935" +checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f" dependencies = [ "num-conv", "time-core", @@ -5738,9 +5773,12 @@ dependencies = [ name = "wkg" version = "0.16.0" dependencies = [ + "anstream 0.6.21", + "anstyle", "anyhow", "base64 0.22.1", "clap", + "colorchoice-clap", "docker_credential", "futures-util", "oci-client", diff --git a/Cargo.toml b/Cargo.toml index 707d495..c90977c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,20 +9,31 @@ authors = ["The Wasmtime Project Developers"] license = "Apache-2.0 WITH LLVM-exception" [workspace.dependencies] +wasm-pkg-client = { version = "0.16.0", path = "crates/wasm-pkg-client" } +wasm-pkg-common = { version = "0.16.0", path = "crates/wasm-pkg-common" } +wasm-pkg-core = { version = "0.16.0", path = "crates/wasm-pkg-core" } + +anstream = "0.6" +anstyle = "1.0" anyhow = "1" +async-trait = "0.1.77" base64 = "0.22" bytes = "1.11" +clap = "4.5" +colorchoice-clap = "1.0" docker_credential = "1.3.2" etcetera = "0.11" futures-util = "0.3.30" -oci-client = { version = "0.16", default-features = false, features = [ - "rustls-tls", -] } -oci-wasm = { version = "0.4", default-features = false, features = [ - "rustls-tls", -] } +glob = "0.3.3" +http = "1.1.0" +indexmap = "2.5" +oci-client = { version = "0.16", default-features = false, features = [ "rustls-tls" ] } +oci-wasm = { version = "0.4", default-features = false, features = [ "rustls-tls" ] } petgraph = "0.8.3" rcgen = "0.14.8" +reqwest = { version = "0.12.0", default-features = false } +rstest = "0.23" +secrecy = "0.8" semver = "1.0.23" serde = { version = "1.0", features = ["derive"] } serde_json = "1" @@ -34,28 +45,14 @@ tokio = "1.44.2" tokio-util = "0.7.10" toml = "0.8" tracing = "0.1.40" -tracing-subscriber = { version = "0.3.20", default-features = false, features = [ - "fmt", - "env-filter", -] } -wasm-pkg-common = { version = "0.16.0", path = "crates/wasm-pkg-common" } -wasm-pkg-client = { version = "0.16.0", path = "crates/wasm-pkg-client" } -wasm-pkg-core = { version = "0.16.0", path = "crates/wasm-pkg-core" } -wasm-metadata = "0.244" -wit-component = "0.244" -wit-parser = "0.244" -async-trait = "0.1.77" -clap = "4.5" -glob = "0.3.3" -http = "1.1.0" -indexmap = "2.5" -reqwest = { version = "0.12.0", default-features = false } -rstest = "0.23" -secrecy = "0.8" +tracing-subscriber = { version = "0.3.20", default-features = false, features = [ "fmt", "env-filter" ] } url = "2.5.0" warg-client = "0.9.2" warg-crypto = "0.9.2" warg-protocol = "0.9.2" +wasm-metadata = "0.244" +wit-component = "0.244" +wit-parser = "0.244" # https://github.com/crate-ci/typos/blob/master/docs/reference.md [workspace.metadata.typos.default] diff --git a/crates/wkg/Cargo.toml b/crates/wkg/Cargo.toml index 3fbded2..d52cf28 100644 --- a/crates/wkg/Cargo.toml +++ b/crates/wkg/Cargo.toml @@ -14,8 +14,11 @@ default = ["docker-tests"] docker-tests = [] [dependencies] +anstream = { workspace = true } +anstyle = { workspace = true } anyhow = { workspace = true } clap = { workspace = true, features = ["derive", "wrap_help", "env"] } +colorchoice-clap = { workspace = true } docker_credential = { workspace = true } futures-util = { workspace = true, features = ["io"] } oci-client = { workspace = true } @@ -24,12 +27,13 @@ tempfile = { workspace = true } tokio = { workspace = true, features = ["macros", "rt"] } tracing = { workspace = true } tracing-subscriber = { workspace = true, features = ["ansi"] } -wasm-pkg-common = { workspace = true } wasm-pkg-client = { workspace = true } -wit-component = { workspace = true } +wasm-pkg-common = { workspace = true } wasm-pkg-core = { workspace = true } +wit-component = { workspace = true } [dev-dependencies] +anstream = { workspace = true, features = ["test"] } base64 = { workspace = true } serde_json = { workspace = true } tempfile = { workspace = true } diff --git a/crates/wkg/src/main.rs b/crates/wkg/src/main.rs index 190e89f..56f0286 100644 --- a/crates/wkg/src/main.rs +++ b/crates/wkg/src/main.rs @@ -4,6 +4,7 @@ use std::{ path::PathBuf, }; +use anstream::eprintln; use anyhow::{Context, anyhow, ensure}; use clap::{Args, Parser, Subcommand, ValueEnum}; use futures_util::TryStreamExt; @@ -32,9 +33,40 @@ use wit::{BuildArgs, FetchArgs, UpdateArgs, WitCommands}; use crate::wit::temp_wit_file; +#[macro_export] +macro_rules! warnln { + ($($arg:tt)*) => {{ + let style = ::anstyle::AnsiColor::Yellow.on_default() | ::anstyle::Effects::BOLD; + ::anstream::eprintln!("{style}warning{style:#}: {}", format_args!($($arg)*)); + }}; +} + +#[macro_export] +macro_rules! statusln { + ($label:expr, $($arg:tt)*) => {{ + let style = ::anstyle::AnsiColor::Cyan.on_default() | ::anstyle::Effects::BOLD; + ::anstream::eprintln!( + "{style}{:>12}{style:#} {}", + $label, + format_args!($($arg)*), + ); + }}; +} + +#[macro_export] +macro_rules! helpln { + ($($arg:tt)*) => {{ + let style = ::anstyle::AnsiColor::Magenta.on_default() | ::anstyle::Effects::BOLD; + ::anstream::eprintln!("{style}{:>7}{style:#}: {}", "help", format_args!($($arg)*)); + }}; +} + #[derive(Parser, Debug)] #[command(version)] struct Cli { + #[command(flatten)] + color: colorchoice_clap::Color, + #[command(subcommand)] command: Commands, } @@ -194,7 +226,7 @@ impl ConfigArgs { if let Some(registry) = config.default_registry() { eprintln!("Default registry: {}", registry); } else { - eprintln!("Default registry is not set"); + warnln!("Default registry is not set"); } Ok(()) @@ -280,7 +312,7 @@ impl PublishArgs { .merge(reg_config); let mut plan = PublishPlan::from_paths(paths)?; - eprintln!("{plan}"); + anstream::eprintln!("{plan}"); // TODO(mkatychev): Add support for `PackageLoader::get_release` to handle // querying on a per package, namespace, and registry level @@ -358,7 +390,7 @@ impl PublishArgs { .publish_release_data(source, publish_opts.clone()) .await?; if self.dry_run { - eprintln!("Aborting publish due to dry run: {}@{}", package, version); + warnln!("Aborting publish due to dry run: {}@{}", package, version); } else { eprintln!("Published {}@{}", package, version); } @@ -461,7 +493,8 @@ impl GetArgs { let version = match version { Some(ver) => ver, None => { - eprintln!("No version specified; fetching version list..."); + warnln!("no version specified; fetching version list..."); + statusln!("Fetching", "version list"); let versions = client.list_all_versions(&package).await?; tracing::trace!(?versions, "Fetched version list"); versions @@ -472,7 +505,7 @@ impl GetArgs { } }; - eprintln!("Getting {package}@{version}..."); + statusln!("Fetching", "{package}@{version}..."); let release = client .get_release(&package, &version) .await @@ -524,8 +557,8 @@ impl GetArgs { "wasm" => Format::Wasm, "wit" => Format::Wit, _ => { - eprintln!( - "Couldn't infer output format from file name {:?}", + warnln!( + "couldn't infer output format from file name {:?}", self.output.file_name().unwrap_or_default() ); Format::Auto @@ -547,11 +580,11 @@ impl GetArgs { } Ok(_) => None, Err(err) => { - tracing::debug!(?err, "failed to decode WIT package"); + warnln!("unable to decode WIT package"); if format == Format::Wit { return Err(err); } - eprintln!("Failed to detect package content type: {err:#}"); + eprintln!("failed to detect package content type: {err:#}"); None } } @@ -614,6 +647,7 @@ async fn main() -> anyhow::Result<()> { .init(); let cli = Cli::parse(); + cli.color.write_global(); match cli.command { Commands::Config(args) => args.run().await, @@ -624,7 +658,8 @@ async fn main() -> anyhow::Result<()> { Commands::Fetch(args) => args.run().await, Commands::Update(args) => args.run().await, Commands::Wit(args) => { - eprintln!("warning: `wkg wit ` is deprecated; use `wkg ` instead"); + warnln!("`wkg wit ` is deprecated"); + helpln!("use `wkg ` instead"); args.run().await } } diff --git a/crates/wkg/src/wit.rs b/crates/wkg/src/wit.rs index 71025ec..052596d 100644 --- a/crates/wkg/src/wit.rs +++ b/crates/wkg/src/wit.rs @@ -1,6 +1,7 @@ //! Args and commands for interacting with WIT files and dependencies use std::path::{Path, PathBuf}; +use anstream::eprintln; use anyhow::Context; use clap::{Args, Subcommand}; use tempfile::NamedTempFile;