use std::sync::Arc;
use crate::analysis::analyzer::analyzer::Analyzer;
use crate::analysis::analyzer::simple::SimpleAnalyzer;
use crate::analysis::token::TokenStream;
use crate::analysis::tokenizer::whole::WholeTokenizer;
use crate::error::Result;
pub struct KeywordAnalyzer {
inner: SimpleAnalyzer,
}
impl KeywordAnalyzer {
pub fn new() -> Self {
let tokenizer = Arc::new(WholeTokenizer::new());
let analyzer = SimpleAnalyzer::new(tokenizer);
KeywordAnalyzer { inner: analyzer }
}
pub fn inner(&self) -> &SimpleAnalyzer {
&self.inner
}
}
impl Default for KeywordAnalyzer {
fn default() -> Self {
Self::new()
}
}
impl Analyzer for KeywordAnalyzer {
fn analyze(&self, text: &str) -> Result<TokenStream> {
self.inner.analyze(text)
}
fn name(&self) -> &'static str {
"keyword"
}
fn as_any(&self) -> &dyn std::any::Any {
self
}
}
impl std::fmt::Debug for KeywordAnalyzer {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("KeywordAnalyzer")
.field("inner", &self.inner)
.finish()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::analysis::token::Token;
#[test]
fn test_keyword_analyzer() {
let analyzer = KeywordAnalyzer::new();
let tokens: Vec<Token> = analyzer.analyze("Hello World Test").unwrap().collect();
assert_eq!(tokens.len(), 1);
assert_eq!(tokens[0].text, "Hello World Test");
}
}