use std::{fs::File, io, path::Path}; use icu_locid::LanguageIdentifier; use xml::{writer::XmlEvent, EmitterConfig, EventWriter}; use crate::{Bundle, Message, WriteError}; pub fn export_file( bundle: &Bundle, locale: LanguageIdentifier, path: &Path, ) -> Result<(), WriteError> { let mut file = File::create(path).unwrap(); export_fh(bundle, locale, &mut file) } pub fn export_fh( bundle: &Bundle, locale: LanguageIdentifier, fh: &mut File, ) -> Result<(), WriteError> { let mut writer = EmitterConfig::new() .perform_indent(true) .create_writer(fh); writer .write( XmlEvent::start_element("xliff") .attr("xmlns", "urn:oasis:names:tc:xliff:document:2.0") .attr("version", "2.0") .attr("srcLang", &format!("{}", locale)), ) .unwrap(); writer .write(XmlEvent::start_element("file").attr("id", "main")) .unwrap(); for (key, message) in bundle.message_iter() { write_message(&mut writer, key, message, &locale); } writer.write(XmlEvent::end_element()).unwrap(); writer.write(XmlEvent::end_element()).unwrap(); Ok(()) } fn write_message( writer: &mut EventWriter, key: &str, message: &Message, locale: &LanguageIdentifier, ) where T: std::io::Write, { [ XmlEvent::start_element("unit").attr("id", key).into(), XmlEvent::start_element("notes").into(), XmlEvent::start_element("note").into(), XmlEvent::characters(message.description()).into(), XmlEvent::end_element().into(), XmlEvent::end_element().into(), XmlEvent::start_element("segment").into(), XmlEvent::start_element("source").into(), XmlEvent::characters(message.variant(locale).unwrap().content()).into(), XmlEvent::end_element().into(), XmlEvent::end_element().into(), XmlEvent::end_element().into(), ] .into_iter() .for_each(|elem: XmlEvent| writer.write(elem).unwrap()); }