diff options
| author | +merlan #flirora <uruwi@protonmail.com> | 2024-06-22 04:59:52 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-22 08:59:52 +0000 |
| commit | 781eea632f68c478c0a96495f7f4822ba6f7873d (patch) | |
| tree | 1866cda18d077cc36b76f9a661491cb4bea8f638 /crates/typst-macros | |
| parent | 3d3489fbaef7524655f5c911e0bf6dec7394f90e (diff) | |
Add message when trying to access a field that is not set (#4399)
Co-authored-by: Laurenz <laurmaedje@gmail.com>
Diffstat (limited to 'crates/typst-macros')
| -rw-r--r-- | crates/typst-macros/src/elem.rs | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/crates/typst-macros/src/elem.rs b/crates/typst-macros/src/elem.rs index 35dc8b75..a3666e1d 100644 --- a/crates/typst-macros/src/elem.rs +++ b/crates/typst-macros/src/elem.rs @@ -390,13 +390,13 @@ fn create_fields_enum(element: &Elem) -> TokenStream { } impl ::std::convert::TryFrom<u8> for Fields { - type Error = (); + type Error = #foundations::FieldAccessError; fn try_from(value: u8) -> Result<Self, Self::Error> { #(const #consts: u8 = Fields::#variants as u8;)* match value { #(#consts => Ok(Self::#variants),)* - _ => Err(()), + _ => Err(#foundations::FieldAccessError::Internal), } } } @@ -877,9 +877,9 @@ fn create_fields_impl(element: &Elem) -> TokenStream { let Field { enum_ident, ident, .. } = field; let expr = if field.required { - quote! { Some(#into_value(self.#ident.clone())) } + quote! { Ok(#into_value(self.#ident.clone())) } } else { - quote! { self.#ident.clone().map(#into_value) } + quote! { self.#ident.clone().map(#into_value).ok_or(#foundations::FieldAccessError::Unset) } }; quote! { Fields::#enum_ident => #expr } @@ -890,9 +890,9 @@ fn create_fields_impl(element: &Elem) -> TokenStream { let Field { enum_ident, ident, .. } = field; let expr = if field.required { - quote! { Some(#into_value(self.#ident.clone())) } + quote! { Ok(#into_value(self.#ident.clone())) } } else if field.synthesized { - quote! { self.#ident.clone().map(#into_value) } + quote! { self.#ident.clone().map(#into_value).ok_or(#foundations::FieldAccessError::Unset) } } else { let value = create_style_chain_access( field, @@ -900,7 +900,7 @@ fn create_fields_impl(element: &Elem) -> TokenStream { if field.ghost { quote!(None) } else { quote!(self.#ident.as_ref()) }, ); - quote! { Some(#into_value(#value)) } + quote! { Ok(#into_value(#value)) } }; quote! { Fields::#enum_ident => #expr } @@ -911,10 +911,10 @@ fn create_fields_impl(element: &Elem) -> TokenStream { let Field { enum_ident, .. } = field; let expr = if field.required || field.synthesized { - quote! { None } + quote! { Err(#foundations::FieldAccessError::Unknown) } } else { let value = create_style_chain_access(field, false, quote!(None)); - quote! { Some(#into_value(#value)) } + quote! { Ok(#into_value(#value)) } }; quote! { Fields::#enum_ident => #expr } @@ -962,6 +962,10 @@ fn create_fields_impl(element: &Elem) -> TokenStream { let Elem { ident, .. } = element; + let result = quote! { + Result<#foundations::Value, #foundations::FieldAccessError> + }; + quote! { impl #foundations::Fields for #ident { type Enum = Fields; @@ -977,27 +981,33 @@ fn create_fields_impl(element: &Elem) -> TokenStream { } } - fn field(&self, id: u8) -> Option<#foundations::Value> { - let id = Fields::try_from(id).ok()?; + fn field(&self, id: u8) -> #result { + let id = Fields::try_from(id)?; match id { #(#field_arms,)* - _ => None, + // This arm might be reached if someone tries to access an + // internal field. + _ => Err(#foundations::FieldAccessError::Unknown), } } - fn field_with_styles(&self, id: u8, styles: #foundations::StyleChain) -> Option<#foundations::Value> { - let id = Fields::try_from(id).ok()?; + fn field_with_styles(&self, id: u8, styles: #foundations::StyleChain) -> #result { + let id = Fields::try_from(id)?; match id { #(#field_with_styles_arms,)* - _ => None, + // This arm might be reached if someone tries to access an + // internal field. + _ => Err(#foundations::FieldAccessError::Unknown), } } - fn field_from_styles(id: u8, styles: #foundations::StyleChain) -> Option<#foundations::Value> { - let id = Fields::try_from(id).ok()?; + fn field_from_styles(id: u8, styles: #foundations::StyleChain) -> #result { + let id = Fields::try_from(id)?; match id { #(#field_from_styles_arms,)* - _ => None, + // This arm might be reached if someone tries to access an + // internal field. + _ => Err(#foundations::FieldAccessError::Unknown), } } |
