summaryrefslogtreecommitdiff
path: root/crates/typst-macros
diff options
context:
space:
mode:
author+merlan #flirora <uruwi@protonmail.com>2024-06-22 04:59:52 -0400
committerGitHub <noreply@github.com>2024-06-22 08:59:52 +0000
commit781eea632f68c478c0a96495f7f4822ba6f7873d (patch)
tree1866cda18d077cc36b76f9a661491cb4bea8f638 /crates/typst-macros
parent3d3489fbaef7524655f5c911e0bf6dec7394f90e (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.rs46
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),
}
}