llm_token_visualizer/
lib.rs1pub mod data;
39pub mod detect;
40#[cfg(feature = "live")]
41pub mod live;
42pub mod renderer;
43pub mod report;
44pub mod utils;
45
46pub use data::{
47 ConfidenceLevel, FlagType, TokenAnalysis, TokenFlag, TokenInfo, VisualizationConfig,
48};
49pub use renderer::{HtmlRenderer, MarkdownRenderer, Renderer, TerminalRenderer};
50pub use utils::{create_mock_analysis, detect_issues, simple_tokenize, AnalysisMetrics};
51
52use anyhow::Result;
53
54pub fn visualize_tokens(
56 text: &str,
57 analysis: &TokenAnalysis,
58 format: &str,
59 config: Option<VisualizationConfig>,
60) -> Result<String> {
61 let config = config.unwrap_or_default();
62
63 match format {
64 "terminal" => {
65 let renderer = TerminalRenderer::new();
66 renderer.render(text, analysis, &config)
67 }
68 "html" => {
69 let renderer = HtmlRenderer::new();
70 renderer.render(text, analysis, &config)
71 }
72 "markdown" => {
73 let renderer = MarkdownRenderer::new();
74 renderer.render(text, analysis, &config)
75 }
76 _ => Err(anyhow::anyhow!("Unsupported format: {}", format)),
77 }
78}
79
80pub fn quick_analyze(text: &str, format: &str) -> Result<String> {
82 let analysis = utils::create_mock_analysis(text);
83 let config = VisualizationConfig::default();
84 visualize_tokens(text, &analysis, format, Some(config))
85}
86
87pub fn analyze_with_issues(analysis: &TokenAnalysis) -> (utils::AnalysisMetrics, Vec<String>) {
89 let metrics = utils::AnalysisMetrics::from_analysis(analysis);
90 let issues = utils::detect_issues(analysis);
91 (metrics, issues)
92}
93
94#[cfg(test)]
95mod tests {
96 use super::*;
97
98 #[test]
99 fn test_visualize_tokens() {
100 let analysis = TokenAnalysis {
101 tokens: vec![
102 TokenInfo {
103 text: "Hello".to_string(),
104 confidence: 0.9,
105 },
106 TokenInfo {
107 text: " world".to_string(),
108 confidence: 0.8,
109 },
110 ],
111 flags: vec![],
112 };
113
114 let result = visualize_tokens("Hello world", &analysis, "markdown", None);
115 assert!(result.is_ok());
116 assert!(result.unwrap().contains("Hello"));
117 }
118
119 #[test]
120 fn test_quick_analyze() {
121 let result = quick_analyze("This is a test", "markdown");
122 assert!(result.is_ok());
123 assert!(result.unwrap().contains("Token Analysis"));
124 }
125
126 #[test]
127 fn test_analyze_with_issues() {
128 let analysis = TokenAnalysis {
129 tokens: vec![
130 TokenInfo {
131 text: "good".to_string(),
132 confidence: 0.9,
133 },
134 TokenInfo {
135 text: "bad".to_string(),
136 confidence: 0.1,
137 },
138 ],
139 flags: vec![],
140 };
141
142 let (metrics, issues) = analyze_with_issues(&analysis);
143 assert_eq!(metrics.total_tokens, 2);
144 assert!(!issues.is_empty());
145 }
146}