use crate::catalog::{Catalog, Locale};
use crate::emitter::{self, EmitOptions};
use crate::error::Result;
use crate::parser;
use crate::signatures::ExpectedDomain;
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct ConvertOptions {
pub fallback_locale: Option<Locale>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Conversion {
pub text: String,
pub fallback_ids: Vec<String>,
}
pub fn convert(
input: &str,
catalog: &Catalog,
from: &Locale,
to: &Locale,
options: &ConvertOptions,
) -> Result<Conversion> {
convert_with_context(input, catalog, from, to, options, catalog)
}
pub fn convert_with_context(
input: &str,
catalog: &Catalog,
from: &Locale,
to: &Locale,
options: &ConvertOptions,
context: &dyn ExpectedDomain,
) -> Result<Conversion> {
let program = parser::parse_with_context(input, catalog, from, context)?;
let emit_options = EmitOptions {
fallback_locale: options.fallback_locale.clone(),
};
let output = emitter::emit_with_options_for_conversion(&program, catalog, to, &emit_options)?;
Ok(Conversion {
text: output.text,
fallback_ids: output.fallback_ids,
})
}