arminius_lib_sync/syncv4/
transitions.rs1use arminius_lib_db::{Database as _, DefaultDb, TransactedDb};
11use arminius_lib_db_sync::syncv4::TransactedSyncV4Queries;
12use ruma::api::client::sync::sync_events;
13
14use crate::syncv4::{connect, error::SyncV4Error, execute, gather, plan};
15
16#[derive(Debug)]
21pub struct SyncV4Handler<T: TransactedSyncV4Queries, S> {
22 transaction: T,
24 stage: S,
26}
27
28impl<'a> SyncV4Handler<TransactedDb<'a>, connect::ResolvedConnection> {
29 pub async fn connect(
34 database: &'a mut DefaultDb,
35 key: connect::ConnectionKey,
36 pos: Option<String>,
37 ) -> Result<SyncV4Handler<TransactedDb<'a>, connect::ResolvedConnection>, SyncV4Error> {
38 let mut transaction = database.begin_transaction().await?;
39
40 let stage = connect::resolve(&mut transaction, key, pos).await?;
41
42 Ok(SyncV4Handler { transaction, stage })
43 }
44 }
46
47impl<T: TransactedSyncV4Queries> SyncV4Handler<T, connect::ResolvedConnection> {
48 pub async fn gather(self) -> Result<SyncV4Handler<T, gather::SyncV4Inputs>, SyncV4Error> {
52 let SyncV4Handler { mut transaction, stage: connection } = self;
53
54 let stage = gather::gather(&mut transaction, connection).await?;
55
56 Ok(SyncV4Handler { transaction, stage })
57 }
58}
59
60impl<T: TransactedSyncV4Queries> SyncV4Handler<T, gather::SyncV4Inputs> {
61 pub fn plan(
68 self,
69 request: &sync_events::v5::Request,
70 ) -> Result<SyncV4Handler<T, plan::SyncV4Plan>, SyncV4Error> {
71 let SyncV4Handler { transaction, stage: inputs } = self;
72
73 let stage = plan::plan(inputs, request)?;
74
75 Ok(SyncV4Handler { transaction, stage })
76 }
77}
78
79impl<T: TransactedSyncV4Queries> SyncV4Handler<T, plan::SyncV4Plan> {
80 pub fn has_data_to_sync(&self) -> bool {
82 self.stage.has_data_to_sync()
83 }
84}
85
86impl SyncV4Handler<TransactedDb<'_>, plan::SyncV4Plan> {
87 pub(crate) async fn execute(self) -> Result<execute::Persisted, SyncV4Error> {
96 let SyncV4Handler { transaction, stage: plan } = self;
97
98 execute::execute(transaction, plan).await
99 }
100
101 pub(crate) async fn persist_without_position(self) -> Result<execute::Persisted, SyncV4Error> {
109 let SyncV4Handler { transaction, stage: plan } = self;
110
111 execute::persist_without_position(transaction, plan).await
112 }
113}