azure_storage_queues 0.2.0

Azure Queue Storage crate from the Azure SDK for Rust
Documentation
use azure_core::PermissionError;
use chrono::{DateTime, FixedOffset};
use std::convert::TryFrom;

use azure_storage::StoredAccessPolicy;

#[derive(Debug, Clone)]
pub struct QueueStoredAccessPolicy {
    pub id: String,
    pub start: DateTime<FixedOffset>,
    pub expiry: DateTime<FixedOffset>,
    pub is_read_enabled: bool,
    pub is_add_enabled: bool,
    pub is_update_enabled: bool,
    pub is_process_enabled: bool,
}

impl QueueStoredAccessPolicy {
    pub fn new(
        id: impl Into<String>,
        start: impl Into<DateTime<FixedOffset>>,
        expiry: impl Into<DateTime<FixedOffset>>,
    ) -> Self {
        Self {
            id: id.into(),
            start: start.into(),
            expiry: expiry.into(),
            is_read_enabled: false,
            is_add_enabled: false,
            is_update_enabled: false,
            is_process_enabled: false,
        }
    }

    pub fn enable_read(self) -> Self {
        Self {
            is_read_enabled: true,
            ..self
        }
    }

    pub fn enable_add(self) -> Self {
        Self {
            is_add_enabled: true,
            ..self
        }
    }

    pub fn enable_update(self) -> Self {
        Self {
            is_update_enabled: true,
            ..self
        }
    }

    pub fn enable_process(self) -> Self {
        Self {
            is_process_enabled: true,
            ..self
        }
    }

    pub fn enable_all(self) -> Self {
        Self {
            is_add_enabled: true,
            is_read_enabled: true,
            is_update_enabled: true,
            is_process_enabled: true,
            ..self
        }
    }

    pub fn to_permission_string(&self) -> String {
        let mut permission = String::with_capacity(4);

        if self.is_read_enabled {
            permission.push('r');
        }
        if self.is_add_enabled {
            permission.push('a');
        }
        if self.is_update_enabled {
            permission.push('u');
        }
        if self.is_process_enabled {
            permission.push('p');
        }

        permission
    }
}

impl TryFrom<StoredAccessPolicy> for QueueStoredAccessPolicy {
    type Error = PermissionError;

    fn try_from(sap: StoredAccessPolicy) -> Result<Self, Self::Error> {
        let mut queue_sap = Self::new(sap.id, sap.start, sap.expiry);

        for token in sap.permission.chars() {
            match token {
                'r' => {
                    queue_sap = queue_sap.enable_read();
                }
                'a' => {
                    queue_sap = queue_sap.enable_add();
                }
                'u' => {
                    queue_sap = queue_sap.enable_update();
                }
                'p' => {
                    queue_sap = queue_sap.enable_process();
                }
                c => {
                    return Err(PermissionError::NonSupportedToken {
                        service: "queue".to_owned(),
                        received_token: c,
                        supported_tokens: vec!['r', 'a', 'u', 'p'],
                    })
                }
            }
        }

        Ok(queue_sap)
    }
}

impl From<&QueueStoredAccessPolicy> for StoredAccessPolicy {
    fn from(queue_stored_access_policy: &QueueStoredAccessPolicy) -> Self {
        StoredAccessPolicy {
            id: queue_stored_access_policy.id.to_owned(),
            start: queue_stored_access_policy.start,
            expiry: queue_stored_access_policy.expiry,
            permission: queue_stored_access_policy.to_permission_string(),
        }
    }
}