spin_trigger/cli/
initial_kv_setter.rs1use anyhow::Context as _;
2use spin_core::async_trait;
3use spin_factor_key_value::KeyValueFactor;
4use spin_factors::RuntimeFactors;
5use spin_factors_executor::ExecutorHooks;
6
7pub struct InitialKvSetterHook {
9 kv_pairs: Vec<(String, String)>,
10}
11
12impl InitialKvSetterHook {
13 pub fn new(kv_pairs: Vec<(String, String)>) -> Self {
14 Self { kv_pairs }
15 }
16}
17
18const DEFAULT_KEY_VALUE_STORE_LABEL: &str = "default";
19
20#[async_trait]
21impl<F: RuntimeFactors, U> ExecutorHooks<F, U> for InitialKvSetterHook {
22 async fn configure_app(
23 &self,
24 configured_app: &spin_factors::ConfiguredApp<F>,
25 ) -> anyhow::Result<()> {
26 if self.kv_pairs.is_empty() {
27 return Ok(());
28 }
29 let kv = configured_app.app_state::<KeyValueFactor>().context(
30 "attempted to set initial kv pairs but the key-value factor was not configured",
31 )?;
32 let store = kv
33 .get_store(DEFAULT_KEY_VALUE_STORE_LABEL)
34 .await
35 .expect("trigger was misconfigured and lacks a default store");
36 for (key, value) in &self.kv_pairs {
37 store
38 .set(key, value.as_bytes())
39 .await
40 .context("failed to set key-value pair")?;
41 }
42
43 Ok(())
44 }
45}