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 output = io::stdout(); let mut writer = EmitterConfig::new() .perform_indent(true) .create_writer(output); writer.write(XmlEvent::start_element("xliff")).unwrap(); writer.write(XmlEvent::start_element("file")).unwrap(); for (key, message) in bundle.message_iter() { write_message(&mut writer, message, &locale); } writer.write(XmlEvent::end_element()).unwrap(); writer.write(XmlEvent::end_element()).unwrap(); Ok(()) } fn write_message(writer: &mut EventWriter, message: &Message, locale: &LanguageIdentifier) where T: std::io::Write, { writer.write(XmlEvent::start_element("unit")).unwrap(); writer.write(XmlEvent::start_element("segment")).unwrap(); writer.write(XmlEvent::characters(message.variant(locale).unwrap().content())).unwrap(); writer.write(XmlEvent::end_element()).unwrap(); writer.write(XmlEvent::end_element()).unwrap(); }