Skip to content

Commit 46f12c8

Browse files
authored
Merge pull request #4 from fermyon/implement_wasi_cli_p2
allow passing in the cli args to the components as env args
2 parents 81efd1f + 47ab3d6 commit 46f12c8

File tree

1 file changed

+43
-11
lines changed

1 file changed

+43
-11
lines changed

src/lib.rs

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
use anyhow::{anyhow, Context, Result};
22
use async_trait::async_trait;
3+
use clap::Args;
34
use serde::{Deserialize, Serialize};
45
use spin_app::AppComponent;
56
use spin_core::Engine;
67
use spin_trigger::TriggerInstancePre;
7-
use spin_trigger::{cli::NoArgs, TriggerAppEngine, TriggerExecutor};
8+
use spin_trigger::{TriggerAppEngine, TriggerExecutor};
89

910
type RuntimeData = ();
1011
type Store = spin_core::Store<RuntimeData>;
@@ -20,10 +21,29 @@ pub struct Component {
2021
pub id: String,
2122
}
2223

23-
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
24-
#[serde(deny_unknown_fields)]
25-
struct TriggerMetadata {
26-
pub r#type: String,
24+
#[derive(Args, Debug)]
25+
#[clap(trailing_var_arg(true))]
26+
pub struct CliArgs {
27+
#[clap(multiple_values(true), allow_hyphen_values(true))]
28+
pub guest_args: Vec<String>,
29+
}
30+
31+
impl CliArgs {
32+
fn apply_args_to_store(
33+
&self,
34+
component_id: &str,
35+
store_builder: &mut spin_core::StoreBuilder,
36+
) -> Result<()> {
37+
// Insert the component id as the first argument as the command name
38+
let args = vec![component_id]
39+
.into_iter()
40+
.chain(self.guest_args.iter().map(|arg| &**arg))
41+
.collect::<Vec<&str>>();
42+
43+
store_builder.args(args)?;
44+
45+
Ok(())
46+
}
2747
}
2848

2949
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
@@ -47,7 +67,7 @@ impl TriggerExecutor for CommandTrigger {
4767
const TRIGGER_TYPE: &'static str = "command";
4868
type RuntimeData = RuntimeData;
4969
type TriggerConfig = CommandTriggerConfig;
50-
type RunConfig = NoArgs;
70+
type RunConfig = CliArgs;
5171
type InstancePre = CommandInstancePre;
5272

5373
async fn new(engine: TriggerAppEngine<Self>) -> Result<Self> {
@@ -60,8 +80,8 @@ impl TriggerExecutor for CommandTrigger {
6080
Ok(Self { engine, components })
6181
}
6282

63-
async fn run(self, _config: Self::RunConfig) -> Result<()> {
64-
self.handle().await
83+
async fn run(self, config: Self::RunConfig) -> Result<()> {
84+
self.handle(config).await
6585
}
6686
}
6787

@@ -105,9 +125,18 @@ impl TriggerInstancePre<RuntimeData, CommandTriggerConfig> for CommandInstancePr
105125
}
106126

107127
impl CommandTrigger {
108-
pub async fn handle(&self) -> Result<()> {
128+
pub async fn handle(&self, args: CliArgs) -> Result<()> {
109129
let component = &self.components[0];
110-
let (instance, mut store) = self.engine.prepare_instance(&component.id).await?;
130+
let mut store_builder = self
131+
.engine
132+
.store_builder(&component.id, spin_core::WasiVersion::Preview2)?;
133+
134+
args.apply_args_to_store(&component.id, &mut store_builder)?;
135+
136+
let (instance, mut store) = self
137+
.engine
138+
.prepare_instance_with_store(&component.id, store_builder)
139+
.await?;
111140
match instance {
112141
CommandInstance::Component(instance) => {
113142
let handler = wasmtime_wasi::preview2::command::Command::new(&mut store, &instance)
@@ -117,9 +146,12 @@ impl CommandTrigger {
117146
CommandInstance::Module(_) => {
118147
// Toss the commandInstance we have and create a new one as the
119148
// associated store will be a preview2 store
120-
let store_builder = self
149+
let mut store_builder = self
121150
.engine
122151
.store_builder(&component.id, spin_core::WasiVersion::Preview1)?;
152+
153+
args.apply_args_to_store(&component.id, &mut store_builder)?;
154+
123155
let (instance, mut store) = self
124156
.engine
125157
.prepare_instance_with_store(&component.id, store_builder)

0 commit comments

Comments
 (0)