spin_key_value_spin/
lib.rs1mod store;
2
3use std::{fs, path::PathBuf};
4
5use anyhow::Context as _;
6use serde::{Deserialize, Serialize};
7use spin_factor_key_value::runtime_config::spin::MakeKeyValueStore;
8use store::{DatabaseLocation, KeyValueSqlite};
9
10pub struct SpinKeyValueStore {
12 base_path: Option<PathBuf>,
14}
15
16impl SpinKeyValueStore {
17 pub fn new(base_path: Option<PathBuf>) -> Self {
23 Self { base_path }
24 }
25}
26
27impl MakeKeyValueStore for SpinKeyValueStore {
28 const RUNTIME_CONFIG_TYPE: &'static str = "spin";
29
30 type RuntimeConfig = SpinKeyValueRuntimeConfig;
31
32 type StoreManager = KeyValueSqlite;
33
34 fn make_store(
35 &self,
36 runtime_config: Self::RuntimeConfig,
37 ) -> anyhow::Result<Self::StoreManager> {
38 let location = match (&self.base_path, &runtime_config.path) {
39 (Some(base_path), Some(path)) => DatabaseLocation::Path(base_path.join(path)),
41 (None, Some(path)) => DatabaseLocation::Path(path.clone()),
43 (None | Some(_), None) => DatabaseLocation::InMemory,
45 };
46 if let DatabaseLocation::Path(path) = &location {
47 if let Some(parent) = path.parent().filter(|p| !p.exists()) {
49 fs::create_dir_all(parent).with_context(|| {
50 format!(
51 "failed to create key value store's parent directory: '{}",
52 parent.display()
53 )
54 })?;
55 }
56 }
57 Ok(KeyValueSqlite::new(location))
58 }
59}
60
61#[derive(Deserialize, Serialize)]
63pub struct SpinKeyValueRuntimeConfig {
64 path: Option<PathBuf>,
66}
67
68impl SpinKeyValueRuntimeConfig {
69 pub fn new(path: Option<PathBuf>) -> Self {
72 Self { path }
73 }
74}