1
1
use anyhow:: { anyhow, Context , Result } ;
2
2
use async_trait:: async_trait;
3
+ use clap:: Args ;
3
4
use serde:: { Deserialize , Serialize } ;
4
5
use spin_app:: AppComponent ;
5
6
use spin_core:: Engine ;
6
7
use spin_trigger:: TriggerInstancePre ;
7
- use spin_trigger:: { cli :: NoArgs , TriggerAppEngine , TriggerExecutor } ;
8
+ use spin_trigger:: { TriggerAppEngine , TriggerExecutor } ;
8
9
9
10
type RuntimeData = ( ) ;
10
11
type Store = spin_core:: Store < RuntimeData > ;
@@ -20,10 +21,29 @@ pub struct Component {
20
21
pub id : String ,
21
22
}
22
23
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
+ }
27
47
}
28
48
29
49
#[ derive( Clone , Debug , Default , Deserialize , Serialize ) ]
@@ -47,7 +67,7 @@ impl TriggerExecutor for CommandTrigger {
47
67
const TRIGGER_TYPE : & ' static str = "command" ;
48
68
type RuntimeData = RuntimeData ;
49
69
type TriggerConfig = CommandTriggerConfig ;
50
- type RunConfig = NoArgs ;
70
+ type RunConfig = CliArgs ;
51
71
type InstancePre = CommandInstancePre ;
52
72
53
73
async fn new ( engine : TriggerAppEngine < Self > ) -> Result < Self > {
@@ -60,8 +80,8 @@ impl TriggerExecutor for CommandTrigger {
60
80
Ok ( Self { engine, components } )
61
81
}
62
82
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
65
85
}
66
86
}
67
87
@@ -105,9 +125,18 @@ impl TriggerInstancePre<RuntimeData, CommandTriggerConfig> for CommandInstancePr
105
125
}
106
126
107
127
impl CommandTrigger {
108
- pub async fn handle ( & self ) -> Result < ( ) > {
128
+ pub async fn handle ( & self , args : CliArgs ) -> Result < ( ) > {
109
129
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 ?;
111
140
match instance {
112
141
CommandInstance :: Component ( instance) => {
113
142
let handler = wasmtime_wasi:: preview2:: command:: Command :: new ( & mut store, & instance)
@@ -117,9 +146,12 @@ impl CommandTrigger {
117
146
CommandInstance :: Module ( _) => {
118
147
// Toss the commandInstance we have and create a new one as the
119
148
// associated store will be a preview2 store
120
- let store_builder = self
149
+ let mut store_builder = self
121
150
. engine
122
151
. store_builder ( & component. id , spin_core:: WasiVersion :: Preview1 ) ?;
152
+
153
+ args. apply_args_to_store ( & component. id , & mut store_builder) ?;
154
+
123
155
let ( instance, mut store) = self
124
156
. engine
125
157
. prepare_instance_with_store ( & component. id , store_builder)
0 commit comments