edc_dataplane_core/extensions/repo/
sqlite.rs

1use miwa::{
2    core::{Extension, ExtensionConfig, MiwaContext, MiwaResult},
3    derive::{extension, ExtensionConfig},
4};
5use serde::Deserialize;
6
7use crate::core::db::{sqlite::transfer::SqliteTransferRepo, transfer::TransferRepoRef};
8
9pub struct SqliteRepoExtension {}
10
11#[async_trait::async_trait]
12impl Extension for SqliteRepoExtension {
13    async fn start(&self) -> MiwaResult<()> {
14        Ok(())
15    }
16
17    async fn shutdown(&self) -> MiwaResult<()> {
18        Ok(())
19    }
20}
21
22#[derive(Deserialize, ExtensionConfig)]
23#[config(prefix = "db.transfers")]
24#[serde(rename_all = "lowercase")]
25pub enum TransferDbConfig {
26    Sqlite { path: String },
27}
28
29#[extension(
30    name = "Sqlite store extensions for dataplane",
31    provides(TransferRepoRef)
32)]
33pub async fn sql_repo_extension(
34    ctx: &MiwaContext,
35    ExtensionConfig(cfg): ExtensionConfig<TransferDbConfig>,
36) -> MiwaResult<SqliteRepoExtension> {
37    ctx.register(create_transfer_store(cfg).await?);
38    Ok(SqliteRepoExtension {})
39}
40
41async fn create_transfer_store(cfg: TransferDbConfig) -> anyhow::Result<TransferRepoRef> {
42    match cfg {
43        TransferDbConfig::Sqlite { path } => {
44            let store = SqliteTransferRepo::connect(&format!("sqlite:{}", path)).await?;
45            store.migrate().await?;
46
47            Ok(TransferRepoRef::of(store))
48        }
49    }
50}