use crate::cache::{ensure_model, Cache, ModelFiles};
use crate::engine::{Engine, Translation};
use crate::fetch::Fetch;
use crate::remote::fetch_records;
use crate::route::{resolve_route, Route};
pub fn ensure_files(
fetch: &dyn Fetch,
cache: &Cache,
src: &str,
trg: &str,
) -> Result<ModelFiles, String> {
let records = fetch_records(fetch)?;
ensure_model(fetch, cache, &records, src, trg)
}
pub fn ensure_route_files(
fetch: &dyn Fetch,
cache: &Cache,
src: &str,
trg: &str,
) -> Result<(Route, Vec<ModelFiles>), String> {
let records = fetch_records(fetch)?;
let route = resolve_route(&records, src, trg)?;
let files = match &route {
Route::Direct { src, trg } => vec![ensure_model(fetch, cache, &records, src, trg)?],
Route::Pivot { src, pivot, trg } => vec![
ensure_model(fetch, cache, &records, src, pivot)?,
ensure_model(fetch, cache, &records, pivot, trg)?,
],
};
Ok((route, files))
}
pub fn load_engine(
fetch: &dyn Fetch,
cache: &Cache,
src: &str,
trg: &str,
) -> Result<Engine, String> {
let files = ensure_files(fetch, cache, src, trg)?;
Engine::load(&files.model, &files.src_vocab, &files.trg_vocab)
}
pub fn load_translation(
fetch: &dyn Fetch,
cache: &Cache,
src: &str,
trg: &str,
) -> Result<Translation, String> {
let records = fetch_records(fetch)?;
match resolve_route(&records, src, trg)? {
Route::Direct { src, trg } => {
let files = ensure_model(fetch, cache, &records, &src, &trg)?;
let engine = Engine::load(&files.model, &files.src_vocab, &files.trg_vocab)?;
Ok(Translation::Direct(engine))
}
Route::Pivot { src, pivot, trg } => {
let leg1 = ensure_model(fetch, cache, &records, &src, &pivot)?;
let leg2 = ensure_model(fetch, cache, &records, &pivot, &trg)?;
let first = Engine::load(&leg1.model, &leg1.src_vocab, &leg1.trg_vocab)?;
let second = Engine::load(&leg2.model, &leg2.src_vocab, &leg2.trg_vocab)?;
Ok(Translation::Pivot {
pivot,
first,
second,
})
}
}
}