use std::path::Path;
use msime_engine::{prepare_runtime_paths, DictionaryAccess, Session, SessionOptions};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut arguments = std::env::args_os().skip(1);
let data = arguments
.next()
.ok_or("usage: quickstart <data directory> [<work directory>]")?;
let resources = std::path::absolute(data)?;
let work = match arguments.next() {
Some(path) => std::path::absolute(path)?,
None => std::env::temp_dir().join("msime-quickstart"),
};
let paths = prepare_runtime_paths(
&resources,
&work.join("user"),
&work.join("cache"),
&content_id(&resources),
)?;
let access = DictionaryAccess::try_session(&paths.user_data, &paths.dictionaries)?
.ok_or("the dictionaries are being maintained; try again later")?;
let mut session = Session::new(SessionOptions::new(paths))?;
for key in b"nihao" {
session.character(*key, false);
}
let state = session.display_snapshot();
println!("preedit: {}", state.preedit);
for (index, candidate) in state.candidates.iter().take(9).enumerate() {
println!("{}. {}", index + 1, candidate.word);
}
let result = session.select(0);
match result.commit {
Some(text) => println!("commit: {text}"),
None => println!("still composing: {}", session.display_snapshot().preedit),
}
if let Some(diagnostic) = result.diagnostic {
eprintln!("diagnostic: {diagnostic}");
}
drop(session);
drop(access);
msime_engine::shutdown();
Ok(())
}
fn content_id(resources: &Path) -> String {
let name = resources
.file_name()
.map(|name| name.to_string_lossy().into_owned())
.unwrap_or_default();
let id: String = name
.chars()
.take(128)
.map(|character| {
if character.is_ascii_alphanumeric() || character == '-' {
character
} else {
'_'
}
})
.collect();
if id.is_empty() {
"data".to_owned()
} else {
id
}
}