use cheetah_string::CheetahString;
use crate::common::attribute::Attribute;
use crate::common::attribute::AttributeBase;
#[derive(Debug, Clone)]
pub struct BooleanAttribute {
attribute: AttributeBase,
default_value: bool,
}
impl BooleanAttribute {
pub fn new(name: CheetahString, changeable: bool, default_value: bool) -> Self {
Self {
attribute: AttributeBase::new(name, changeable),
default_value,
}
}
#[inline]
pub fn default_value(&self) -> bool {
self.default_value
}
pub fn parse_bool(value: &str) -> Result<bool, String> {
match value.to_lowercase().as_str() {
"true" => Ok(true),
"false" => Ok(false),
_ => Err(format!("Boolean attribute must be 'true' or 'false', got '{value}'",)),
}
}
}
impl Attribute for BooleanAttribute {
#[inline]
fn verify(&self, value: &str) -> Result<(), String> {
if value.is_empty() {
return Err("Boolean attribute value cannot be empty".to_string());
}
Self::parse_bool(value)?;
Ok(())
}
#[inline]
fn name(&self) -> &CheetahString {
self.attribute.name()
}
#[inline]
fn is_changeable(&self) -> bool {
self.attribute.is_changeable()
}
}
#[cfg(test)]
mod tests {
use cheetah_string::CheetahString;
use super::*;
#[test]
fn create_boolean_attribute() {
let name = CheetahString::from_static_str("test_attribute");
let attribute = BooleanAttribute::new(name.clone(), true, true);
assert_eq!(attribute.name(), &name);
assert!(attribute.is_changeable());
assert!(attribute.default_value());
}
#[test]
fn parse_bool_true() {
let result = BooleanAttribute::parse_bool("true");
assert!(result.is_ok());
assert!(result.unwrap());
}
#[test]
fn parse_bool_false() {
let result = BooleanAttribute::parse_bool("false");
assert!(result.is_ok());
assert!(!result.unwrap());
}
#[test]
fn parse_bool_invalid() {
let result = BooleanAttribute::parse_bool("invalid");
assert!(result.is_err());
assert_eq!(
result.unwrap_err(),
"Boolean attribute must be 'true' or 'false', got 'invalid'"
);
}
#[test]
fn verify_valid_true() {
let attribute = BooleanAttribute::new(CheetahString::from_static_str("test_attribute"), true, true);
let result = attribute.verify("true");
assert!(result.is_ok());
}
#[test]
fn verify_valid_false() {
let attribute = BooleanAttribute::new(CheetahString::from_static_str("test_attribute"), true, false);
let result = attribute.verify("false");
assert!(result.is_ok());
}
#[test]
fn verify_empty_value() {
let attribute = BooleanAttribute::new(CheetahString::from_static_str("test_attribute"), true, true);
let result = attribute.verify("");
assert!(result.is_err());
assert_eq!(result.unwrap_err(), "Boolean attribute value cannot be empty");
}
#[test]
fn verify_invalid_value() {
let attribute = BooleanAttribute::new(CheetahString::from_static_str("test_attribute"), true, true);
let result = attribute.verify("invalid");
assert!(result.is_err());
assert_eq!(
result.unwrap_err(),
"Boolean attribute must be 'true' or 'false', got 'invalid'"
);
}
}