canic_core/access/
guard.rs

1use crate::{
2    access::AccessError, ops::storage::state::app::AppStateOps,
3    storage::stable::state::app::AppMode,
4};
5use thiserror::Error as ThisError;
6
7///
8/// GuardAccessError
9/// Access errors raised by application state guards.
10///
11
12#[derive(Debug, ThisError)]
13pub enum GuardAccessError {
14    #[error("application is disabled")]
15    AppDisabled,
16
17    #[error("application is in readonly mode")]
18    AppReadonly,
19}
20
21/// Validate access for query calls.
22///
23/// Rules:
24/// - Enabled and Readonly modes permit queries.
25/// - Disabled mode rejects queries.
26pub fn guard_app_query() -> Result<(), AccessError> {
27    let mode = AppStateOps::get_mode();
28
29    match mode {
30        AppMode::Enabled | AppMode::Readonly => Ok(()),
31        AppMode::Disabled => Err(GuardAccessError::AppDisabled.into()),
32    }
33}
34
35/// Validate access for update calls.
36///
37/// Rules:
38/// - Enabled mode permits updates.
39/// - Readonly rejects updates.
40/// - Disabled rejects updates.
41pub fn guard_app_update() -> Result<(), AccessError> {
42    let mode = AppStateOps::get_mode();
43
44    match mode {
45        AppMode::Enabled => Ok(()),
46        AppMode::Readonly => Err(GuardAccessError::AppReadonly.into()),
47        AppMode::Disabled => Err(GuardAccessError::AppDisabled.into()),
48    }
49}