canic_core/access/
guard.rs

1use crate::{
2    Error, ThisError,
3    access::AccessError,
4    ops::storage::state::app::{AppMode, AppStateOps},
5};
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
21impl From<GuardAccessError> for Error {
22    fn from(err: GuardAccessError) -> Self {
23        AccessError::Guard(err).into()
24    }
25}
26
27/// Validate access for query calls.
28///
29/// Rules:
30/// - Enabled and Readonly modes permit queries.
31/// - Disabled mode rejects queries.
32pub fn guard_app_query() -> Result<(), AccessError> {
33    let mode = AppStateOps::snapshot().mode.unwrap_or(AppMode::Disabled);
34
35    match mode {
36        AppMode::Enabled | AppMode::Readonly => Ok(()),
37        AppMode::Disabled => Err(GuardAccessError::AppDisabled.into()),
38    }
39}
40
41/// Validate access for update calls.
42///
43/// Rules:
44/// - Enabled mode permits updates.
45/// - Readonly rejects updates.
46/// - Disabled rejects updates.
47pub fn guard_app_update() -> Result<(), AccessError> {
48    let mode = AppStateOps::snapshot().mode.unwrap_or(AppMode::Disabled);
49
50    match mode {
51        AppMode::Enabled => Ok(()),
52        AppMode::Readonly => Err(GuardAccessError::AppReadonly.into()),
53        AppMode::Disabled => Err(GuardAccessError::AppDisabled.into()),
54    }
55}