use crate::qmdb::sync::engine::Config;
use commonware_codec::Encode;
use commonware_macros::boxed;
pub mod engine;
pub(crate) use engine::Engine;
mod error;
pub use error::{EngineError, Error};
mod gaps;
mod journal;
pub(crate) use journal::Journal;
mod metrics;
pub use metrics::Metrics;
mod database;
pub(crate) use database::{
journal_covers_range, local_boundary_nodes, Config as DatabaseConfig, Database,
};
pub mod resolver;
pub(crate) use resolver::{FetchResult, Resolver};
mod target;
pub use target::Target;
pub mod compact;
mod requests;
pub trait DbResolver<DB: Database>:
Resolver<Family = DB::Family, Op = DB::Op, Digest = DB::Digest>
{
}
impl<DB, R> DbResolver<DB> for R
where
DB: Database,
R: Resolver<Family = DB::Family, Op = DB::Op, Digest = DB::Digest>,
{
}
#[boxed]
pub async fn sync<DB, R>(
config: Config<DB, R>,
) -> Result<DB, Error<DB::Family, R::Error, DB::Digest>>
where
DB: Database,
DB::Op: Encode,
R: DbResolver<DB>,
{
Box::pin(Engine::new(config).await?.sync()).await
}