use crate::model::{ConditionValue, PrincipalType, QString};
use crate::offline::EvaluationError;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::str::FromStr;
use uuid::Uuid;
pub type Environment = HashMap<QString, ConditionValue>;
#[derive(Debug, Deserialize, Serialize)]
pub struct Request {
#[serde(skip_serializing_if = "Option::is_none")]
pub request_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub principal: Option<Principal>,
pub action: QString,
pub resource: String,
#[serde(skip_serializing_if = "HashMap::is_empty")]
pub environment: Environment,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct Principal {
pub principal_type: PrincipalType,
pub identifier: String,
}
impl Request {
pub fn get(&self, key: &QString) -> Result<&ConditionValue, EvaluationError> {
match self.environment.get(key) {
Some(v) => Ok(v),
None => Err(EvaluationError::UnknownVariableName(key.to_string())),
}
}
pub fn get_(&self, key: &str) -> Result<&ConditionValue, EvaluationError> {
let key = QString::from_str(key)
.map_err(|_| EvaluationError::InvalidVariableName(key.to_string()))?;
match self.environment.get(&key) {
Some(v) => Ok(v),
None => Err(EvaluationError::UnknownVariableName(key.to_string())),
}
}
pub fn request_id() -> Option<String> {
Some(
Uuid::new_v4()
.as_hyphenated()
.encode_lower(&mut Uuid::encode_buffer())
.to_string(),
)
}
}