diff --git a/implementations/rust/preserves-schema/src/compiler/context.rs b/implementations/rust/preserves-schema/src/compiler/context.rs index 9da8117..97337c7 100644 --- a/implementations/rust/preserves-schema/src/compiler/context.rs +++ b/implementations/rust/preserves-schema/src/compiler/context.rs @@ -73,8 +73,8 @@ impl<'b> BundleContext<'b> { } } - pub fn type_for_name(&self, r: &Ref) -> &types::TDefinition { - self.types.get(r).unwrap_or_else(|| panic!("{:?} not found", r)) + pub fn type_for_name(&self, r: &Ref) -> Option<&types::TDefinition> { + self.types.get(r) } pub fn define_literal(&mut self, v: &IOValue) -> String { @@ -153,7 +153,7 @@ impl<'m, 'b> ModuleContext<'m, 'b> { Some(s) => item(name![s.to_owned(), r.name.to_owned()]) }; - if with_generic_args && self.type_for_name(r).has_embedded(self) { + if with_generic_args && self.ref_has_embedded(r) { item(seq![base, anglebrackets!["_Any"]]) } else { base @@ -172,10 +172,17 @@ impl<'m, 'b> ModuleContext<'m, 'b> { } } - pub fn type_for_name(&self, r: &Ref) -> &types::TDefinition { + pub fn type_for_name(&self, r: &Ref) -> Option<&types::TDefinition> { self.bundle.type_for_name(&self.qualify(r)) } + pub fn ref_has_embedded(&self, r: &Ref) -> bool { + match self.type_for_name(r) { + Some(ty) => ty.has_embedded(self), + None => false, // TODO: should this be configurable? + } + } + pub fn literals_generic_decls(&self) -> Item { item(anglebrackets!["_Any: preserves::value::NestedValue"]) } diff --git a/implementations/rust/preserves-schema/src/compiler/types.rs b/implementations/rust/preserves-schema/src/compiler/types.rs index 4171282..ce4f70b 100644 --- a/implementations/rust/preserves-schema/src/compiler/types.rs +++ b/implementations/rust/preserves-schema/src/compiler/types.rs @@ -214,7 +214,7 @@ impl TField { false } else { seen.insert(r.clone()); - ctxt.type_for_name(&r)._has_embedded(ctxt, seen) + ctxt.type_for_name(&r).map(|ty| ty._has_embedded(ctxt, seen)).unwrap_or(false) } } TField::Base(_) => false,