use std::collections::HashMap;
pub trait StringRouter: Send + Sync + std::fmt::Debug {
fn get_string_subrecord_types(&self, record_type: &str) -> Option<&[String]>;
fn supports_strings(&self, record_type: &str, subrecord_type: &str) -> bool {
self.get_string_subrecord_types(record_type)
.map(|types| types.iter().any(|t| t == subrecord_type))
.unwrap_or(false)
}
}
#[derive(Debug)]
pub struct DefaultStringRouter {
routes: HashMap<String, Vec<String>>,
}
impl DefaultStringRouter {
pub fn new(routes: HashMap<String, Vec<String>>) -> Self {
Self { routes }
}
pub fn from_embedded_data() -> Result<Self, Box<dyn std::error::Error>> {
let routes = super::load_string_records()?;
Ok(Self::new(routes))
}
}
impl StringRouter for DefaultStringRouter {
fn get_string_subrecord_types(&self, record_type: &str) -> Option<&[String]> {
self.routes.get(record_type).map(|v| v.as_slice())
}
}
#[cfg(test)]
mod tests {
use super::*;
fn create_test_router() -> DefaultStringRouter {
let mut routes = HashMap::new();
routes.insert("WEAP".to_string(), vec!["FULL".to_string(), "DESC".to_string()]);
routes.insert("ARMO".to_string(), vec!["FULL".to_string(), "DESC".to_string()]);
routes.insert("NPC_".to_string(), vec!["FULL".to_string(), "SHRT".to_string()]);
DefaultStringRouter::new(routes)
}
#[test]
fn test_get_string_subrecord_types() {
let router = create_test_router();
let weap_types = router.get_string_subrecord_types("WEAP");
assert!(weap_types.is_some());
assert_eq!(weap_types.unwrap(), &["FULL", "DESC"]);
let unknown = router.get_string_subrecord_types("UNKN");
assert!(unknown.is_none());
}
#[test]
fn test_supports_strings() {
let router = create_test_router();
assert!(router.supports_strings("WEAP", "FULL"));
assert!(router.supports_strings("WEAP", "DESC"));
assert!(router.supports_strings("NPC_", "SHRT"));
assert!(!router.supports_strings("WEAP", "XXXX"));
assert!(!router.supports_strings("UNKN", "FULL"));
}
#[test]
fn test_from_embedded_data() {
let router = DefaultStringRouter::from_embedded_data();
assert!(router.is_ok());
let router = router.unwrap();
assert!(router.supports_strings("WEAP", "FULL"));
assert!(router.supports_strings("BOOK", "CNAM"));
assert!(router.supports_strings("QUST", "NNAM"));
}
}