noatun 0.1.3

Noatun is an in-process, distributed database with materialized view support.
Documentation
use crate::database::{DatabaseSettings, OpenMode};
use crate::MessageFrame;
use crate::SavefileMessageSerializer;
use crate::{Database, Message, MessageId};
use savefile_derive::Savefile;
use std::pin::Pin;

noatun_object!(
    struct Doc {
        opod counter: u32,
    }
);

#[derive(Savefile, Debug)]
pub struct DocMessage {
    val: u32,
    reset: bool,
}

impl Message for DocMessage {
    type Root = Doc;
    type Serializer = SavefileMessageSerializer<Self>;

    fn apply(&self, _time: MessageId, root: Pin<&mut Self::Root>) {
        let mut root = root.pin_project();
        if self.reset {
            root.counter.set(0);
        } else {
            root.counter += self.val;
        }
    }
}

#[test]
fn test_subsume_nonlocal() {
    super::setup_tracing();
    let msg0_time = MessageId::new_debug2(0).timestamp();
    let mut db: Database<DocMessage> = Database::create_new(
        "test/test_subsumption_nonlocal1",
        OpenMode::Overwrite,
        DatabaseSettings {
            mock_time: Some(msg0_time),
            ..DatabaseSettings::default()
        },
    )
    .unwrap();
    let mut db = db.begin_session_mut().unwrap();
    db.disable_filesystem_sync().unwrap();

    println!("Cur cutoff time: {:?}", db.current_cutoff_time());

    for i in 0..3 {
        db.append_single(
            &MessageFrame::new(
                MessageId::new_debug2(i),
                vec![],
                DocMessage {
                    val: 1,
                    reset: false,
                },
            ),
            false,
        )
        .unwrap();
    }
    assert_eq!(db.count_messages(), 3);

    db.append_single(
        &MessageFrame::new(
            MessageId::new_debug2(10),
            vec![],
            DocMessage {
                val: 0,
                reset: true,
            },
        ),
        false,
    )
    .unwrap();

    assert_eq!(db.count_messages(), 1);
}