use thiserror::Error;
use super::IDialect;
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub struct AbstractDialect {
name: String,
}
impl AbstractDialect {
pub fn new(name: Option<&str>) -> Result<Self, AbstractDialectError> {
let name = name.ok_or(AbstractDialectError::DialectNameCannotBeNull)?;
Ok(Self {
name: name.to_owned(),
})
}
#[must_use]
pub fn get_name(&self) -> &str {
&self.name
}
}
impl IDialect for AbstractDialect {
fn class_name(&self) -> &'static str {
"org.thymeleaf.dialect.AbstractDialect"
}
fn get_name(&self) -> Option<&str> {
Some(self.get_name())
}
}
#[derive(Clone, Copy, Debug, Eq, Error, PartialEq)]
pub enum AbstractDialectError {
#[error("Dialect name cannot be null")]
DialectNameCannotBeNull,
}
#[cfg(test)]
mod tests {
use super::{AbstractDialect, AbstractDialectError};
use crate::IDialect;
#[test]
fn accepts_empty_and_unicode_names_and_exposes_them_immutably() {
let empty = AbstractDialect::new(Some("")).expect("empty name is legal");
let unicode = AbstractDialect::new(Some("标准方言")).expect("unicode name is legal");
assert_eq!(empty.get_name(), "");
assert_eq!(unicode.get_name(), "标准方言");
assert_eq!(IDialect::get_name(&unicode), Some("标准方言"));
}
#[test]
fn rejects_a_java_null_name_with_the_exact_message() {
let error = AbstractDialect::new(None).expect_err("null name must fail");
assert_eq!(error, AbstractDialectError::DialectNameCannotBeNull);
assert_eq!(error.to_string(), "Dialect name cannot be null");
}
}