edc-dataplane-core 0.2.0

An EDC compatible dataplane
Documentation
use miwa::{
    core::{Extension, ExtensionConfig, MiwaContext, MiwaResult},
    derive::{extension, ExtensionConfig},
};
use serde::Deserialize;

use crate::core::db::{sqlite::transfer::SqliteTransferRepo, transfer::TransferRepoRef};

pub struct SqliteRepoExtension {}

#[async_trait::async_trait]
impl Extension for SqliteRepoExtension {
    async fn start(&self) -> MiwaResult<()> {
        Ok(())
    }

    async fn shutdown(&self) -> MiwaResult<()> {
        Ok(())
    }
}

#[derive(Deserialize, ExtensionConfig)]
#[config(prefix = "db.transfers")]
#[serde(rename_all = "lowercase")]
pub enum TransferDbConfig {
    Sqlite { path: String },
}

#[extension(
    name = "Sqlite store extensions for dataplane",
    provides(TransferRepoRef)
)]
pub async fn sql_repo_extension(
    ctx: &MiwaContext,
    ExtensionConfig(cfg): ExtensionConfig<TransferDbConfig>,
) -> MiwaResult<SqliteRepoExtension> {
    ctx.register(create_transfer_store(cfg).await?);
    Ok(SqliteRepoExtension {})
}

async fn create_transfer_store(cfg: TransferDbConfig) -> anyhow::Result<TransferRepoRef> {
    match cfg {
        TransferDbConfig::Sqlite { path } => {
            let store = SqliteTransferRepo::connect(&format!("sqlite:{}", path)).await?;
            store.migrate().await?;

            Ok(TransferRepoRef::of(store))
        }
    }
}