diff --git a/macro/src/gen/mod.rs b/macro/src/gen/mod.rs index cbcfa63..5957788 100644 --- a/macro/src/gen/mod.rs +++ b/macro/src/gen/mod.rs @@ -30,9 +30,10 @@ fn gen_config_impl(input: &ir::Input) -> TokenStream { match f.kind { FieldKind::Nested { .. } => { quote! { - confique::Config::from_partial(partial.#field_name).map_err(|e| { - confique::internal::prepend_missing_value_error(e, #path) - })? + confique::internal::map_err_prefix_path( + confique::Config::from_partial(partial.#field_name), + #path, + )? } } FieldKind::Leaf { kind: LeafKind::Optional { .. }, .. } => { @@ -40,8 +41,7 @@ fn gen_config_impl(input: &ir::Input) -> TokenStream { } FieldKind::Leaf { kind: LeafKind::Required { .. }, .. } => { quote! { - partial.#field_name - .ok_or(confique::internal::missing_value_error(#path.into()))? + confique::internal::unwrap_or_missing_value_err(partial.#field_name, #path)? } } } diff --git a/src/internal.rs b/src/internal.rs index 009d28e..1c5ca65 100644 --- a/src/internal.rs +++ b/src/internal.rs @@ -19,17 +19,21 @@ where src.into_deserializer() } -pub fn missing_value_error(path: String) -> Error { - ErrorInner::MissingValue(path).into() +pub fn unwrap_or_missing_value_err(value: Option, path: &str) -> Result { + match value { + Some(v) => Ok(v), + None => Err(ErrorInner::MissingValue(path.into()).into()) + } } -pub fn prepend_missing_value_error(e: Error, prefix: &str) -> Error { - match *e.inner { - ErrorInner::MissingValue(path) => { +pub fn map_err_prefix_path(res: Result, prefix: &str) -> Result { + res.map_err(|e| { + if let ErrorInner::MissingValue(path) = &*e.inner { ErrorInner::MissingValue(format!("{prefix}.{path}")).into() + } else { + e } - e => e.into(), - } + }) } pub fn from_env<'de, T: serde::Deserialize<'de>>(