├── templates └── cron-rust │ ├── content │ ├── .gitignore │ ├── src │ │ └── lib.rs │ ├── Cargo.toml.tmpl │ └── spin.toml │ └── metadata │ ├── spin-template.toml │ └── snippets │ └── component.txt ├── guest-python ├── requirements.txt ├── app.py ├── spin.toml └── README.md ├── .gitignore ├── spin-pluginify.toml ├── guest-rust ├── Cargo.toml ├── src │ └── lib.rs ├── spin.toml └── Cargo.lock ├── MAINTAINERS.md ├── sdk ├── Cargo.toml ├── macro │ ├── Cargo.toml │ ├── src │ │ └── lib.rs │ └── Cargo.lock └── src │ └── lib.rs ├── cron.wit ├── src ├── main.rs └── lib.rs ├── Cargo.toml ├── release-process.md ├── README.md ├── .github └── workflows │ └── build.yaml └── LICENSE /templates/cron-rust/content/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | .spin/ 3 | -------------------------------------------------------------------------------- /guest-python/requirements.txt: -------------------------------------------------------------------------------- 1 | spin-sdk==2.0.0 2 | componentize-py==0.12.0 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | *.tar.gz 3 | trigger-cron.json 4 | .spin 5 | venv 6 | __pycache__ 7 | *.wasm 8 | spin_cron -------------------------------------------------------------------------------- /spin-pluginify.toml: -------------------------------------------------------------------------------- 1 | name = "trigger-cron" 2 | description = "A Spin trigger for Cron events" 3 | version = "0.3.0" 4 | spin_compatibility = ">=3.0" 5 | license = "Apache-2.0" 6 | package = "./target/release/trigger-cron" 7 | -------------------------------------------------------------------------------- /templates/cron-rust/content/src/lib.rs: -------------------------------------------------------------------------------- 1 | use spin_cron_sdk::{cron_component, Error, Metadata}; 2 | 3 | #[cron_component] 4 | fn handle_cron_event(metadata: Metadata) -> Result<(), Error> { 5 | println!("[{}] Hello from a cron component", metadata.timestamp); 6 | Ok(()) 7 | } 8 | -------------------------------------------------------------------------------- /guest-rust/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "guest" 3 | version = "0.1.0" 4 | authors = ["The Spin authors"] 5 | edition = "2021" 6 | rust-version = "1.87" 7 | 8 | [lib] 9 | crate-type = ["cdylib"] 10 | 11 | [dependencies] 12 | spin-sdk = "5.1.0" 13 | spin-cron-sdk = { path = "../sdk" } 14 | 15 | [workspace] 16 | -------------------------------------------------------------------------------- /guest-python/app.py: -------------------------------------------------------------------------------- 1 | import spin_cron 2 | from spin_cron.imports import cron_types 3 | from spin_sdk import variables 4 | 5 | class SpinCron(spin_cron.SpinCron): 6 | def handle_cron_event(self, metadata: cron_types.Metadata) -> None: 7 | temp = variables.get("something") 8 | print("[" + str(metadata.timestamp) +"] " + "Hello every " + temp) -------------------------------------------------------------------------------- /MAINTAINERS.md: -------------------------------------------------------------------------------- 1 | # MAINTAINERS 2 | 3 | ## Current Maintainers 4 | 5 | _Listed in alphabetical order by first name_ 6 | 7 | | Name | GitHub Username | 8 | | --- | --- | 9 | | Brian Hardock | fibonacci1729 | 10 | | Ivan Towlson | itowlson | 11 | | Karthik Ganeshram | karthik2804 | 12 | | Radu Matei | radu-matei | 13 | 14 | ## Emeritus Maintainers 15 | 16 | None 17 | -------------------------------------------------------------------------------- /sdk/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "spin-cron-sdk" 3 | version = { workspace = true } 4 | authors = { workspace = true } 5 | edition = { workspace = true } 6 | rust-version = { workspace = true } 7 | include = ["../cron.wit"] 8 | 9 | [lib] 10 | name = "spin_cron_sdk" 11 | 12 | [dependencies] 13 | spin-executor = "5.1.0" 14 | spin-cron-macro = { path = "macro" } 15 | wit-bindgen = { workspace = true } -------------------------------------------------------------------------------- /guest-rust/src/lib.rs: -------------------------------------------------------------------------------- 1 | use spin_cron_sdk::{cron_component, Error, Metadata}; 2 | use spin_sdk::variables; 3 | 4 | #[cron_component] 5 | async fn handle_cron_event(metadata: Metadata) -> Result<(), Error> { 6 | let key = variables::get("something").unwrap_or_default(); 7 | println!( 8 | "[{}] Hello this is me running every {}", 9 | metadata.timestamp, key 10 | ); 11 | Ok(()) 12 | } 13 | -------------------------------------------------------------------------------- /sdk/macro/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "spin-cron-macro" 3 | version = { workspace = true } 4 | authors = { workspace = true } 5 | edition = { workspace = true } 6 | rust-version = { workspace = true } 7 | include = ["../../cron.wit"] 8 | 9 | [lib] 10 | name = "spin_cron_macro" 11 | proc-macro = true 12 | 13 | [dependencies] 14 | proc-macro2 = "1" 15 | quote = "1.0" 16 | syn = { version = "1.0", features = ["full"] } -------------------------------------------------------------------------------- /cron.wit: -------------------------------------------------------------------------------- 1 | package fermyon:spin-cron@2.0.0; 2 | 3 | interface cron-types { 4 | record metadata { 5 | timestamp: u64, 6 | } 7 | 8 | variant error { 9 | other(string), 10 | } 11 | } 12 | 13 | world spin-cron { 14 | use cron-types.{metadata, error}; 15 | export handle-cron-event: func(metadata: metadata) -> result<_, error>; 16 | } 17 | 18 | world spin-cron-sdk { 19 | import cron-types; 20 | } 21 | -------------------------------------------------------------------------------- /templates/cron-rust/content/Cargo.toml.tmpl: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "{{project-name | kebab_case}}" 3 | authors = ["{{authors}}"] 4 | description = "{{project-description}}" 5 | version = "0.1.0" 6 | edition = "2021" 7 | rust-version = "1.86" 8 | 9 | [lib] 10 | crate-type = ["cdylib"] 11 | 12 | [dependencies] 13 | spin-sdk = "5.1.0" 14 | spin-cron-sdk = { git = "https://github.com/spinframework/spin-trigger-cron/" } 15 | 16 | [workspace] 17 | -------------------------------------------------------------------------------- /templates/cron-rust/metadata/spin-template.toml: -------------------------------------------------------------------------------- 1 | manifest_version = "1" 2 | id = "cron-rust" 3 | description = "Cron event handler using Rust" 4 | tags = ["cron", "rust"] 5 | 6 | [add_component] 7 | skip_files = ["spin.toml"] 8 | [add_component.snippets] 9 | component = "component.txt" 10 | 11 | [parameters] 12 | project-description = { type = "string", prompt = "Description", default = "" } 13 | cron-expression = { type = "string", prompt = "Cron expression", default = "1/2 * * * * *" } 14 | -------------------------------------------------------------------------------- /guest-python/spin.toml: -------------------------------------------------------------------------------- 1 | spin_manifest_version = 2 2 | 3 | [application] 4 | name = "cron-sampl-py" 5 | authors = ["The Spin authors"] 6 | version = "0.1.0" 7 | 8 | [[trigger.cron]] 9 | component = "every2seconds" 10 | cron_expression = "1/2 * * * * *" 11 | 12 | [component.every2seconds] 13 | source = "app.wasm" 14 | [component.every2seconds.build] 15 | command = "componentize-py -d ../cron.wit -w spin-cron componentize -m spin_sdk=spin-imports app -o app.wasm" 16 | [component.every2seconds.variables] 17 | something = "2s" 18 | -------------------------------------------------------------------------------- /sdk/src/lib.rs: -------------------------------------------------------------------------------- 1 | pub use spin_cron_macro::cron_component; 2 | 3 | #[doc(hidden)] 4 | pub use spin_executor as executor; 5 | 6 | #[doc(hidden)] 7 | pub mod wit { 8 | #![allow(missing_docs)] 9 | 10 | wit_bindgen::generate!({ 11 | world: "spin-cron-sdk", 12 | path: "..", 13 | }); 14 | } 15 | 16 | #[doc(inline)] 17 | pub use wit::fermyon::spin_cron::cron_types::Error; 18 | #[doc(inline)] 19 | pub use wit::fermyon::spin_cron::cron_types::Metadata; 20 | 21 | #[doc(hidden)] 22 | pub use wit_bindgen; 23 | -------------------------------------------------------------------------------- /templates/cron-rust/metadata/snippets/component.txt: -------------------------------------------------------------------------------- 1 | [[trigger.cron]] 2 | component = "{{project-name | kebab_case}}" 3 | cron_expression = "{{cron-expression}}" 4 | 5 | [component.{{project-name | kebab_case}}] 6 | source = "{{ output-path }}/target/wasm32-wasip2/release/{{project-name | snake_case}}.wasm" 7 | allowed_outbound_hosts = [] 8 | [component.{{project-name | kebab_case}}.build] 9 | command = "cargo build --target wasm32-wasip2 --release" 10 | workdir = "{{ output-path }}" 11 | watch = ["src/**/*.rs", "Cargo.toml"] 12 | -------------------------------------------------------------------------------- /guest-python/README.md: -------------------------------------------------------------------------------- 1 | # Python Sample for Spin Cron Trigger 2 | 3 | ## Setup Environment and Dependencies 4 | 5 | ```bash 6 | python3 -m venv venv 7 | source venv/bin/activate 8 | pip3 install -r requirements.txt 9 | ``` 10 | 11 | To generate bindings to use with intellisense 12 | 13 | ```bash 14 | componentize-py -d ../cron.wit -w spin-cron bindings bindings 15 | mv bindings/spin_cron ./ 16 | rm -r bindings 17 | ``` 18 | 19 | 20 | ## Build and run the app 21 | 22 | ```bash 23 | $ spin up --build 24 | [1710200677] Hello every 2s 25 | [1710200679] Hello every 2s 26 | ``` 27 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use clap::Parser; 2 | use spin_runtime_factors::FactorsBuilder; 3 | use spin_trigger::cli::FactorsTriggerCommand; 4 | use std::io::IsTerminal; 5 | use trigger_cron::CronTrigger; 6 | 7 | type Command = FactorsTriggerCommand; 8 | 9 | #[tokio::main] 10 | async fn main() -> anyhow::Result<()> { 11 | tracing_subscriber::fmt() 12 | .with_writer(std::io::stderr) 13 | .with_env_filter(tracing_subscriber::EnvFilter::from_default_env()) 14 | .with_ansi(std::io::stderr().is_terminal()) 15 | .init(); 16 | 17 | let t = Command::parse(); 18 | t.run().await 19 | } 20 | -------------------------------------------------------------------------------- /templates/cron-rust/content/spin.toml: -------------------------------------------------------------------------------- 1 | spin_manifest_version = 2 2 | 3 | [application] 4 | name = "{{project-name}}" 5 | version = "0.1.0" 6 | authors = ["{{authors}}"] 7 | description = "{{project-description}}" 8 | 9 | [[trigger.cron]] 10 | component = "{{project-name | kebab_case}}" 11 | cron_expression = "{{cron-expression}}" 12 | 13 | [component.{{project-name | kebab_case}}] 14 | source = "target/wasm32-wasip2/release/{{project-name | snake_case}}.wasm" 15 | allowed_outbound_hosts = [] 16 | [component.{{project-name | kebab_case}}.build] 17 | command = "cargo build --target wasm32-wasip2 --release" 18 | watch = ["src/**/*.rs", "Cargo.toml"] 19 | -------------------------------------------------------------------------------- /guest-rust/spin.toml: -------------------------------------------------------------------------------- 1 | spin_manifest_version = 2 2 | 3 | [application] 4 | name = "cron-sample" 5 | authors = ["The Spin authors"] 6 | description = "" 7 | version = "0.1.0" 8 | 9 | [[trigger.cron]] 10 | component = "every2seconds" 11 | cron_expression = "1/2 * * * * *" 12 | 13 | [component.every2seconds] 14 | source = "target/wasm32-wasip1/release/guest.wasm" 15 | [component.every2seconds.build] 16 | command = "cargo build --target wasm32-wasip1 --release" 17 | [component.every2seconds.variables] 18 | something = "2s" 19 | 20 | [[trigger.cron]] 21 | component = "every4seconds" 22 | cron_expression = "1/4 * * * * *" 23 | 24 | [component.every4seconds] 25 | source = "target/wasm32-wasip1/release/guest.wasm" 26 | [component.every4seconds.build] 27 | command = "cargo build --target wasm32-wasip1 --release" 28 | [component.every4seconds.variables] 29 | something = "4s" 30 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "trigger-cron" 3 | version = { workspace = true } 4 | authors = { workspace = true } 5 | edition = { workspace = true } 6 | rust-version = { workspace = true } 7 | 8 | [workspace.package] 9 | version = "0.3.0" 10 | authors = ["The Spin authors"] 11 | edition = "2021" 12 | rust-version = "1.87" 13 | 14 | [workspace] 15 | members = ["sdk", "sdk/macro"] 16 | 17 | [dependencies] 18 | anyhow = "1.0.75" 19 | async-trait = "0.1" 20 | clap = { version = "3.1.15", features = ["derive", "env"] } 21 | serde = "1.0" 22 | spin-factors = { git = "https://github.com/spinframework/spin", tag = "v3.5.0" } 23 | spin-runtime-factors = { git = "https://github.com/spinframework/spin", tag = "v3.5.0" } 24 | spin-trigger = { git = "https://github.com/spinframework/spin", tag = "v3.5.0" } 25 | tokio = { version = "1.37", features = ["full"] } 26 | tokio-cron-scheduler = "0.13" 27 | tracing = { version = "0.1", features = ["log"] } 28 | tracing-subscriber = { version = "0.3.7", features = ["env-filter"] } 29 | wasmtime = { version = "37.0.1" } 30 | 31 | [target.'cfg(target_os = "linux")'.dependencies] 32 | # This needs to be an explicit dependency to enable 33 | # '--features openssl/vendored', which is used for Linux releases. 34 | openssl = { version = "0.10" } 35 | 36 | [workspace.dependencies] 37 | wit-bindgen = "0.43.0" 38 | -------------------------------------------------------------------------------- /release-process.md: -------------------------------------------------------------------------------- 1 | # Cutting a new release of the Spin Cron trigger plugin 2 | 3 | To cut a new release of the Cron trigger plugin, you will need to do the following: 4 | 5 | 1. Confirm that [CI is green](https://github.com/spinframework/spin-trigger-cron/actions) for the commit selected to be tagged and released. 6 | 7 | 2. Change the version number in [Cargo.toml](./Cargo.toml) and [spin-pluginify.toml](./spin-pluginify.toml) and run `cargo build --release`. 8 | 9 | 3. Create a pull request with these changes and merge once approved. 10 | 11 | 4. Checkout the commit with the version bump from above. 12 | 13 | 5. Create and push a new tag with a `v` and then the version number. 14 | 15 | As an example, via the `git` CLI: 16 | 17 | ``` 18 | # Create a GPG-signed and annotated tag 19 | git tag -s -m "Spin Cron Trigger v0.2.0" v0.2.0 20 | 21 | # Push the tag to the remote corresponding to spinframework/spin-trigger-cron (here 'origin') 22 | git push origin v0.2.0 23 | ``` 24 | 25 | 6. Pushing the tag upstream will trigger the [release action](https://github.com/spinframework/spin-trigger-cron/actions/workflows/release.yml). 26 | - The release build will create the packaged versions of the plugin, the updated plugin manifest and a checksums file 27 | - These assets are uploaded to a new GitHub release for the pushed tag 28 | - Release notes are auto-generated but edit as needed especially around breaking changes or other notable items 29 | 30 | 7. Create a PR in the [spinframework/spin-plugins](https://github.com/spinframework/spin-plugins) repository with the [updated manifest](https://github.com/spinframework/spin-plugins/tree/main/manifests/cron-trigger). 31 | 32 | 8. If applicable, create PR(s) or coordinate [documentation](https://github.com/spinframework/spin-docs) needs, e.g. for new features or updated functionality. -------------------------------------------------------------------------------- /sdk/macro/src/lib.rs: -------------------------------------------------------------------------------- 1 | use proc_macro::TokenStream; 2 | use quote::quote; 3 | 4 | const WIT_PATH: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/../../cron.wit"); 5 | 6 | #[proc_macro_attribute] 7 | pub fn cron_component(_attr: TokenStream, item: TokenStream) -> TokenStream { 8 | let func = syn::parse_macro_input!(item as syn::ItemFn); 9 | let func_name = &func.sig.ident; 10 | let await_postfix = func.sig.asyncness.map(|_| quote!(.await)); 11 | let preamble = preamble(); 12 | 13 | quote!( 14 | #func 15 | mod __spin_cron { 16 | mod preamble { 17 | #preamble 18 | } 19 | impl self::preamble::Guest for preamble::Cron { 20 | fn handle_cron_event(metadata: ::spin_cron_sdk::Metadata) -> ::std::result::Result<(), ::spin_cron_sdk::Error> { 21 | ::spin_cron_sdk::executor::run(async move { 22 | match super::#func_name(metadata)#await_postfix { 23 | ::std::result::Result::Ok(()) => ::std::result::Result::Ok(()), 24 | ::std::result::Result::Err(e) => { 25 | eprintln!("{}", e); 26 | ::std::result::Result::Err(::spin_cron_sdk::Error::Other(e.to_string())) 27 | }, 28 | } 29 | }) 30 | } 31 | } 32 | } 33 | ).into() 34 | } 35 | 36 | fn preamble() -> proc_macro2::TokenStream { 37 | let world = "spin-cron"; 38 | quote! { 39 | #![allow(missing_docs)] 40 | ::spin_cron_sdk::wit_bindgen::generate!({ 41 | world: #world, 42 | path: #WIT_PATH, 43 | runtime_path: "::spin_cron_sdk::wit_bindgen::rt", 44 | with: { 45 | "fermyon:spin-cron/cron-types@2.0.0": ::spin_cron_sdk, 46 | } 47 | }); 48 | pub struct Cron; 49 | export!(Cron); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Experimental Cron trigger for Spin 2 | 3 | ## Install from release 4 | 5 | ```bash 6 | spin plugins install --url https://github.com/spinframework/spin-trigger-cron/releases/download/canary/trigger-cron.json 7 | ``` 8 | 9 | ## Build From source 10 | 11 | You will need Rust and the `pluginify` plugin (`spin plugins install --url https://github.com/itowlson/spin-pluginify/releases/download/canary/pluginify.json`). 12 | 13 | ```bash 14 | cargo build --release 15 | spin pluginify --install 16 | ``` 17 | 18 | ## Test 19 | 20 | You will need to build and run the spin components. Change the cron expression if needed. 21 | 22 | ```bash 23 | cd guest 24 | spin build --up 25 | ``` 26 | 27 | 28 | ## Installing the template 29 | 30 | You can install the template using the following command: 31 | 32 | ```bash 33 | spin templates install --git https://github.com/spinframework/spin-trigger-cron 34 | ``` 35 | 36 | Once the template is installed, you can create a new application using: 37 | 38 | ```bash 39 | spin new -t cron-rust hello_cron --accept-defaults 40 | ``` 41 | 42 | To run the newly created app: 43 | 44 | ``` 45 | cd hello_cron 46 | spin build --up 47 | ``` 48 | 49 | ## Trigger Configuration 50 | 51 | The trigger type is `cron`, and there are no application-level configuration options. 52 | 53 | The following options are available to set in the [[trigger.cron]] section: 54 | 55 | | Name | Type | Required? | Description | 56 | |-----------------------|------------------|-----------|-------------| 57 | | `component` | string or table | required | The component to run on the schedule given in `cron_expression`. (This is the standard Spin trigger component field.) | 58 | | `cron_expression` | string | required | The `cron` expression describes the schedule for executing the component. | 59 | 60 | ### Cron Expression Fields 61 | 62 | The `cron_expression` fields are as follows: 63 | 64 | ```text 65 | # ┌──────────── sec (0–59) 66 | # | ┌───────────── min (0–59) 67 | # | │ ┌───────────── hour (0–23) 68 | # | │ │ ┌───────────── day of month (1–31) 69 | # | │ │ │ ┌───────────── month (1–12) 70 | # | │ │ │ │ ┌───────────── day of week (0–6) 71 | # | │ │ │ │ | ┌─────────────- year 72 | # | │ │ │ │ | │ 73 | # | │ │ │ │ | │ 74 | * * * * * * * 75 | ``` 76 | 77 | ### Cron Expression Characters 78 | 79 | The `*` indicates that every value applies. For example, if `sec` is set to `*`, then every second will trigger execution. 80 | The `/` indicates increments. For example, if `sec` is set to `0/15`, then starting at `0`, the trigger will be executed every 15 seconds. 81 | The `,` indicates a list of values. For example, if `sec` is set to `2,8`, then the trigger will execute only on the 2nd and 8th seconds of every minute. 82 | The `-` indicates range. For example, if the `sec` is set to `5-10`, then the trigger will execute only on the 5th, 6th, 7th, 8th, 9th, and 10th seconds of each minute. 83 | The `0` indicates no execution. If the `sec` is set to `0`, then the trigger can only execute on higher field values such as `min`, `hour`, etc. The lowest second increment is 60 (one minute). 84 | 85 | Here is one example that combines a few of the fields mentioned above: 86 | 87 | ```text 88 | sec min hour day of month month day of week year 89 | 0 1/2 11,12 5-10 * * * 90 | ``` 91 | 92 | The above schedule of `0 1/2 11,12 5-10 * * *` will execute on the first minute and every subsequent 2 minutes during the 11th hour and the 12 hour (noon) on days 5 through 10 of every month (regardless of the day of the week) and this will repeat through every year. 93 | 94 | ## Building Cron Components 95 | 96 | Currently only a Rust SDK is supported for guest components. The `spin-cron-sdk` along with the [`spin_sdk` crate](https://docs.rs/spin-sdk) can be used to build cron components. The guest code must have a function decorated with the `#[cron_component]` macro. See `guest/src/lib.rs` for an example in rust. 97 | 98 | The signature of the function must be `fn handle_cron_event(metadata: Metadata) -> Result<(), Error>`. 99 | 100 | The `Metadata` object contains a single field `timestamp` which contains the duration since 00:00:00 UTC on 1 January 1970 (the Unix epoch) in seconds. 101 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | use anyhow::{anyhow, Context, Result}; 2 | use serde::{Deserialize, Serialize}; 3 | use spin_factors::RuntimeFactors; 4 | use spin_trigger::{cli::NoCliArgs, App, Trigger, TriggerApp}; 5 | use std::{ 6 | sync::Arc, 7 | time::{SystemTime, UNIX_EPOCH}, 8 | }; 9 | use tokio::signal; 10 | use tokio_cron_scheduler::{Job, JobScheduler}; 11 | 12 | wasmtime::component::bindgen!({ 13 | world: "spin-cron", 14 | path: "cron.wit", 15 | exports: { default: async }, 16 | }); 17 | 18 | use fermyon::spin_cron::cron_types as cron; 19 | 20 | pub struct CronTrigger { 21 | cron_components: Vec, 22 | } 23 | 24 | #[derive(Clone, Debug, Default, Deserialize, Serialize)] 25 | #[serde(deny_unknown_fields)] 26 | pub struct CronTriggerConfig { 27 | pub component: String, 28 | pub cron_expression: String, 29 | } 30 | 31 | #[derive(Clone, Debug)] 32 | struct Component { 33 | pub id: String, 34 | pub cron_expression: String, 35 | } 36 | 37 | impl Trigger for CronTrigger { 38 | const TYPE: &'static str = "cron"; 39 | 40 | type CliArgs = NoCliArgs; 41 | 42 | type InstanceState = (); 43 | 44 | fn new(_cli_args: Self::CliArgs, app: &App) -> anyhow::Result { 45 | let cron_components = app 46 | .trigger_configs::(>::TYPE)? 47 | .into_iter() 48 | .map(|(_, config)| Component { 49 | id: config.component.clone(), 50 | cron_expression: config.cron_expression.clone(), 51 | }) 52 | .collect(); 53 | Ok(Self { cron_components }) 54 | } 55 | 56 | fn run( 57 | self, 58 | trigger_app: TriggerApp, 59 | ) -> impl std::future::Future> + Send { 60 | let components = self.cron_components; 61 | Self::init_cron_scheduler(trigger_app.into(), components) 62 | } 63 | } 64 | 65 | impl CronTrigger { 66 | async fn init_cron_scheduler( 67 | engine: Arc>, 68 | components: Vec, 69 | ) -> anyhow::Result<()> { 70 | let mut sched = JobScheduler::new().await?; 71 | for component in components { 72 | let id = component.id.clone(); 73 | tracing::info!("Adding component \"{id}\" to job scheduler"); 74 | let engine = engine.clone(); 75 | sched 76 | .add(Job::new_async( 77 | component.cron_expression.clone().as_str(), 78 | move |_, _| { 79 | let processor = CronEventProcessor::new(engine.clone(), component.clone()); 80 | let timestamp: u64 = SystemTime::now() 81 | .duration_since(UNIX_EPOCH) 82 | .unwrap() 83 | .as_secs(); 84 | Box::pin(async move { 85 | _ = processor 86 | .handle_cron_event(cron::Metadata { timestamp }) 87 | .await; 88 | }) 89 | }, 90 | )?) 91 | .await?; 92 | } 93 | 94 | sched.start().await?; 95 | tracing::info!("Job scheduler started"); 96 | 97 | // Handle Ctrl + c 98 | let (tx, rx) = tokio::sync::oneshot::channel::<()>(); 99 | tokio::spawn(async move { 100 | signal::ctrl_c().await.expect("Failed to listen for Ctrl+C"); 101 | tracing::info!("Ctrl+C received - Terminating"); 102 | let _ = tx.send(()); 103 | }); 104 | rx.await?; 105 | 106 | sched.shutdown().await?; 107 | tracing::info!("Job scheduler stopped"); 108 | 109 | Ok(()) 110 | } 111 | } 112 | 113 | pub struct CronEventProcessor { 114 | trigger_app: Arc>, 115 | component: Component, 116 | } 117 | 118 | impl CronEventProcessor { 119 | fn new(trigger_app: Arc>, component: Component) -> Self { 120 | Self { 121 | trigger_app, 122 | component, 123 | } 124 | } 125 | 126 | async fn handle_cron_event(&self, metadata: cron::Metadata) -> anyhow::Result<()> { 127 | // Load the guest... 128 | let instance_builder = self.trigger_app.prepare(&self.component.id)?; 129 | let (instance, mut store) = instance_builder.instantiate(()).await?; 130 | let instance = SpinCron::new(&mut store, &instance)?; 131 | // ...and call the entry point 132 | let res = instance 133 | .call_handle_cron_event(&mut store, metadata) 134 | .await 135 | .context("cron handler trapped")?; 136 | res.map_err(|e| { 137 | tracing::error!("Component {} failed: {e}", self.component.id); 138 | anyhow!("Component {} failed: {e}", self.component.id) 139 | }) 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /.github/workflows/build.yaml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json 2 | 3 | name: Build and package 4 | on: 5 | push: 6 | branches: [main] 7 | tags: ["v*"] 8 | pull_request: 9 | branches: [main] 10 | 11 | # TODO: better way? 12 | permissions: 13 | contents: write 14 | 15 | # Construct a concurrency group to be shared across workflow runs. 16 | # The default behavior ensures that only one is running at a time, with 17 | # all others queuing and thus not interrupting runs that are in-flight. 18 | concurrency: ${{ github.workflow }} 19 | 20 | env: 21 | PROGRAM_NAME: trigger-cron 22 | 23 | jobs: 24 | build: 25 | name: Build plugin 26 | runs-on: ${{ matrix.config.os }} 27 | strategy: 28 | fail-fast: false 29 | matrix: 30 | config: 31 | - { target: "x86_64-unknown-linux-gnu", os: "ubuntu-22.04", arch: "amd64", extension: "", extraArg: "--features openssl/vendored" } 32 | - { target: "aarch64-unknown-linux-gnu", os: "ubuntu-22.04", arch: "aarch64", extension: "", extraArg: "--features openssl/vendored" } 33 | - { target: "x86_64-apple-darwin", os: "macos-15-intel", arch: "amd64", extension: "" } 34 | - { target: "aarch64-apple-darwin", os: "macos-14", arch: "aarch64", extension: "" } 35 | - { target: "x86_64-pc-windows-msvc", os: "windows-latest", arch: "amd64", extension: ".exe" } 36 | steps: 37 | - uses: actions/checkout@v3 38 | - uses: Swatinem/rust-cache@v2 39 | with: 40 | shared-key: "${{ runner.os }}-lint-${{ hashFiles('./Cargo.lock') }}" 41 | cache-on-failure: "true" 42 | - name: Install Rust 43 | uses: dtolnay/rust-toolchain@stable 44 | with: 45 | toolchain: 1.87 46 | targets: ${{ matrix.config.target }} 47 | - name: Install Spin 48 | uses: rajatjindal/setup-actions/spin@main 49 | with: 50 | version: "v0.8.0" 51 | - name: Install pluginify 52 | shell: bash 53 | run: spin plugins install --url https://github.com/itowlson/spin-pluginify/releases/download/canary/pluginify.json --yes 54 | - name: Set up for cross-compiled linux aarch64 build 55 | if: matrix.config.target == 'aarch64-unknown-linux-gnu' 56 | run: | 57 | sudo apt update 58 | sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu 59 | echo '[target.aarch64-unknown-linux-gnu]' >> ${HOME}/.cargo/config.toml 60 | echo 'linker = "aarch64-linux-gnu-gcc"' >> ${HOME}/.cargo/config.toml 61 | - name: Build plugin binary 62 | run: cargo build --release --target ${{ matrix.config.target }} ${{ matrix.config.extraArg }} 63 | - name: Copy plugin binary to standard location 64 | shell: bash 65 | run: cp target/${{ matrix.config.target }}/release/${{ env.PROGRAM_NAME}}${{ matrix.config.extension }} target/release/${{ env.PROGRAM_NAME}}${{ matrix.config.extension }} 66 | 67 | - name: Pluginify plugin binary 68 | run: spin pluginify --arch ${{ matrix.config.arch }} 69 | - name: Archive pluginified 70 | uses: actions/upload-artifact@v4 71 | with: 72 | name: ${{ env.PROGRAM_NAME}}-${{ matrix.config.os }}-${{ matrix.config.arch }} 73 | path: | 74 | *.tar.gz 75 | *.json 76 | 77 | package: 78 | name: Package plugin 79 | if: github.event_name == 'push' 80 | runs-on: ubuntu-latest 81 | needs: build 82 | steps: 83 | - name: Install Spin 84 | uses: rajatjindal/setup-actions/spin@main 85 | with: 86 | version: "v3.2.0" 87 | - name: Install pluginify 88 | shell: bash 89 | run: spin plugins install --url https://github.com/itowlson/spin-pluginify/releases/download/canary/pluginify.json --yes 90 | 91 | - name: set the release version (tag) 92 | if: startsWith(github.ref, 'refs/tags/v') 93 | shell: bash 94 | run: echo "RELEASE_VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV 95 | - name: set the release version (main) 96 | if: github.ref == 'refs/heads/main' 97 | shell: bash 98 | run: echo "RELEASE_VERSION=canary" >> $GITHUB_ENV 99 | - name: set the release version (TEST TEST TEST) 100 | if: github.event_name == 'pull_request' 101 | shell: bash 102 | run: echo "RELEASE_VERSION=precanary" >> $GITHUB_ENV 103 | 104 | - name: Download artifacts 105 | uses: actions/download-artifact@v4 106 | with: 107 | pattern: ${{ env.PROGRAM_NAME}}-* 108 | - name: Display structure of downloaded files 109 | run: ls -R 110 | - name: pluginify it 111 | run: | 112 | spin pluginify --merge --release-url-base https://github.com/fermyon/spin-trigger-cron/releases/download/${{ env.RELEASE_VERSION }}/ >${{ env.PROGRAM_NAME }}.json 113 | - name: Display merged manifest 114 | run: cat ${{ env.PROGRAM_NAME }}.json 115 | 116 | # Handle versioned release 117 | - name: Upload tars to Github release 118 | if: startsWith(github.ref, 'refs/tags/v') 119 | uses: svenstaro/upload-release-action@v2 120 | with: 121 | repo_token: ${{ secrets.GITHUB_TOKEN }} 122 | file: "**/*.tar.gz" 123 | file_glob: true 124 | tag: ${{ github.ref }} 125 | - name: Upload manifest to Github release 126 | if: startsWith(github.ref, 'refs/tags/v') 127 | uses: svenstaro/upload-release-action@v2 128 | with: 129 | repo_token: ${{ secrets.GITHUB_TOKEN }} 130 | file: ${{ env.PROGRAM_NAME }}.json 131 | tag: ${{ github.ref }} 132 | 133 | # Handle canary release 134 | - name: Delete canary tag 135 | if: github.ref == 'refs/heads/main' 136 | uses: dev-drprasad/delete-tag-and-release@v0.2.1 137 | env: 138 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 139 | with: 140 | tag_name: canary 141 | - name: Recreate canary tag and release 142 | if: github.ref == 'refs/heads/main' 143 | uses: ncipollo/release-action@v1.10.0 144 | with: 145 | tag: canary 146 | allowUpdates: true 147 | prerelease: true 148 | - name: Upload tars to Github release 149 | if: github.ref == 'refs/heads/main' 150 | uses: svenstaro/upload-release-action@v2 151 | with: 152 | repo_token: ${{ secrets.GITHUB_TOKEN }} 153 | file: "**/*.tar.gz" 154 | file_glob: true 155 | tag: canary 156 | - name: Upload manifest to Github release 157 | if: github.ref == 'refs/heads/main' 158 | uses: svenstaro/upload-release-action@v2 159 | with: 160 | repo_token: ${{ secrets.GITHUB_TOKEN }} 161 | file: ${{ env.PROGRAM_NAME }}.json 162 | tag: canary 163 | -------------------------------------------------------------------------------- /sdk/macro/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "anyhow" 7 | version = "1.0.75" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" 10 | 11 | [[package]] 12 | name = "bitflags" 13 | version = "2.4.1" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" 16 | 17 | [[package]] 18 | name = "bytes" 19 | version = "1.5.0" 20 | source = "registry+https://github.com/rust-lang/crates.io-index" 21 | checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" 22 | 23 | [[package]] 24 | name = "equivalent" 25 | version = "1.0.1" 26 | source = "registry+https://github.com/rust-lang/crates.io-index" 27 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 28 | 29 | [[package]] 30 | name = "fnv" 31 | version = "1.0.7" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 34 | 35 | [[package]] 36 | name = "hashbrown" 37 | version = "0.14.3" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" 40 | 41 | [[package]] 42 | name = "heck" 43 | version = "0.4.1" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 46 | dependencies = [ 47 | "unicode-segmentation", 48 | ] 49 | 50 | [[package]] 51 | name = "http" 52 | version = "0.2.11" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" 55 | dependencies = [ 56 | "bytes", 57 | "fnv", 58 | "itoa", 59 | ] 60 | 61 | [[package]] 62 | name = "id-arena" 63 | version = "2.2.1" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" 66 | 67 | [[package]] 68 | name = "indexmap" 69 | version = "2.1.0" 70 | source = "registry+https://github.com/rust-lang/crates.io-index" 71 | checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" 72 | dependencies = [ 73 | "equivalent", 74 | "hashbrown", 75 | "serde", 76 | ] 77 | 78 | [[package]] 79 | name = "itoa" 80 | version = "1.0.9" 81 | source = "registry+https://github.com/rust-lang/crates.io-index" 82 | checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" 83 | 84 | [[package]] 85 | name = "leb128" 86 | version = "0.2.5" 87 | source = "registry+https://github.com/rust-lang/crates.io-index" 88 | checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" 89 | 90 | [[package]] 91 | name = "log" 92 | version = "0.4.20" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" 95 | 96 | [[package]] 97 | name = "proc-macro2" 98 | version = "1.0.70" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" 101 | dependencies = [ 102 | "unicode-ident", 103 | ] 104 | 105 | [[package]] 106 | name = "quote" 107 | version = "1.0.33" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" 110 | dependencies = [ 111 | "proc-macro2", 112 | ] 113 | 114 | [[package]] 115 | name = "ryu" 116 | version = "1.0.15" 117 | source = "registry+https://github.com/rust-lang/crates.io-index" 118 | checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" 119 | 120 | [[package]] 121 | name = "semver" 122 | version = "1.0.20" 123 | source = "registry+https://github.com/rust-lang/crates.io-index" 124 | checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" 125 | 126 | [[package]] 127 | name = "serde" 128 | version = "1.0.193" 129 | source = "registry+https://github.com/rust-lang/crates.io-index" 130 | checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" 131 | dependencies = [ 132 | "serde_derive", 133 | ] 134 | 135 | [[package]] 136 | name = "serde_derive" 137 | version = "1.0.193" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" 140 | dependencies = [ 141 | "proc-macro2", 142 | "quote", 143 | "syn 2.0.39", 144 | ] 145 | 146 | [[package]] 147 | name = "serde_json" 148 | version = "1.0.108" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" 151 | dependencies = [ 152 | "itoa", 153 | "ryu", 154 | "serde", 155 | ] 156 | 157 | [[package]] 158 | name = "smallvec" 159 | version = "1.11.2" 160 | source = "registry+https://github.com/rust-lang/crates.io-index" 161 | checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" 162 | 163 | [[package]] 164 | name = "spdx" 165 | version = "0.10.2" 166 | source = "registry+https://github.com/rust-lang/crates.io-index" 167 | checksum = "b19b32ed6d899ab23174302ff105c1577e45a06b08d4fe0a9dd13ce804bbbf71" 168 | dependencies = [ 169 | "smallvec", 170 | ] 171 | 172 | [[package]] 173 | name = "syn" 174 | version = "1.0.109" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 177 | dependencies = [ 178 | "proc-macro2", 179 | "quote", 180 | "unicode-ident", 181 | ] 182 | 183 | [[package]] 184 | name = "syn" 185 | version = "2.0.39" 186 | source = "registry+https://github.com/rust-lang/crates.io-index" 187 | checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" 188 | dependencies = [ 189 | "proc-macro2", 190 | "quote", 191 | "unicode-ident", 192 | ] 193 | 194 | [[package]] 195 | name = "trigger-cron" 196 | version = "0.1.0" 197 | dependencies = [ 198 | "anyhow", 199 | "bytes", 200 | "http", 201 | "proc-macro2", 202 | "quote", 203 | "syn 1.0.109", 204 | "wit-bindgen", 205 | ] 206 | 207 | [[package]] 208 | name = "unicode-ident" 209 | version = "1.0.12" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 212 | 213 | [[package]] 214 | name = "unicode-segmentation" 215 | version = "1.10.1" 216 | source = "registry+https://github.com/rust-lang/crates.io-index" 217 | checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" 218 | 219 | [[package]] 220 | name = "unicode-xid" 221 | version = "0.2.4" 222 | source = "registry+https://github.com/rust-lang/crates.io-index" 223 | checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" 224 | 225 | [[package]] 226 | name = "wasm-encoder" 227 | version = "0.36.2" 228 | source = "registry+https://github.com/rust-lang/crates.io-index" 229 | checksum = "822b645bf4f2446b949776ffca47e2af60b167209ffb70814ef8779d299cd421" 230 | dependencies = [ 231 | "leb128", 232 | ] 233 | 234 | [[package]] 235 | name = "wasm-encoder" 236 | version = "0.38.1" 237 | source = "registry+https://github.com/rust-lang/crates.io-index" 238 | checksum = "0ad2b51884de9c7f4fe2fd1043fccb8dcad4b1e29558146ee57a144d15779f3f" 239 | dependencies = [ 240 | "leb128", 241 | ] 242 | 243 | [[package]] 244 | name = "wasm-metadata" 245 | version = "0.10.14" 246 | source = "registry+https://github.com/rust-lang/crates.io-index" 247 | checksum = "d835d67708f6374937c550ad8dd1d17c616ae009e3f00d7a0ac9f7825e78c36a" 248 | dependencies = [ 249 | "anyhow", 250 | "indexmap", 251 | "serde", 252 | "serde_derive", 253 | "serde_json", 254 | "spdx", 255 | "wasm-encoder 0.38.1", 256 | "wasmparser 0.118.1", 257 | ] 258 | 259 | [[package]] 260 | name = "wasmparser" 261 | version = "0.116.1" 262 | source = "registry+https://github.com/rust-lang/crates.io-index" 263 | checksum = "a58e28b80dd8340cb07b8242ae654756161f6fc8d0038123d679b7b99964fa50" 264 | dependencies = [ 265 | "indexmap", 266 | "semver", 267 | ] 268 | 269 | [[package]] 270 | name = "wasmparser" 271 | version = "0.118.1" 272 | source = "registry+https://github.com/rust-lang/crates.io-index" 273 | checksum = "95ee9723b928e735d53000dec9eae7b07a60e490c85ab54abb66659fc61bfcd9" 274 | dependencies = [ 275 | "indexmap", 276 | "semver", 277 | ] 278 | 279 | [[package]] 280 | name = "wit-bindgen" 281 | version = "0.13.1" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "38726c54a5d7c03cac28a2a8de1006cfe40397ddf6def3f836189033a413bc08" 284 | dependencies = [ 285 | "bitflags", 286 | "wit-bindgen-rust-macro", 287 | ] 288 | 289 | [[package]] 290 | name = "wit-bindgen-core" 291 | version = "0.13.1" 292 | source = "registry+https://github.com/rust-lang/crates.io-index" 293 | checksum = "c8bf1fddccaff31a1ad57432d8bfb7027a7e552969b6c68d6d8820dcf5c2371f" 294 | dependencies = [ 295 | "anyhow", 296 | "wit-component", 297 | "wit-parser", 298 | ] 299 | 300 | [[package]] 301 | name = "wit-bindgen-rust" 302 | version = "0.13.2" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "0e7200e565124801e01b7b5ddafc559e1da1b2e1bed5364d669cd1d96fb88722" 305 | dependencies = [ 306 | "anyhow", 307 | "heck", 308 | "wasm-metadata", 309 | "wit-bindgen-core", 310 | "wit-component", 311 | ] 312 | 313 | [[package]] 314 | name = "wit-bindgen-rust-macro" 315 | version = "0.13.1" 316 | source = "registry+https://github.com/rust-lang/crates.io-index" 317 | checksum = "4ae33920ad8119fe72cf59eb00f127c0b256a236b9de029a1a10397b1f38bdbd" 318 | dependencies = [ 319 | "anyhow", 320 | "proc-macro2", 321 | "quote", 322 | "syn 2.0.39", 323 | "wit-bindgen-core", 324 | "wit-bindgen-rust", 325 | "wit-component", 326 | ] 327 | 328 | [[package]] 329 | name = "wit-component" 330 | version = "0.17.0" 331 | source = "registry+https://github.com/rust-lang/crates.io-index" 332 | checksum = "480cc1a078b305c1b8510f7c455c76cbd008ee49935f3a6c5fd5e937d8d95b1e" 333 | dependencies = [ 334 | "anyhow", 335 | "bitflags", 336 | "indexmap", 337 | "log", 338 | "serde", 339 | "serde_derive", 340 | "serde_json", 341 | "wasm-encoder 0.36.2", 342 | "wasm-metadata", 343 | "wasmparser 0.116.1", 344 | "wit-parser", 345 | ] 346 | 347 | [[package]] 348 | name = "wit-parser" 349 | version = "0.12.2" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "43771ee863a16ec4ecf9da0fc65c3bbd4a1235c8e3da5f094b562894843dfa76" 352 | dependencies = [ 353 | "anyhow", 354 | "id-arena", 355 | "indexmap", 356 | "log", 357 | "semver", 358 | "serde", 359 | "serde_derive", 360 | "serde_json", 361 | "unicode-xid", 362 | ] 363 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright (c) The Spin Framework Contributors. All Rights Reserved. 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | 203 | --- LLVM Exceptions to the Apache 2.0 License ---- 204 | 205 | As an exception, if, as a result of your compiling your source code, portions 206 | of this Software are embedded into an Object form of such source code, you 207 | may redistribute such embedded portions in such Object form without complying 208 | with the conditions of Sections 4(a), 4(b) and 4(d) of the License. 209 | 210 | In addition, if you combine or link compiled forms of this Software with 211 | software that is licensed under the GPLv2 ("Combined Software") and if a 212 | court of competent jurisdiction determines that the patent provision (Section 213 | 3), the indemnity provision (Section 9) or other Section of the License 214 | conflicts with the conditions of the GPLv2, you may retroactively and 215 | prospectively choose to deem waived or otherwise exclude such Section(s) of 216 | the License, but only in their entirety and only with respect to the Combined 217 | Software. 218 | -------------------------------------------------------------------------------- /guest-rust/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "android-tzdata" 7 | version = "0.1.1" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 10 | 11 | [[package]] 12 | name = "android_system_properties" 13 | version = "0.1.5" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 16 | dependencies = [ 17 | "libc", 18 | ] 19 | 20 | [[package]] 21 | name = "anyhow" 22 | version = "1.0.75" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" 25 | 26 | [[package]] 27 | name = "arrayvec" 28 | version = "0.7.6" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 31 | 32 | [[package]] 33 | name = "async-trait" 34 | version = "0.1.74" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" 37 | dependencies = [ 38 | "proc-macro2", 39 | "quote", 40 | "syn 2.0.106", 41 | ] 42 | 43 | [[package]] 44 | name = "autocfg" 45 | version = "1.1.0" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 48 | 49 | [[package]] 50 | name = "base64" 51 | version = "0.22.1" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 54 | 55 | [[package]] 56 | name = "bitflags" 57 | version = "2.4.1" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" 60 | 61 | [[package]] 62 | name = "block-buffer" 63 | version = "0.10.4" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 66 | dependencies = [ 67 | "generic-array", 68 | ] 69 | 70 | [[package]] 71 | name = "bumpalo" 72 | version = "3.19.0" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" 75 | 76 | [[package]] 77 | name = "byteorder" 78 | version = "1.5.0" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 81 | 82 | [[package]] 83 | name = "bytes" 84 | version = "1.10.1" 85 | source = "registry+https://github.com/rust-lang/crates.io-index" 86 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 87 | 88 | [[package]] 89 | name = "cc" 90 | version = "1.2.34" 91 | source = "registry+https://github.com/rust-lang/crates.io-index" 92 | checksum = "42bc4aea80032b7bf409b0bc7ccad88853858911b7713a8062fdc0623867bedc" 93 | dependencies = [ 94 | "shlex", 95 | ] 96 | 97 | [[package]] 98 | name = "cfg-if" 99 | version = "1.0.3" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" 102 | 103 | [[package]] 104 | name = "chrono" 105 | version = "0.4.41" 106 | source = "registry+https://github.com/rust-lang/crates.io-index" 107 | checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" 108 | dependencies = [ 109 | "android-tzdata", 110 | "iana-time-zone", 111 | "js-sys", 112 | "num-traits", 113 | "wasm-bindgen", 114 | "windows-link", 115 | ] 116 | 117 | [[package]] 118 | name = "core-foundation-sys" 119 | version = "0.8.7" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 122 | 123 | [[package]] 124 | name = "cpufeatures" 125 | version = "0.2.17" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 128 | dependencies = [ 129 | "libc", 130 | ] 131 | 132 | [[package]] 133 | name = "crypto-common" 134 | version = "0.1.6" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 137 | dependencies = [ 138 | "generic-array", 139 | "typenum", 140 | ] 141 | 142 | [[package]] 143 | name = "digest" 144 | version = "0.10.7" 145 | source = "registry+https://github.com/rust-lang/crates.io-index" 146 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 147 | dependencies = [ 148 | "block-buffer", 149 | "crypto-common", 150 | "subtle", 151 | ] 152 | 153 | [[package]] 154 | name = "equivalent" 155 | version = "1.0.1" 156 | source = "registry+https://github.com/rust-lang/crates.io-index" 157 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 158 | 159 | [[package]] 160 | name = "fallible-iterator" 161 | version = "0.2.0" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" 164 | 165 | [[package]] 166 | name = "fnv" 167 | version = "1.0.7" 168 | source = "registry+https://github.com/rust-lang/crates.io-index" 169 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 170 | 171 | [[package]] 172 | name = "foldhash" 173 | version = "0.1.5" 174 | source = "registry+https://github.com/rust-lang/crates.io-index" 175 | checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 176 | 177 | [[package]] 178 | name = "form_urlencoded" 179 | version = "1.2.1" 180 | source = "registry+https://github.com/rust-lang/crates.io-index" 181 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 182 | dependencies = [ 183 | "percent-encoding", 184 | ] 185 | 186 | [[package]] 187 | name = "futures" 188 | version = "0.3.31" 189 | source = "registry+https://github.com/rust-lang/crates.io-index" 190 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 191 | dependencies = [ 192 | "futures-channel", 193 | "futures-core", 194 | "futures-executor", 195 | "futures-io", 196 | "futures-sink", 197 | "futures-task", 198 | "futures-util", 199 | ] 200 | 201 | [[package]] 202 | name = "futures-channel" 203 | version = "0.3.31" 204 | source = "registry+https://github.com/rust-lang/crates.io-index" 205 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 206 | dependencies = [ 207 | "futures-core", 208 | "futures-sink", 209 | ] 210 | 211 | [[package]] 212 | name = "futures-core" 213 | version = "0.3.31" 214 | source = "registry+https://github.com/rust-lang/crates.io-index" 215 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 216 | 217 | [[package]] 218 | name = "futures-executor" 219 | version = "0.3.31" 220 | source = "registry+https://github.com/rust-lang/crates.io-index" 221 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 222 | dependencies = [ 223 | "futures-core", 224 | "futures-task", 225 | "futures-util", 226 | ] 227 | 228 | [[package]] 229 | name = "futures-io" 230 | version = "0.3.31" 231 | source = "registry+https://github.com/rust-lang/crates.io-index" 232 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 233 | 234 | [[package]] 235 | name = "futures-macro" 236 | version = "0.3.31" 237 | source = "registry+https://github.com/rust-lang/crates.io-index" 238 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 239 | dependencies = [ 240 | "proc-macro2", 241 | "quote", 242 | "syn 2.0.106", 243 | ] 244 | 245 | [[package]] 246 | name = "futures-sink" 247 | version = "0.3.31" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 250 | 251 | [[package]] 252 | name = "futures-task" 253 | version = "0.3.31" 254 | source = "registry+https://github.com/rust-lang/crates.io-index" 255 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 256 | 257 | [[package]] 258 | name = "futures-util" 259 | version = "0.3.31" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 262 | dependencies = [ 263 | "futures-channel", 264 | "futures-core", 265 | "futures-io", 266 | "futures-macro", 267 | "futures-sink", 268 | "futures-task", 269 | "memchr", 270 | "pin-project-lite", 271 | "pin-utils", 272 | "slab", 273 | ] 274 | 275 | [[package]] 276 | name = "generic-array" 277 | version = "0.14.7" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 280 | dependencies = [ 281 | "typenum", 282 | "version_check", 283 | ] 284 | 285 | [[package]] 286 | name = "getrandom" 287 | version = "0.3.3" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 290 | dependencies = [ 291 | "cfg-if", 292 | "libc", 293 | "r-efi", 294 | "wasi 0.14.3+wasi-0.2.4", 295 | ] 296 | 297 | [[package]] 298 | name = "guest" 299 | version = "0.1.0" 300 | dependencies = [ 301 | "spin-cron-sdk", 302 | "spin-sdk", 303 | ] 304 | 305 | [[package]] 306 | name = "hashbrown" 307 | version = "0.15.5" 308 | source = "registry+https://github.com/rust-lang/crates.io-index" 309 | checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 310 | dependencies = [ 311 | "foldhash", 312 | ] 313 | 314 | [[package]] 315 | name = "heck" 316 | version = "0.5.0" 317 | source = "registry+https://github.com/rust-lang/crates.io-index" 318 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 319 | 320 | [[package]] 321 | name = "hmac" 322 | version = "0.12.1" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 325 | dependencies = [ 326 | "digest", 327 | ] 328 | 329 | [[package]] 330 | name = "http" 331 | version = "1.3.1" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 334 | dependencies = [ 335 | "bytes", 336 | "fnv", 337 | "itoa", 338 | ] 339 | 340 | [[package]] 341 | name = "iana-time-zone" 342 | version = "0.1.63" 343 | source = "registry+https://github.com/rust-lang/crates.io-index" 344 | checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" 345 | dependencies = [ 346 | "android_system_properties", 347 | "core-foundation-sys", 348 | "iana-time-zone-haiku", 349 | "js-sys", 350 | "log", 351 | "wasm-bindgen", 352 | "windows-core", 353 | ] 354 | 355 | [[package]] 356 | name = "iana-time-zone-haiku" 357 | version = "0.1.2" 358 | source = "registry+https://github.com/rust-lang/crates.io-index" 359 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 360 | dependencies = [ 361 | "cc", 362 | ] 363 | 364 | [[package]] 365 | name = "id-arena" 366 | version = "2.2.1" 367 | source = "registry+https://github.com/rust-lang/crates.io-index" 368 | checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" 369 | 370 | [[package]] 371 | name = "indexmap" 372 | version = "2.11.0" 373 | source = "registry+https://github.com/rust-lang/crates.io-index" 374 | checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" 375 | dependencies = [ 376 | "equivalent", 377 | "hashbrown", 378 | "serde", 379 | ] 380 | 381 | [[package]] 382 | name = "itoa" 383 | version = "1.0.9" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" 386 | 387 | [[package]] 388 | name = "js-sys" 389 | version = "0.3.77" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 392 | dependencies = [ 393 | "once_cell", 394 | "wasm-bindgen", 395 | ] 396 | 397 | [[package]] 398 | name = "leb128fmt" 399 | version = "0.1.0" 400 | source = "registry+https://github.com/rust-lang/crates.io-index" 401 | checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" 402 | 403 | [[package]] 404 | name = "libc" 405 | version = "0.2.175" 406 | source = "registry+https://github.com/rust-lang/crates.io-index" 407 | checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" 408 | 409 | [[package]] 410 | name = "log" 411 | version = "0.4.20" 412 | source = "registry+https://github.com/rust-lang/crates.io-index" 413 | checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" 414 | 415 | [[package]] 416 | name = "md-5" 417 | version = "0.10.6" 418 | source = "registry+https://github.com/rust-lang/crates.io-index" 419 | checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 420 | dependencies = [ 421 | "cfg-if", 422 | "digest", 423 | ] 424 | 425 | [[package]] 426 | name = "memchr" 427 | version = "2.6.4" 428 | source = "registry+https://github.com/rust-lang/crates.io-index" 429 | checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" 430 | 431 | [[package]] 432 | name = "num-traits" 433 | version = "0.2.19" 434 | source = "registry+https://github.com/rust-lang/crates.io-index" 435 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 436 | dependencies = [ 437 | "autocfg", 438 | ] 439 | 440 | [[package]] 441 | name = "once_cell" 442 | version = "1.21.3" 443 | source = "registry+https://github.com/rust-lang/crates.io-index" 444 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 445 | 446 | [[package]] 447 | name = "percent-encoding" 448 | version = "2.3.1" 449 | source = "registry+https://github.com/rust-lang/crates.io-index" 450 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 451 | 452 | [[package]] 453 | name = "pin-project-lite" 454 | version = "0.2.13" 455 | source = "registry+https://github.com/rust-lang/crates.io-index" 456 | checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" 457 | 458 | [[package]] 459 | name = "pin-utils" 460 | version = "0.1.0" 461 | source = "registry+https://github.com/rust-lang/crates.io-index" 462 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 463 | 464 | [[package]] 465 | name = "postgres-protocol" 466 | version = "0.6.8" 467 | source = "registry+https://github.com/rust-lang/crates.io-index" 468 | checksum = "76ff0abab4a9b844b93ef7b81f1efc0a366062aaef2cd702c76256b5dc075c54" 469 | dependencies = [ 470 | "base64", 471 | "byteorder", 472 | "bytes", 473 | "fallible-iterator", 474 | "hmac", 475 | "md-5", 476 | "memchr", 477 | "rand", 478 | "sha2", 479 | "stringprep", 480 | ] 481 | 482 | [[package]] 483 | name = "postgres-types" 484 | version = "0.2.9" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" 487 | dependencies = [ 488 | "bytes", 489 | "fallible-iterator", 490 | "postgres-protocol", 491 | ] 492 | 493 | [[package]] 494 | name = "postgres_range" 495 | version = "0.11.1" 496 | source = "registry+https://github.com/rust-lang/crates.io-index" 497 | checksum = "f6dce28dc5ba143d8eb157b62aac01ae5a1c585c40792158b720e86a87642101" 498 | dependencies = [ 499 | "postgres-protocol", 500 | "postgres-types", 501 | ] 502 | 503 | [[package]] 504 | name = "ppv-lite86" 505 | version = "0.2.21" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 508 | dependencies = [ 509 | "zerocopy", 510 | ] 511 | 512 | [[package]] 513 | name = "prettyplease" 514 | version = "0.2.37" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" 517 | dependencies = [ 518 | "proc-macro2", 519 | "syn 2.0.106", 520 | ] 521 | 522 | [[package]] 523 | name = "proc-macro2" 524 | version = "1.0.101" 525 | source = "registry+https://github.com/rust-lang/crates.io-index" 526 | checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" 527 | dependencies = [ 528 | "unicode-ident", 529 | ] 530 | 531 | [[package]] 532 | name = "quote" 533 | version = "1.0.40" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 536 | dependencies = [ 537 | "proc-macro2", 538 | ] 539 | 540 | [[package]] 541 | name = "r-efi" 542 | version = "5.3.0" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 545 | 546 | [[package]] 547 | name = "rand" 548 | version = "0.9.2" 549 | source = "registry+https://github.com/rust-lang/crates.io-index" 550 | checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 551 | dependencies = [ 552 | "rand_chacha", 553 | "rand_core", 554 | ] 555 | 556 | [[package]] 557 | name = "rand_chacha" 558 | version = "0.9.0" 559 | source = "registry+https://github.com/rust-lang/crates.io-index" 560 | checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 561 | dependencies = [ 562 | "ppv-lite86", 563 | "rand_core", 564 | ] 565 | 566 | [[package]] 567 | name = "rand_core" 568 | version = "0.9.3" 569 | source = "registry+https://github.com/rust-lang/crates.io-index" 570 | checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 571 | dependencies = [ 572 | "getrandom", 573 | ] 574 | 575 | [[package]] 576 | name = "routefinder" 577 | version = "0.5.3" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | checksum = "94f8f99b10dedd317514253dda1fa7c14e344aac96e1f78149a64879ce282aca" 580 | dependencies = [ 581 | "smartcow", 582 | "smartstring", 583 | ] 584 | 585 | [[package]] 586 | name = "rust_decimal" 587 | version = "1.37.2" 588 | source = "registry+https://github.com/rust-lang/crates.io-index" 589 | checksum = "b203a6425500a03e0919c42d3c47caca51e79f1132046626d2c8871c5092035d" 590 | dependencies = [ 591 | "arrayvec", 592 | "num-traits", 593 | ] 594 | 595 | [[package]] 596 | name = "rustversion" 597 | version = "1.0.22" 598 | source = "registry+https://github.com/rust-lang/crates.io-index" 599 | checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 600 | 601 | [[package]] 602 | name = "ryu" 603 | version = "1.0.15" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" 606 | 607 | [[package]] 608 | name = "semver" 609 | version = "1.0.20" 610 | source = "registry+https://github.com/rust-lang/crates.io-index" 611 | checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" 612 | 613 | [[package]] 614 | name = "serde" 615 | version = "1.0.193" 616 | source = "registry+https://github.com/rust-lang/crates.io-index" 617 | checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" 618 | dependencies = [ 619 | "serde_derive", 620 | ] 621 | 622 | [[package]] 623 | name = "serde_derive" 624 | version = "1.0.193" 625 | source = "registry+https://github.com/rust-lang/crates.io-index" 626 | checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" 627 | dependencies = [ 628 | "proc-macro2", 629 | "quote", 630 | "syn 2.0.106", 631 | ] 632 | 633 | [[package]] 634 | name = "serde_json" 635 | version = "1.0.108" 636 | source = "registry+https://github.com/rust-lang/crates.io-index" 637 | checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" 638 | dependencies = [ 639 | "itoa", 640 | "ryu", 641 | "serde", 642 | ] 643 | 644 | [[package]] 645 | name = "sha2" 646 | version = "0.10.9" 647 | source = "registry+https://github.com/rust-lang/crates.io-index" 648 | checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" 649 | dependencies = [ 650 | "cfg-if", 651 | "cpufeatures", 652 | "digest", 653 | ] 654 | 655 | [[package]] 656 | name = "shlex" 657 | version = "1.3.0" 658 | source = "registry+https://github.com/rust-lang/crates.io-index" 659 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 660 | 661 | [[package]] 662 | name = "slab" 663 | version = "0.4.9" 664 | source = "registry+https://github.com/rust-lang/crates.io-index" 665 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 666 | dependencies = [ 667 | "autocfg", 668 | ] 669 | 670 | [[package]] 671 | name = "smartcow" 672 | version = "0.2.1" 673 | source = "registry+https://github.com/rust-lang/crates.io-index" 674 | checksum = "656fcb1c1fca8c4655372134ce87d8afdf5ec5949ebabe8d314be0141d8b5da2" 675 | dependencies = [ 676 | "smartstring", 677 | ] 678 | 679 | [[package]] 680 | name = "smartstring" 681 | version = "1.0.1" 682 | source = "registry+https://github.com/rust-lang/crates.io-index" 683 | checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" 684 | dependencies = [ 685 | "autocfg", 686 | "static_assertions", 687 | "version_check", 688 | ] 689 | 690 | [[package]] 691 | name = "spin-cron-macro" 692 | version = "0.3.0" 693 | dependencies = [ 694 | "proc-macro2", 695 | "quote", 696 | "syn 1.0.109", 697 | ] 698 | 699 | [[package]] 700 | name = "spin-cron-sdk" 701 | version = "0.3.0" 702 | dependencies = [ 703 | "spin-cron-macro", 704 | "spin-executor", 705 | "wit-bindgen 0.43.0", 706 | ] 707 | 708 | [[package]] 709 | name = "spin-executor" 710 | version = "5.1.0" 711 | source = "registry+https://github.com/rust-lang/crates.io-index" 712 | checksum = "9fa74c56ad71afb64fff0566d7cb313567d0469ba2a75b0af58c323f59b74280" 713 | dependencies = [ 714 | "futures", 715 | "once_cell", 716 | "wasi 0.13.1+wasi-0.2.0", 717 | ] 718 | 719 | [[package]] 720 | name = "spin-macro" 721 | version = "5.1.0" 722 | source = "registry+https://github.com/rust-lang/crates.io-index" 723 | checksum = "74edf3aab0f4e24b30e765d10fcdbff69aa2d1906907f3318c5f8a8106daef34" 724 | dependencies = [ 725 | "anyhow", 726 | "bytes", 727 | "proc-macro2", 728 | "quote", 729 | "syn 1.0.109", 730 | ] 731 | 732 | [[package]] 733 | name = "spin-sdk" 734 | version = "5.1.0" 735 | source = "registry+https://github.com/rust-lang/crates.io-index" 736 | checksum = "5374bed998dc151d3c3a45ffdba3269d9f94ea6cf19f002ff7fc744edb09a5f8" 737 | dependencies = [ 738 | "anyhow", 739 | "async-trait", 740 | "bytes", 741 | "chrono", 742 | "form_urlencoded", 743 | "futures", 744 | "http", 745 | "once_cell", 746 | "postgres_range", 747 | "routefinder", 748 | "rust_decimal", 749 | "serde", 750 | "serde_json", 751 | "spin-executor", 752 | "spin-macro", 753 | "thiserror", 754 | "uuid", 755 | "wasi 0.13.1+wasi-0.2.0", 756 | "wit-bindgen 0.43.0", 757 | ] 758 | 759 | [[package]] 760 | name = "static_assertions" 761 | version = "1.1.0" 762 | source = "registry+https://github.com/rust-lang/crates.io-index" 763 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 764 | 765 | [[package]] 766 | name = "stringprep" 767 | version = "0.1.5" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" 770 | dependencies = [ 771 | "unicode-bidi", 772 | "unicode-normalization", 773 | "unicode-properties", 774 | ] 775 | 776 | [[package]] 777 | name = "subtle" 778 | version = "2.6.1" 779 | source = "registry+https://github.com/rust-lang/crates.io-index" 780 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 781 | 782 | [[package]] 783 | name = "syn" 784 | version = "1.0.109" 785 | source = "registry+https://github.com/rust-lang/crates.io-index" 786 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 787 | dependencies = [ 788 | "proc-macro2", 789 | "quote", 790 | "unicode-ident", 791 | ] 792 | 793 | [[package]] 794 | name = "syn" 795 | version = "2.0.106" 796 | source = "registry+https://github.com/rust-lang/crates.io-index" 797 | checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" 798 | dependencies = [ 799 | "proc-macro2", 800 | "quote", 801 | "unicode-ident", 802 | ] 803 | 804 | [[package]] 805 | name = "thiserror" 806 | version = "2.0.17" 807 | source = "registry+https://github.com/rust-lang/crates.io-index" 808 | checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" 809 | dependencies = [ 810 | "thiserror-impl", 811 | ] 812 | 813 | [[package]] 814 | name = "thiserror-impl" 815 | version = "2.0.17" 816 | source = "registry+https://github.com/rust-lang/crates.io-index" 817 | checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" 818 | dependencies = [ 819 | "proc-macro2", 820 | "quote", 821 | "syn 2.0.106", 822 | ] 823 | 824 | [[package]] 825 | name = "tinyvec" 826 | version = "1.10.0" 827 | source = "registry+https://github.com/rust-lang/crates.io-index" 828 | checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" 829 | dependencies = [ 830 | "tinyvec_macros", 831 | ] 832 | 833 | [[package]] 834 | name = "tinyvec_macros" 835 | version = "0.1.1" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 838 | 839 | [[package]] 840 | name = "typenum" 841 | version = "1.18.0" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 844 | 845 | [[package]] 846 | name = "unicode-bidi" 847 | version = "0.3.18" 848 | source = "registry+https://github.com/rust-lang/crates.io-index" 849 | checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 850 | 851 | [[package]] 852 | name = "unicode-ident" 853 | version = "1.0.12" 854 | source = "registry+https://github.com/rust-lang/crates.io-index" 855 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 856 | 857 | [[package]] 858 | name = "unicode-normalization" 859 | version = "0.1.24" 860 | source = "registry+https://github.com/rust-lang/crates.io-index" 861 | checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 862 | dependencies = [ 863 | "tinyvec", 864 | ] 865 | 866 | [[package]] 867 | name = "unicode-properties" 868 | version = "0.1.3" 869 | source = "registry+https://github.com/rust-lang/crates.io-index" 870 | checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 871 | 872 | [[package]] 873 | name = "unicode-xid" 874 | version = "0.2.4" 875 | source = "registry+https://github.com/rust-lang/crates.io-index" 876 | checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" 877 | 878 | [[package]] 879 | name = "uuid" 880 | version = "1.18.0" 881 | source = "registry+https://github.com/rust-lang/crates.io-index" 882 | checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be" 883 | dependencies = [ 884 | "js-sys", 885 | "wasm-bindgen", 886 | ] 887 | 888 | [[package]] 889 | name = "version_check" 890 | version = "0.9.4" 891 | source = "registry+https://github.com/rust-lang/crates.io-index" 892 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 893 | 894 | [[package]] 895 | name = "wasi" 896 | version = "0.13.1+wasi-0.2.0" 897 | source = "registry+https://github.com/rust-lang/crates.io-index" 898 | checksum = "2f43d1c36145feb89a3e61aa0ba3e582d976a8ab77f1474aa0adb80800fe0cf8" 899 | dependencies = [ 900 | "wit-bindgen-rt 0.24.0", 901 | ] 902 | 903 | [[package]] 904 | name = "wasi" 905 | version = "0.14.3+wasi-0.2.4" 906 | source = "registry+https://github.com/rust-lang/crates.io-index" 907 | checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95" 908 | dependencies = [ 909 | "wit-bindgen 0.45.0", 910 | ] 911 | 912 | [[package]] 913 | name = "wasm-bindgen" 914 | version = "0.2.100" 915 | source = "registry+https://github.com/rust-lang/crates.io-index" 916 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 917 | dependencies = [ 918 | "cfg-if", 919 | "once_cell", 920 | "rustversion", 921 | "wasm-bindgen-macro", 922 | ] 923 | 924 | [[package]] 925 | name = "wasm-bindgen-backend" 926 | version = "0.2.100" 927 | source = "registry+https://github.com/rust-lang/crates.io-index" 928 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 929 | dependencies = [ 930 | "bumpalo", 931 | "log", 932 | "proc-macro2", 933 | "quote", 934 | "syn 2.0.106", 935 | "wasm-bindgen-shared", 936 | ] 937 | 938 | [[package]] 939 | name = "wasm-bindgen-macro" 940 | version = "0.2.100" 941 | source = "registry+https://github.com/rust-lang/crates.io-index" 942 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 943 | dependencies = [ 944 | "quote", 945 | "wasm-bindgen-macro-support", 946 | ] 947 | 948 | [[package]] 949 | name = "wasm-bindgen-macro-support" 950 | version = "0.2.100" 951 | source = "registry+https://github.com/rust-lang/crates.io-index" 952 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 953 | dependencies = [ 954 | "proc-macro2", 955 | "quote", 956 | "syn 2.0.106", 957 | "wasm-bindgen-backend", 958 | "wasm-bindgen-shared", 959 | ] 960 | 961 | [[package]] 962 | name = "wasm-bindgen-shared" 963 | version = "0.2.100" 964 | source = "registry+https://github.com/rust-lang/crates.io-index" 965 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 966 | dependencies = [ 967 | "unicode-ident", 968 | ] 969 | 970 | [[package]] 971 | name = "wasm-encoder" 972 | version = "0.235.0" 973 | source = "registry+https://github.com/rust-lang/crates.io-index" 974 | checksum = "b3bc393c395cb621367ff02d854179882b9a351b4e0c93d1397e6090b53a5c2a" 975 | dependencies = [ 976 | "leb128fmt", 977 | "wasmparser", 978 | ] 979 | 980 | [[package]] 981 | name = "wasm-metadata" 982 | version = "0.235.0" 983 | source = "registry+https://github.com/rust-lang/crates.io-index" 984 | checksum = "b055604ba04189d54b8c0ab2c2fc98848f208e103882d5c0b984f045d5ea4d20" 985 | dependencies = [ 986 | "anyhow", 987 | "indexmap", 988 | "wasm-encoder", 989 | "wasmparser", 990 | ] 991 | 992 | [[package]] 993 | name = "wasmparser" 994 | version = "0.235.0" 995 | source = "registry+https://github.com/rust-lang/crates.io-index" 996 | checksum = "161296c618fa2d63f6ed5fffd1112937e803cb9ec71b32b01a76321555660917" 997 | dependencies = [ 998 | "bitflags", 999 | "hashbrown", 1000 | "indexmap", 1001 | "semver", 1002 | ] 1003 | 1004 | [[package]] 1005 | name = "windows-core" 1006 | version = "0.61.2" 1007 | source = "registry+https://github.com/rust-lang/crates.io-index" 1008 | checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" 1009 | dependencies = [ 1010 | "windows-implement", 1011 | "windows-interface", 1012 | "windows-link", 1013 | "windows-result", 1014 | "windows-strings", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "windows-implement" 1019 | version = "0.60.0" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 1022 | dependencies = [ 1023 | "proc-macro2", 1024 | "quote", 1025 | "syn 2.0.106", 1026 | ] 1027 | 1028 | [[package]] 1029 | name = "windows-interface" 1030 | version = "0.59.1" 1031 | source = "registry+https://github.com/rust-lang/crates.io-index" 1032 | checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 1033 | dependencies = [ 1034 | "proc-macro2", 1035 | "quote", 1036 | "syn 2.0.106", 1037 | ] 1038 | 1039 | [[package]] 1040 | name = "windows-link" 1041 | version = "0.1.3" 1042 | source = "registry+https://github.com/rust-lang/crates.io-index" 1043 | checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 1044 | 1045 | [[package]] 1046 | name = "windows-result" 1047 | version = "0.3.4" 1048 | source = "registry+https://github.com/rust-lang/crates.io-index" 1049 | checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 1050 | dependencies = [ 1051 | "windows-link", 1052 | ] 1053 | 1054 | [[package]] 1055 | name = "windows-strings" 1056 | version = "0.4.2" 1057 | source = "registry+https://github.com/rust-lang/crates.io-index" 1058 | checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 1059 | dependencies = [ 1060 | "windows-link", 1061 | ] 1062 | 1063 | [[package]] 1064 | name = "wit-bindgen" 1065 | version = "0.43.0" 1066 | source = "registry+https://github.com/rust-lang/crates.io-index" 1067 | checksum = "9a18712ff1ec5bd09da500fe1e91dec11256b310da0ff33f8b4ec92b927cf0c6" 1068 | dependencies = [ 1069 | "wit-bindgen-rt 0.43.0", 1070 | "wit-bindgen-rust-macro", 1071 | ] 1072 | 1073 | [[package]] 1074 | name = "wit-bindgen" 1075 | version = "0.45.0" 1076 | source = "registry+https://github.com/rust-lang/crates.io-index" 1077 | checksum = "052283831dbae3d879dc7f51f3d92703a316ca49f91540417d38591826127814" 1078 | 1079 | [[package]] 1080 | name = "wit-bindgen-core" 1081 | version = "0.43.0" 1082 | source = "registry+https://github.com/rust-lang/crates.io-index" 1083 | checksum = "2c53468e077362201de11999c85c07c36e12048a990a3e0d69da2bd61da355d0" 1084 | dependencies = [ 1085 | "anyhow", 1086 | "heck", 1087 | "wit-parser", 1088 | ] 1089 | 1090 | [[package]] 1091 | name = "wit-bindgen-rt" 1092 | version = "0.24.0" 1093 | source = "registry+https://github.com/rust-lang/crates.io-index" 1094 | checksum = "3b0780cf7046630ed70f689a098cd8d56c5c3b22f2a7379bbdb088879963ff96" 1095 | dependencies = [ 1096 | "bitflags", 1097 | ] 1098 | 1099 | [[package]] 1100 | name = "wit-bindgen-rt" 1101 | version = "0.43.0" 1102 | source = "registry+https://github.com/rust-lang/crates.io-index" 1103 | checksum = "9fd734226eac1fd7c450956964e3a9094c9cee65e9dafdf126feef8c0096db65" 1104 | dependencies = [ 1105 | "bitflags", 1106 | "futures", 1107 | "once_cell", 1108 | ] 1109 | 1110 | [[package]] 1111 | name = "wit-bindgen-rust" 1112 | version = "0.43.0" 1113 | source = "registry+https://github.com/rust-lang/crates.io-index" 1114 | checksum = "531ebfcec48e56473805285febdb450e270fa75b2dacb92816861d0473b4c15f" 1115 | dependencies = [ 1116 | "anyhow", 1117 | "heck", 1118 | "indexmap", 1119 | "prettyplease", 1120 | "syn 2.0.106", 1121 | "wasm-metadata", 1122 | "wit-bindgen-core", 1123 | "wit-component", 1124 | ] 1125 | 1126 | [[package]] 1127 | name = "wit-bindgen-rust-macro" 1128 | version = "0.43.0" 1129 | source = "registry+https://github.com/rust-lang/crates.io-index" 1130 | checksum = "7852bf8a9d1ea80884d26b864ddebd7b0c7636697c6ca10f4c6c93945e023966" 1131 | dependencies = [ 1132 | "anyhow", 1133 | "prettyplease", 1134 | "proc-macro2", 1135 | "quote", 1136 | "syn 2.0.106", 1137 | "wit-bindgen-core", 1138 | "wit-bindgen-rust", 1139 | ] 1140 | 1141 | [[package]] 1142 | name = "wit-component" 1143 | version = "0.235.0" 1144 | source = "registry+https://github.com/rust-lang/crates.io-index" 1145 | checksum = "64a57a11109cc553396f89f3a38a158a97d0b1adaec113bd73e0f64d30fb601f" 1146 | dependencies = [ 1147 | "anyhow", 1148 | "bitflags", 1149 | "indexmap", 1150 | "log", 1151 | "serde", 1152 | "serde_derive", 1153 | "serde_json", 1154 | "wasm-encoder", 1155 | "wasm-metadata", 1156 | "wasmparser", 1157 | "wit-parser", 1158 | ] 1159 | 1160 | [[package]] 1161 | name = "wit-parser" 1162 | version = "0.235.0" 1163 | source = "registry+https://github.com/rust-lang/crates.io-index" 1164 | checksum = "0a1f95a87d03a33e259af286b857a95911eb46236a0f726cbaec1227b3dfc67a" 1165 | dependencies = [ 1166 | "anyhow", 1167 | "id-arena", 1168 | "indexmap", 1169 | "log", 1170 | "semver", 1171 | "serde", 1172 | "serde_derive", 1173 | "serde_json", 1174 | "unicode-xid", 1175 | "wasmparser", 1176 | ] 1177 | 1178 | [[package]] 1179 | name = "zerocopy" 1180 | version = "0.8.26" 1181 | source = "registry+https://github.com/rust-lang/crates.io-index" 1182 | checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" 1183 | dependencies = [ 1184 | "zerocopy-derive", 1185 | ] 1186 | 1187 | [[package]] 1188 | name = "zerocopy-derive" 1189 | version = "0.8.26" 1190 | source = "registry+https://github.com/rust-lang/crates.io-index" 1191 | checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" 1192 | dependencies = [ 1193 | "proc-macro2", 1194 | "quote", 1195 | "syn 2.0.106", 1196 | ] 1197 | --------------------------------------------------------------------------------