spin_trigger/cli/
initial_kv_setter.rs

1use anyhow::Context as _;
2use spin_core::async_trait;
3use spin_factor_key_value::KeyValueFactor;
4use spin_factors::RuntimeFactors;
5use spin_factors_executor::ExecutorHooks;
6
7/// An [`ExecutorHooks`] that sets initial key-value pairs in the default store.
8pub 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}