From 253611246a0bc9b022a2242aca9655d2c0dd27fe Mon Sep 17 00:00:00 2001 From: karthik2804 Date: Wed, 25 Sep 2024 11:49:26 +0200 Subject: [PATCH] restructure add command to infer sources Signed-off-by: karthik2804 --- .github/workflows/release.yaml | 2 +- Cargo.lock | 490 +++++++++++++++++++++++++++++++-- Cargo.toml | 3 +- README.md | 8 +- src/commands/add.rs | 107 +++++-- src/commands/add/registry.rs | 18 +- src/main.rs | 1 - 7 files changed, 571 insertions(+), 58 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 6bf6498..ad677bb 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -139,7 +139,7 @@ jobs: run: ls -R - name: pluginify it run: | - spin pluginify --merge --release-url-base https://github.com/karthik2804/-plugin/releases/download/${{ env.RELEASE_VERSION }}/ >${{ env.PROGRAM_NAME }}.json + spin pluginify --merge --release-url-base https://github.com/fermyon/spin-deps-plugin/releases/download/${{ env.RELEASE_VERSION }}/ >${{ env.PROGRAM_NAME }}.json - name: Display merged manifest run: cat ${{ env.PROGRAM_NAME }}.json diff --git a/Cargo.lock b/Cargo.lock index 061034e..33acecf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -847,7 +847,7 @@ dependencies = [ "hashbrown 0.14.5", "log", "regalloc2", - "rustc-hash", + "rustc-hash 1.1.0", "smallvec", "target-lexicon", ] @@ -1977,6 +1977,7 @@ dependencies = [ "tokio", "tokio-rustls 0.26.0", "tower-service", + "webpki-roots 0.26.6", ] [[package]] @@ -2690,6 +2691,31 @@ dependencies = [ "memchr", ] +[[package]] +name = "oci-client" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f5098b86f972ac3484f7c9011bbbbd64aaa7e21d10d2c1a91fefb4ad0ba2ad9" +dependencies = [ + "bytes", + "chrono", + "futures-util", + "http 1.1.0", + "http-auth", + "jwt", + "lazy_static 1.5.0", + "olpc-cjson", + "regex", + "reqwest 0.12.7", + "serde 1.0.210", + "serde_json", + "sha2", + "thiserror", + "tokio", + "tracing", + "unicase", +] + [[package]] name = "oci-distribution" version = "0.11.0" @@ -2732,6 +2758,23 @@ dependencies = [ "wit-parser 0.209.1", ] +[[package]] +name = "oci-wasm" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d3493d1985a31c5fbd4b37f72a319aab88b55908185a5a799219c6152e9da9b" +dependencies = [ + "anyhow", + "chrono", + "oci-client", + "serde 1.0.210", + "serde_json", + "sha2", + "tokio", + "wit-component 0.215.0", + "wit-parser 0.215.0", +] + [[package]] name = "olpc-cjson" version = "0.1.3" @@ -3224,6 +3267,54 @@ dependencies = [ "tint", ] +[[package]] +name = "quinn" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.0.0", + "rustls 0.23.13", + "socket2 0.5.7", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +dependencies = [ + "bytes", + "rand 0.8.5", + "ring", + "rustc-hash 2.0.0", + "rustls 0.23.13", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +dependencies = [ + "libc", + "once_cell", + "socket2 0.5.7", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "quote" version = "1.0.37" @@ -3361,7 +3452,7 @@ checksum = "ad156d539c879b7a24a363a2016d77961786e71f48f2e2fc8302a92abd2429a6" dependencies = [ "hashbrown 0.13.2", "log", - "rustc-hash", + "rustc-hash 1.1.0", "slice-group-by", "smallvec", ] @@ -3478,7 +3569,10 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", + "quinn", + "rustls 0.23.13", "rustls-pemfile 2.1.3", + "rustls-pki-types", "serde 1.0.210", "serde_json", "serde_urlencoded", @@ -3486,6 +3580,7 @@ dependencies = [ "system-configuration 0.6.1", "tokio", "tokio-native-tls", + "tokio-rustls 0.26.0", "tokio-socks", "tokio-util", "tower-service", @@ -3494,6 +3589,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", + "webpki-roots 0.26.6", "windows-registry", ] @@ -3540,6 +3636,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + [[package]] name = "rustc_version" version = "0.4.1" @@ -4163,7 +4265,8 @@ dependencies = [ "toml 0.8.19", "toml_edit 0.22.21", "url", - "wasm-pkg-loader", + "wasm-pkg-client", + "wasm-pkg-common 0.5.1", "wasmparser 0.217.0", "wit-bindgen-core", "wit-bindgen-rust", @@ -4335,7 +4438,7 @@ dependencies = [ "thiserror", "toml 0.8.19", "url", - "wasm-pkg-common", + "wasm-pkg-common 0.4.1", ] [[package]] @@ -4347,7 +4450,7 @@ dependencies = [ "base64 0.22.1", "semver", "serde 1.0.210", - "wasm-pkg-common", + "wasm-pkg-common 0.4.1", ] [[package]] @@ -5038,8 +5141,23 @@ dependencies = [ "serde 1.0.210", "serde_with", "thiserror", - "warg-crypto", - "warg-protocol", + "warg-crypto 0.7.0", + "warg-protocol 0.7.0", +] + +[[package]] +name = "warg-api" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44b422328c3a86be288f569694aa97df958ade0cd9514ed00bc562952c6778e" +dependencies = [ + "indexmap 2.5.0", + "itertools 0.12.1", + "serde 1.0.210", + "serde_with", + "thiserror", + "warg-crypto 0.9.0", + "warg-protocol 0.9.0", ] [[package]] @@ -5077,10 +5195,56 @@ dependencies = [ "tracing", "url", "walkdir", - "warg-api", - "warg-crypto", - "warg-protocol", - "warg-transparency", + "warg-api 0.7.0", + "warg-crypto 0.7.0", + "warg-protocol 0.7.0", + "warg-transparency 0.7.0", + "wasm-compose", + "wasm-encoder 0.41.2", + "wasmparser 0.121.2", + "wasmprinter 0.2.80", + "windows-sys 0.52.0", +] + +[[package]] +name = "warg-client" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd1af3c0a73c56613c152fb99048af889a57063756299460c8fc26fea52ddccc" +dependencies = [ + "anyhow", + "async-recursion", + "async-trait", + "bytes", + "clap", + "dialoguer", + "dirs 5.0.1", + "futures-util", + "indexmap 2.5.0", + "itertools 0.12.1", + "keyring", + "libc", + "normpath", + "once_cell", + "pathdiff", + "ptree", + "reqwest 0.12.7", + "secrecy", + "semver", + "serde 1.0.210", + "serde_json", + "sha256", + "tempfile", + "thiserror", + "tokio", + "tokio-util", + "tracing", + "url", + "walkdir", + "warg-api 0.9.0", + "warg-crypto 0.9.0", + "warg-protocol 0.9.0", + "warg-transparency 0.9.0", "wasm-compose", "wasm-encoder 0.41.2", "wasmparser 0.121.2", @@ -5109,6 +5273,27 @@ dependencies = [ "thiserror", ] +[[package]] +name = "warg-crypto" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52fb6f3a64e3fef5425a0ab2b4354f1e49a699b76d58dd91d632483634f10474" +dependencies = [ + "anyhow", + "base64 0.21.7", + "digest", + "hex", + "leb128", + "once_cell", + "p256", + "rand_core 0.6.4", + "secrecy", + "serde 1.0.210", + "sha2", + "signature", + "thiserror", +] + [[package]] name = "warg-protobuf" version = "0.7.0" @@ -5125,7 +5310,26 @@ dependencies = [ "protox", "regex", "serde 1.0.210", - "warg-crypto", + "warg-crypto 0.7.0", +] + +[[package]] +name = "warg-protobuf" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bbb2d353497af3f6334bce11bfe69d638eedbb6d5059992acb2a05dd0beef5b" +dependencies = [ + "anyhow", + "pbjson", + "pbjson-build", + "pbjson-types", + "prost", + "prost-build", + "prost-types", + "protox", + "regex", + "serde 1.0.210", + "warg-crypto 0.9.0", ] [[package]] @@ -5145,9 +5349,32 @@ dependencies = [ "serde 1.0.210", "serde_with", "thiserror", - "warg-crypto", - "warg-protobuf", - "warg-transparency", + "warg-crypto 0.7.0", + "warg-protobuf 0.7.0", + "warg-transparency 0.7.0", + "wasmparser 0.121.2", +] + +[[package]] +name = "warg-protocol" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a710c66d8b5f2a7b046ecd2d45121530f561fd5c699b9c85ee49d332cfe773" +dependencies = [ + "anyhow", + "base64 0.21.7", + "hex", + "indexmap 2.5.0", + "pbjson-types", + "prost", + "prost-types", + "semver", + "serde 1.0.210", + "serde_with", + "thiserror", + "warg-crypto 0.9.0", + "warg-protobuf 0.9.0", + "warg-transparency 0.9.0", "wasmparser 0.121.2", ] @@ -5161,8 +5388,22 @@ dependencies = [ "indexmap 2.5.0", "prost", "thiserror", - "warg-crypto", - "warg-protobuf", + "warg-crypto 0.7.0", + "warg-protobuf 0.7.0", +] + +[[package]] +name = "warg-transparency" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b950a71a544b7ac8f5a5e95f43886ac97c3fe5c7080b955b1b534037596d7be" +dependencies = [ + "anyhow", + "indexmap 2.5.0", + "prost", + "thiserror", + "warg-crypto 0.9.0", + "warg-protobuf 0.9.0", ] [[package]] @@ -5284,6 +5525,26 @@ dependencies = [ "leb128", ] +[[package]] +name = "wasm-encoder" +version = "0.215.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb56df3e06b8e6b77e37d2969a50ba51281029a9aeb3855e76b7f49b6418847" +dependencies = [ + "leb128", + "wasmparser 0.215.0", +] + +[[package]] +name = "wasm-encoder" +version = "0.216.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c23aebea22c8a75833ae08ed31ccc020835b12a41999e58c31464271b94a88" +dependencies = [ + "leb128", + "wasmparser 0.216.0", +] + [[package]] name = "wasm-encoder" version = "0.217.0" @@ -5318,6 +5579,38 @@ dependencies = [ "wasmparser 0.209.1", ] +[[package]] +name = "wasm-metadata" +version = "0.215.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6bb07c5576b608f7a2a9baa2294c1a3584a249965d695a9814a496cb6d232f" +dependencies = [ + "anyhow", + "indexmap 2.5.0", + "serde 1.0.210", + "serde_derive", + "serde_json", + "spdx", + "wasm-encoder 0.215.0", + "wasmparser 0.215.0", +] + +[[package]] +name = "wasm-metadata" +version = "0.216.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c8154d703a6b0e45acf6bd172fa002fc3c7058a9f7615e517220aeca27c638" +dependencies = [ + "anyhow", + "indexmap 2.5.0", + "serde 1.0.210", + "serde_derive", + "serde_json", + "spdx", + "wasm-encoder 0.216.0", + "wasmparser 0.216.0", +] + [[package]] name = "wasm-metadata" version = "0.217.0" @@ -5333,6 +5626,39 @@ dependencies = [ "wasmparser 0.217.0", ] +[[package]] +name = "wasm-pkg-client" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0904880365efa1b4f81e34948d27fabf762837fea05852bbb0c1674c43a802" +dependencies = [ + "anyhow", + "async-trait", + "base64 0.22.1", + "bytes", + "dirs 5.0.1", + "docker_credential", + "futures-util", + "oci-client", + "oci-wasm 0.0.5", + "secrecy", + "serde 1.0.210", + "serde_json", + "sha2", + "thiserror", + "tokio", + "tokio-util", + "toml 0.8.19", + "tracing", + "tracing-subscriber", + "url", + "warg-client 0.9.0", + "warg-crypto 0.9.0", + "warg-protocol 0.9.0", + "wasm-pkg-common 0.5.1", + "wit-component 0.216.0", +] + [[package]] name = "wasm-pkg-common" version = "0.4.1" @@ -5351,6 +5677,28 @@ dependencies = [ "tracing", ] +[[package]] +name = "wasm-pkg-common" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0287f3ce5f1e03c4cf88bdd533b01dcd315c321eb09cb3dd35cfdf4031d912f9" +dependencies = [ + "anyhow", + "bytes", + "dirs 5.0.1", + "futures-util", + "http 1.1.0", + "reqwest 0.12.7", + "semver", + "serde 1.0.210", + "serde_json", + "sha2", + "thiserror", + "tokio", + "toml 0.8.19", + "tracing", +] + [[package]] name = "wasm-pkg-loader" version = "0.4.1" @@ -5365,7 +5713,7 @@ dependencies = [ "docker_credential", "futures-util", "oci-distribution", - "oci-wasm", + "oci-wasm 0.0.4", "secrecy", "serde 1.0.210", "serde_json", @@ -5377,9 +5725,9 @@ dependencies = [ "tracing", "tracing-subscriber", "url", - "warg-client", - "warg-protocol", - "wasm-pkg-common", + "warg-client 0.7.0", + "warg-protocol 0.7.0", + "wasm-pkg-common 0.4.1", ] [[package]] @@ -5420,6 +5768,32 @@ dependencies = [ "serde 1.0.210", ] +[[package]] +name = "wasmparser" +version = "0.215.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fbde0881f24199b81cf49b6ff8f9c145ac8eb1b7fc439adb5c099734f7d90e" +dependencies = [ + "ahash", + "bitflags 2.6.0", + "hashbrown 0.14.5", + "indexmap 2.5.0", + "semver", +] + +[[package]] +name = "wasmparser" +version = "0.216.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcdee6bea3619d311fb4b299721e89a986c3470f804b6d534340e412589028e3" +dependencies = [ + "ahash", + "bitflags 2.6.0", + "hashbrown 0.14.5", + "indexmap 2.5.0", + "semver", +] + [[package]] name = "wasmparser" version = "0.217.0" @@ -6152,6 +6526,44 @@ dependencies = [ "wit-parser 0.209.1", ] +[[package]] +name = "wit-component" +version = "0.215.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f725e3885fc5890648be5c5cbc1353b755dc932aa5f1aa7de968b912a3280743" +dependencies = [ + "anyhow", + "bitflags 2.6.0", + "indexmap 2.5.0", + "log", + "serde 1.0.210", + "serde_derive", + "serde_json", + "wasm-encoder 0.215.0", + "wasm-metadata 0.215.0", + "wasmparser 0.215.0", + "wit-parser 0.215.0", +] + +[[package]] +name = "wit-component" +version = "0.216.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e2ca3ece38ea2447a9069b43074ba73d96dde1944cba276c54e41371745f9dc" +dependencies = [ + "anyhow", + "bitflags 2.6.0", + "indexmap 2.5.0", + "log", + "serde 1.0.210", + "serde_derive", + "serde_json", + "wasm-encoder 0.216.0", + "wasm-metadata 0.216.0", + "wasmparser 0.216.0", + "wit-parser 0.216.0", +] + [[package]] name = "wit-component" version = "0.217.0" @@ -6188,6 +6600,42 @@ dependencies = [ "wasmparser 0.209.1", ] +[[package]] +name = "wit-parser" +version = "0.215.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "935a97eaffd57c3b413aa510f8f0b550a4a9fe7d59e79cd8b89a83dcb860321f" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.5.0", + "log", + "semver", + "serde 1.0.210", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.215.0", +] + +[[package]] +name = "wit-parser" +version = "0.216.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4d108165c1167a4ccc8a803dcf5c28e0a51d6739fd228cc7adce768632c764c" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.5.0", + "log", + "semver", + "serde 1.0.210", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.216.0", +] + [[package]] name = "wit-parser" version = "0.217.0" diff --git a/Cargo.toml b/Cargo.toml index 0bc5cae..310f87c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,11 +19,12 @@ url = "2.5.2" wasmparser = { git = "https://github.com/bytecodealliance/wasm-tools" } wit-component = { git = "https://github.com/bytecodealliance/wasm-tools" } wit-parser = { git = "https://github.com/bytecodealliance/wasm-tools" } -wasm-pkg-loader = "0.4.1" futures = "0.3.30" semver = "1.0.23" wit-bindgen-rust = { git = "https://github.com/fibonacci1729/wit-bindgen", branch = "deps" } wit-bindgen-core = { git = "https://github.com/fibonacci1729/wit-bindgen", branch = "deps" } +wasm-pkg-common = "0.5.1" +wasm-pkg-client = "0.5.1" [target.'cfg(target_os = "linux")'.dependencies] # This needs to be an explicit dependency to enable diff --git a/README.md b/README.md index 6f00e40..9d2d3ec 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ This plugin enables adding component dependencies to a [Spin](https://github.com ## Installation ```bash -spin plugins install --url https://github.com/fermyon/spin-deps/releases/download/canary/spin-deps.json -y +spin plugins install --url https://github.com/fermyon/spin-deps-plugin/releases/download/canary/spin-deps.json -y ``` ## Using the plugin @@ -13,9 +13,9 @@ spin plugins install --url https://github.com/fermyon/spin-deps/releases/downloa Make sure you are in the root of a spin project with a `spin.toml`. ```bash -spin deps add local # for adding a dependency on a local component -spin deps add http --digest --name # for adding a dependency on component from a HTTP source -spin deps add registry --version --registry # for adding a dependency on a component from the registry +spin deps add # for adding a dependency on a local component +spin deps add --digest --name # for adding a dependency on component from a HTTP source +spin deps add --registry # for adding a dependency on a component from the registry. package_name is of the form 'foo:bar@=0.1.0' ``` This should now prompt a few more questions about which component to add a dependency to and interfaces to import. Once that is done, the `spin.toml` will be updated and the `importized` bindings will be generated in `.wit/components`. diff --git a/src/commands/add.rs b/src/commands/add.rs index 7cfaf0e..89200fc 100644 --- a/src/commands/add.rs +++ b/src/commands/add.rs @@ -1,8 +1,9 @@ -use anyhow::Result; -use clap::Subcommand; +use anyhow::{bail, Result}; +use clap::Args; use http::HttpAddCommand; use local::LocalAddCommand; use registry::RegistryAddCommand; +use semver::VersionReq; use spin_manifest::{ manifest_from_file, schema::v2::{AppManifest, ComponentDependency}, @@ -10,6 +11,8 @@ use spin_manifest::{ use spin_serde::{DependencyName, DependencyPackageName, KebabId}; use std::{collections::HashMap, path::PathBuf}; use tokio::fs; +use url::Url; +use wasm_pkg_client::{PackageRef, Registry}; use wit_parser::{PackageId, Resolve}; use crate::common::{ @@ -25,23 +28,71 @@ mod http; mod local; mod registry; -#[derive(Subcommand, Debug)] -pub enum AddCommand { - /// Add a component from a local file. +#[derive(Args, Debug)] +pub struct AddCommand { + /// Source to the component. Can be one of a local path, a HTTP URL or a registry reference. + pub source: String, + /// Sha256 digest that will be used to verify HTTP downloads. Required for HTTP sources, ignored otherwise. + #[clap(short, long)] + pub digest: Option, + /// Registry to override the default with. Ignored in the cases of local or HTTP sources. + #[clap(short, long)] + pub registry: Option, +} + +enum ComponentSource { Local(LocalAddCommand), - /// Add a component from an HTTP source. Http(HttpAddCommand), - /// Add a component from a registry. Registry(RegistryAddCommand), } +impl ComponentSource { + pub fn infer_source( + source: &String, + digest: &Option, + registry: &Option, + ) -> Result { + let path = PathBuf::from(&source); + if path.exists() { + return Ok(Self::Local(LocalAddCommand { path })); + } + + if let Ok(url) = Url::parse(source) { + if url.scheme().starts_with("http") { + return digest.clone().map_or_else( + || bail!("Digest needs to be specified for HTTP sources."), + |d| Ok(Self::Http(HttpAddCommand { url, digest: d })), + ); + } + } + + if let Ok((name, version)) = package_name_ver(source) { + if version.is_none() { + bail!("Version needs to specified for regitry sources.") + } + return Ok(Self::Registry(RegistryAddCommand { + package: name, + version: version.unwrap(), + registry: registry.clone(), + })); + } + + bail!("Could not infer component source"); + } + pub async fn get_component(&self) -> Result> { + match &self { + ComponentSource::Local(cmd) => cmd.get_component().await, + ComponentSource::Http(cmd) => cmd.get_component().await, + ComponentSource::Registry(cmd) => cmd.get_component().await, + } + } +} + impl AddCommand { pub async fn run(&self) -> Result<()> { - let component = match self { - AddCommand::Local(cmd) => cmd.get_component().await?, - AddCommand::Http(cmd) => cmd.get_component().await?, - AddCommand::Registry(cmd) => cmd.get_component().await?, - }; + let source = ComponentSource::infer_source(&self.source, &self.digest, &self.registry)?; + + let component = source.get_component().await?; let (mut resolve, main) = parse_component_bytes(component)?; @@ -76,8 +127,13 @@ impl AddCommand { let wit_text = resolve_to_wit(&merged_resolve, main)?; fs::write(output_wit, wit_text).await?; - self.update_manifest(&mut manifest, selected_component, selected_interfaces) - .await?; + self.update_manifest( + source, + &mut manifest, + selected_component, + selected_interfaces, + ) + .await?; Ok(()) } @@ -143,6 +199,7 @@ impl AddCommand { /// Updates the manifest file with the new component dependency. async fn update_manifest( &self, + source: ComponentSource, manifest: &mut AppManifest, selected_component: &str, selected_interfaces: Vec, @@ -150,17 +207,17 @@ impl AddCommand { let id = KebabId::try_from(selected_component.to_owned()).unwrap(); let component = manifest.components.get_mut(&id).unwrap(); - let component_dependency = match self { - AddCommand::Local(src) => ComponentDependency::Local { + let component_dependency = match source { + ComponentSource::Local(src) => ComponentDependency::Local { path: src.path.clone(), export: None, }, - AddCommand::Http(src) => ComponentDependency::HTTP { + ComponentSource::Http(src) => ComponentDependency::HTTP { url: src.url.to_string(), digest: format!("sha256:{}", src.digest.clone()), export: None, }, - AddCommand::Registry(src) => ComponentDependency::Package { + ComponentSource::Registry(src) => ComponentDependency::Package { version: src.version.to_string(), registry: src.registry.as_ref().map(|registry| registry.to_string()), package: Some(src.package.clone().to_string()), @@ -184,3 +241,17 @@ impl AddCommand { Ok(()) } } + +fn package_name_ver(package_name: &str) -> Result<(PackageRef, Option)> { + let (package, version) = package_name + .split_once('@') + .map(|(pkg, ver)| (pkg, Some(ver))) + .unwrap_or((package_name, None)); + + let version = if let Some(v) = version { + Some(v.parse()?) + } else { + None + }; + Ok((package.parse()?, version)) +} diff --git a/src/commands/add/registry.rs b/src/commands/add/registry.rs index 9a07071..1f26b4a 100644 --- a/src/commands/add/registry.rs +++ b/src/commands/add/registry.rs @@ -1,10 +1,10 @@ -use anyhow::{anyhow, Context, Result}; +use anyhow::{Context, Result}; use clap::Args; use futures::stream::StreamExt; use semver::VersionReq; use spin_loader::cache::Cache; use tokio::io::AsyncWriteExt; -use wasm_pkg_loader::{PackageRef, Registry}; +use wasm_pkg_common::{package::PackageRef, registry::Registry}; /// Command to add a component from a registry. #[derive(Args, Debug)] @@ -21,21 +21,15 @@ pub struct RegistryAddCommand { impl RegistryAddCommand { pub async fn get_component(&self) -> Result> { - let mut client_config = wasm_pkg_loader::Config::global_defaults()?; + let mut client_config = wasm_pkg_client::Config::global_defaults()?; if let Some(registry) = &self.registry { client_config.set_package_registry_override(self.package.clone(), registry.to_owned()); } - let mut pkg_loader = wasm_pkg_loader::Client::new(client_config); + let pkg_loader = wasm_pkg_client::Client::new(client_config); - let mut releases = pkg_loader.list_all_versions(&self.package).await.map_err(|e| { - if matches!(e, wasm_pkg_loader::Error::NoRegistryForNamespace(_)) && self.registry.to_owned().is_none() { - anyhow!("No default registry specified for wasm-pkg-loader. Create a default config, or set `registry` for package {:?}", &self.package) - } else { - e.into() - } - })?; + let mut releases = pkg_loader.list_all_versions(&self.package).await?; releases.sort(); @@ -55,7 +49,7 @@ impl RegistryAddCommand { .await?; let digest = match &release.content_digest { - wasm_pkg_loader::ContentDigest::Sha256 { hex } => format!("sha256:{hex}"), + wasm_pkg_client::ContentDigest::Sha256 { hex } => format!("sha256:{hex}"), }; let cache = Cache::new(None).await?; diff --git a/src/main.rs b/src/main.rs index 4249048..f2d87e0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,7 +17,6 @@ struct Cli { #[derive(Subcommand, Debug)] enum Commands { /// Add a new component dependency - #[command(subcommand)] Add(AddCommand), /// Generates dependency bindings for selected component GenerateBindings(GenerateBindingsCommand),