diff --git a/implementations/rust/preserves-schema/src/compiler/context.rs b/implementations/rust/preserves-schema/src/compiler/context.rs index 874a917..3f22563 100644 --- a/implementations/rust/preserves-schema/src/compiler/context.rs +++ b/implementations/rust/preserves-schema/src/compiler/context.rs @@ -199,8 +199,12 @@ impl<'a, 'm> FunctionContext<'a, 'm> { return item(seq!["Err", parens![self.conformance_err_code()]]); } + pub fn fully_qualified_error_context(&self) -> String { + self.m.module_path.0.join(".") + "." + &self.error_context + } + pub fn conformance_err_code(&self) -> Item { return item(seq!["_support::ParseError::conformance_error", parens![ - escape_string(&(self.m.module_path.0.join(".") + "." + &self.error_context))]]); + escape_string(&self.fully_qualified_error_context())]]); } } diff --git a/implementations/rust/preserves-schema/src/compiler/unparsers.rs b/implementations/rust/preserves-schema/src/compiler/unparsers.rs index 23478a0..dfcb040 100644 --- a/implementations/rust/preserves-schema/src/compiler/unparsers.rs +++ b/implementations/rust/preserves-schema/src/compiler/unparsers.rs @@ -1,7 +1,7 @@ use crate::*; use crate::gen::schema::*; use crate::syntax::block::constructors::*; -use crate::syntax::block::{Emittable, Item}; +use crate::syntax::block::{Emittable, Item, escape_string}; use std::cell::Cell; use std::rc::Rc; @@ -82,8 +82,11 @@ pub fn gen_definition_unparser(m: &mut ModuleContext, n: &str, d: &Definition) { ps.extend(pattern_n); let (patpat, vc) = destruct(&mut ctxt, item(names::render_constructor(n)), true, &record_type(&ps)); body.push(item(seq!["let ", patpat, " = value;"])); - body.push(item(seq!["preserves::value::merge(vec!", brackets(ps.iter().map( - |p| named_pattern_unparser(&mut ctxt, p, &vc)).collect()), ")"])); + body.push(item(seq![ + "preserves::value::merge(vec!", brackets(ps.iter().map( + |p| named_pattern_unparser(&mut ctxt, p, &vc)).collect() + ), ").expect", parens![escape_string(&( + "merge of ".to_owned() + &ctxt.fully_qualified_error_context()))]])); } Definition::Pattern(p) => { let (patpat, vc) = destruct(&mut ctxt, item(names::render_constructor(n)), true, &pattern_type(p));