spin_key_value_spin/
lib.rs1mod store;
2
3use std::{
4 fs,
5 path::{Path, PathBuf},
6};
7
8use anyhow::Context as _;
9use serde::{Deserialize, Serialize};
10use spin_factor_key_value::runtime_config::spin::MakeKeyValueStore;
11use store::{DatabaseLocation, KeyValueSqlite};
12
13pub struct SpinKeyValueStore {
15 base_path: Option<PathBuf>,
17}
18
19impl SpinKeyValueStore {
20 pub fn new(base_path: Option<PathBuf>) -> Self {
26 Self { base_path }
27 }
28}
29
30impl MakeKeyValueStore for SpinKeyValueStore {
31 const RUNTIME_CONFIG_TYPE: &'static str = "spin";
32
33 type RuntimeConfig = SpinKeyValueRuntimeConfig;
34
35 type StoreManager = KeyValueSqlite;
36
37 fn make_store(
38 &self,
39 runtime_config: Self::RuntimeConfig,
40 ) -> anyhow::Result<Self::StoreManager> {
41 let location = match (&self.base_path, &runtime_config.path) {
42 (Some(base_path), Some(path)) => {
44 let path = resolve_relative_path(path, base_path);
45 DatabaseLocation::Path(path)
46 }
47 (None, Some(path)) => DatabaseLocation::Path(path.clone()),
49 (None | Some(_), None) => DatabaseLocation::InMemory,
51 };
52 if let DatabaseLocation::Path(path) = &location {
53 if let Some(parent) = path.parent().filter(|p| !p.exists()) {
55 fs::create_dir_all(parent).with_context(|| {
56 format!(
57 "failed to create key value store's parent directory: '{}",
58 parent.display()
59 )
60 })?;
61 }
62 }
63 Ok(KeyValueSqlite::new(location))
64 }
65}
66
67#[derive(Deserialize, Serialize)]
69pub struct SpinKeyValueRuntimeConfig {
70 path: Option<PathBuf>,
72}
73
74impl SpinKeyValueRuntimeConfig {
75 pub fn new(path: Option<PathBuf>) -> Self {
78 Self { path }
79 }
80}
81
82fn resolve_relative_path(path: &Path, base_dir: &Path) -> PathBuf {
86 if path.is_absolute() {
87 return path.to_owned();
88 }
89 base_dir.join(path)
90}