edc_dataplane_core/extensions/repo/
sqlite.rs1use 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}