diff --git a/Cargo.lock b/Cargo.lock index 21d8ae9a98..55aedbcad2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8174,10 +8174,11 @@ name = "spin-app" version = "3.4.0-pre0" dependencies = [ "anyhow", + "itertools 0.14.0", "serde", "serde_json", - "spin-factors-test", - "spin-locked-app", + "spin-serde", + "thiserror 2.0.12", "tokio", "toml", ] @@ -8243,7 +8244,6 @@ dependencies = [ "spin-factor-outbound-networking", "spin-http", "spin-loader", - "spin-locked-app", "spin-manifest", "spin-oci", "spin-plugins", @@ -8332,11 +8332,11 @@ dependencies = [ "anyhow", "async-trait", "serde_json", + "spin-app", "spin-componentize", "spin-factor-wasi", "spin-factors", "spin-factors-test", - "spin-locked-app", "tokio", "tracing", "wasmtime", @@ -8371,7 +8371,7 @@ dependencies = [ "anyhow", "async-trait", "futures", - "spin-locked-app", + "spin-app", "thiserror 2.0.12", "tokio", "toml", @@ -8383,12 +8383,12 @@ version = "3.4.0-pre0" dependencies = [ "anyhow", "serde", + "spin-app", "spin-core", "spin-factors", "spin-factors-test", "spin-key-value-redis", "spin-key-value-spin", - "spin-locked-app", "spin-resource-table", "spin-telemetry", "spin-world", @@ -8406,11 +8406,11 @@ dependencies = [ "anyhow", "async-trait", "serde", + "spin-app", "spin-factors", "spin-factors-test", "spin-llm-local", "spin-llm-remote-http", - "spin-locked-app", "spin-telemetry", "spin-world", "tokio", @@ -8493,11 +8493,11 @@ dependencies = [ "rustls 0.23.18", "rustls-pki-types", "serde", + "spin-app", "spin-factor-variables", "spin-factor-wasi", "spin-factors", "spin-factors-test", - "spin-locked-app", "spin-manifest", "spin-outbound-networking-config", "spin-serde", @@ -8559,9 +8559,9 @@ name = "spin-factor-sqlite" version = "3.4.0-pre0" dependencies = [ "async-trait", + "spin-app", "spin-factors", "spin-factors-test", - "spin-locked-app", "spin-resource-table", "spin-world", "tokio", @@ -8640,6 +8640,7 @@ dependencies = [ "spin-loader", "spin-telemetry", "tempfile", + "tokio", "toml", ] @@ -8779,9 +8780,9 @@ dependencies = [ "serde", "serde_json", "sha2", + "spin-app", "spin-common", "spin-expressions", - "spin-locked-app", "spin-manifest", "spin-outbound-networking-config", "spin-serde", @@ -8794,19 +8795,6 @@ dependencies = [ "wasm-pkg-client", ] -[[package]] -name = "spin-locked-app" -version = "3.4.0-pre0" -dependencies = [ - "anyhow", - "async-trait", - "itertools 0.14.0", - "serde", - "serde_json", - "spin-serde", - "thiserror 2.0.12", -] - [[package]] name = "spin-manifest" version = "3.4.0-pre0" @@ -8845,10 +8833,10 @@ dependencies = [ "reqwest 0.12.9", "serde", "serde_json", + "spin-app", "spin-common", "spin-compose", "spin-loader", - "spin-locked-app", "tempfile", "tokio", "tokio-util", diff --git a/Cargo.toml b/Cargo.toml index 51065b44ee..723f4ba291 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -58,7 +58,6 @@ spin-doctor = { path = "crates/doctor" } spin-factor-outbound-networking = { path = "crates/factor-outbound-networking" } spin-http = { path = "crates/http" } spin-loader = { path = "crates/loader" } -spin-locked-app = { path = "crates/locked-app" } spin-manifest = { path = "crates/manifest" } spin-oci = { path = "crates/oci" } spin-plugins = { path = "crates/plugins" } diff --git a/crates/app/Cargo.toml b/crates/app/Cargo.toml index 94bbfa7c27..29adbb755d 100644 --- a/crates/app/Cargo.toml +++ b/crates/app/Cargo.toml @@ -6,11 +6,12 @@ edition = { workspace = true } [dependencies] anyhow = { workspace = true } +itertools = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } -spin-locked-app = { path = "../locked-app" } +spin-serde = { path = "../serde" } +thiserror = { workspace = true } [dev-dependencies] toml = { workspace = true } -spin-factors-test = { path = "../factors-test" } tokio = { workspace = true } \ No newline at end of file diff --git a/crates/app/src/error.rs b/crates/app/src/error.rs new file mode 100644 index 0000000000..16fcf253ff --- /dev/null +++ b/crates/app/src/error.rs @@ -0,0 +1,25 @@ +/// Type alias for a [`Result`]s with [`Error`]. +pub type Result = std::result::Result; + +/// Errors returned by methods in this crate. +#[derive(Debug, thiserror::Error)] +pub enum Error { + /// An error propagated from the `spin_core` crate. + #[error(transparent)] + Core(anyhow::Error), + /// An error from a `DynamicHostComponent`. + #[error("host component error: {0:#}")] + HostComponent(#[source] anyhow::Error), + /// An error from a `Loader` implementation. + #[error(transparent)] + Loader(anyhow::Error), + /// An error indicating missing or unexpected metadata. + #[error("metadata error: {0}")] + Metadata(String), + /// An error indicating failed JSON (de)serialization. + #[error("json error: {0}")] + Json(#[from] serde_json::Error), + /// A validation error that can be presented directly to the user. + #[error(transparent)] + Validation(anyhow::Error), +} diff --git a/crates/app/src/lib.rs b/crates/app/src/lib.rs index 3f2a0098cc..8830ebb729 100644 --- a/crates/app/src/lib.rs +++ b/crates/app/src/lib.rs @@ -11,15 +11,22 @@ use std::sync::Arc; use serde::Deserialize; use serde_json::Value; -use spin_locked_app::MetadataExt; -use locked::{ContentPath, LockedApp, LockedComponent, LockedComponentSource, LockedTrigger}; +use crate::locked::{ + ContentPath, LockedApp, LockedComponent, LockedComponentSource, LockedTrigger, +}; -pub use spin_locked_app::locked; -pub use spin_locked_app::values; -pub use spin_locked_app::{Error, MetadataKey, Result}; +pub use crate::locked::Variable; -pub use locked::Variable; +use crate::error::{Error, Result}; +use crate::metadata::MetadataExt as _; + +mod error; +pub mod locked; +mod metadata; +pub mod values; + +pub use metadata::MetadataKey; /// MetadataKey for extracting the application name. pub const APP_NAME_KEY: MetadataKey = MetadataKey::new("name"); @@ -121,7 +128,7 @@ impl App { return Ok(None); }; let metadata = T::deserialize(value).map_err(|err| { - Error::MetadataError(format!( + Error::Metadata(format!( "invalid metadata value for {trigger_type:?}: {err:?}" )) })?; @@ -186,7 +193,7 @@ impl App { ) -> Result { self.validate_retained_components_exist(retained_components)?; for validator in validators { - validator(&self, retained_components).map_err(Error::ValidationError)?; + validator(&self, retained_components).map_err(Error::Validation)?; } let (component_ids, trigger_ids): (HashSet, HashSet) = self .triggers() @@ -211,7 +218,7 @@ impl App { .collect::>(); for c in retained_components { if !app_components.contains(*c) { - return Err(Error::ValidationError(anyhow::anyhow!( + return Err(Error::Validation(anyhow::anyhow!( "Specified component \"{c}\" not found in application" ))); } @@ -310,10 +317,10 @@ impl<'a> AppTrigger<'a> { let id = &self.locked.id; let common_config: CommonTriggerConfig = self.typed_config()?; let component_id = common_config.component.ok_or_else(|| { - Error::MetadataError(format!("trigger {id:?} missing 'component' config field")) + Error::Metadata(format!("trigger {id:?} missing 'component' config field")) })?; self.app.get_component(&component_id).ok_or_else(|| { - Error::MetadataError(format!( + Error::Metadata(format!( "missing component {component_id:?} configured for trigger {id:?}" )) }) @@ -337,29 +344,45 @@ pub fn retain_components( #[cfg(test)] mod test { - use spin_factors_test::build_locked_app; + use std::collections::HashSet; use super::*; + pub fn locked_app() -> LockedApp { + LockedApp { + spin_lock_version: Default::default(), + must_understand: Default::default(), + metadata: Default::default(), + host_requirements: Default::default(), + variables: Default::default(), + triggers: vec![LockedTrigger { + id: "trigger".into(), + trigger_type: "dummy".into(), + trigger_config: toml::from_str(r#"component = "empty""#).unwrap(), + }], + components: vec![LockedComponent { + id: "empty".to_owned(), + metadata: Default::default(), + source: LockedComponentSource { + content_type: "application/wasm".to_owned(), + content: Default::default(), + }, + env: Default::default(), + files: Default::default(), + config: Default::default(), + dependencies: Default::default(), + host_requirements: Default::default(), + }], + } + } + fn does_nothing_validator(_: &App, _: &[&str]) -> anyhow::Result<()> { Ok(()) } #[tokio::test] async fn test_retain_components_filtering_for_only_component_works() { - let manifest = toml::toml! { - spin_manifest_version = 2 - - [application] - name = "test-app" - - [[trigger.test-trigger]] - component = "empty" - - [component.empty] - source = "does-not-exist.wasm" - }; - let mut locked_app = build_locked_app(&manifest).await.unwrap(); + let mut locked_app = locked_app(); locked_app = retain_components(locked_app, &["empty"], &[&does_nothing_validator]).unwrap(); let components = locked_app .components diff --git a/crates/locked-app/src/locked.rs b/crates/app/src/locked.rs similarity index 100% rename from crates/locked-app/src/locked.rs rename to crates/app/src/locked.rs diff --git a/crates/locked-app/src/metadata.rs b/crates/app/src/metadata.rs similarity index 88% rename from crates/locked-app/src/metadata.rs rename to crates/app/src/metadata.rs index cfb487ce4d..5e50ad7e03 100644 --- a/crates/locked-app/src/metadata.rs +++ b/crates/app/src/metadata.rs @@ -57,16 +57,14 @@ pub trait MetadataExt { self.get_value(key.as_ref()) .map(T::deserialize) .transpose() - .map_err(|err| { - Error::MetadataError(format!("invalid metadata value for {key:?}: {err:?}")) - }) + .map_err(|err| Error::Metadata(format!("invalid metadata value for {key:?}: {err:?}"))) } /// Get a required value from a metadata map, returning an error /// if it is not present fn require_typed<'a, T: Deserialize<'a>>(&'a self, key: MetadataKey) -> Result { self.get_typed(key)? - .ok_or_else(|| Error::MetadataError(format!("missing required metadata {key:?}"))) + .ok_or_else(|| Error::Metadata(format!("missing required metadata {key:?}"))) } } diff --git a/crates/locked-app/src/values.rs b/crates/app/src/values.rs similarity index 100% rename from crates/locked-app/src/values.rs rename to crates/app/src/values.rs diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index c6d324991e..e0bed88c7b 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -16,7 +16,7 @@ spin-componentize = { workspace = true } spin-factor-wasi = { path = "../factor-wasi" } spin-factors = { path = "../factors" } spin-factors-test = { path = "../factors-test" } -spin-locked-app = { path = "../locked-app" } +spin-app = { path = "../app" } tokio = { workspace = true, features = ["macros", "rt", "rt-multi-thread"] } wasmtime-wasi = { workspace = true } diff --git a/crates/core/tests/integration_test.rs b/crates/core/tests/integration_test.rs index 7d2c1aca3d..09d5976279 100644 --- a/crates/core/tests/integration_test.rs +++ b/crates/core/tests/integration_test.rs @@ -5,10 +5,10 @@ use std::{ use anyhow::Context; use serde_json::json; +use spin_app::locked::LockedApp; use spin_core::{AsState, Component, Config, Engine, State, Store, StoreBuilder, Trap}; use spin_factor_wasi::{DummyFilesMounter, WasiFactor}; use spin_factors::{App, AsInstanceState, RuntimeFactors}; -use spin_locked_app::locked::LockedApp; use tokio::{fs, io::AsyncWrite}; use wasmtime_wasi::I32Exit; diff --git a/crates/expressions/Cargo.toml b/crates/expressions/Cargo.toml index 6c9749fb4d..50ee221b5d 100644 --- a/crates/expressions/Cargo.toml +++ b/crates/expressions/Cargo.toml @@ -8,7 +8,7 @@ edition = { workspace = true } anyhow = { workspace = true } async-trait = { workspace = true } futures = { workspace = true } -spin-locked-app = { path = "../locked-app" } +spin-app = { path = "../app" } thiserror = { workspace = true } [dev-dependencies] diff --git a/crates/expressions/src/lib.rs b/crates/expressions/src/lib.rs index 2219044372..eaae990522 100644 --- a/crates/expressions/src/lib.rs +++ b/crates/expressions/src/lib.rs @@ -3,7 +3,7 @@ mod template; use std::{borrow::Cow, collections::HashMap, fmt::Debug}; -use spin_locked_app::Variable; +use spin_app::Variable; pub use async_trait; diff --git a/crates/factor-key-value/Cargo.toml b/crates/factor-key-value/Cargo.toml index 8327737bd1..6273b11863 100644 --- a/crates/factor-key-value/Cargo.toml +++ b/crates/factor-key-value/Cargo.toml @@ -9,7 +9,7 @@ anyhow = { workspace = true } serde = { workspace = true } spin-core = { path = "../core" } spin-factors = { path = "../factors" } -spin-locked-app = { path = "../locked-app" } +spin-app = { path = "../app" } spin-resource-table = { path = "../table" } spin-telemetry = { path = "../telemetry" } spin-world = { path = "../world" } diff --git a/crates/factor-key-value/src/lib.rs b/crates/factor-key-value/src/lib.rs index 792ea18b92..2567c1c2e2 100644 --- a/crates/factor-key-value/src/lib.rs +++ b/crates/factor-key-value/src/lib.rs @@ -8,11 +8,11 @@ use std::{ }; use anyhow::ensure; +use spin_app::MetadataKey; use spin_factors::{ ConfigureAppContext, Factor, FactorData, FactorInstanceBuilder, InitContext, PrepareContext, RuntimeFactors, }; -use spin_locked_app::MetadataKey; /// Metadata key for key-value stores. pub const KEY_VALUE_STORES_KEY: MetadataKey> = MetadataKey::new("key_value_stores"); diff --git a/crates/factor-llm/Cargo.toml b/crates/factor-llm/Cargo.toml index c43a7bbd6c..51d3a9d5b1 100644 --- a/crates/factor-llm/Cargo.toml +++ b/crates/factor-llm/Cargo.toml @@ -20,7 +20,7 @@ serde = { workspace = true } spin-factors = { path = "../factors" } spin-llm-local = { path = "../llm-local", optional = true } spin-llm-remote-http = { path = "../llm-remote-http" } -spin-locked-app = { path = "../locked-app" } +spin-app = { path = "../app" } spin-telemetry = { path = "../telemetry" } spin-world = { path = "../world" } tokio = { workspace = true, features = ["sync"] } diff --git a/crates/factor-llm/src/lib.rs b/crates/factor-llm/src/lib.rs index 4f43feac68..d1b386db30 100644 --- a/crates/factor-llm/src/lib.rs +++ b/crates/factor-llm/src/lib.rs @@ -5,10 +5,10 @@ use std::collections::{HashMap, HashSet}; use std::sync::Arc; use async_trait::async_trait; +use spin_app::MetadataKey; use spin_factors::{ ConfigureAppContext, Factor, FactorData, PrepareContext, RuntimeFactors, SelfInstanceBuilder, }; -use spin_locked_app::MetadataKey; use spin_world::v1::llm::{self as v1}; use spin_world::v2::llm::{self as v2}; use tokio::sync::Mutex; diff --git a/crates/factor-outbound-networking/Cargo.toml b/crates/factor-outbound-networking/Cargo.toml index b94a75fa2c..15143ac171 100644 --- a/crates/factor-outbound-networking/Cargo.toml +++ b/crates/factor-outbound-networking/Cargo.toml @@ -15,7 +15,7 @@ serde = { workspace = true } spin-factor-variables = { path = "../factor-variables" } spin-factor-wasi = { path = "../factor-wasi" } spin-factors = { path = "../factors" } -spin-locked-app = { path = "../locked-app" } +spin-app = { path = "../app" } spin-manifest = { path = "../manifest" } spin-outbound-networking-config = { path = "../outbound-networking-config" } spin-serde = { path = "../serde" } diff --git a/crates/factor-outbound-networking/src/allowed_hosts.rs b/crates/factor-outbound-networking/src/allowed_hosts.rs index 0a736eb6bf..43e146aa75 100644 --- a/crates/factor-outbound-networking/src/allowed_hosts.rs +++ b/crates/factor-outbound-networking/src/allowed_hosts.rs @@ -1,6 +1,6 @@ use anyhow::Context as _; +use spin_app::MetadataKey; use spin_factors::{App, AppComponent}; -use spin_locked_app::MetadataKey; use spin_outbound_networking_config::allowed_hosts::parse_service_chaining_target; const ALLOWED_HOSTS_KEY: MetadataKey> = MetadataKey::new("allowed_outbound_hosts"); diff --git a/crates/factor-sqlite/Cargo.toml b/crates/factor-sqlite/Cargo.toml index ee945ed4fa..956a6f5b75 100644 --- a/crates/factor-sqlite/Cargo.toml +++ b/crates/factor-sqlite/Cargo.toml @@ -11,7 +11,7 @@ rust-version.workspace = true [dependencies] async-trait = { workspace = true } spin-factors = { path = "../factors" } -spin-locked-app = { path = "../locked-app" } +spin-app = { path = "../app" } spin-resource-table = { path = "../table" } spin-world = { path = "../world" } tokio = { workspace = true } diff --git a/crates/factor-sqlite/src/lib.rs b/crates/factor-sqlite/src/lib.rs index 9fafdb796a..833ae756c7 100644 --- a/crates/factor-sqlite/src/lib.rs +++ b/crates/factor-sqlite/src/lib.rs @@ -7,8 +7,8 @@ use std::sync::Arc; use host::InstanceState; use async_trait::async_trait; +use spin_app::MetadataKey; use spin_factors::{anyhow, Factor, FactorData}; -use spin_locked_app::MetadataKey; use spin_world::spin::sqlite::sqlite as v3; use spin_world::v1::sqlite as v1; use spin_world::v2::sqlite as v2; diff --git a/crates/factors-test/Cargo.toml b/crates/factors-test/Cargo.toml index 80ab8aa655..2333cb3786 100644 --- a/crates/factors-test/Cargo.toml +++ b/crates/factors-test/Cargo.toml @@ -11,6 +11,7 @@ spin-loader = { path = "../loader" } spin-telemetry = { path = "../telemetry", features = ["testing"] } tempfile = { workspace = true } toml = { workspace = true } +tokio = { workspace = true } [lints] workspace = true diff --git a/crates/loader/Cargo.toml b/crates/loader/Cargo.toml index 0d85b5f577..a709378d88 100644 --- a/crates/loader/Cargo.toml +++ b/crates/loader/Cargo.toml @@ -17,7 +17,7 @@ serde_json = { workspace = true } sha2 = { workspace = true } spin-common = { path = "../common" } spin-expressions = { path = "../expressions" } -spin-locked-app = { path = "../locked-app" } +spin-app = { path = "../app" } spin-manifest = { path = "../manifest" } spin-outbound-networking-config = { path = "../outbound-networking-config" } spin-serde = { path = "../serde" } diff --git a/crates/loader/src/lib.rs b/crates/loader/src/lib.rs index ea64bac40d..0e8a46581c 100644 --- a/crates/loader/src/lib.rs +++ b/crates/loader/src/lib.rs @@ -14,8 +14,8 @@ use std::path::{Path, PathBuf}; use anyhow::{Context, Result}; use local::LocalLoader; +use spin_app::locked::LockedApp; use spin_common::paths::parent_dir; -use spin_locked_app::locked::LockedApp; pub mod cache; mod fs; diff --git a/crates/loader/src/local.rs b/crates/loader/src/local.rs index 34659fc65b..a662c8111c 100644 --- a/crates/loader/src/local.rs +++ b/crates/loader/src/local.rs @@ -3,15 +3,15 @@ use std::path::{Path, PathBuf}; use anyhow::{anyhow, bail, ensure, Context, Result}; use futures::{future::try_join_all, StreamExt}; use reqwest::Url; -use spin_common::{paths::parent_dir, sloth, ui::quoted_path}; -use spin_expressions::Resolver; -use spin_locked_app::{ +use spin_app::{ locked::{ self, ContentPath, ContentRef, LockedApp, LockedComponent, LockedComponentDependency, LockedComponentSource, LockedTrigger, }, values::{ValuesMap, ValuesMapBuilder}, }; +use spin_common::{paths::parent_dir, sloth, ui::quoted_path}; +use spin_expressions::Resolver; use spin_manifest::schema::v2::{self, AppManifest, KebabId, WasiFilesMount}; use spin_outbound_networking_config::allowed_hosts::{AllowedHostConfig, AllowedHostsConfig}; use spin_serde::DependencyName; @@ -114,15 +114,14 @@ impl LocalLoader { })) .await?; - let host_requirements = spin_locked_app::values::ValuesMap::new(); + let host_requirements = spin_app::values::ValuesMap::new(); let mut must_understand = vec![]; if !host_requirements.is_empty() { - must_understand.push(spin_locked_app::locked::MustUnderstand::HostRequirements); + must_understand.push(spin_app::locked::MustUnderstand::HostRequirements); } if components.iter().any(|c| !c.host_requirements.is_empty()) { - must_understand - .push(spin_locked_app::locked::MustUnderstand::ComponentHostRequirements); + must_understand.push(spin_app::locked::MustUnderstand::ComponentHostRequirements); } drop(sloth_guard); @@ -219,8 +218,8 @@ impl LocalLoader { let mut host_requirements = ValuesMapBuilder::new(); if component_requires_service_chaining { host_requirements.string( - spin_locked_app::locked::SERVICE_CHAINING_KEY, - spin_locked_app::locked::HOST_REQ_REQUIRED, + spin_app::locked::SERVICE_CHAINING_KEY, + spin_app::locked::HOST_REQ_REQUIRED, ); } let host_requirements = host_requirements.build(); diff --git a/crates/locked-app/Cargo.toml b/crates/locked-app/Cargo.toml deleted file mode 100644 index aa9fe98a13..0000000000 --- a/crates/locked-app/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "spin-locked-app" -version = { workspace = true } -authors = { workspace = true } -edition = { workspace = true } - -[dependencies] -anyhow = { workspace = true } -async-trait = { workspace = true } -itertools = { workspace = true } -serde = { workspace = true } -serde_json = { workspace = true } -spin-serde = { path = "../serde" } -thiserror = { workspace = true } diff --git a/crates/locked-app/src/lib.rs b/crates/locked-app/src/lib.rs deleted file mode 100644 index e94cfcf774..0000000000 --- a/crates/locked-app/src/lib.rs +++ /dev/null @@ -1,50 +0,0 @@ -//! Spin internal application interfaces -//! -//! This crate contains interfaces to Spin application configuration to be used -//! by crates that implement Spin execution environments: trigger executors and -//! host components, in particular. - -#![deny(missing_docs)] - -pub mod locked; -mod metadata; -pub mod values; - -pub use async_trait::async_trait; -pub use locked::Variable; -pub use metadata::{MetadataExt, MetadataKey}; - -/// MetadataKey for extracting the application name. -pub const APP_NAME_KEY: MetadataKey = MetadataKey::new("name"); -/// MetadataKey for extracting the application version. -pub const APP_VERSION_KEY: MetadataKey = MetadataKey::new("version"); -/// MetadataKey for extracting the application description. -pub const APP_DESCRIPTION_KEY: MetadataKey = MetadataKey::new("description"); -/// MetadataKey for extracting the OCI image digest. -pub const OCI_IMAGE_DIGEST_KEY: MetadataKey = MetadataKey::new("oci_image_digest"); - -/// Type alias for a [`Result`]s with [`Error`]. -pub type Result = std::result::Result; - -/// Errors returned by methods in this crate. -#[derive(Debug, thiserror::Error)] -pub enum Error { - /// An error propagated from the `spin_core` crate. - #[error(transparent)] - CoreError(anyhow::Error), - /// An error from a `DynamicHostComponent`. - #[error("host component error: {0:#}")] - HostComponentError(#[source] anyhow::Error), - /// An error from a `Loader` implementation. - #[error(transparent)] - LoaderError(anyhow::Error), - /// An error indicating missing or unexpected metadata. - #[error("metadata error: {0}")] - MetadataError(String), - /// An error indicating failed JSON (de)serialization. - #[error("json error: {0}")] - JsonError(#[from] serde_json::Error), - /// A validation error that can be presented directly to the user. - #[error(transparent)] - ValidationError(anyhow::Error), -} diff --git a/crates/oci/Cargo.toml b/crates/oci/Cargo.toml index b4655152d0..10879c314f 100644 --- a/crates/oci/Cargo.toml +++ b/crates/oci/Cargo.toml @@ -24,7 +24,7 @@ serde_json = { workspace = true } spin-common = { path = "../common" } spin-compose = { path = "../compose" } spin-loader = { path = "../loader" } -spin-locked-app = { path = "../locked-app" } +spin-app = { path = "../app" } tempfile = { workspace = true } tokio = { workspace = true, features = ["fs"] } tokio-util = { version = "0.7", features = ["compat"] } diff --git a/crates/oci/src/client.rs b/crates/oci/src/client.rs index 7ec254bf46..5be8119df6 100644 --- a/crates/oci/src/client.rs +++ b/crates/oci/src/client.rs @@ -13,13 +13,13 @@ use oci_distribution::{ token_cache::RegistryTokenType, Reference, RegistryOperation, }; use reqwest::Url; +use spin_app::locked::{ContentPath, ContentRef, LockedApp, LockedComponent}; use spin_common::sha256; use spin_common::ui::quoted_path; use spin_common::url::parse_file_url; use spin_compose::ComponentSourceLoaderFs; use spin_loader::cache::Cache; use spin_loader::FilesMountStrategy; -use spin_locked_app::locked::{ContentPath, ContentRef, LockedApp, LockedComponent}; use tokio::fs; use walkdir::WalkDir; @@ -835,7 +835,7 @@ fn all_annotations( explicit: Option>, predefined: InferPredefinedAnnotations, ) -> Option> { - use spin_locked_app::{MetadataKey, APP_DESCRIPTION_KEY, APP_NAME_KEY, APP_VERSION_KEY}; + use spin_app::{MetadataKey, APP_DESCRIPTION_KEY, APP_NAME_KEY, APP_VERSION_KEY}; const APP_AUTHORS_KEY: MetadataKey> = MetadataKey::new("authors"); if predefined == InferPredefinedAnnotations::None { @@ -989,7 +989,7 @@ mod test { #[tokio::test] async fn can_assemble_layers() { - use spin_locked_app::locked::LockedComponent; + use spin_app::locked::LockedComponent; use tokio::io::AsyncWriteExt; let working_dir = tempfile::tempdir().unwrap(); @@ -1353,7 +1353,7 @@ mod test { } fn annotatable_app() -> LockedApp { - let mut meta_builder = spin_locked_app::values::ValuesMapBuilder::new(); + let mut meta_builder = spin_app::values::ValuesMapBuilder::new(); meta_builder .string("name", "this-is-spinal-tap") .string("version", "11.11.11") diff --git a/crates/oci/src/loader.rs b/crates/oci/src/loader.rs index 0a86f7a0df..813e4f2254 100644 --- a/crates/oci/src/loader.rs +++ b/crates/oci/src/loader.rs @@ -3,9 +3,9 @@ use std::path::{Path, PathBuf}; use anyhow::{anyhow, ensure, Context, Result}; use oci_distribution::Reference; use reqwest::Url; +use spin_app::locked::{ContentPath, ContentRef, LockedApp, LockedComponent}; use spin_common::ui::quoted_path; use spin_loader::cache::Cache; -use spin_locked_app::locked::{ContentPath, ContentRef, LockedApp, LockedComponent}; use crate::{Client, ORIGIN_URL_SCHEME}; diff --git a/crates/oci/src/validate.rs b/crates/oci/src/validate.rs index a28ccc3893..07c580ba41 100644 --- a/crates/oci/src/validate.rs +++ b/crates/oci/src/validate.rs @@ -1,6 +1,6 @@ use anyhow::{bail, Context, Result}; +use spin_app::locked::{LockedComponent, LockedComponentSource}; use spin_common::{ui::quoted_path, url::parse_file_url}; -use spin_locked_app::locked::{LockedComponent, LockedComponentSource}; /// Validate that all Spin components specify valid wasm binaries in both the `source` /// field and for each dependency. @@ -56,7 +56,7 @@ async fn read_component_source(source: &LockedComponentSource) -> Result mod test { use super::*; use crate::from_json; - use spin_locked_app::locked::LockedComponent; + use spin_app::locked::LockedComponent; use tokio::io::AsyncWriteExt; #[tokio::test] diff --git a/examples/spin-timer/Cargo.lock b/examples/spin-timer/Cargo.lock index 94a0f84724..90cda35456 100644 --- a/examples/spin-timer/Cargo.lock +++ b/examples/spin-timer/Cargo.lock @@ -4740,9 +4740,11 @@ name = "spin-app" version = "3.4.0-pre0" dependencies = [ "anyhow", + "itertools 0.14.0", "serde", "serde_json", - "spin-locked-app", + "spin-serde", + "thiserror 2.0.12", ] [[package]] @@ -4804,7 +4806,7 @@ dependencies = [ "anyhow", "async-trait", "futures", - "spin-locked-app", + "spin-app", "thiserror 2.0.12", ] @@ -4814,9 +4816,9 @@ version = "3.4.0-pre0" dependencies = [ "anyhow", "serde", + "spin-app", "spin-core", "spin-factors", - "spin-locked-app", "spin-resource-table", "spin-telemetry", "spin-world", @@ -4833,9 +4835,9 @@ dependencies = [ "anyhow", "async-trait", "serde", + "spin-app", "spin-factors", "spin-llm-remote-http", - "spin-locked-app", "spin-telemetry", "spin-world", "tokio", @@ -4911,10 +4913,10 @@ dependencies = [ "rustls 0.23.25", "rustls-pki-types", "serde", + "spin-app", "spin-factor-variables", "spin-factor-wasi", "spin-factors", - "spin-locked-app", "spin-manifest", "spin-outbound-networking-config", "spin-serde", @@ -4967,8 +4969,8 @@ name = "spin-factor-sqlite" version = "3.4.0-pre0" dependencies = [ "async-trait", + "spin-app", "spin-factors", - "spin-locked-app", "spin-resource-table", "spin-world", "tokio", @@ -5099,19 +5101,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "spin-locked-app" -version = "3.4.0-pre0" -dependencies = [ - "anyhow", - "async-trait", - "itertools 0.14.0", - "serde", - "serde_json", - "spin-serde", - "thiserror 2.0.12", -] - [[package]] name = "spin-manifest" version = "3.4.0-pre0" diff --git a/src/commands/up/app_source.rs b/src/commands/up/app_source.rs index 29088f0ddd..102b9261a4 100644 --- a/src/commands/up/app_source.rs +++ b/src/commands/up/app_source.rs @@ -3,8 +3,8 @@ use std::{ path::{Path, PathBuf}, }; +use spin_app::locked::LockedApp; use spin_common::ui::quoted_path; -use spin_locked_app::locked::LockedApp; use spin_manifest::schema::v2::AppManifest; /// A source from which an App may be loaded.