DRY for _Value

This commit is contained in:
Tony Garnock-Jones 2021-09-17 12:19:26 +02:00
parent 6869a89291
commit ac8567731d
3 changed files with 20 additions and 35 deletions

View File

@ -170,7 +170,7 @@ impl<'m, 'b> ModuleContext<'m, 'b> {
RefRenderStyle::Bare =>
base,
RefRenderStyle::Qualified =>
if q { item(seq![base, anglebrackets!["_Value"]]) } else { base },
if q { item(seq![base, anglebrackets![self.any_type()]]) } else { base },
}
}
@ -184,30 +184,8 @@ impl<'m, 'b> ModuleContext<'m, 'b> {
// ^ TODO: should the "false" be configurable?
}
pub fn generic_decls(&self) -> Item {
item(anglebrackets!["_Value: preserves::value::NestedValue"])
}
pub fn generic_static_decls(&self) -> Item {
item(anglebrackets!["_Value: preserves::value::NestedValue + 'static"])
}
pub fn generic_decls_with_defaults(&self) -> Item {
item(anglebrackets![
seq!["_Value: preserves::value::NestedValue = ",
if self.schema.embedded_type == EmbeddedTypeName::False {
"preserves::value::IOValue"
} else {
"_Any"
}]])
}
pub fn generic_arg(&self) -> Item {
item("<_Value>")
}
pub fn language_type(&self) -> Item {
item(seq![self.language_base_type(), self.generic_arg()])
item(seq![self.language_base_type(), anglebrackets![self.any_type()]])
}
pub fn language_base_type(&self) -> Item {

View File

@ -103,8 +103,8 @@ pub fn gen_definition_reader(m: &mut ModuleContext, n: &str, d: &Definition) {
item(seq![
"fn ", fname.clone(), anglebrackets![
"'de",
"_Value: preserves::value::NestedValue",
"R: _support::Reader<'de, _Value>"],
seq![ctxt.m.any_type(), ": preserves::value::NestedValue"],
seq!["R: _support::Reader<'de, ", ctxt.m.any_type(), ">"]],
"(r: &mut R) -> ",
"std::result::Result<",
names::render_constructor(n), ty.generic_arg(ctxt.m),
@ -141,10 +141,11 @@ pub fn gen_definition_reader(m: &mut ModuleContext, n: &str, d: &Definition) {
}
item(seq![
"impl", anglebrackets!["'de",
"_Value: preserves::value::NestedValue",
"R: _support::Reader<'de, _Value>"], " ",
"_support::Deserialize", anglebrackets!["'de", "_Value", "R"], " ",
"impl", anglebrackets![
"'de",
seq![ctxt.m.any_type(), ": preserves::value::NestedValue"],
seq!["R: _support::Reader<'de, ", ctxt.m.any_type(), ">"]], " ",
"_support::Deserialize", anglebrackets!["'de", ctxt.m.any_type(), "R"], " ",
"for ", names::render_constructor(n), ty.generic_arg(ctxt.m), " ", codeblock![
seq!["fn deserialize(r: &mut R) -> ",
"std::result::Result<Self, _support::ParseError> ",

View File

@ -195,8 +195,8 @@ impl TField {
fn render(&self, ctxt: &ModuleContext, box_needed: bool) -> impl Emittable {
match self {
TField::Unit => seq!["()"],
TField::Any => seq!["_Value"],
TField::Embedded => seq!["_Value::Embedded"],
TField::Any => seq![ctxt.any_type()],
TField::Embedded => seq![ctxt.any_type(), "::Embedded"],
TField::Array(t) => seq!["std::vec::Vec<", t.render(ctxt, false), ">"],
TField::Set(t) => seq!["preserves::value::Set<", t.render(ctxt, false), ">"],
TField::Map(k, v) => seq!["preserves::value::Map",
@ -267,7 +267,8 @@ impl TSimple {
impl TDefinition {
pub fn generic_decl(&self, ctxt: &ModuleContext) -> Item {
if self.has_embedded(ctxt.bundle) {
ctxt.generic_decls()
item(anglebrackets![
seq![ctxt.any_type(), ": preserves::value::NestedValue"]])
} else {
item("")
}
@ -275,7 +276,12 @@ impl TDefinition {
pub fn generic_decl_with_defaults(&self, ctxt: &ModuleContext) -> Item {
if self.has_embedded(ctxt.bundle) {
ctxt.generic_decls_with_defaults()
item(anglebrackets![
seq![ctxt.any_type(), ": preserves::value::NestedValue = ",
match ctxt.schema.embedded_type {
EmbeddedTypeName::False => "preserves::value::IOValue",
EmbeddedTypeName::Ref(_) => "_Any",
}]])
} else {
item("")
}
@ -283,7 +289,7 @@ impl TDefinition {
pub fn generic_arg(&self, ctxt: &ModuleContext) -> Item {
if self.has_embedded(ctxt.bundle) {
ctxt.generic_arg()
item(anglebrackets![ctxt.any_type()])
} else {
item("")
}