Documentation
#![allow(missing_docs)]

#[ixc::handler(Counter)]
pub mod counter {
    use ixc::*;

    #[derive(Resources)]
    pub struct Counter {
        #[state]
        value: Accumulator,
    }

    impl Counter {
        #[on_create]
        pub fn create(&self, ctx: &mut Context) -> Result<()> {
            Ok(())
        }

        #[publish]
        pub fn get(&self, ctx: &Context) -> Result<u128> {
            let res = self.value.get(ctx)?;
            Ok(res)
        }

        #[publish]
        pub fn inc(&self, ctx: &mut Context) -> Result<u128> {
            let value = self.value.add(ctx, 1)?;
            Ok(value)
        }

        #[publish]
        pub fn dec(&self, ctx: &mut Context) -> Result<u128> {
            let value = self.value.safe_sub(ctx, 1)?;
            Ok(value)
        }
    }
}


#[cfg(test)]
mod tests {
    use super::counter::*;
    use ixc_core::account_api::create_account;
    use ixc_testing::*;

    #[test]
    fn test_counter() {
        let mut app = TestApp::default();
        app.register_handler::<Counter>().unwrap();
        let mut alice_ctx = app.new_client_context().unwrap();
        let counter_client = create_account::<Counter>(&mut alice_ctx, CounterCreate{}).unwrap();
        let cur = counter_client.get(&alice_ctx).unwrap();
        assert_eq!(cur, 0);
        let cur = counter_client.inc(&mut alice_ctx).unwrap();
        assert_eq!(cur, 1);
        let cur = counter_client.inc(&mut alice_ctx).unwrap();
        assert_eq!(cur, 2);
        let cur = counter_client.dec(&mut alice_ctx).unwrap();
        assert_eq!(cur, 1);
        let cur = counter_client.dec(&mut alice_ctx).unwrap();
        assert_eq!(cur, 0);
        let res = counter_client.dec(&mut alice_ctx);
        assert!(res.is_err());
    }
}

fn main() {}