use liblouis::TableResolver;
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("liblouis Table Discovery Demonstration");
println!("=====================================");
println!();
println!("Initializing liblouis table discovery...");
match TableResolver::index_tables() {
Ok(()) => println!("[SUCCESS] Table indexing completed"),
Err(e) => {
println!("[WARNING] Table indexing failed: {}", e);
println!("This may be due to missing liblouis tables or incompatible liblouis version");
println!("Continuing with locale resolution demonstration...");
}
}
println!();
println!("Query-based Table Discovery:");
println!("----------------------------");
let queries = [
("English tables", "language:en"),
("French tables", "language:fr"),
("German tables", "language:de"),
("Grade 2 tables", "grade:2"),
("Grade 1 tables", "grade:1"),
("English Grade 2", "language:en grade:2"),
("US English Grade 2", "language:en region:US grade:2"),
("UK English Grade 2", "language:en region:GB grade:2"),
("French Grade 2", "language:fr grade:2"),
("German Grade 2", "language:de grade:2"),
("Computer braille", "type:computer"),
("Literary braille", "type:literary"),
("6-dot tables", "dots:6"),
("8-dot tables", "dots:8"),
];
for (description, query) in &queries {
print!(" {:<20} ('{}') => ", description, query);
match TableResolver::find_table(query) {
Ok(Some(table)) => println!("{}", table),
Ok(None) => println!("(no matches)"),
Err(e) => println!("ERROR: {} (query may not be supported)", e),
}
}
println!();
println!("Locale Resolution (BRLTTY parameter mapping):");
println!("---------------------------------------------");
let locales = [
"en_US",
"en_GB",
"en_CA",
"fr_FR",
"fr_CA",
"de_DE",
"es_ES",
"it_IT",
"pt_BR",
"nl_NL",
"sv_SE",
"da_DK",
"no_NO",
"en-US",
"en-GB",
"en",
"fr",
"de",
"en-us-g2.ctb",
"en-gb-g2.ctb",
"xx_XX",
];
for locale in &locales {
print!(" {:<10} => ", locale);
match TableResolver::resolve_locale(locale) {
Ok(table) => println!("{}", table),
Err(e) => println!("ERROR: {}", e),
}
}
println!();
println!("Practical Usage Examples:");
println!("------------------------");
println!("Finding best Grade 2 table for the system:");
match TableResolver::find_table("grade:2") {
Ok(Some(table)) => {
println!(" Found Grade 2 table: {}", table);
let translator = liblouis::Translator::new();
match translator.translate_string(&table, "Hello world") {
Ok(contracted) => println!(" Test translation: 'Hello world' -> '{}'", contracted),
Err(e) => println!(" Test translation failed: {}", e),
}
}
Ok(None) => println!(" No Grade 2 table found"),
Err(e) => println!(" Query failed: {}", e),
}
println!();
println!("Simulating user preference resolution:");
let user_preferences = ["en_US", "en_GB", "fr_FR", "unknown_locale"];
for pref in &user_preferences {
println!(" User configured '{}' =>", pref);
match TableResolver::resolve_locale(pref) {
Ok(table) => {
println!(" Resolved to: {}", table);
let translator = liblouis::Translator::new();
match translator.translate_string(&table, "and the for") {
Ok(contracted) => println!(" Test: 'and the for' -> '{}'", contracted),
Err(_) => println!(" Test failed (table may not be installed)"),
}
}
Err(e) => println!(" Resolution failed: {}", e),
}
println!();
}
println!("Table discovery demonstration complete!");
println!();
println!("Key benefits:");
println!("• Dynamic table discovery based on metadata");
println!("• Automatic locale resolution for user preferences");
println!("• Fallback mechanisms ensure applications keep working");
println!("• Integration with BRLTTY parameter system");
println!("• No more hardcoded table names in application code");
Ok(())
}