olai_stack_state/
watch.rs1use std::time::Duration;
4
5use futures::Stream;
6use rusqlite::Connection;
7
8use crate::error::Result;
9use crate::store::{Store, connect};
10
11pub struct Watcher {
16 conn: Connection,
17 version: i64,
18}
19
20impl Store {
21 pub fn watcher(&self) -> Result<Watcher> {
23 let conn = connect(self.path())?;
24 let version = data_version(&conn)?;
25 Ok(Watcher { conn, version })
26 }
27}
28
29fn data_version(conn: &Connection) -> Result<i64> {
30 Ok(conn.query_row("PRAGMA data_version", [], |r| r.get(0))?)
31}
32
33impl Watcher {
34 pub fn changed(&mut self) -> Result<bool> {
37 let version = data_version(&self.conn)?;
38 let changed = version != self.version;
39 self.version = version;
40 Ok(changed)
41 }
42
43 pub fn changes(self, interval: Duration) -> impl Stream<Item = Result<()>> {
46 futures::stream::unfold(self, move |mut watcher| async move {
47 loop {
48 tokio::time::sleep(interval).await;
49 match watcher.changed() {
50 Ok(true) => return Some((Ok(()), watcher)),
51 Ok(false) => continue,
52 Err(e) => return Some((Err(e), watcher)),
53 }
54 }
55 })
56 }
57}