Add error handling for common unsupported Rust code
Dependencies
- [2]
JWZT34UCAdd `Localize`` trait bound for each field in the derived item - [3]
QFPQZR4KRefactor `fluent_embed` - [4]
XEEXWJLGAdd simple end-to-end test for selectors - [5]
F5LG7WENEmit compilation errors from Fluent source code - [6]
VQBJBFEXImprove error handling for missing Fluent messages - [7]
OWXLFLRMMerge `cli_macros` shim into `fluent_embed` - [8]
4BMW4JJOAdd support for deriving items with generics - [9]
NO3PDO7PRefactor `fluent_embed` to support structs - [10]
ROSR4HD5Parse captured glob as locale - [11]
3NMKD6I5Refactor `Localize` trait to use `std::io::Write` - [12]
CESJ4CTOMove macro-specific code into `macro_impl` module - [*]
XGNME3WRMove `Group::derive_enum` to new `crate::parse_macro` module - [*]
5FIVUZYFUnify `fluent_embed` macro API as `localize()`
Change contents
- edit in fluent_embed_derive/src/macro_impl/mod.rs at line 13
pub enum UnsupportedReason {#[error("Unions are not supported")]Union,#[error("Unnamed fields are not supported")]UnnamedFields,}#[derive(Debug, Error)]#[error("Unsupported Rust code")]pub struct UnsupportedError {span: syn::Ident,reason: UnsupportedReason,}#[derive(Debug, Error)] - edit in fluent_embed_derive/src/macro_impl/mod.rs at line 32
Unsupported(#[from] UnsupportedError), - replacement in fluent_embed_derive/src/macro_impl/mod.rs at line 67
syn::Data::Union(_) => todo!(),syn::Data::Union(_) => {return Err(MacroError::Unsupported(UnsupportedError {span: derive_input.ident.clone(),reason: UnsupportedReason::Union,}))} - replacement in fluent_embed_derive/src/macro_impl/mod.rs at line 80
syn::Data::Union(_) => todo!(),syn::Data::Union(_) => {return Err(MacroError::Unsupported(UnsupportedError {span: derive_input.ident.clone(),reason: UnsupportedReason::Union,}))} - replacement in fluent_embed_derive/src/macro_impl/mod.rs at line 100
_ => todo!(),_ => {return Err(MacroError::Unsupported(UnsupportedError {span: derive_input.ident.clone(),reason: UnsupportedReason::UnnamedFields,}))} - replacement in fluent_embed_derive/src/macro_impl/mod.rs at line 110
.flat_map(|variant| match &variant.fields {.map(|variant| match &variant.fields { - replacement in fluent_embed_derive/src/macro_impl/mod.rs at line 112
named_fields.named.iter().map(|field| &field.ty)Ok(named_fields.named.iter().map(|field| &field.ty).collect()) - replacement in fluent_embed_derive/src/macro_impl/mod.rs at line 114
_ => todo!(),_ => Err(MacroError::Unsupported(UnsupportedError {span: variant.ident.clone(),reason: UnsupportedReason::UnnamedFields,})), - edit in fluent_embed_derive/src/macro_impl/mod.rs at line 119
.collect::<Result<Vec<Vec<&syn::Type>>, _>>()?.into_iter().flatten() - replacement in fluent_embed_derive/src/macro_impl/error.rs at line 1
use super::{attribute, fluent, fluent::GroupError, MacroError};use super::{attribute,fluent::{self, GroupError},MacroError, UnsupportedError, UnsupportedReason,}; - replacement in fluent_embed_derive/src/macro_impl/error.rs at line 92
help = "{}", matched_locales},help = "{}", matched_locales;},}}fn unsupported(error: UnsupportedError) {match error.reason {UnsupportedReason::Union => emit_error! { error.span, "unions are not supported";help = "Use a `struct` or `enum` instead"},UnsupportedReason::UnnamedFields => {emit_error! { error.span, "only named fields are supported";help = "Each field needs a name so it can be referenced by Fluent code";note = "There must be at least one named field (unit structs are unsupported!)"}} - edit in fluent_embed_derive/src/macro_impl/error.rs at line 115
MacroError::Unsupported(error) => unsupported(error), - edit in fluent_embed_derive/src/macro_impl/derive.rs at line 8[15.64][3.9191]
use super::{MacroError, UnsupportedError, UnsupportedReason}; - replacement in fluent_embed_derive/src/macro_impl/derive.rs at line 92
) -> Result<TokenStream, fluent::GroupError> {) -> Result<TokenStream, MacroError> { - replacement in fluent_embed_derive/src/macro_impl/derive.rs at line 101
syn::Fields::Unnamed(_) => todo!(),syn::Fields::Unit => todo!(),_ => {return Err(MacroError::Unsupported(UnsupportedError {span: ident.clone(),reason: UnsupportedReason::UnnamedFields,}))} - replacement in fluent_embed_derive/src/macro_impl/derive.rs at line 109
expr_for_message(&mut group, ident, &references)Ok(expr_for_message(&mut group, ident, &references)?) - replacement in fluent_embed_derive/src/macro_impl/derive.rs at line 139
) -> Result<TokenStream, fluent::GroupError> {) -> Result<TokenStream, MacroError> { - replacement in fluent_embed_derive/src/macro_impl/derive.rs at line 156
syn::Fields::Unnamed(_) => todo!(),syn::Fields::Unit => todo!(),_ => {return Err(MacroError::Unsupported(UnsupportedError {span: enum_variant.ident.clone(),reason: UnsupportedReason::UnnamedFields,}))} - replacement in fluent_embed_derive/src/macro_impl/derive.rs at line 169
syn::Fields::Unnamed(_) => todo!(),syn::Fields::Unit => todo!(),_ => {return Err(MacroError::Unsupported(UnsupportedError {span: enum_variant.ident.clone(),reason: UnsupportedReason::UnnamedFields,}))}