use crate::resolver::ResolverError; use fluent_syntax::parser::ParserError; use std::error::Error; #[derive(Debug, PartialEq, Clone)] pub enum EntryKind { Message, Term, Function, } impl std::fmt::Display for EntryKind { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Self::Message => f.write_str("message"), Self::Term => f.write_str("term"), Self::Function => f.write_str("function"), } } } /// Core error type for Fluent runtime system. /// /// It contains three main types of errors that may come up /// during runtime use of the fluent-bundle crate. #[derive(Debug, PartialEq, Clone)] pub enum FluentError { /// An error which occurs when /// [`FluentBundle::add_resource`](crate::bundle::FluentBundle::add_resource) /// adds entries that are already registered in a given [`FluentBundle`](crate::FluentBundle). /// /// # Example /// /// ``` /// use fluent_bundle::{FluentBundle, FluentResource}; /// use unic_langid::langid; /// /// let ftl_string = String::from("intro = Welcome, { $name }."); /// let res1 = FluentResource::try_new(ftl_string) /// .expect("Could not parse an FTL string."); /// /// let ftl_string = String::from("intro = Hi, { $name }."); /// let res2 = FluentResource::try_new(ftl_string) /// .expect("Could not parse an FTL string."); /// /// let langid_en = langid!("en-US"); /// let mut bundle = FluentBundle::new(vec![langid_en]); /// /// bundle.add_resource(&res1) /// .expect("Failed to add FTL resources to the bundle."); /// /// assert!(bundle.add_resource(&res2).is_err()); /// ``` Overriding { kind: EntryKind, id: String, }, ParserError(ParserError), ResolverError(ResolverError), } impl std::fmt::Display for FluentError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Self::Overriding { kind, id } => { write!(f, "Attempt to override an existing {}: \"{}\".", kind, id) } Self::ParserError(err) => write!(f, "Parser error: {}", err), Self::ResolverError(err) => write!(f, "Resolver error: {}", err), } } } impl Error for FluentError {} impl From for FluentError { fn from(error: ResolverError) -> Self { Self::ResolverError(error) } } impl From for FluentError { fn from(error: ParserError) -> Self { Self::ParserError(error) } }