diff --git a/base/elixir/test/inputs/json/misc/00c36.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/00c36.json/default/QuickType.ex
index dbbb315..ab8f0dc 100644
--- a/base/elixir/test/inputs/json/misc/00c36.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/00c36.json/default/QuickType.ex
@@ -145,13 +145,31 @@ defmodule TopLevel1 do
           value: String.t()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel1.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel1.date"}
+
+  def decode_decimal(value) when is_binary(value), do: value
+  def decode_decimal(_), do: {:error, "Unexpected type when decoding TopLevel1.decimal"}
+
+  def encode_decimal(value) when is_binary(value), do: value
+  def encode_decimal(_), do: {:error, "Unexpected type when encoding TopLevel1.decimal"}
+
+  def decode_value(value) when is_binary(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding TopLevel1.value"}
+
+  def encode_value(value) when is_binary(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding TopLevel1.value"}
+
   def from_map(m) do
     %TopLevel1{
       country: Country.from_map(m["country"]),
-      date: m["date"],
-      decimal: m["decimal"],
+      date: decode_date(m["date"]),
+      decimal: decode_decimal(m["decimal"]),
       indicator: Country.from_map(m["indicator"]),
-      value: m["value"],
+      value: decode_value(m["value"]),
     }
   end
 
@@ -189,12 +207,36 @@ defmodule TopLevel2 do
           total: integer()
         }
 
+  def decode_page(value) when is_integer(value), do: value
+  def decode_page(_), do: {:error, "Unexpected type when decoding TopLevel2.page"}
+
+  def encode_page(value) when is_integer(value), do: value
+  def encode_page(_), do: {:error, "Unexpected type when encoding TopLevel2.page"}
+
+  def decode_pages(value) when is_integer(value), do: value
+  def decode_pages(_), do: {:error, "Unexpected type when decoding TopLevel2.pages"}
+
+  def encode_pages(value) when is_integer(value), do: value
+  def encode_pages(_), do: {:error, "Unexpected type when encoding TopLevel2.pages"}
+
+  def decode_per_page(value) when is_binary(value), do: value
+  def decode_per_page(_), do: {:error, "Unexpected type when decoding TopLevel2.per_page"}
+
+  def encode_per_page(value) when is_binary(value), do: value
+  def encode_per_page(_), do: {:error, "Unexpected type when encoding TopLevel2.per_page"}
+
+  def decode_total(value) when is_integer(value), do: value
+  def decode_total(_), do: {:error, "Unexpected type when decoding TopLevel2.total"}
+
+  def encode_total(value) when is_integer(value), do: value
+  def encode_total(_), do: {:error, "Unexpected type when encoding TopLevel2.total"}
+
   def from_map(m) do
     %TopLevel2{
-      page: m["page"],
-      pages: m["pages"],
-      per_page: m["per_page"],
-      total: m["total"],
+      page: decode_page(m["page"]),
+      pages: decode_pages(m["pages"]),
+      per_page: decode_per_page(m["per_page"]),
+      total: decode_total(m["total"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/00ec5.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/00ec5.json/default/QuickType.ex
index e86f78d..b7762e9 100644
--- a/base/elixir/test/inputs/json/misc/00ec5.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/00ec5.json/default/QuickType.ex
@@ -59,9 +59,15 @@ defmodule Property do
           type: Type.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Property.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Property.description"}
+
   def from_map(m) do
     %Property{
-      description: m["description"],
+      description: decode_description(m["description"]),
       type: Type.decode(m["type"]),
     }
   end
@@ -164,11 +170,29 @@ defmodule Info do
           version: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Info.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Info.description"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Info.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Info.title"}
+
+  def decode_version(value) when is_binary(value), do: value
+  def decode_version(_), do: {:error, "Unexpected type when decoding Info.version"}
+
+  def encode_version(value) when is_binary(value), do: value
+  def encode_version(_), do: {:error, "Unexpected type when encoding Info.version"}
+
   def from_map(m) do
     %Info{
-      description: m["description"],
-      title: m["title"],
-      version: m["version"],
+      description: decode_description(m["description"]),
+      title: decode_title(m["title"]),
+      version: decode_version(m["version"]),
     }
   end
 
@@ -206,13 +230,37 @@ defmodule Parameter do
           type: Type.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Parameter.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Parameter.description"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Parameter.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Parameter.name"}
+
+  def decode_parameter_in(value) when is_binary(value), do: value
+  def decode_parameter_in(_), do: {:error, "Unexpected type when decoding Parameter.parameter_in"}
+
+  def encode_parameter_in(value) when is_binary(value), do: value
+  def encode_parameter_in(_), do: {:error, "Unexpected type when encoding Parameter.parameter_in"}
+
+  def decode_required(value) when is_boolean(value), do: value
+  def decode_required(_), do: {:error, "Unexpected type when decoding Parameter.required"}
+
+  def encode_required(value) when is_boolean(value), do: value
+  def encode_required(_), do: {:error, "Unexpected type when encoding Parameter.required"}
+
   def from_map(m) do
     %Parameter{
-      description: m["description"],
+      description: decode_description(m["description"]),
       format: Type.decode(m["format"]),
-      name: m["name"],
-      parameter_in: m["in"],
-      required: m["required"],
+      name: decode_name(m["name"]),
+      parameter_in: decode_parameter_in(m["in"]),
+      required: decode_required(m["required"]),
       type: Type.decode(m["type"]),
     }
   end
@@ -249,9 +297,15 @@ defmodule Schema do
           ref: String.t()
         }
 
+  def decode_ref(value) when is_binary(value), do: value
+  def decode_ref(_), do: {:error, "Unexpected type when decoding Schema.ref"}
+
+  def encode_ref(value) when is_binary(value), do: value
+  def encode_ref(_), do: {:error, "Unexpected type when encoding Schema.ref"}
+
   def from_map(m) do
     %Schema{
-      ref: m["$ref"],
+      ref: decode_ref(m["$ref"]),
     }
   end
 
@@ -283,9 +337,15 @@ defmodule The200N do
           schema: Schema.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding The200N.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding The200N.description"}
+
   def from_map(m) do
     %The200N{
-      description: m["description"],
+      description: decode_description(m["description"]),
       schema: Schema.from_map(m["schema"]),
     }
   end
@@ -355,13 +415,37 @@ defmodule Get do
           tags: [String.t()]
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Get.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Get.description"}
+
+  def decode_parameters(value) when is_list(value), do: value
+  def decode_parameters(_), do: {:error, "Unexpected type when decoding Get.parameters"}
+
+  def encode_parameters(value) when is_list(value), do: value
+  def encode_parameters(_), do: {:error, "Unexpected type when encoding Get.parameters"}
+
+  def decode_summary(value) when is_binary(value), do: value
+  def decode_summary(_), do: {:error, "Unexpected type when decoding Get.summary"}
+
+  def encode_summary(value) when is_binary(value), do: value
+  def encode_summary(_), do: {:error, "Unexpected type when encoding Get.summary"}
+
+  def decode_tags(value) when is_list(value), do: value
+  def decode_tags(_), do: {:error, "Unexpected type when decoding Get.tags"}
+
+  def encode_tags(value) when is_list(value), do: value
+  def encode_tags(_), do: {:error, "Unexpected type when encoding Get.tags"}
+
   def from_map(m) do
     %Get{
-      description: m["description"],
+      description: decode_description(m["description"]),
       parameters: Enum.map(m["parameters"], &Parameter.from_map/1),
       responses: Responses.from_map(m["responses"]),
-      summary: m["summary"],
-      tags: m["tags"],
+      summary: decode_summary(m["summary"]),
+      tags: decode_tags(m["tags"]),
     }
   end
 
@@ -469,16 +553,46 @@ defmodule TopLevel do
           swagger: String.t()
         }
 
+  def decode_base_path(value) when is_binary(value), do: value
+  def decode_base_path(_), do: {:error, "Unexpected type when decoding TopLevel.base_path"}
+
+  def encode_base_path(value) when is_binary(value), do: value
+  def encode_base_path(_), do: {:error, "Unexpected type when encoding TopLevel.base_path"}
+
+  def decode_host(value) when is_binary(value), do: value
+  def decode_host(_), do: {:error, "Unexpected type when decoding TopLevel.host"}
+
+  def encode_host(value) when is_binary(value), do: value
+  def encode_host(_), do: {:error, "Unexpected type when encoding TopLevel.host"}
+
+  def decode_produces(value) when is_list(value), do: value
+  def decode_produces(_), do: {:error, "Unexpected type when decoding TopLevel.produces"}
+
+  def encode_produces(value) when is_list(value), do: value
+  def encode_produces(_), do: {:error, "Unexpected type when encoding TopLevel.produces"}
+
+  def decode_schemes(value) when is_list(value), do: value
+  def decode_schemes(_), do: {:error, "Unexpected type when decoding TopLevel.schemes"}
+
+  def encode_schemes(value) when is_list(value), do: value
+  def encode_schemes(_), do: {:error, "Unexpected type when encoding TopLevel.schemes"}
+
+  def decode_swagger(value) when is_binary(value), do: value
+  def decode_swagger(_), do: {:error, "Unexpected type when decoding TopLevel.swagger"}
+
+  def encode_swagger(value) when is_binary(value), do: value
+  def encode_swagger(_), do: {:error, "Unexpected type when encoding TopLevel.swagger"}
+
   def from_map(m) do
     %TopLevel{
-      base_path: m["basePath"],
+      base_path: decode_base_path(m["basePath"]),
       definitions: Definitions.from_map(m["definitions"]),
-      host: m["host"],
+      host: decode_host(m["host"]),
       info: Info.from_map(m["info"]),
       paths: Paths.from_map(m["paths"]),
-      produces: m["produces"],
-      schemes: m["schemes"],
-      swagger: m["swagger"],
+      produces: decode_produces(m["produces"]),
+      schemes: decode_schemes(m["schemes"]),
+      swagger: decode_swagger(m["swagger"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/010b1.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/010b1.json/default/QuickType.ex
index 193f7cc..81e4144 100644
--- a/base/elixir/test/inputs/json/misc/010b1.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/010b1.json/default/QuickType.ex
@@ -63,14 +63,44 @@ defmodule TopLevelElement do
           year: integer()
         }
 
+  def decode_age(value) when is_integer(value), do: value
+  def decode_age(_), do: {:error, "Unexpected type when decoding TopLevelElement.age"}
+
+  def encode_age(value) when is_integer(value), do: value
+  def encode_age(_), do: {:error, "Unexpected type when encoding TopLevelElement.age"}
+
+  def decode_females(value) when is_integer(value), do: value
+  def decode_females(_), do: {:error, "Unexpected type when decoding TopLevelElement.females"}
+
+  def encode_females(value) when is_integer(value), do: value
+  def encode_females(_), do: {:error, "Unexpected type when encoding TopLevelElement.females"}
+
+  def decode_males(value) when is_integer(value), do: value
+  def decode_males(_), do: {:error, "Unexpected type when decoding TopLevelElement.males"}
+
+  def encode_males(value) when is_integer(value), do: value
+  def encode_males(_), do: {:error, "Unexpected type when encoding TopLevelElement.males"}
+
+  def decode_total(value) when is_integer(value), do: value
+  def decode_total(_), do: {:error, "Unexpected type when decoding TopLevelElement.total"}
+
+  def encode_total(value) when is_integer(value), do: value
+  def encode_total(_), do: {:error, "Unexpected type when encoding TopLevelElement.total"}
+
+  def decode_year(value) when is_integer(value), do: value
+  def decode_year(_), do: {:error, "Unexpected type when decoding TopLevelElement.year"}
+
+  def encode_year(value) when is_integer(value), do: value
+  def encode_year(_), do: {:error, "Unexpected type when encoding TopLevelElement.year"}
+
   def from_map(m) do
     %TopLevelElement{
-      age: m["age"],
+      age: decode_age(m["age"]),
       country: Country.decode(m["country"]),
-      females: m["females"],
-      males: m["males"],
-      total: m["total"],
-      year: m["year"],
+      females: decode_females(m["females"]),
+      males: decode_males(m["males"]),
+      total: decode_total(m["total"]),
+      year: decode_year(m["year"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/016af.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/016af.json/default/QuickType.ex
index bf47bf0..b805b08 100644
--- a/base/elixir/test/inputs/json/misc/016af.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/016af.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule TotalPopulation do
           population: integer()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TotalPopulation.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TotalPopulation.date"}
+
+  def decode_population(value) when is_integer(value), do: value
+  def decode_population(_), do: {:error, "Unexpected type when decoding TotalPopulation.population"}
+
+  def encode_population(value) when is_integer(value), do: value
+  def encode_population(_), do: {:error, "Unexpected type when encoding TotalPopulation.population"}
+
   def from_map(m) do
     %TotalPopulation{
-      date: m["date"],
-      population: m["population"],
+      date: decode_date(m["date"]),
+      population: decode_population(m["population"]),
     }
   end
 
@@ -49,6 +61,12 @@ defmodule TopLevel do
           total_population: [TotalPopulation.t()]
         }
 
+  def decode_total_population(value) when is_list(value), do: value
+  def decode_total_population(_), do: {:error, "Unexpected type when decoding TopLevel.total_population"}
+
+  def encode_total_population(value) when is_list(value), do: value
+  def encode_total_population(_), do: {:error, "Unexpected type when encoding TopLevel.total_population"}
+
   def from_map(m) do
     %TopLevel{
       total_population: Enum.map(m["total_population"], &TotalPopulation.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/033b1.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/033b1.json/default/QuickType.ex
index 8937606..db497b1 100644
--- a/base/elixir/test/inputs/json/misc/033b1.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/033b1.json/default/QuickType.ex
@@ -15,11 +15,32 @@ defmodule TopLevel do
           rates: %{String.t() => float()}
         }
 
+  def decode_base(value) when is_binary(value), do: value
+  def decode_base(_), do: {:error, "Unexpected type when decoding TopLevel.base"}
+
+  def encode_base(value) when is_binary(value), do: value
+  def encode_base(_), do: {:error, "Unexpected type when encoding TopLevel.base"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel.date"}
+
+  def decode_rates_value(value) when is_float(value), do: value
+  def decode_rates_value(value) when is_integer(value), do: value
+  def decode_rates_value(_), do: {:error, "Unexpected type when decoding TopLevel.rates"}
+
+  def encode_rates_value(value) when is_float(value), do: value
+  def encode_rates_value(value) when is_integer(value), do: value
+  def encode_rates_value(_), do: {:error, "Unexpected type when encoding TopLevel.rates"}
+
   def from_map(m) do
     %TopLevel{
-      base: m["base"],
-      date: m["date"],
-      rates: m["rates"],
+      base: decode_base(m["base"]),
+      date: decode_date(m["date"]),
+      rates: m["rates"]
+      |> Map.new(fn {key, value} -> {key, decode_rates_value(value)} end),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/050b0.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/050b0.json/default/QuickType.ex
index 56e0770..4dec19b 100644
--- a/base/elixir/test/inputs/json/misc/050b0.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/050b0.json/default/QuickType.ex
@@ -61,9 +61,15 @@ defmodule Identifier do
           scheme: Scheme.t()
         }
 
+  def decode_identifier(value) when is_binary(value), do: value
+  def decode_identifier(_), do: {:error, "Unexpected type when decoding Identifier.identifier"}
+
+  def encode_identifier(value) when is_binary(value), do: value
+  def encode_identifier(_), do: {:error, "Unexpected type when encoding Identifier.identifier"}
+
   def from_map(m) do
     %Identifier{
-      identifier: m["identifier"],
+      identifier: decode_identifier(m["identifier"]),
       scheme: Scheme.decode(m["scheme"]),
     }
   end
@@ -194,10 +200,16 @@ defmodule Link do
           url: String.t()
         }
 
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Link.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Link.url"}
+
   def from_map(m) do
     %Link{
       note: Note.decode(m["note"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
     }
   end
 
@@ -230,9 +242,15 @@ defmodule OtherName do
           note: nil | String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding OtherName.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding OtherName.name"}
+
   def from_map(m) do
     %OtherName{
-      name: m["name"],
+      name: decode_name(m["name"]),
       note: m["note"],
     }
   end
@@ -359,11 +377,17 @@ defmodule Text do
           url: String.t()
         }
 
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Text.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Text.url"}
+
   def from_map(m) do
     %Text{
       media_type: MediaType.decode(m["media_type"]),
       title: Title.decode(m["title"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
     }
   end
 
@@ -403,13 +427,55 @@ defmodule TopLevelElement do
           text: [Text.t()]
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_identifiers(value) when is_list(value), do: value
+  def decode_identifiers(_), do: {:error, "Unexpected type when decoding TopLevelElement.identifiers"}
+
+  def encode_identifiers(value) when is_list(value), do: value
+  def encode_identifiers(_), do: {:error, "Unexpected type when encoding TopLevelElement.identifiers"}
+
+  def decode_keywords(value) when is_list(value), do: value
+  def decode_keywords(_), do: {:error, "Unexpected type when decoding TopLevelElement.keywords"}
+
+  def encode_keywords(value) when is_list(value), do: value
+  def encode_keywords(_), do: {:error, "Unexpected type when encoding TopLevelElement.keywords"}
+
+  def decode_links(value) when is_list(value), do: value
+  def decode_links(_), do: {:error, "Unexpected type when decoding TopLevelElement.links"}
+
+  def encode_links(value) when is_list(value), do: value
+  def encode_links(_), do: {:error, "Unexpected type when encoding TopLevelElement.links"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.name"}
+
+  def decode_other_names(value) when is_list(value), do: value
+  def decode_other_names(_), do: {:error, "Unexpected type when decoding TopLevelElement.other_names"}
+
+  def encode_other_names(value) when is_list(value), do: value
+  def encode_other_names(_), do: {:error, "Unexpected type when encoding TopLevelElement.other_names"}
+
+  def decode_text(value) when is_list(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding TopLevelElement.text"}
+
+  def encode_text(value) when is_list(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding TopLevelElement.text"}
+
   def from_map(m) do
     %TopLevelElement{
-      id: m["id"],
+      id: decode_id(m["id"]),
       identifiers: Enum.map(m["identifiers"], &Identifier.from_map/1),
       keywords: Enum.map(m["keywords"], &KeywordElement.decode/1),
       links: Enum.map(m["links"], &Link.from_map/1),
-      name: m["name"],
+      name: decode_name(m["name"]),
       other_names: Enum.map(m["other_names"], &OtherName.from_map/1),
       superseded_by: m["superseded_by"],
       text: Enum.map(m["text"], &Text.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/06bee.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/06bee.json/default/QuickType.ex
index 59ed95f..5ad7ab3 100644
--- a/base/elixir/test/inputs/json/misc/06bee.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/06bee.json/default/QuickType.ex
@@ -61,9 +61,15 @@ defmodule Identifier do
           scheme: Scheme.t()
         }
 
+  def decode_identifier(value) when is_binary(value), do: value
+  def decode_identifier(_), do: {:error, "Unexpected type when decoding Identifier.identifier"}
+
+  def encode_identifier(value) when is_binary(value), do: value
+  def encode_identifier(_), do: {:error, "Unexpected type when encoding Identifier.identifier"}
+
   def from_map(m) do
     %Identifier{
-      identifier: m["identifier"],
+      identifier: decode_identifier(m["identifier"]),
       scheme: Scheme.decode(m["scheme"]),
     }
   end
@@ -189,10 +195,16 @@ defmodule Link do
           url: String.t()
         }
 
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Link.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Link.url"}
+
   def from_map(m) do
     %Link{
       note: Note.decode(m["note"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
     }
   end
 
@@ -316,11 +328,17 @@ defmodule Text do
           url: String.t()
         }
 
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Text.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Text.url"}
+
   def from_map(m) do
     %Text{
       media_type: MediaType.decode(m["media_type"]),
       title: Title.decode(m["title"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
     }
   end
 
@@ -360,15 +378,63 @@ defmodule TopLevelElement do
           text: [Text.t()]
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_identifiers(value) when is_list(value), do: value
+  def decode_identifiers(_), do: {:error, "Unexpected type when decoding TopLevelElement.identifiers"}
+
+  def encode_identifiers(value) when is_list(value), do: value
+  def encode_identifiers(_), do: {:error, "Unexpected type when encoding TopLevelElement.identifiers"}
+
+  def decode_keywords(value) when is_list(value), do: value
+  def decode_keywords(_), do: {:error, "Unexpected type when decoding TopLevelElement.keywords"}
+
+  def encode_keywords(value) when is_list(value), do: value
+  def encode_keywords(_), do: {:error, "Unexpected type when encoding TopLevelElement.keywords"}
+
+  def decode_links(value) when is_list(value), do: value
+  def decode_links(_), do: {:error, "Unexpected type when decoding TopLevelElement.links"}
+
+  def encode_links(value) when is_list(value), do: value
+  def encode_links(_), do: {:error, "Unexpected type when encoding TopLevelElement.links"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.name"}
+
+  def decode_other_names(value) when is_list(value), do: value
+  def decode_other_names(_), do: {:error, "Unexpected type when decoding TopLevelElement.other_names"}
+
+  def encode_other_names(value) when is_list(value), do: value
+  def encode_other_names(_), do: {:error, "Unexpected type when encoding TopLevelElement.other_names"}
+
+  def decode_superseded_by(value) when is_nil(value), do: value
+  def decode_superseded_by(_), do: {:error, "Unexpected type when decoding TopLevelElement.superseded_by"}
+
+  def encode_superseded_by(value) when is_nil(value), do: value
+  def encode_superseded_by(_), do: {:error, "Unexpected type when encoding TopLevelElement.superseded_by"}
+
+  def decode_text(value) when is_list(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding TopLevelElement.text"}
+
+  def encode_text(value) when is_list(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding TopLevelElement.text"}
+
   def from_map(m) do
     %TopLevelElement{
-      id: m["id"],
+      id: decode_id(m["id"]),
       identifiers: Enum.map(m["identifiers"], &Identifier.from_map/1),
       keywords: Enum.map(m["keywords"], &KeywordElement.decode/1),
       links: Enum.map(m["links"], &Link.from_map/1),
-      name: m["name"],
-      other_names: m["other_names"],
-      superseded_by: m["superseded_by"],
+      name: decode_name(m["name"]),
+      other_names: decode_other_names(m["other_names"]),
+      superseded_by: decode_superseded_by(m["superseded_by"]),
       text: Enum.map(m["text"], &Text.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/0779f.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/0779f.json/default/QuickType.ex
index b9f86f4..e9a4777 100644
--- a/base/elixir/test/inputs/json/misc/0779f.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/0779f.json/default/QuickType.ex
@@ -21,17 +21,71 @@ defmodule Status do
           type: String.t()
         }
 
+  def decode_avg_delay(value) when is_binary(value), do: value
+  def decode_avg_delay(_), do: {:error, "Unexpected type when decoding Status.avg_delay"}
+
+  def encode_avg_delay(value) when is_binary(value), do: value
+  def encode_avg_delay(_), do: {:error, "Unexpected type when encoding Status.avg_delay"}
+
+  def decode_closure_begin(value) when is_binary(value), do: value
+  def decode_closure_begin(_), do: {:error, "Unexpected type when decoding Status.closure_begin"}
+
+  def encode_closure_begin(value) when is_binary(value), do: value
+  def encode_closure_begin(_), do: {:error, "Unexpected type when encoding Status.closure_begin"}
+
+  def decode_closure_end(value) when is_binary(value), do: value
+  def decode_closure_end(_), do: {:error, "Unexpected type when decoding Status.closure_end"}
+
+  def encode_closure_end(value) when is_binary(value), do: value
+  def encode_closure_end(_), do: {:error, "Unexpected type when encoding Status.closure_end"}
+
+  def decode_end_time(value) when is_binary(value), do: value
+  def decode_end_time(_), do: {:error, "Unexpected type when decoding Status.end_time"}
+
+  def encode_end_time(value) when is_binary(value), do: value
+  def encode_end_time(_), do: {:error, "Unexpected type when encoding Status.end_time"}
+
+  def decode_max_delay(value) when is_binary(value), do: value
+  def decode_max_delay(_), do: {:error, "Unexpected type when decoding Status.max_delay"}
+
+  def encode_max_delay(value) when is_binary(value), do: value
+  def encode_max_delay(_), do: {:error, "Unexpected type when encoding Status.max_delay"}
+
+  def decode_min_delay(value) when is_binary(value), do: value
+  def decode_min_delay(_), do: {:error, "Unexpected type when decoding Status.min_delay"}
+
+  def encode_min_delay(value) when is_binary(value), do: value
+  def encode_min_delay(_), do: {:error, "Unexpected type when encoding Status.min_delay"}
+
+  def decode_reason(value) when is_binary(value), do: value
+  def decode_reason(_), do: {:error, "Unexpected type when decoding Status.reason"}
+
+  def encode_reason(value) when is_binary(value), do: value
+  def encode_reason(_), do: {:error, "Unexpected type when encoding Status.reason"}
+
+  def decode_trend(value) when is_binary(value), do: value
+  def decode_trend(_), do: {:error, "Unexpected type when decoding Status.trend"}
+
+  def encode_trend(value) when is_binary(value), do: value
+  def encode_trend(_), do: {:error, "Unexpected type when encoding Status.trend"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Status.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Status.type"}
+
   def from_map(m) do
     %Status{
-      avg_delay: m["avgDelay"],
-      closure_begin: m["closureBegin"],
-      closure_end: m["closureEnd"],
-      end_time: m["endTime"],
-      max_delay: m["maxDelay"],
-      min_delay: m["minDelay"],
-      reason: m["reason"],
-      trend: m["trend"],
-      type: m["type"],
+      avg_delay: decode_avg_delay(m["avgDelay"]),
+      closure_begin: decode_closure_begin(m["closureBegin"]),
+      closure_end: decode_closure_end(m["closureEnd"]),
+      end_time: decode_end_time(m["endTime"]),
+      max_delay: decode_max_delay(m["maxDelay"]),
+      min_delay: decode_min_delay(m["minDelay"]),
+      reason: decode_reason(m["reason"]),
+      trend: decode_trend(m["trend"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -72,11 +126,29 @@ defmodule Meta do
           url: String.t()
         }
 
+  def decode_credit(value) when is_binary(value), do: value
+  def decode_credit(_), do: {:error, "Unexpected type when decoding Meta.credit"}
+
+  def encode_credit(value) when is_binary(value), do: value
+  def encode_credit(_), do: {:error, "Unexpected type when encoding Meta.credit"}
+
+  def decode_updated(value) when is_binary(value), do: value
+  def decode_updated(_), do: {:error, "Unexpected type when decoding Meta.updated"}
+
+  def encode_updated(value) when is_binary(value), do: value
+  def encode_updated(_), do: {:error, "Unexpected type when encoding Meta.updated"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Meta.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Meta.url"}
+
   def from_map(m) do
     %Meta{
-      credit: m["credit"],
-      updated: m["updated"],
-      url: m["url"],
+      credit: decode_credit(m["credit"]),
+      updated: decode_updated(m["updated"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -113,13 +185,39 @@ defmodule Weather do
           wind: String.t()
         }
 
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Weather.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Weather.temp"}
+
+  def decode_visibility(value) when is_float(value), do: value
+  def decode_visibility(value) when is_integer(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Weather.visibility"}
+
+  def encode_visibility(value) when is_float(value), do: value
+  def encode_visibility(value) when is_integer(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Weather.visibility"}
+
+  def decode_weather(value) when is_binary(value), do: value
+  def decode_weather(_), do: {:error, "Unexpected type when decoding Weather.weather"}
+
+  def encode_weather(value) when is_binary(value), do: value
+  def encode_weather(_), do: {:error, "Unexpected type when encoding Weather.weather"}
+
+  def decode_wind(value) when is_binary(value), do: value
+  def decode_wind(_), do: {:error, "Unexpected type when decoding Weather.wind"}
+
+  def encode_wind(value) when is_binary(value), do: value
+  def encode_wind(_), do: {:error, "Unexpected type when encoding Weather.wind"}
+
   def from_map(m) do
     %Weather{
       meta: Meta.from_map(m["meta"]),
-      temp: m["temp"],
-      visibility: m["visibility"],
-      weather: m["weather"],
-      wind: m["wind"],
+      temp: decode_temp(m["temp"]),
+      visibility: decode_visibility(m["visibility"]),
+      weather: decode_weather(m["weather"]),
+      wind: decode_wind(m["wind"]),
     }
   end
 
@@ -161,14 +259,50 @@ defmodule TopLevel do
           weather: Weather.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding TopLevel.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding TopLevel.city"}
+
+  def decode_delay(value) when is_binary(value), do: value
+  def decode_delay(_), do: {:error, "Unexpected type when decoding TopLevel.delay"}
+
+  def encode_delay(value) when is_binary(value), do: value
+  def encode_delay(_), do: {:error, "Unexpected type when encoding TopLevel.delay"}
+
+  def decode_iata(value) when is_binary(value), do: value
+  def decode_iata(_), do: {:error, "Unexpected type when decoding TopLevel.iata"}
+
+  def encode_iata(value) when is_binary(value), do: value
+  def encode_iata(_), do: {:error, "Unexpected type when encoding TopLevel.iata"}
+
+  def decode_icao(value) when is_binary(value), do: value
+  def decode_icao(_), do: {:error, "Unexpected type when decoding TopLevel.icao"}
+
+  def encode_icao(value) when is_binary(value), do: value
+  def encode_icao(_), do: {:error, "Unexpected type when encoding TopLevel.icao"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding TopLevel.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding TopLevel.state"}
+
   def from_map(m) do
     %TopLevel{
-      city: m["city"],
-      delay: m["delay"],
-      iata: m["IATA"],
-      icao: m["ICAO"],
-      name: m["name"],
-      state: m["state"],
+      city: decode_city(m["city"]),
+      delay: decode_delay(m["delay"]),
+      iata: decode_iata(m["IATA"]),
+      icao: decode_icao(m["ICAO"]),
+      name: decode_name(m["name"]),
+      state: decode_state(m["state"]),
       status: Status.from_map(m["status"]),
       weather: Weather.from_map(m["weather"]),
     }
diff --git a/base/elixir/test/inputs/json/misc/07c75.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/07c75.json/default/QuickType.ex
index a99b8db..7687ff3 100644
--- a/base/elixir/test/inputs/json/misc/07c75.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/07c75.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Identifier do
           scheme: String.t()
         }
 
+  def decode_identifier(value) when is_binary(value), do: value
+  def decode_identifier(_), do: {:error, "Unexpected type when decoding Identifier.identifier"}
+
+  def encode_identifier(value) when is_binary(value), do: value
+  def encode_identifier(_), do: {:error, "Unexpected type when encoding Identifier.identifier"}
+
+  def decode_scheme(value) when is_binary(value), do: value
+  def decode_scheme(_), do: {:error, "Unexpected type when decoding Identifier.scheme"}
+
+  def encode_scheme(value) when is_binary(value), do: value
+  def encode_scheme(_), do: {:error, "Unexpected type when encoding Identifier.scheme"}
+
   def from_map(m) do
     %Identifier{
-      identifier: m["identifier"],
-      scheme: m["scheme"],
+      identifier: decode_identifier(m["identifier"]),
+      scheme: decode_scheme(m["scheme"]),
     }
   end
 
@@ -50,10 +62,22 @@ defmodule Link do
           url: String.t()
         }
 
+  def decode_note(value) when is_binary(value), do: value
+  def decode_note(_), do: {:error, "Unexpected type when decoding Link.note"}
+
+  def encode_note(value) when is_binary(value), do: value
+  def encode_note(_), do: {:error, "Unexpected type when encoding Link.note"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Link.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Link.url"}
+
   def from_map(m) do
     %Link{
-      note: m["note"],
-      url: m["url"],
+      note: decode_note(m["note"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -87,11 +111,29 @@ defmodule Text do
           url: String.t()
         }
 
+  def decode_media_type(value) when is_binary(value), do: value
+  def decode_media_type(_), do: {:error, "Unexpected type when decoding Text.media_type"}
+
+  def encode_media_type(value) when is_binary(value), do: value
+  def encode_media_type(_), do: {:error, "Unexpected type when encoding Text.media_type"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Text.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Text.title"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Text.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Text.url"}
+
   def from_map(m) do
     %Text{
-      media_type: m["media_type"],
-      title: m["title"],
-      url: m["url"],
+      media_type: decode_media_type(m["media_type"]),
+      title: decode_title(m["title"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -131,15 +173,63 @@ defmodule TopLevelElement do
           text: [Text.t()]
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_identifiers(value) when is_list(value), do: value
+  def decode_identifiers(_), do: {:error, "Unexpected type when decoding TopLevelElement.identifiers"}
+
+  def encode_identifiers(value) when is_list(value), do: value
+  def encode_identifiers(_), do: {:error, "Unexpected type when encoding TopLevelElement.identifiers"}
+
+  def decode_keywords(value) when is_list(value), do: value
+  def decode_keywords(_), do: {:error, "Unexpected type when decoding TopLevelElement.keywords"}
+
+  def encode_keywords(value) when is_list(value), do: value
+  def encode_keywords(_), do: {:error, "Unexpected type when encoding TopLevelElement.keywords"}
+
+  def decode_links(value) when is_list(value), do: value
+  def decode_links(_), do: {:error, "Unexpected type when decoding TopLevelElement.links"}
+
+  def encode_links(value) when is_list(value), do: value
+  def encode_links(_), do: {:error, "Unexpected type when encoding TopLevelElement.links"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.name"}
+
+  def decode_other_names(value) when is_list(value), do: value
+  def decode_other_names(_), do: {:error, "Unexpected type when decoding TopLevelElement.other_names"}
+
+  def encode_other_names(value) when is_list(value), do: value
+  def encode_other_names(_), do: {:error, "Unexpected type when encoding TopLevelElement.other_names"}
+
+  def decode_superseded_by(value) when is_nil(value), do: value
+  def decode_superseded_by(_), do: {:error, "Unexpected type when decoding TopLevelElement.superseded_by"}
+
+  def encode_superseded_by(value) when is_nil(value), do: value
+  def encode_superseded_by(_), do: {:error, "Unexpected type when encoding TopLevelElement.superseded_by"}
+
+  def decode_text(value) when is_list(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding TopLevelElement.text"}
+
+  def encode_text(value) when is_list(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding TopLevelElement.text"}
+
   def from_map(m) do
     %TopLevelElement{
-      id: m["id"],
+      id: decode_id(m["id"]),
       identifiers: Enum.map(m["identifiers"], &Identifier.from_map/1),
-      keywords: m["keywords"],
+      keywords: decode_keywords(m["keywords"]),
       links: Enum.map(m["links"], &Link.from_map/1),
-      name: m["name"],
-      other_names: m["other_names"],
-      superseded_by: m["superseded_by"],
+      name: decode_name(m["name"]),
+      other_names: decode_other_names(m["other_names"]),
+      superseded_by: decode_superseded_by(m["superseded_by"]),
       text: Enum.map(m["text"], &Text.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/09f54.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/09f54.json/default/QuickType.ex
index e9923e5..bc204fb 100644
--- a/base/elixir/test/inputs/json/misc/09f54.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/09f54.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Datum do
           value: String.t()
         }
 
+  def decode_anomaly(value) when is_binary(value), do: value
+  def decode_anomaly(_), do: {:error, "Unexpected type when decoding Datum.anomaly"}
+
+  def encode_anomaly(value) when is_binary(value), do: value
+  def encode_anomaly(_), do: {:error, "Unexpected type when encoding Datum.anomaly"}
+
+  def decode_value(value) when is_binary(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding Datum.value"}
+
+  def encode_value(value) when is_binary(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding Datum.value"}
+
   def from_map(m) do
     %Datum{
-      anomaly: m["anomaly"],
-      value: m["value"],
+      anomaly: decode_anomaly(m["anomaly"]),
+      value: decode_value(m["value"]),
     }
   end
 
@@ -52,12 +64,36 @@ defmodule Description do
           units: String.t()
         }
 
+  def decode_base_period(value) when is_binary(value), do: value
+  def decode_base_period(_), do: {:error, "Unexpected type when decoding Description.base_period"}
+
+  def encode_base_period(value) when is_binary(value), do: value
+  def encode_base_period(_), do: {:error, "Unexpected type when encoding Description.base_period"}
+
+  def decode_missing(value) when is_integer(value), do: value
+  def decode_missing(_), do: {:error, "Unexpected type when decoding Description.missing"}
+
+  def encode_missing(value) when is_integer(value), do: value
+  def encode_missing(_), do: {:error, "Unexpected type when encoding Description.missing"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Description.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Description.title"}
+
+  def decode_units(value) when is_binary(value), do: value
+  def decode_units(_), do: {:error, "Unexpected type when decoding Description.units"}
+
+  def encode_units(value) when is_binary(value), do: value
+  def encode_units(_), do: {:error, "Unexpected type when encoding Description.units"}
+
   def from_map(m) do
     %Description{
-      base_period: m["base_period"],
-      missing: m["missing"],
-      title: m["title"],
-      units: m["units"],
+      base_period: decode_base_period(m["base_period"]),
+      missing: decode_missing(m["missing"]),
+      title: decode_title(m["title"]),
+      units: decode_units(m["units"]),
     }
   end
 
@@ -94,7 +130,8 @@ defmodule TopLevel do
 
   def from_map(m) do
     %TopLevel{
-      data: m["data"],
+      data: m["data"]
+      |> Map.new(fn {key, value} -> {key, Datum.from_map(value)} end),
       description: Description.from_map(m["description"]),
     }
   end
@@ -107,7 +144,8 @@ defmodule TopLevel do
 
   def to_map(struct) do
     %{
-      "data" => struct.data,
+      "data" => struct.data
+      |> Map.new(fn {key, value} -> {key, Datum.to_map(value)} end),
       "description" => Description.to_map(struct.description),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/0a358.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/0a358.json/default/QuickType.ex
index d538b14..dcebd1a 100644
--- a/base/elixir/test/inputs/json/misc/0a358.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/0a358.json/default/QuickType.ex
@@ -47,14 +47,50 @@ defmodule Result do
           uri: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Result.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Result.code"}
+
+  def decode_created_at(value) when is_binary(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding Result.created_at"}
+
+  def encode_created_at(value) when is_binary(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding Result.created_at"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Result.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Result.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Result.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Result.name"}
+
+  def decode_updated_at(value) when is_binary(value), do: value
+  def decode_updated_at(_), do: {:error, "Unexpected type when decoding Result.updated_at"}
+
+  def encode_updated_at(value) when is_binary(value), do: value
+  def encode_updated_at(_), do: {:error, "Unexpected type when encoding Result.updated_at"}
+
+  def decode_uri(value) when is_binary(value), do: value
+  def decode_uri(_), do: {:error, "Unexpected type when decoding Result.uri"}
+
+  def encode_uri(value) when is_binary(value), do: value
+  def encode_uri(_), do: {:error, "Unexpected type when encoding Result.uri"}
+
   def from_map(m) do
     %Result{
-      code: m["code"],
-      created_at: m["created_at"],
-      id: m["id"],
-      name: m["name"],
-      updated_at: m["updated_at"],
-      uri: m["uri"],
+      code: decode_code(m["code"]),
+      created_at: decode_created_at(m["created_at"]),
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
+      updated_at: decode_updated_at(m["updated_at"]),
+      uri: decode_uri(m["uri"]),
     }
   end
 
@@ -96,14 +132,50 @@ defmodule TopLevel do
           results: [Result.t()]
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding TopLevel.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding TopLevel.count"}
+
+  def decode_limit(value) when is_integer(value), do: value
+  def decode_limit(_), do: {:error, "Unexpected type when decoding TopLevel.limit"}
+
+  def encode_limit(value) when is_integer(value), do: value
+  def encode_limit(_), do: {:error, "Unexpected type when encoding TopLevel.limit"}
+
+  def decode_next(value) when is_binary(value), do: value
+  def decode_next(_), do: {:error, "Unexpected type when decoding TopLevel.next"}
+
+  def encode_next(value) when is_binary(value), do: value
+  def encode_next(_), do: {:error, "Unexpected type when encoding TopLevel.next"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding TopLevel.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding TopLevel.offset"}
+
+  def decode_previous(value) when is_boolean(value), do: value
+  def decode_previous(_), do: {:error, "Unexpected type when decoding TopLevel.previous"}
+
+  def encode_previous(value) when is_boolean(value), do: value
+  def encode_previous(_), do: {:error, "Unexpected type when encoding TopLevel.previous"}
+
+  def decode_results(value) when is_list(value), do: value
+  def decode_results(_), do: {:error, "Unexpected type when decoding TopLevel.results"}
+
+  def encode_results(value) when is_list(value), do: value
+  def encode_results(_), do: {:error, "Unexpected type when encoding TopLevel.results"}
+
   def from_map(m) do
     %TopLevel{
-      count: m["count"],
+      count: decode_count(m["count"]),
       facets: Facets.from_map(m["facets"]),
-      limit: m["limit"],
-      next: m["next"],
-      offset: m["offset"],
-      previous: m["previous"],
+      limit: decode_limit(m["limit"]),
+      next: decode_next(m["next"]),
+      offset: decode_offset(m["offset"]),
+      previous: decode_previous(m["previous"]),
       results: Enum.map(m["results"], &Result.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/0a91a.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/0a91a.json/default/QuickType.ex
index 11a8d36..107aa35 100644
--- a/base/elixir/test/inputs/json/misc/0a91a.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/0a91a.json/default/QuickType.ex
@@ -18,14 +18,44 @@ defmodule Actor do
           url: String.t()
         }
 
+  def decode_avatar_url(value) when is_binary(value), do: value
+  def decode_avatar_url(_), do: {:error, "Unexpected type when decoding Actor.avatar_url"}
+
+  def encode_avatar_url(value) when is_binary(value), do: value
+  def encode_avatar_url(_), do: {:error, "Unexpected type when encoding Actor.avatar_url"}
+
+  def decode_gravatar_id(value) when is_binary(value), do: value
+  def decode_gravatar_id(_), do: {:error, "Unexpected type when decoding Actor.gravatar_id"}
+
+  def encode_gravatar_id(value) when is_binary(value), do: value
+  def encode_gravatar_id(_), do: {:error, "Unexpected type when encoding Actor.gravatar_id"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Actor.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Actor.id"}
+
+  def decode_login(value) when is_binary(value), do: value
+  def decode_login(_), do: {:error, "Unexpected type when decoding Actor.login"}
+
+  def encode_login(value) when is_binary(value), do: value
+  def encode_login(_), do: {:error, "Unexpected type when encoding Actor.login"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Actor.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Actor.url"}
+
   def from_map(m) do
     %Actor{
-      avatar_url: m["avatar_url"],
+      avatar_url: decode_avatar_url(m["avatar_url"]),
       display_login: m["display_login"],
-      gravatar_id: m["gravatar_id"],
-      id: m["id"],
-      login: m["login"],
-      url: m["url"],
+      gravatar_id: decode_gravatar_id(m["gravatar_id"]),
+      id: decode_id(m["id"]),
+      login: decode_login(m["login"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -62,10 +92,22 @@ defmodule Author do
           name: String.t()
         }
 
+  def decode_email(value) when is_binary(value), do: value
+  def decode_email(_), do: {:error, "Unexpected type when decoding Author.email"}
+
+  def encode_email(value) when is_binary(value), do: value
+  def encode_email(_), do: {:error, "Unexpected type when encoding Author.email"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Author.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Author.name"}
+
   def from_map(m) do
     %Author{
-      email: m["email"],
-      name: m["name"],
+      email: decode_email(m["email"]),
+      name: decode_name(m["name"]),
     }
   end
 
@@ -101,13 +143,37 @@ defmodule Commit do
           url: String.t()
         }
 
+  def decode_distinct(value) when is_boolean(value), do: value
+  def decode_distinct(_), do: {:error, "Unexpected type when decoding Commit.distinct"}
+
+  def encode_distinct(value) when is_boolean(value), do: value
+  def encode_distinct(_), do: {:error, "Unexpected type when encoding Commit.distinct"}
+
+  def decode_message(value) when is_binary(value), do: value
+  def decode_message(_), do: {:error, "Unexpected type when decoding Commit.message"}
+
+  def encode_message(value) when is_binary(value), do: value
+  def encode_message(_), do: {:error, "Unexpected type when encoding Commit.message"}
+
+  def decode_sha(value) when is_binary(value), do: value
+  def decode_sha(_), do: {:error, "Unexpected type when decoding Commit.sha"}
+
+  def encode_sha(value) when is_binary(value), do: value
+  def encode_sha(_), do: {:error, "Unexpected type when encoding Commit.sha"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Commit.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Commit.url"}
+
   def from_map(m) do
     %Commit{
       author: Author.from_map(m["author"]),
-      distinct: m["distinct"],
-      message: m["message"],
-      sha: m["sha"],
-      url: m["url"],
+      distinct: decode_distinct(m["distinct"]),
+      message: decode_message(m["message"]),
+      sha: decode_sha(m["sha"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -158,25 +224,127 @@ defmodule MergedBy do
           url: String.t()
         }
 
+  def decode_avatar_url(value) when is_binary(value), do: value
+  def decode_avatar_url(_), do: {:error, "Unexpected type when decoding MergedBy.avatar_url"}
+
+  def encode_avatar_url(value) when is_binary(value), do: value
+  def encode_avatar_url(_), do: {:error, "Unexpected type when encoding MergedBy.avatar_url"}
+
+  def decode_events_url(value) when is_binary(value), do: value
+  def decode_events_url(_), do: {:error, "Unexpected type when decoding MergedBy.events_url"}
+
+  def encode_events_url(value) when is_binary(value), do: value
+  def encode_events_url(_), do: {:error, "Unexpected type when encoding MergedBy.events_url"}
+
+  def decode_followers_url(value) when is_binary(value), do: value
+  def decode_followers_url(_), do: {:error, "Unexpected type when decoding MergedBy.followers_url"}
+
+  def encode_followers_url(value) when is_binary(value), do: value
+  def encode_followers_url(_), do: {:error, "Unexpected type when encoding MergedBy.followers_url"}
+
+  def decode_following_url(value) when is_binary(value), do: value
+  def decode_following_url(_), do: {:error, "Unexpected type when decoding MergedBy.following_url"}
+
+  def encode_following_url(value) when is_binary(value), do: value
+  def encode_following_url(_), do: {:error, "Unexpected type when encoding MergedBy.following_url"}
+
+  def decode_gists_url(value) when is_binary(value), do: value
+  def decode_gists_url(_), do: {:error, "Unexpected type when decoding MergedBy.gists_url"}
+
+  def encode_gists_url(value) when is_binary(value), do: value
+  def encode_gists_url(_), do: {:error, "Unexpected type when encoding MergedBy.gists_url"}
+
+  def decode_gravatar_id(value) when is_binary(value), do: value
+  def decode_gravatar_id(_), do: {:error, "Unexpected type when decoding MergedBy.gravatar_id"}
+
+  def encode_gravatar_id(value) when is_binary(value), do: value
+  def encode_gravatar_id(_), do: {:error, "Unexpected type when encoding MergedBy.gravatar_id"}
+
+  def decode_html_url(value) when is_binary(value), do: value
+  def decode_html_url(_), do: {:error, "Unexpected type when decoding MergedBy.html_url"}
+
+  def encode_html_url(value) when is_binary(value), do: value
+  def encode_html_url(_), do: {:error, "Unexpected type when encoding MergedBy.html_url"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding MergedBy.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding MergedBy.id"}
+
+  def decode_login(value) when is_binary(value), do: value
+  def decode_login(_), do: {:error, "Unexpected type when decoding MergedBy.login"}
+
+  def encode_login(value) when is_binary(value), do: value
+  def encode_login(_), do: {:error, "Unexpected type when encoding MergedBy.login"}
+
+  def decode_organizations_url(value) when is_binary(value), do: value
+  def decode_organizations_url(_), do: {:error, "Unexpected type when decoding MergedBy.organizations_url"}
+
+  def encode_organizations_url(value) when is_binary(value), do: value
+  def encode_organizations_url(_), do: {:error, "Unexpected type when encoding MergedBy.organizations_url"}
+
+  def decode_received_events_url(value) when is_binary(value), do: value
+  def decode_received_events_url(_), do: {:error, "Unexpected type when decoding MergedBy.received_events_url"}
+
+  def encode_received_events_url(value) when is_binary(value), do: value
+  def encode_received_events_url(_), do: {:error, "Unexpected type when encoding MergedBy.received_events_url"}
+
+  def decode_repos_url(value) when is_binary(value), do: value
+  def decode_repos_url(_), do: {:error, "Unexpected type when decoding MergedBy.repos_url"}
+
+  def encode_repos_url(value) when is_binary(value), do: value
+  def encode_repos_url(_), do: {:error, "Unexpected type when encoding MergedBy.repos_url"}
+
+  def decode_site_admin(value) when is_boolean(value), do: value
+  def decode_site_admin(_), do: {:error, "Unexpected type when decoding MergedBy.site_admin"}
+
+  def encode_site_admin(value) when is_boolean(value), do: value
+  def encode_site_admin(_), do: {:error, "Unexpected type when encoding MergedBy.site_admin"}
+
+  def decode_starred_url(value) when is_binary(value), do: value
+  def decode_starred_url(_), do: {:error, "Unexpected type when decoding MergedBy.starred_url"}
+
+  def encode_starred_url(value) when is_binary(value), do: value
+  def encode_starred_url(_), do: {:error, "Unexpected type when encoding MergedBy.starred_url"}
+
+  def decode_subscriptions_url(value) when is_binary(value), do: value
+  def decode_subscriptions_url(_), do: {:error, "Unexpected type when decoding MergedBy.subscriptions_url"}
+
+  def encode_subscriptions_url(value) when is_binary(value), do: value
+  def encode_subscriptions_url(_), do: {:error, "Unexpected type when encoding MergedBy.subscriptions_url"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding MergedBy.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding MergedBy.type"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding MergedBy.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding MergedBy.url"}
+
   def from_map(m) do
     %MergedBy{
-      avatar_url: m["avatar_url"],
-      events_url: m["events_url"],
-      followers_url: m["followers_url"],
-      following_url: m["following_url"],
-      gists_url: m["gists_url"],
-      gravatar_id: m["gravatar_id"],
-      html_url: m["html_url"],
-      id: m["id"],
-      login: m["login"],
-      organizations_url: m["organizations_url"],
-      received_events_url: m["received_events_url"],
-      repos_url: m["repos_url"],
-      site_admin: m["site_admin"],
-      starred_url: m["starred_url"],
-      subscriptions_url: m["subscriptions_url"],
-      type: m["type"],
-      url: m["url"],
+      avatar_url: decode_avatar_url(m["avatar_url"]),
+      events_url: decode_events_url(m["events_url"]),
+      followers_url: decode_followers_url(m["followers_url"]),
+      following_url: decode_following_url(m["following_url"]),
+      gists_url: decode_gists_url(m["gists_url"]),
+      gravatar_id: decode_gravatar_id(m["gravatar_id"]),
+      html_url: decode_html_url(m["html_url"]),
+      id: decode_id(m["id"]),
+      login: decode_login(m["login"]),
+      organizations_url: decode_organizations_url(m["organizations_url"]),
+      received_events_url: decode_received_events_url(m["received_events_url"]),
+      repos_url: decode_repos_url(m["repos_url"]),
+      site_admin: decode_site_admin(m["site_admin"]),
+      starred_url: decode_starred_url(m["starred_url"]),
+      subscriptions_url: decode_subscriptions_url(m["subscriptions_url"]),
+      type: decode_type(m["type"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -291,77 +459,485 @@ defmodule BaseRepo do
           watchers_count: integer()
         }
 
+  def decode_archive_url(value) when is_binary(value), do: value
+  def decode_archive_url(_), do: {:error, "Unexpected type when decoding BaseRepo.archive_url"}
+
+  def encode_archive_url(value) when is_binary(value), do: value
+  def encode_archive_url(_), do: {:error, "Unexpected type when encoding BaseRepo.archive_url"}
+
+  def decode_assignees_url(value) when is_binary(value), do: value
+  def decode_assignees_url(_), do: {:error, "Unexpected type when decoding BaseRepo.assignees_url"}
+
+  def encode_assignees_url(value) when is_binary(value), do: value
+  def encode_assignees_url(_), do: {:error, "Unexpected type when encoding BaseRepo.assignees_url"}
+
+  def decode_blobs_url(value) when is_binary(value), do: value
+  def decode_blobs_url(_), do: {:error, "Unexpected type when decoding BaseRepo.blobs_url"}
+
+  def encode_blobs_url(value) when is_binary(value), do: value
+  def encode_blobs_url(_), do: {:error, "Unexpected type when encoding BaseRepo.blobs_url"}
+
+  def decode_branches_url(value) when is_binary(value), do: value
+  def decode_branches_url(_), do: {:error, "Unexpected type when decoding BaseRepo.branches_url"}
+
+  def encode_branches_url(value) when is_binary(value), do: value
+  def encode_branches_url(_), do: {:error, "Unexpected type when encoding BaseRepo.branches_url"}
+
+  def decode_clone_url(value) when is_binary(value), do: value
+  def decode_clone_url(_), do: {:error, "Unexpected type when decoding BaseRepo.clone_url"}
+
+  def encode_clone_url(value) when is_binary(value), do: value
+  def encode_clone_url(_), do: {:error, "Unexpected type when encoding BaseRepo.clone_url"}
+
+  def decode_collaborators_url(value) when is_binary(value), do: value
+  def decode_collaborators_url(_), do: {:error, "Unexpected type when decoding BaseRepo.collaborators_url"}
+
+  def encode_collaborators_url(value) when is_binary(value), do: value
+  def encode_collaborators_url(_), do: {:error, "Unexpected type when encoding BaseRepo.collaborators_url"}
+
+  def decode_comments_url(value) when is_binary(value), do: value
+  def decode_comments_url(_), do: {:error, "Unexpected type when decoding BaseRepo.comments_url"}
+
+  def encode_comments_url(value) when is_binary(value), do: value
+  def encode_comments_url(_), do: {:error, "Unexpected type when encoding BaseRepo.comments_url"}
+
+  def decode_commits_url(value) when is_binary(value), do: value
+  def decode_commits_url(_), do: {:error, "Unexpected type when decoding BaseRepo.commits_url"}
+
+  def encode_commits_url(value) when is_binary(value), do: value
+  def encode_commits_url(_), do: {:error, "Unexpected type when encoding BaseRepo.commits_url"}
+
+  def decode_compare_url(value) when is_binary(value), do: value
+  def decode_compare_url(_), do: {:error, "Unexpected type when decoding BaseRepo.compare_url"}
+
+  def encode_compare_url(value) when is_binary(value), do: value
+  def encode_compare_url(_), do: {:error, "Unexpected type when encoding BaseRepo.compare_url"}
+
+  def decode_contents_url(value) when is_binary(value), do: value
+  def decode_contents_url(_), do: {:error, "Unexpected type when decoding BaseRepo.contents_url"}
+
+  def encode_contents_url(value) when is_binary(value), do: value
+  def encode_contents_url(_), do: {:error, "Unexpected type when encoding BaseRepo.contents_url"}
+
+  def decode_contributors_url(value) when is_binary(value), do: value
+  def decode_contributors_url(_), do: {:error, "Unexpected type when decoding BaseRepo.contributors_url"}
+
+  def encode_contributors_url(value) when is_binary(value), do: value
+  def encode_contributors_url(_), do: {:error, "Unexpected type when encoding BaseRepo.contributors_url"}
+
+  def decode_created_at(value) when is_binary(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding BaseRepo.created_at"}
+
+  def encode_created_at(value) when is_binary(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding BaseRepo.created_at"}
+
+  def decode_default_branch(value) when is_binary(value), do: value
+  def decode_default_branch(_), do: {:error, "Unexpected type when decoding BaseRepo.default_branch"}
+
+  def encode_default_branch(value) when is_binary(value), do: value
+  def encode_default_branch(_), do: {:error, "Unexpected type when encoding BaseRepo.default_branch"}
+
+  def decode_deployments_url(value) when is_binary(value), do: value
+  def decode_deployments_url(_), do: {:error, "Unexpected type when decoding BaseRepo.deployments_url"}
+
+  def encode_deployments_url(value) when is_binary(value), do: value
+  def encode_deployments_url(_), do: {:error, "Unexpected type when encoding BaseRepo.deployments_url"}
+
+  def decode_description(value) when is_nil(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding BaseRepo.description"}
+
+  def encode_description(value) when is_nil(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding BaseRepo.description"}
+
+  def decode_downloads_url(value) when is_binary(value), do: value
+  def decode_downloads_url(_), do: {:error, "Unexpected type when decoding BaseRepo.downloads_url"}
+
+  def encode_downloads_url(value) when is_binary(value), do: value
+  def encode_downloads_url(_), do: {:error, "Unexpected type when encoding BaseRepo.downloads_url"}
+
+  def decode_events_url(value) when is_binary(value), do: value
+  def decode_events_url(_), do: {:error, "Unexpected type when decoding BaseRepo.events_url"}
+
+  def encode_events_url(value) when is_binary(value), do: value
+  def encode_events_url(_), do: {:error, "Unexpected type when encoding BaseRepo.events_url"}
+
+  def decode_fork(value) when is_boolean(value), do: value
+  def decode_fork(_), do: {:error, "Unexpected type when decoding BaseRepo.fork"}
+
+  def encode_fork(value) when is_boolean(value), do: value
+  def encode_fork(_), do: {:error, "Unexpected type when encoding BaseRepo.fork"}
+
+  def decode_forks(value) when is_integer(value), do: value
+  def decode_forks(_), do: {:error, "Unexpected type when decoding BaseRepo.forks"}
+
+  def encode_forks(value) when is_integer(value), do: value
+  def encode_forks(_), do: {:error, "Unexpected type when encoding BaseRepo.forks"}
+
+  def decode_forks_count(value) when is_integer(value), do: value
+  def decode_forks_count(_), do: {:error, "Unexpected type when decoding BaseRepo.forks_count"}
+
+  def encode_forks_count(value) when is_integer(value), do: value
+  def encode_forks_count(_), do: {:error, "Unexpected type when encoding BaseRepo.forks_count"}
+
+  def decode_forks_url(value) when is_binary(value), do: value
+  def decode_forks_url(_), do: {:error, "Unexpected type when decoding BaseRepo.forks_url"}
+
+  def encode_forks_url(value) when is_binary(value), do: value
+  def encode_forks_url(_), do: {:error, "Unexpected type when encoding BaseRepo.forks_url"}
+
+  def decode_full_name(value) when is_binary(value), do: value
+  def decode_full_name(_), do: {:error, "Unexpected type when decoding BaseRepo.full_name"}
+
+  def encode_full_name(value) when is_binary(value), do: value
+  def encode_full_name(_), do: {:error, "Unexpected type when encoding BaseRepo.full_name"}
+
+  def decode_git_commits_url(value) when is_binary(value), do: value
+  def decode_git_commits_url(_), do: {:error, "Unexpected type when decoding BaseRepo.git_commits_url"}
+
+  def encode_git_commits_url(value) when is_binary(value), do: value
+  def encode_git_commits_url(_), do: {:error, "Unexpected type when encoding BaseRepo.git_commits_url"}
+
+  def decode_git_refs_url(value) when is_binary(value), do: value
+  def decode_git_refs_url(_), do: {:error, "Unexpected type when decoding BaseRepo.git_refs_url"}
+
+  def encode_git_refs_url(value) when is_binary(value), do: value
+  def encode_git_refs_url(_), do: {:error, "Unexpected type when encoding BaseRepo.git_refs_url"}
+
+  def decode_git_tags_url(value) when is_binary(value), do: value
+  def decode_git_tags_url(_), do: {:error, "Unexpected type when decoding BaseRepo.git_tags_url"}
+
+  def encode_git_tags_url(value) when is_binary(value), do: value
+  def encode_git_tags_url(_), do: {:error, "Unexpected type when encoding BaseRepo.git_tags_url"}
+
+  def decode_git_url(value) when is_binary(value), do: value
+  def decode_git_url(_), do: {:error, "Unexpected type when decoding BaseRepo.git_url"}
+
+  def encode_git_url(value) when is_binary(value), do: value
+  def encode_git_url(_), do: {:error, "Unexpected type when encoding BaseRepo.git_url"}
+
+  def decode_has_downloads(value) when is_boolean(value), do: value
+  def decode_has_downloads(_), do: {:error, "Unexpected type when decoding BaseRepo.has_downloads"}
+
+  def encode_has_downloads(value) when is_boolean(value), do: value
+  def encode_has_downloads(_), do: {:error, "Unexpected type when encoding BaseRepo.has_downloads"}
+
+  def decode_has_issues(value) when is_boolean(value), do: value
+  def decode_has_issues(_), do: {:error, "Unexpected type when decoding BaseRepo.has_issues"}
+
+  def encode_has_issues(value) when is_boolean(value), do: value
+  def encode_has_issues(_), do: {:error, "Unexpected type when encoding BaseRepo.has_issues"}
+
+  def decode_has_pages(value) when is_boolean(value), do: value
+  def decode_has_pages(_), do: {:error, "Unexpected type when decoding BaseRepo.has_pages"}
+
+  def encode_has_pages(value) when is_boolean(value), do: value
+  def encode_has_pages(_), do: {:error, "Unexpected type when encoding BaseRepo.has_pages"}
+
+  def decode_has_projects(value) when is_boolean(value), do: value
+  def decode_has_projects(_), do: {:error, "Unexpected type when decoding BaseRepo.has_projects"}
+
+  def encode_has_projects(value) when is_boolean(value), do: value
+  def encode_has_projects(_), do: {:error, "Unexpected type when encoding BaseRepo.has_projects"}
+
+  def decode_has_wiki(value) when is_boolean(value), do: value
+  def decode_has_wiki(_), do: {:error, "Unexpected type when decoding BaseRepo.has_wiki"}
+
+  def encode_has_wiki(value) when is_boolean(value), do: value
+  def encode_has_wiki(_), do: {:error, "Unexpected type when encoding BaseRepo.has_wiki"}
+
+  def decode_homepage(value) when is_nil(value), do: value
+  def decode_homepage(_), do: {:error, "Unexpected type when decoding BaseRepo.homepage"}
+
+  def encode_homepage(value) when is_nil(value), do: value
+  def encode_homepage(_), do: {:error, "Unexpected type when encoding BaseRepo.homepage"}
+
+  def decode_hooks_url(value) when is_binary(value), do: value
+  def decode_hooks_url(_), do: {:error, "Unexpected type when decoding BaseRepo.hooks_url"}
+
+  def encode_hooks_url(value) when is_binary(value), do: value
+  def encode_hooks_url(_), do: {:error, "Unexpected type when encoding BaseRepo.hooks_url"}
+
+  def decode_html_url(value) when is_binary(value), do: value
+  def decode_html_url(_), do: {:error, "Unexpected type when decoding BaseRepo.html_url"}
+
+  def encode_html_url(value) when is_binary(value), do: value
+  def encode_html_url(_), do: {:error, "Unexpected type when encoding BaseRepo.html_url"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding BaseRepo.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding BaseRepo.id"}
+
+  def decode_issue_comment_url(value) when is_binary(value), do: value
+  def decode_issue_comment_url(_), do: {:error, "Unexpected type when decoding BaseRepo.issue_comment_url"}
+
+  def encode_issue_comment_url(value) when is_binary(value), do: value
+  def encode_issue_comment_url(_), do: {:error, "Unexpected type when encoding BaseRepo.issue_comment_url"}
+
+  def decode_issue_events_url(value) when is_binary(value), do: value
+  def decode_issue_events_url(_), do: {:error, "Unexpected type when decoding BaseRepo.issue_events_url"}
+
+  def encode_issue_events_url(value) when is_binary(value), do: value
+  def encode_issue_events_url(_), do: {:error, "Unexpected type when encoding BaseRepo.issue_events_url"}
+
+  def decode_issues_url(value) when is_binary(value), do: value
+  def decode_issues_url(_), do: {:error, "Unexpected type when decoding BaseRepo.issues_url"}
+
+  def encode_issues_url(value) when is_binary(value), do: value
+  def encode_issues_url(_), do: {:error, "Unexpected type when encoding BaseRepo.issues_url"}
+
+  def decode_keys_url(value) when is_binary(value), do: value
+  def decode_keys_url(_), do: {:error, "Unexpected type when decoding BaseRepo.keys_url"}
+
+  def encode_keys_url(value) when is_binary(value), do: value
+  def encode_keys_url(_), do: {:error, "Unexpected type when encoding BaseRepo.keys_url"}
+
+  def decode_labels_url(value) when is_binary(value), do: value
+  def decode_labels_url(_), do: {:error, "Unexpected type when decoding BaseRepo.labels_url"}
+
+  def encode_labels_url(value) when is_binary(value), do: value
+  def encode_labels_url(_), do: {:error, "Unexpected type when encoding BaseRepo.labels_url"}
+
+  def decode_language(value) when is_binary(value), do: value
+  def decode_language(_), do: {:error, "Unexpected type when decoding BaseRepo.language"}
+
+  def encode_language(value) when is_binary(value), do: value
+  def encode_language(_), do: {:error, "Unexpected type when encoding BaseRepo.language"}
+
+  def decode_languages_url(value) when is_binary(value), do: value
+  def decode_languages_url(_), do: {:error, "Unexpected type when decoding BaseRepo.languages_url"}
+
+  def encode_languages_url(value) when is_binary(value), do: value
+  def encode_languages_url(_), do: {:error, "Unexpected type when encoding BaseRepo.languages_url"}
+
+  def decode_merges_url(value) when is_binary(value), do: value
+  def decode_merges_url(_), do: {:error, "Unexpected type when decoding BaseRepo.merges_url"}
+
+  def encode_merges_url(value) when is_binary(value), do: value
+  def encode_merges_url(_), do: {:error, "Unexpected type when encoding BaseRepo.merges_url"}
+
+  def decode_milestones_url(value) when is_binary(value), do: value
+  def decode_milestones_url(_), do: {:error, "Unexpected type when decoding BaseRepo.milestones_url"}
+
+  def encode_milestones_url(value) when is_binary(value), do: value
+  def encode_milestones_url(_), do: {:error, "Unexpected type when encoding BaseRepo.milestones_url"}
+
+  def decode_mirror_url(value) when is_nil(value), do: value
+  def decode_mirror_url(_), do: {:error, "Unexpected type when decoding BaseRepo.mirror_url"}
+
+  def encode_mirror_url(value) when is_nil(value), do: value
+  def encode_mirror_url(_), do: {:error, "Unexpected type when encoding BaseRepo.mirror_url"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding BaseRepo.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding BaseRepo.name"}
+
+  def decode_notifications_url(value) when is_binary(value), do: value
+  def decode_notifications_url(_), do: {:error, "Unexpected type when decoding BaseRepo.notifications_url"}
+
+  def encode_notifications_url(value) when is_binary(value), do: value
+  def encode_notifications_url(_), do: {:error, "Unexpected type when encoding BaseRepo.notifications_url"}
+
+  def decode_open_issues(value) when is_integer(value), do: value
+  def decode_open_issues(_), do: {:error, "Unexpected type when decoding BaseRepo.open_issues"}
+
+  def encode_open_issues(value) when is_integer(value), do: value
+  def encode_open_issues(_), do: {:error, "Unexpected type when encoding BaseRepo.open_issues"}
+
+  def decode_open_issues_count(value) when is_integer(value), do: value
+  def decode_open_issues_count(_), do: {:error, "Unexpected type when decoding BaseRepo.open_issues_count"}
+
+  def encode_open_issues_count(value) when is_integer(value), do: value
+  def encode_open_issues_count(_), do: {:error, "Unexpected type when encoding BaseRepo.open_issues_count"}
+
+  def decode_private(value) when is_boolean(value), do: value
+  def decode_private(_), do: {:error, "Unexpected type when decoding BaseRepo.private"}
+
+  def encode_private(value) when is_boolean(value), do: value
+  def encode_private(_), do: {:error, "Unexpected type when encoding BaseRepo.private"}
+
+  def decode_pulls_url(value) when is_binary(value), do: value
+  def decode_pulls_url(_), do: {:error, "Unexpected type when decoding BaseRepo.pulls_url"}
+
+  def encode_pulls_url(value) when is_binary(value), do: value
+  def encode_pulls_url(_), do: {:error, "Unexpected type when encoding BaseRepo.pulls_url"}
+
+  def decode_pushed_at(value) when is_binary(value), do: value
+  def decode_pushed_at(_), do: {:error, "Unexpected type when decoding BaseRepo.pushed_at"}
+
+  def encode_pushed_at(value) when is_binary(value), do: value
+  def encode_pushed_at(_), do: {:error, "Unexpected type when encoding BaseRepo.pushed_at"}
+
+  def decode_releases_url(value) when is_binary(value), do: value
+  def decode_releases_url(_), do: {:error, "Unexpected type when decoding BaseRepo.releases_url"}
+
+  def encode_releases_url(value) when is_binary(value), do: value
+  def encode_releases_url(_), do: {:error, "Unexpected type when encoding BaseRepo.releases_url"}
+
+  def decode_size(value) when is_integer(value), do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding BaseRepo.size"}
+
+  def encode_size(value) when is_integer(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding BaseRepo.size"}
+
+  def decode_ssh_url(value) when is_binary(value), do: value
+  def decode_ssh_url(_), do: {:error, "Unexpected type when decoding BaseRepo.ssh_url"}
+
+  def encode_ssh_url(value) when is_binary(value), do: value
+  def encode_ssh_url(_), do: {:error, "Unexpected type when encoding BaseRepo.ssh_url"}
+
+  def decode_stargazers_count(value) when is_integer(value), do: value
+  def decode_stargazers_count(_), do: {:error, "Unexpected type when decoding BaseRepo.stargazers_count"}
+
+  def encode_stargazers_count(value) when is_integer(value), do: value
+  def encode_stargazers_count(_), do: {:error, "Unexpected type when encoding BaseRepo.stargazers_count"}
+
+  def decode_stargazers_url(value) when is_binary(value), do: value
+  def decode_stargazers_url(_), do: {:error, "Unexpected type when decoding BaseRepo.stargazers_url"}
+
+  def encode_stargazers_url(value) when is_binary(value), do: value
+  def encode_stargazers_url(_), do: {:error, "Unexpected type when encoding BaseRepo.stargazers_url"}
+
+  def decode_statuses_url(value) when is_binary(value), do: value
+  def decode_statuses_url(_), do: {:error, "Unexpected type when decoding BaseRepo.statuses_url"}
+
+  def encode_statuses_url(value) when is_binary(value), do: value
+  def encode_statuses_url(_), do: {:error, "Unexpected type when encoding BaseRepo.statuses_url"}
+
+  def decode_subscribers_url(value) when is_binary(value), do: value
+  def decode_subscribers_url(_), do: {:error, "Unexpected type when decoding BaseRepo.subscribers_url"}
+
+  def encode_subscribers_url(value) when is_binary(value), do: value
+  def encode_subscribers_url(_), do: {:error, "Unexpected type when encoding BaseRepo.subscribers_url"}
+
+  def decode_subscription_url(value) when is_binary(value), do: value
+  def decode_subscription_url(_), do: {:error, "Unexpected type when decoding BaseRepo.subscription_url"}
+
+  def encode_subscription_url(value) when is_binary(value), do: value
+  def encode_subscription_url(_), do: {:error, "Unexpected type when encoding BaseRepo.subscription_url"}
+
+  def decode_svn_url(value) when is_binary(value), do: value
+  def decode_svn_url(_), do: {:error, "Unexpected type when decoding BaseRepo.svn_url"}
+
+  def encode_svn_url(value) when is_binary(value), do: value
+  def encode_svn_url(_), do: {:error, "Unexpected type when encoding BaseRepo.svn_url"}
+
+  def decode_tags_url(value) when is_binary(value), do: value
+  def decode_tags_url(_), do: {:error, "Unexpected type when decoding BaseRepo.tags_url"}
+
+  def encode_tags_url(value) when is_binary(value), do: value
+  def encode_tags_url(_), do: {:error, "Unexpected type when encoding BaseRepo.tags_url"}
+
+  def decode_teams_url(value) when is_binary(value), do: value
+  def decode_teams_url(_), do: {:error, "Unexpected type when decoding BaseRepo.teams_url"}
+
+  def encode_teams_url(value) when is_binary(value), do: value
+  def encode_teams_url(_), do: {:error, "Unexpected type when encoding BaseRepo.teams_url"}
+
+  def decode_trees_url(value) when is_binary(value), do: value
+  def decode_trees_url(_), do: {:error, "Unexpected type when decoding BaseRepo.trees_url"}
+
+  def encode_trees_url(value) when is_binary(value), do: value
+  def encode_trees_url(_), do: {:error, "Unexpected type when encoding BaseRepo.trees_url"}
+
+  def decode_updated_at(value) when is_binary(value), do: value
+  def decode_updated_at(_), do: {:error, "Unexpected type when decoding BaseRepo.updated_at"}
+
+  def encode_updated_at(value) when is_binary(value), do: value
+  def encode_updated_at(_), do: {:error, "Unexpected type when encoding BaseRepo.updated_at"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding BaseRepo.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding BaseRepo.url"}
+
+  def decode_watchers(value) when is_integer(value), do: value
+  def decode_watchers(_), do: {:error, "Unexpected type when decoding BaseRepo.watchers"}
+
+  def encode_watchers(value) when is_integer(value), do: value
+  def encode_watchers(_), do: {:error, "Unexpected type when encoding BaseRepo.watchers"}
+
+  def decode_watchers_count(value) when is_integer(value), do: value
+  def decode_watchers_count(_), do: {:error, "Unexpected type when decoding BaseRepo.watchers_count"}
+
+  def encode_watchers_count(value) when is_integer(value), do: value
+  def encode_watchers_count(_), do: {:error, "Unexpected type when encoding BaseRepo.watchers_count"}
+
   def from_map(m) do
     %BaseRepo{
-      archive_url: m["archive_url"],
-      assignees_url: m["assignees_url"],
-      blobs_url: m["blobs_url"],
-      branches_url: m["branches_url"],
-      clone_url: m["clone_url"],
-      collaborators_url: m["collaborators_url"],
-      comments_url: m["comments_url"],
-      commits_url: m["commits_url"],
-      compare_url: m["compare_url"],
-      contents_url: m["contents_url"],
-      contributors_url: m["contributors_url"],
-      created_at: m["created_at"],
-      default_branch: m["default_branch"],
-      deployments_url: m["deployments_url"],
-      description: m["description"],
-      downloads_url: m["downloads_url"],
-      events_url: m["events_url"],
-      fork: m["fork"],
-      forks: m["forks"],
-      forks_count: m["forks_count"],
-      forks_url: m["forks_url"],
-      full_name: m["full_name"],
-      git_commits_url: m["git_commits_url"],
-      git_refs_url: m["git_refs_url"],
-      git_tags_url: m["git_tags_url"],
-      git_url: m["git_url"],
-      has_downloads: m["has_downloads"],
-      has_issues: m["has_issues"],
-      has_pages: m["has_pages"],
-      has_projects: m["has_projects"],
-      has_wiki: m["has_wiki"],
-      homepage: m["homepage"],
-      hooks_url: m["hooks_url"],
-      html_url: m["html_url"],
-      id: m["id"],
-      issue_comment_url: m["issue_comment_url"],
-      issue_events_url: m["issue_events_url"],
-      issues_url: m["issues_url"],
-      keys_url: m["keys_url"],
-      labels_url: m["labels_url"],
-      language: m["language"],
-      languages_url: m["languages_url"],
-      merges_url: m["merges_url"],
-      milestones_url: m["milestones_url"],
-      mirror_url: m["mirror_url"],
-      name: m["name"],
-      notifications_url: m["notifications_url"],
-      open_issues: m["open_issues"],
-      open_issues_count: m["open_issues_count"],
+      archive_url: decode_archive_url(m["archive_url"]),
+      assignees_url: decode_assignees_url(m["assignees_url"]),
+      blobs_url: decode_blobs_url(m["blobs_url"]),
+      branches_url: decode_branches_url(m["branches_url"]),
+      clone_url: decode_clone_url(m["clone_url"]),
+      collaborators_url: decode_collaborators_url(m["collaborators_url"]),
+      comments_url: decode_comments_url(m["comments_url"]),
+      commits_url: decode_commits_url(m["commits_url"]),
+      compare_url: decode_compare_url(m["compare_url"]),
+      contents_url: decode_contents_url(m["contents_url"]),
+      contributors_url: decode_contributors_url(m["contributors_url"]),
+      created_at: decode_created_at(m["created_at"]),
+      default_branch: decode_default_branch(m["default_branch"]),
+      deployments_url: decode_deployments_url(m["deployments_url"]),
+      description: decode_description(m["description"]),
+      downloads_url: decode_downloads_url(m["downloads_url"]),
+      events_url: decode_events_url(m["events_url"]),
+      fork: decode_fork(m["fork"]),
+      forks: decode_forks(m["forks"]),
+      forks_count: decode_forks_count(m["forks_count"]),
+      forks_url: decode_forks_url(m["forks_url"]),
+      full_name: decode_full_name(m["full_name"]),
+      git_commits_url: decode_git_commits_url(m["git_commits_url"]),
+      git_refs_url: decode_git_refs_url(m["git_refs_url"]),
+      git_tags_url: decode_git_tags_url(m["git_tags_url"]),
+      git_url: decode_git_url(m["git_url"]),
+      has_downloads: decode_has_downloads(m["has_downloads"]),
+      has_issues: decode_has_issues(m["has_issues"]),
+      has_pages: decode_has_pages(m["has_pages"]),
+      has_projects: decode_has_projects(m["has_projects"]),
+      has_wiki: decode_has_wiki(m["has_wiki"]),
+      homepage: decode_homepage(m["homepage"]),
+      hooks_url: decode_hooks_url(m["hooks_url"]),
+      html_url: decode_html_url(m["html_url"]),
+      id: decode_id(m["id"]),
+      issue_comment_url: decode_issue_comment_url(m["issue_comment_url"]),
+      issue_events_url: decode_issue_events_url(m["issue_events_url"]),
+      issues_url: decode_issues_url(m["issues_url"]),
+      keys_url: decode_keys_url(m["keys_url"]),
+      labels_url: decode_labels_url(m["labels_url"]),
+      language: decode_language(m["language"]),
+      languages_url: decode_languages_url(m["languages_url"]),
+      merges_url: decode_merges_url(m["merges_url"]),
+      milestones_url: decode_milestones_url(m["milestones_url"]),
+      mirror_url: decode_mirror_url(m["mirror_url"]),
+      name: decode_name(m["name"]),
+      notifications_url: decode_notifications_url(m["notifications_url"]),
+      open_issues: decode_open_issues(m["open_issues"]),
+      open_issues_count: decode_open_issues_count(m["open_issues_count"]),
       owner: MergedBy.from_map(m["owner"]),
-      private: m["private"],
-      pulls_url: m["pulls_url"],
-      pushed_at: m["pushed_at"],
-      releases_url: m["releases_url"],
-      size: m["size"],
-      ssh_url: m["ssh_url"],
-      stargazers_count: m["stargazers_count"],
-      stargazers_url: m["stargazers_url"],
-      statuses_url: m["statuses_url"],
-      subscribers_url: m["subscribers_url"],
-      subscription_url: m["subscription_url"],
-      svn_url: m["svn_url"],
-      tags_url: m["tags_url"],
-      teams_url: m["teams_url"],
-      trees_url: m["trees_url"],
-      updated_at: m["updated_at"],
-      url: m["url"],
-      watchers: m["watchers"],
-      watchers_count: m["watchers_count"],
+      private: decode_private(m["private"]),
+      pulls_url: decode_pulls_url(m["pulls_url"]),
+      pushed_at: decode_pushed_at(m["pushed_at"]),
+      releases_url: decode_releases_url(m["releases_url"]),
+      size: decode_size(m["size"]),
+      ssh_url: decode_ssh_url(m["ssh_url"]),
+      stargazers_count: decode_stargazers_count(m["stargazers_count"]),
+      stargazers_url: decode_stargazers_url(m["stargazers_url"]),
+      statuses_url: decode_statuses_url(m["statuses_url"]),
+      subscribers_url: decode_subscribers_url(m["subscribers_url"]),
+      subscription_url: decode_subscription_url(m["subscription_url"]),
+      svn_url: decode_svn_url(m["svn_url"]),
+      tags_url: decode_tags_url(m["tags_url"]),
+      teams_url: decode_teams_url(m["teams_url"]),
+      trees_url: decode_trees_url(m["trees_url"]),
+      updated_at: decode_updated_at(m["updated_at"]),
+      url: decode_url(m["url"]),
+      watchers: decode_watchers(m["watchers"]),
+      watchers_count: decode_watchers_count(m["watchers_count"]),
     }
   end
 
@@ -464,12 +1040,30 @@ defmodule BaseClass do
           user: MergedBy.t()
         }
 
+  def decode_label(value) when is_binary(value), do: value
+  def decode_label(_), do: {:error, "Unexpected type when decoding BaseClass.label"}
+
+  def encode_label(value) when is_binary(value), do: value
+  def encode_label(_), do: {:error, "Unexpected type when encoding BaseClass.label"}
+
+  def decode_ref(value) when is_binary(value), do: value
+  def decode_ref(_), do: {:error, "Unexpected type when decoding BaseClass.ref"}
+
+  def encode_ref(value) when is_binary(value), do: value
+  def encode_ref(_), do: {:error, "Unexpected type when encoding BaseClass.ref"}
+
+  def decode_sha(value) when is_binary(value), do: value
+  def decode_sha(_), do: {:error, "Unexpected type when decoding BaseClass.sha"}
+
+  def encode_sha(value) when is_binary(value), do: value
+  def encode_sha(_), do: {:error, "Unexpected type when encoding BaseClass.sha"}
+
   def from_map(m) do
     %BaseClass{
-      label: m["label"],
-      ref: m["ref"],
+      label: decode_label(m["label"]),
+      ref: decode_ref(m["ref"]),
       repo: BaseRepo.from_map(m["repo"]),
-      sha: m["sha"],
+      sha: decode_sha(m["sha"]),
       user: MergedBy.from_map(m["user"]),
     }
   end
@@ -505,9 +1099,15 @@ defmodule Comments do
           href: String.t()
         }
 
+  def decode_href(value) when is_binary(value), do: value
+  def decode_href(_), do: {:error, "Unexpected type when decoding Comments.href"}
+
+  def encode_href(value) when is_binary(value), do: value
+  def encode_href(_), do: {:error, "Unexpected type when encoding Comments.href"}
+
   def from_map(m) do
     %Comments{
-      href: m["href"],
+      href: decode_href(m["href"]),
     }
   end
 
@@ -632,48 +1232,264 @@ defmodule PullRequest do
           user: MergedBy.t()
         }
 
+  def decode_additions(value) when is_integer(value), do: value
+  def decode_additions(_), do: {:error, "Unexpected type when decoding PullRequest.additions"}
+
+  def encode_additions(value) when is_integer(value), do: value
+  def encode_additions(_), do: {:error, "Unexpected type when encoding PullRequest.additions"}
+
+  def decode_assignee(value) when is_nil(value), do: value
+  def decode_assignee(_), do: {:error, "Unexpected type when decoding PullRequest.assignee"}
+
+  def encode_assignee(value) when is_nil(value), do: value
+  def encode_assignee(_), do: {:error, "Unexpected type when encoding PullRequest.assignee"}
+
+  def decode_assignees(value) when is_list(value), do: value
+  def decode_assignees(_), do: {:error, "Unexpected type when decoding PullRequest.assignees"}
+
+  def encode_assignees(value) when is_list(value), do: value
+  def encode_assignees(_), do: {:error, "Unexpected type when encoding PullRequest.assignees"}
+
+  def decode_body(value) when is_binary(value), do: value
+  def decode_body(_), do: {:error, "Unexpected type when decoding PullRequest.body"}
+
+  def encode_body(value) when is_binary(value), do: value
+  def encode_body(_), do: {:error, "Unexpected type when encoding PullRequest.body"}
+
+  def decode_changed_files(value) when is_integer(value), do: value
+  def decode_changed_files(_), do: {:error, "Unexpected type when decoding PullRequest.changed_files"}
+
+  def encode_changed_files(value) when is_integer(value), do: value
+  def encode_changed_files(_), do: {:error, "Unexpected type when encoding PullRequest.changed_files"}
+
+  def decode_closed_at(value) when is_binary(value), do: value
+  def decode_closed_at(_), do: {:error, "Unexpected type when decoding PullRequest.closed_at"}
+
+  def encode_closed_at(value) when is_binary(value), do: value
+  def encode_closed_at(_), do: {:error, "Unexpected type when encoding PullRequest.closed_at"}
+
+  def decode_comments(value) when is_integer(value), do: value
+  def decode_comments(_), do: {:error, "Unexpected type when decoding PullRequest.comments"}
+
+  def encode_comments(value) when is_integer(value), do: value
+  def encode_comments(_), do: {:error, "Unexpected type when encoding PullRequest.comments"}
+
+  def decode_comments_url(value) when is_binary(value), do: value
+  def decode_comments_url(_), do: {:error, "Unexpected type when decoding PullRequest.comments_url"}
+
+  def encode_comments_url(value) when is_binary(value), do: value
+  def encode_comments_url(_), do: {:error, "Unexpected type when encoding PullRequest.comments_url"}
+
+  def decode_commits(value) when is_integer(value), do: value
+  def decode_commits(_), do: {:error, "Unexpected type when decoding PullRequest.commits"}
+
+  def encode_commits(value) when is_integer(value), do: value
+  def encode_commits(_), do: {:error, "Unexpected type when encoding PullRequest.commits"}
+
+  def decode_commits_url(value) when is_binary(value), do: value
+  def decode_commits_url(_), do: {:error, "Unexpected type when decoding PullRequest.commits_url"}
+
+  def encode_commits_url(value) when is_binary(value), do: value
+  def encode_commits_url(_), do: {:error, "Unexpected type when encoding PullRequest.commits_url"}
+
+  def decode_created_at(value) when is_binary(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding PullRequest.created_at"}
+
+  def encode_created_at(value) when is_binary(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding PullRequest.created_at"}
+
+  def decode_deletions(value) when is_integer(value), do: value
+  def decode_deletions(_), do: {:error, "Unexpected type when decoding PullRequest.deletions"}
+
+  def encode_deletions(value) when is_integer(value), do: value
+  def encode_deletions(_), do: {:error, "Unexpected type when encoding PullRequest.deletions"}
+
+  def decode_diff_url(value) when is_binary(value), do: value
+  def decode_diff_url(_), do: {:error, "Unexpected type when decoding PullRequest.diff_url"}
+
+  def encode_diff_url(value) when is_binary(value), do: value
+  def encode_diff_url(_), do: {:error, "Unexpected type when encoding PullRequest.diff_url"}
+
+  def decode_html_url(value) when is_binary(value), do: value
+  def decode_html_url(_), do: {:error, "Unexpected type when decoding PullRequest.html_url"}
+
+  def encode_html_url(value) when is_binary(value), do: value
+  def encode_html_url(_), do: {:error, "Unexpected type when encoding PullRequest.html_url"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding PullRequest.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding PullRequest.id"}
+
+  def decode_issue_url(value) when is_binary(value), do: value
+  def decode_issue_url(_), do: {:error, "Unexpected type when decoding PullRequest.issue_url"}
+
+  def encode_issue_url(value) when is_binary(value), do: value
+  def encode_issue_url(_), do: {:error, "Unexpected type when encoding PullRequest.issue_url"}
+
+  def decode_locked(value) when is_boolean(value), do: value
+  def decode_locked(_), do: {:error, "Unexpected type when decoding PullRequest.locked"}
+
+  def encode_locked(value) when is_boolean(value), do: value
+  def encode_locked(_), do: {:error, "Unexpected type when encoding PullRequest.locked"}
+
+  def decode_maintainer_can_modify(value) when is_boolean(value), do: value
+  def decode_maintainer_can_modify(_), do: {:error, "Unexpected type when decoding PullRequest.maintainer_can_modify"}
+
+  def encode_maintainer_can_modify(value) when is_boolean(value), do: value
+  def encode_maintainer_can_modify(_), do: {:error, "Unexpected type when encoding PullRequest.maintainer_can_modify"}
+
+  def decode_merge_commit_sha(value) when is_binary(value), do: value
+  def decode_merge_commit_sha(_), do: {:error, "Unexpected type when decoding PullRequest.merge_commit_sha"}
+
+  def encode_merge_commit_sha(value) when is_binary(value), do: value
+  def encode_merge_commit_sha(_), do: {:error, "Unexpected type when encoding PullRequest.merge_commit_sha"}
+
+  def decode_mergeable(value) when is_nil(value), do: value
+  def decode_mergeable(_), do: {:error, "Unexpected type when decoding PullRequest.mergeable"}
+
+  def encode_mergeable(value) when is_nil(value), do: value
+  def encode_mergeable(_), do: {:error, "Unexpected type when encoding PullRequest.mergeable"}
+
+  def decode_mergeable_state(value) when is_binary(value), do: value
+  def decode_mergeable_state(_), do: {:error, "Unexpected type when decoding PullRequest.mergeable_state"}
+
+  def encode_mergeable_state(value) when is_binary(value), do: value
+  def encode_mergeable_state(_), do: {:error, "Unexpected type when encoding PullRequest.mergeable_state"}
+
+  def decode_merged(value) when is_boolean(value), do: value
+  def decode_merged(_), do: {:error, "Unexpected type when decoding PullRequest.merged"}
+
+  def encode_merged(value) when is_boolean(value), do: value
+  def encode_merged(_), do: {:error, "Unexpected type when encoding PullRequest.merged"}
+
+  def decode_merged_at(value) when is_binary(value), do: value
+  def decode_merged_at(_), do: {:error, "Unexpected type when decoding PullRequest.merged_at"}
+
+  def encode_merged_at(value) when is_binary(value), do: value
+  def encode_merged_at(_), do: {:error, "Unexpected type when encoding PullRequest.merged_at"}
+
+  def decode_milestone(value) when is_nil(value), do: value
+  def decode_milestone(_), do: {:error, "Unexpected type when decoding PullRequest.milestone"}
+
+  def encode_milestone(value) when is_nil(value), do: value
+  def encode_milestone(_), do: {:error, "Unexpected type when encoding PullRequest.milestone"}
+
+  def decode_number(value) when is_integer(value), do: value
+  def decode_number(_), do: {:error, "Unexpected type when decoding PullRequest.number"}
+
+  def encode_number(value) when is_integer(value), do: value
+  def encode_number(_), do: {:error, "Unexpected type when encoding PullRequest.number"}
+
+  def decode_patch_url(value) when is_binary(value), do: value
+  def decode_patch_url(_), do: {:error, "Unexpected type when decoding PullRequest.patch_url"}
+
+  def encode_patch_url(value) when is_binary(value), do: value
+  def encode_patch_url(_), do: {:error, "Unexpected type when encoding PullRequest.patch_url"}
+
+  def decode_rebaseable(value) when is_nil(value), do: value
+  def decode_rebaseable(_), do: {:error, "Unexpected type when decoding PullRequest.rebaseable"}
+
+  def encode_rebaseable(value) when is_nil(value), do: value
+  def encode_rebaseable(_), do: {:error, "Unexpected type when encoding PullRequest.rebaseable"}
+
+  def decode_requested_reviewers(value) when is_list(value), do: value
+  def decode_requested_reviewers(_), do: {:error, "Unexpected type when decoding PullRequest.requested_reviewers"}
+
+  def encode_requested_reviewers(value) when is_list(value), do: value
+  def encode_requested_reviewers(_), do: {:error, "Unexpected type when encoding PullRequest.requested_reviewers"}
+
+  def decode_review_comment_url(value) when is_binary(value), do: value
+  def decode_review_comment_url(_), do: {:error, "Unexpected type when decoding PullRequest.review_comment_url"}
+
+  def encode_review_comment_url(value) when is_binary(value), do: value
+  def encode_review_comment_url(_), do: {:error, "Unexpected type when encoding PullRequest.review_comment_url"}
+
+  def decode_review_comments(value) when is_integer(value), do: value
+  def decode_review_comments(_), do: {:error, "Unexpected type when decoding PullRequest.review_comments"}
+
+  def encode_review_comments(value) when is_integer(value), do: value
+  def encode_review_comments(_), do: {:error, "Unexpected type when encoding PullRequest.review_comments"}
+
+  def decode_review_comments_url(value) when is_binary(value), do: value
+  def decode_review_comments_url(_), do: {:error, "Unexpected type when decoding PullRequest.review_comments_url"}
+
+  def encode_review_comments_url(value) when is_binary(value), do: value
+  def encode_review_comments_url(_), do: {:error, "Unexpected type when encoding PullRequest.review_comments_url"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding PullRequest.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding PullRequest.state"}
+
+  def decode_statuses_url(value) when is_binary(value), do: value
+  def decode_statuses_url(_), do: {:error, "Unexpected type when decoding PullRequest.statuses_url"}
+
+  def encode_statuses_url(value) when is_binary(value), do: value
+  def encode_statuses_url(_), do: {:error, "Unexpected type when encoding PullRequest.statuses_url"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding PullRequest.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding PullRequest.title"}
+
+  def decode_updated_at(value) when is_binary(value), do: value
+  def decode_updated_at(_), do: {:error, "Unexpected type when decoding PullRequest.updated_at"}
+
+  def encode_updated_at(value) when is_binary(value), do: value
+  def encode_updated_at(_), do: {:error, "Unexpected type when encoding PullRequest.updated_at"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding PullRequest.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding PullRequest.url"}
+
   def from_map(m) do
     %PullRequest{
-      additions: m["additions"],
-      assignee: m["assignee"],
-      assignees: m["assignees"],
+      additions: decode_additions(m["additions"]),
+      assignee: decode_assignee(m["assignee"]),
+      assignees: decode_assignees(m["assignees"]),
       base: BaseClass.from_map(m["base"]),
-      body: m["body"],
-      changed_files: m["changed_files"],
-      closed_at: m["closed_at"],
-      comments: m["comments"],
-      comments_url: m["comments_url"],
-      commits: m["commits"],
-      commits_url: m["commits_url"],
-      created_at: m["created_at"],
-      deletions: m["deletions"],
-      diff_url: m["diff_url"],
+      body: decode_body(m["body"]),
+      changed_files: decode_changed_files(m["changed_files"]),
+      closed_at: decode_closed_at(m["closed_at"]),
+      comments: decode_comments(m["comments"]),
+      comments_url: decode_comments_url(m["comments_url"]),
+      commits: decode_commits(m["commits"]),
+      commits_url: decode_commits_url(m["commits_url"]),
+      created_at: decode_created_at(m["created_at"]),
+      deletions: decode_deletions(m["deletions"]),
+      diff_url: decode_diff_url(m["diff_url"]),
       head: BaseClass.from_map(m["head"]),
-      html_url: m["html_url"],
-      id: m["id"],
-      issue_url: m["issue_url"],
+      html_url: decode_html_url(m["html_url"]),
+      id: decode_id(m["id"]),
+      issue_url: decode_issue_url(m["issue_url"]),
       links: Links.from_map(m["_links"]),
-      locked: m["locked"],
-      maintainer_can_modify: m["maintainer_can_modify"],
-      merge_commit_sha: m["merge_commit_sha"],
-      mergeable: m["mergeable"],
-      mergeable_state: m["mergeable_state"],
-      merged: m["merged"],
-      merged_at: m["merged_at"],
+      locked: decode_locked(m["locked"]),
+      maintainer_can_modify: decode_maintainer_can_modify(m["maintainer_can_modify"]),
+      merge_commit_sha: decode_merge_commit_sha(m["merge_commit_sha"]),
+      mergeable: decode_mergeable(m["mergeable"]),
+      mergeable_state: decode_mergeable_state(m["mergeable_state"]),
+      merged: decode_merged(m["merged"]),
+      merged_at: decode_merged_at(m["merged_at"]),
       merged_by: MergedBy.from_map(m["merged_by"]),
-      milestone: m["milestone"],
-      number: m["number"],
-      patch_url: m["patch_url"],
-      rebaseable: m["rebaseable"],
-      requested_reviewers: m["requested_reviewers"],
-      review_comment_url: m["review_comment_url"],
-      review_comments: m["review_comments"],
-      review_comments_url: m["review_comments_url"],
-      state: m["state"],
-      statuses_url: m["statuses_url"],
-      title: m["title"],
-      updated_at: m["updated_at"],
-      url: m["url"],
+      milestone: decode_milestone(m["milestone"]),
+      number: decode_number(m["number"]),
+      patch_url: decode_patch_url(m["patch_url"]),
+      rebaseable: decode_rebaseable(m["rebaseable"]),
+      requested_reviewers: decode_requested_reviewers(m["requested_reviewers"]),
+      review_comment_url: decode_review_comment_url(m["review_comment_url"]),
+      review_comments: decode_review_comments(m["review_comments"]),
+      review_comments_url: decode_review_comments_url(m["review_comments_url"]),
+      state: decode_state(m["state"]),
+      statuses_url: decode_statuses_url(m["statuses_url"]),
+      title: decode_title(m["title"]),
+      updated_at: decode_updated_at(m["updated_at"]),
+      url: decode_url(m["url"]),
       user: MergedBy.from_map(m["user"]),
     }
   end
@@ -818,11 +1634,29 @@ defmodule TopLevelRepo do
           url: String.t()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelRepo.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelRepo.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelRepo.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelRepo.name"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding TopLevelRepo.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding TopLevelRepo.url"}
+
   def from_map(m) do
     %TopLevelRepo{
-      id: m["id"],
-      name: m["name"],
-      url: m["url"],
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -911,14 +1745,32 @@ defmodule TopLevelElement do
           type: Type.t()
         }
 
+  def decode_created_at(value) when is_binary(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding TopLevelElement.created_at"}
+
+  def encode_created_at(value) when is_binary(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding TopLevelElement.created_at"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_public(value) when is_boolean(value), do: value
+  def decode_public(_), do: {:error, "Unexpected type when decoding TopLevelElement.public"}
+
+  def encode_public(value) when is_boolean(value), do: value
+  def encode_public(_), do: {:error, "Unexpected type when encoding TopLevelElement.public"}
+
   def from_map(m) do
     %TopLevelElement{
       actor: Actor.from_map(m["actor"]),
-      created_at: m["created_at"],
-      id: m["id"],
+      created_at: decode_created_at(m["created_at"]),
+      id: decode_id(m["id"]),
       org: m["org"] && Actor.from_map(m["org"]),
       payload: Payload.from_map(m["payload"]),
-      public: m["public"],
+      public: decode_public(m["public"]),
       repo: TopLevelRepo.from_map(m["repo"]),
       type: Type.decode(m["type"]),
     }
diff --git a/base/elixir/test/inputs/json/misc/0b91a.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/0b91a.json/default/QuickType.ex
index 083a8a8..1c1a2b7 100644
--- a/base/elixir/test/inputs/json/misc/0b91a.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/0b91a.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule ResponseInfo do
           status: integer()
         }
 
+  def decode_developer_message(value) when is_binary(value), do: value
+  def decode_developer_message(_), do: {:error, "Unexpected type when decoding ResponseInfo.developer_message"}
+
+  def encode_developer_message(value) when is_binary(value), do: value
+  def encode_developer_message(_), do: {:error, "Unexpected type when encoding ResponseInfo.developer_message"}
+
+  def decode_status(value) when is_integer(value), do: value
+  def decode_status(_), do: {:error, "Unexpected type when decoding ResponseInfo.status"}
+
+  def encode_status(value) when is_integer(value), do: value
+  def encode_status(_), do: {:error, "Unexpected type when encoding ResponseInfo.status"}
+
   def from_map(m) do
     %ResponseInfo{
-      developer_message: m["developerMessage"],
-      status: m["status"],
+      developer_message: decode_developer_message(m["developerMessage"]),
+      status: decode_status(m["status"]),
     }
   end
 
@@ -51,11 +63,29 @@ defmodule Resultset do
           pagesize: integer()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Resultset.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Resultset.count"}
+
+  def decode_page(value) when is_integer(value), do: value
+  def decode_page(_), do: {:error, "Unexpected type when decoding Resultset.page"}
+
+  def encode_page(value) when is_integer(value), do: value
+  def encode_page(_), do: {:error, "Unexpected type when encoding Resultset.page"}
+
+  def decode_pagesize(value) when is_integer(value), do: value
+  def decode_pagesize(_), do: {:error, "Unexpected type when decoding Resultset.pagesize"}
+
+  def encode_pagesize(value) when is_integer(value), do: value
+  def encode_pagesize(_), do: {:error, "Unexpected type when encoding Resultset.pagesize"}
+
   def from_map(m) do
     %Resultset{
-      count: m["count"],
-      page: m["page"],
-      pagesize: m["pagesize"],
+      count: decode_count(m["count"]),
+      page: decode_page(m["page"]),
+      pagesize: decode_pagesize(m["pagesize"]),
     }
   end
 
@@ -90,9 +120,17 @@ defmodule Metadata do
           resultset: Resultset.t()
         }
 
+  def decode_execution_time(value) when is_float(value), do: value
+  def decode_execution_time(value) when is_integer(value), do: value
+  def decode_execution_time(_), do: {:error, "Unexpected type when decoding Metadata.execution_time"}
+
+  def encode_execution_time(value) when is_float(value), do: value
+  def encode_execution_time(value) when is_integer(value), do: value
+  def encode_execution_time(_), do: {:error, "Unexpected type when encoding Metadata.execution_time"}
+
   def from_map(m) do
     %Metadata{
-      execution_time: m["executionTime"],
+      execution_time: decode_execution_time(m["executionTime"]),
       response_info: ResponseInfo.from_map(m["responseInfo"]),
       resultset: Resultset.from_map(m["resultset"]),
     }
@@ -128,10 +166,22 @@ defmodule Component do
           uuid: String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Component.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Component.name"}
+
+  def decode_uuid(value) when is_binary(value), do: value
+  def decode_uuid(_), do: {:error, "Unexpected type when decoding Component.uuid"}
+
+  def encode_uuid(value) when is_binary(value), do: value
+  def encode_uuid(_), do: {:error, "Unexpected type when encoding Component.uuid"}
+
   def from_map(m) do
     %Component{
-      name: m["name"],
-      uuid: m["uuid"],
+      name: decode_name(m["name"]),
+      uuid: decode_uuid(m["uuid"]),
     }
   end
 
@@ -176,22 +226,106 @@ defmodule Result do
           vuuid: String.t()
         }
 
+  def decode_attachment(value) when is_list(value), do: value
+  def decode_attachment(_), do: {:error, "Unexpected type when decoding Result.attachment"}
+
+  def encode_attachment(value) when is_list(value), do: value
+  def encode_attachment(_), do: {:error, "Unexpected type when encoding Result.attachment"}
+
+  def decode_body(value) when is_binary(value), do: value
+  def decode_body(_), do: {:error, "Unexpected type when decoding Result.body"}
+
+  def encode_body(value) when is_binary(value), do: value
+  def encode_body(_), do: {:error, "Unexpected type when encoding Result.body"}
+
+  def decode_changed(value) when is_binary(value), do: value
+  def decode_changed(_), do: {:error, "Unexpected type when decoding Result.changed"}
+
+  def encode_changed(value) when is_binary(value), do: value
+  def encode_changed(_), do: {:error, "Unexpected type when encoding Result.changed"}
+
+  def decode_component(value) when is_list(value), do: value
+  def decode_component(_), do: {:error, "Unexpected type when decoding Result.component"}
+
+  def encode_component(value) when is_list(value), do: value
+  def encode_component(_), do: {:error, "Unexpected type when encoding Result.component"}
+
+  def decode_created(value) when is_binary(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding Result.created"}
+
+  def encode_created(value) when is_binary(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding Result.created"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Result.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Result.date"}
+
+  def decode_image(value) when is_list(value), do: value
+  def decode_image(_), do: {:error, "Unexpected type when decoding Result.image"}
+
+  def encode_image(value) when is_list(value), do: value
+  def encode_image(_), do: {:error, "Unexpected type when encoding Result.image"}
+
+  def decode_number(value) when is_nil(value), do: value
+  def decode_number(_), do: {:error, "Unexpected type when decoding Result.number"}
+
+  def encode_number(value) when is_nil(value), do: value
+  def encode_number(_), do: {:error, "Unexpected type when encoding Result.number"}
+
+  def decode_teaser(value) when is_nil(value), do: value
+  def decode_teaser(_), do: {:error, "Unexpected type when decoding Result.teaser"}
+
+  def encode_teaser(value) when is_nil(value), do: value
+  def encode_teaser(_), do: {:error, "Unexpected type when encoding Result.teaser"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Result.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Result.title"}
+
+  def decode_topic(value) when is_list(value), do: value
+  def decode_topic(_), do: {:error, "Unexpected type when decoding Result.topic"}
+
+  def encode_topic(value) when is_list(value), do: value
+  def encode_topic(_), do: {:error, "Unexpected type when encoding Result.topic"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Result.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Result.url"}
+
+  def decode_uuid(value) when is_binary(value), do: value
+  def decode_uuid(_), do: {:error, "Unexpected type when decoding Result.uuid"}
+
+  def encode_uuid(value) when is_binary(value), do: value
+  def encode_uuid(_), do: {:error, "Unexpected type when encoding Result.uuid"}
+
+  def decode_vuuid(value) when is_binary(value), do: value
+  def decode_vuuid(_), do: {:error, "Unexpected type when decoding Result.vuuid"}
+
+  def encode_vuuid(value) when is_binary(value), do: value
+  def encode_vuuid(_), do: {:error, "Unexpected type when encoding Result.vuuid"}
+
   def from_map(m) do
     %Result{
-      attachment: m["attachment"],
-      body: m["body"],
-      changed: m["changed"],
+      attachment: decode_attachment(m["attachment"]),
+      body: decode_body(m["body"]),
+      changed: decode_changed(m["changed"]),
       component: Enum.map(m["component"], &Component.from_map/1),
-      created: m["created"],
-      date: m["date"],
-      image: m["image"],
-      number: m["number"],
-      teaser: m["teaser"],
-      title: m["title"],
-      topic: m["topic"],
-      url: m["url"],
-      uuid: m["uuid"],
-      vuuid: m["vuuid"],
+      created: decode_created(m["created"]),
+      date: decode_date(m["date"]),
+      image: decode_image(m["image"]),
+      number: decode_number(m["number"]),
+      teaser: decode_teaser(m["teaser"]),
+      title: decode_title(m["title"]),
+      topic: decode_topic(m["topic"]),
+      url: decode_url(m["url"]),
+      uuid: decode_uuid(m["uuid"]),
+      vuuid: decode_vuuid(m["vuuid"]),
     }
   end
 
@@ -236,6 +370,12 @@ defmodule TopLevel do
           results: [Result.t()]
         }
 
+  def decode_results(value) when is_list(value), do: value
+  def decode_results(_), do: {:error, "Unexpected type when decoding TopLevel.results"}
+
+  def encode_results(value) when is_list(value), do: value
+  def encode_results(_), do: {:error, "Unexpected type when encoding TopLevel.results"}
+
   def from_map(m) do
     %TopLevel{
       metadata: Metadata.from_map(m["metadata"]),
diff --git a/base/elixir/test/inputs/json/misc/0cffa.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/0cffa.json/default/QuickType.ex
index 6f9a0e7..683ea55 100644
--- a/base/elixir/test/inputs/json/misc/0cffa.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/0cffa.json/default/QuickType.ex
@@ -16,12 +16,30 @@ defmodule The480_WStill do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding The480_WStill.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding The480_WStill.height"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding The480_WStill.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding The480_WStill.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding The480_WStill.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding The480_WStill.width"}
+
   def from_map(m) do
     %The480_WStill{
-      height: m["height"],
+      height: decode_height(m["height"]),
       size: m["size"],
-      url: m["url"],
-      width: m["width"],
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -58,12 +76,36 @@ defmodule DownsizedSmall do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding DownsizedSmall.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding DownsizedSmall.height"}
+
+  def decode_mp4(value) when is_binary(value), do: value
+  def decode_mp4(_), do: {:error, "Unexpected type when decoding DownsizedSmall.mp4"}
+
+  def encode_mp4(value) when is_binary(value), do: value
+  def encode_mp4(_), do: {:error, "Unexpected type when encoding DownsizedSmall.mp4"}
+
+  def decode_mp4_size(value) when is_binary(value), do: value
+  def decode_mp4_size(_), do: {:error, "Unexpected type when decoding DownsizedSmall.mp4_size"}
+
+  def encode_mp4_size(value) when is_binary(value), do: value
+  def encode_mp4_size(_), do: {:error, "Unexpected type when encoding DownsizedSmall.mp4_size"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding DownsizedSmall.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding DownsizedSmall.width"}
+
   def from_map(m) do
     %DownsizedSmall{
-      height: m["height"],
-      mp4: m["mp4"],
-      mp4_size: m["mp4_size"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      mp4: decode_mp4(m["mp4"]),
+      mp4_size: decode_mp4_size(m["mp4_size"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -106,18 +148,54 @@ defmodule FixedHeight do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding FixedHeight.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding FixedHeight.height"}
+
+  def decode_size(value) when is_binary(value), do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding FixedHeight.size"}
+
+  def encode_size(value) when is_binary(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding FixedHeight.size"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding FixedHeight.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding FixedHeight.url"}
+
+  def decode_webp(value) when is_binary(value), do: value
+  def decode_webp(_), do: {:error, "Unexpected type when decoding FixedHeight.webp"}
+
+  def encode_webp(value) when is_binary(value), do: value
+  def encode_webp(_), do: {:error, "Unexpected type when encoding FixedHeight.webp"}
+
+  def decode_webp_size(value) when is_binary(value), do: value
+  def decode_webp_size(_), do: {:error, "Unexpected type when decoding FixedHeight.webp_size"}
+
+  def encode_webp_size(value) when is_binary(value), do: value
+  def encode_webp_size(_), do: {:error, "Unexpected type when encoding FixedHeight.webp_size"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding FixedHeight.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding FixedHeight.width"}
+
   def from_map(m) do
     %FixedHeight{
       frames: m["frames"],
       hash: m["hash"],
-      height: m["height"],
+      height: decode_height(m["height"]),
       mp4: m["mp4"],
       mp4_size: m["mp4_size"],
-      size: m["size"],
-      url: m["url"],
-      webp: m["webp"],
-      webp_size: m["webp_size"],
-      width: m["width"],
+      size: decode_size(m["size"]),
+      url: decode_url(m["url"]),
+      webp: decode_webp(m["webp"]),
+      webp_size: decode_webp_size(m["webp_size"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -158,10 +236,22 @@ defmodule Looping do
           mp4_size: String.t()
         }
 
+  def decode_mp4(value) when is_binary(value), do: value
+  def decode_mp4(_), do: {:error, "Unexpected type when decoding Looping.mp4"}
+
+  def encode_mp4(value) when is_binary(value), do: value
+  def encode_mp4(_), do: {:error, "Unexpected type when encoding Looping.mp4"}
+
+  def decode_mp4_size(value) when is_binary(value), do: value
+  def decode_mp4_size(_), do: {:error, "Unexpected type when decoding Looping.mp4_size"}
+
+  def encode_mp4_size(value) when is_binary(value), do: value
+  def encode_mp4_size(_), do: {:error, "Unexpected type when encoding Looping.mp4_size"}
+
   def from_map(m) do
     %Looping{
-      mp4: m["mp4"],
-      mp4_size: m["mp4_size"],
+      mp4: decode_mp4(m["mp4"]),
+      mp4_size: decode_mp4_size(m["mp4_size"]),
     }
   end
 
@@ -436,13 +526,43 @@ defmodule User do
           username: Username.t()
         }
 
+  def decode_avatar_url(value) when is_binary(value), do: value
+  def decode_avatar_url(_), do: {:error, "Unexpected type when decoding User.avatar_url"}
+
+  def encode_avatar_url(value) when is_binary(value), do: value
+  def encode_avatar_url(_), do: {:error, "Unexpected type when encoding User.avatar_url"}
+
+  def decode_banner_url(value) when is_binary(value), do: value
+  def decode_banner_url(_), do: {:error, "Unexpected type when decoding User.banner_url"}
+
+  def encode_banner_url(value) when is_binary(value), do: value
+  def encode_banner_url(_), do: {:error, "Unexpected type when encoding User.banner_url"}
+
+  def decode_display_name(value) when is_binary(value), do: value
+  def decode_display_name(_), do: {:error, "Unexpected type when decoding User.display_name"}
+
+  def encode_display_name(value) when is_binary(value), do: value
+  def encode_display_name(_), do: {:error, "Unexpected type when encoding User.display_name"}
+
+  def decode_profile_url(value) when is_binary(value), do: value
+  def decode_profile_url(_), do: {:error, "Unexpected type when decoding User.profile_url"}
+
+  def encode_profile_url(value) when is_binary(value), do: value
+  def encode_profile_url(_), do: {:error, "Unexpected type when encoding User.profile_url"}
+
+  def decode_twitter(value) when is_binary(value), do: value
+  def decode_twitter(_), do: {:error, "Unexpected type when decoding User.twitter"}
+
+  def encode_twitter(value) when is_binary(value), do: value
+  def encode_twitter(_), do: {:error, "Unexpected type when encoding User.twitter"}
+
   def from_map(m) do
     %User{
-      avatar_url: m["avatar_url"],
-      banner_url: m["banner_url"],
-      display_name: m["display_name"],
-      profile_url: m["profile_url"],
-      twitter: m["twitter"],
+      avatar_url: decode_avatar_url(m["avatar_url"]),
+      banner_url: decode_banner_url(m["banner_url"]),
+      display_name: decode_display_name(m["display_name"]),
+      profile_url: decode_profile_url(m["profile_url"]),
+      twitter: decode_twitter(m["twitter"]),
       username: Username.decode(m["username"]),
     }
   end
@@ -496,24 +616,102 @@ defmodule Datum do
           username: Username.t()
         }
 
+  def decode_bitly_gif_url(value) when is_binary(value), do: value
+  def decode_bitly_gif_url(_), do: {:error, "Unexpected type when decoding Datum.bitly_gif_url"}
+
+  def encode_bitly_gif_url(value) when is_binary(value), do: value
+  def encode_bitly_gif_url(_), do: {:error, "Unexpected type when encoding Datum.bitly_gif_url"}
+
+  def decode_bitly_url(value) when is_binary(value), do: value
+  def decode_bitly_url(_), do: {:error, "Unexpected type when decoding Datum.bitly_url"}
+
+  def encode_bitly_url(value) when is_binary(value), do: value
+  def encode_bitly_url(_), do: {:error, "Unexpected type when encoding Datum.bitly_url"}
+
+  def decode_content_url(value) when is_binary(value), do: value
+  def decode_content_url(_), do: {:error, "Unexpected type when decoding Datum.content_url"}
+
+  def encode_content_url(value) when is_binary(value), do: value
+  def encode_content_url(_), do: {:error, "Unexpected type when encoding Datum.content_url"}
+
+  def decode_embed_url(value) when is_binary(value), do: value
+  def decode_embed_url(_), do: {:error, "Unexpected type when decoding Datum.embed_url"}
+
+  def encode_embed_url(value) when is_binary(value), do: value
+  def encode_embed_url(_), do: {:error, "Unexpected type when encoding Datum.embed_url"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Datum.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Datum.id"}
+
+  def decode_import_datetime(value) when is_binary(value), do: value
+  def decode_import_datetime(_), do: {:error, "Unexpected type when decoding Datum.import_datetime"}
+
+  def encode_import_datetime(value) when is_binary(value), do: value
+  def encode_import_datetime(_), do: {:error, "Unexpected type when encoding Datum.import_datetime"}
+
+  def decode_is_indexable(value) when is_integer(value), do: value
+  def decode_is_indexable(_), do: {:error, "Unexpected type when decoding Datum.is_indexable"}
+
+  def encode_is_indexable(value) when is_integer(value), do: value
+  def encode_is_indexable(_), do: {:error, "Unexpected type when encoding Datum.is_indexable"}
+
+  def decode_slug(value) when is_binary(value), do: value
+  def decode_slug(_), do: {:error, "Unexpected type when decoding Datum.slug"}
+
+  def encode_slug(value) when is_binary(value), do: value
+  def encode_slug(_), do: {:error, "Unexpected type when encoding Datum.slug"}
+
+  def decode_source(value) when is_binary(value), do: value
+  def decode_source(_), do: {:error, "Unexpected type when decoding Datum.source"}
+
+  def encode_source(value) when is_binary(value), do: value
+  def encode_source(_), do: {:error, "Unexpected type when encoding Datum.source"}
+
+  def decode_source_post_url(value) when is_binary(value), do: value
+  def decode_source_post_url(_), do: {:error, "Unexpected type when decoding Datum.source_post_url"}
+
+  def encode_source_post_url(value) when is_binary(value), do: value
+  def encode_source_post_url(_), do: {:error, "Unexpected type when encoding Datum.source_post_url"}
+
+  def decode_source_tld(value) when is_binary(value), do: value
+  def decode_source_tld(_), do: {:error, "Unexpected type when decoding Datum.source_tld"}
+
+  def encode_source_tld(value) when is_binary(value), do: value
+  def encode_source_tld(_), do: {:error, "Unexpected type when encoding Datum.source_tld"}
+
+  def decode_trending_datetime(value) when is_binary(value), do: value
+  def decode_trending_datetime(_), do: {:error, "Unexpected type when decoding Datum.trending_datetime"}
+
+  def encode_trending_datetime(value) when is_binary(value), do: value
+  def encode_trending_datetime(_), do: {:error, "Unexpected type when encoding Datum.trending_datetime"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Datum.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Datum.url"}
+
   def from_map(m) do
     %Datum{
-      bitly_gif_url: m["bitly_gif_url"],
-      bitly_url: m["bitly_url"],
-      content_url: m["content_url"],
-      embed_url: m["embed_url"],
-      id: m["id"],
+      bitly_gif_url: decode_bitly_gif_url(m["bitly_gif_url"]),
+      bitly_url: decode_bitly_url(m["bitly_url"]),
+      content_url: decode_content_url(m["content_url"]),
+      embed_url: decode_embed_url(m["embed_url"]),
+      id: decode_id(m["id"]),
       images: Images.from_map(m["images"]),
-      import_datetime: m["import_datetime"],
-      is_indexable: m["is_indexable"],
+      import_datetime: decode_import_datetime(m["import_datetime"]),
+      is_indexable: decode_is_indexable(m["is_indexable"]),
       rating: Rating.decode(m["rating"]),
-      slug: m["slug"],
-      source: m["source"],
-      source_post_url: m["source_post_url"],
-      source_tld: m["source_tld"],
-      trending_datetime: m["trending_datetime"],
+      slug: decode_slug(m["slug"]),
+      source: decode_source(m["source"]),
+      source_post_url: decode_source_post_url(m["source_post_url"]),
+      source_tld: decode_source_tld(m["source_tld"]),
+      trending_datetime: decode_trending_datetime(m["trending_datetime"]),
       type: Type.decode(m["type"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
       user: m["user"] && User.from_map(m["user"]),
       username: Username.decode(m["username"]),
     }
@@ -565,11 +763,29 @@ defmodule Meta do
           status: integer()
         }
 
+  def decode_msg(value) when is_binary(value), do: value
+  def decode_msg(_), do: {:error, "Unexpected type when decoding Meta.msg"}
+
+  def encode_msg(value) when is_binary(value), do: value
+  def encode_msg(_), do: {:error, "Unexpected type when encoding Meta.msg"}
+
+  def decode_response_id(value) when is_binary(value), do: value
+  def decode_response_id(_), do: {:error, "Unexpected type when decoding Meta.response_id"}
+
+  def encode_response_id(value) when is_binary(value), do: value
+  def encode_response_id(_), do: {:error, "Unexpected type when encoding Meta.response_id"}
+
+  def decode_status(value) when is_integer(value), do: value
+  def decode_status(_), do: {:error, "Unexpected type when decoding Meta.status"}
+
+  def encode_status(value) when is_integer(value), do: value
+  def encode_status(_), do: {:error, "Unexpected type when encoding Meta.status"}
+
   def from_map(m) do
     %Meta{
-      msg: m["msg"],
-      response_id: m["response_id"],
-      status: m["status"],
+      msg: decode_msg(m["msg"]),
+      response_id: decode_response_id(m["response_id"]),
+      status: decode_status(m["status"]),
     }
   end
 
@@ -604,11 +820,29 @@ defmodule Pagination do
           total_count: integer()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Pagination.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Pagination.count"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding Pagination.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding Pagination.offset"}
+
+  def decode_total_count(value) when is_integer(value), do: value
+  def decode_total_count(_), do: {:error, "Unexpected type when decoding Pagination.total_count"}
+
+  def encode_total_count(value) when is_integer(value), do: value
+  def encode_total_count(_), do: {:error, "Unexpected type when encoding Pagination.total_count"}
+
   def from_map(m) do
     %Pagination{
-      count: m["count"],
-      offset: m["offset"],
-      total_count: m["total_count"],
+      count: decode_count(m["count"]),
+      offset: decode_offset(m["offset"]),
+      total_count: decode_total_count(m["total_count"]),
     }
   end
 
@@ -643,6 +877,12 @@ defmodule TopLevel do
           pagination: Pagination.t()
         }
 
+  def decode_data(value) when is_list(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data(value) when is_list(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
   def from_map(m) do
     %TopLevel{
       data: Enum.map(m["data"], &Datum.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/0e0c2.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/0e0c2.json/default/QuickType.ex
index 1ea89ce..2eef6c2 100644
--- a/base/elixir/test/inputs/json/misc/0e0c2.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/0e0c2.json/default/QuickType.ex
@@ -16,12 +16,36 @@ defmodule Collection do
           slug: String.t()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Collection.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Collection.id"}
+
+  def decode_movies(value) when is_list(value), do: value
+  def decode_movies(_), do: {:error, "Unexpected type when decoding Collection.movies"}
+
+  def encode_movies(value) when is_list(value), do: value
+  def encode_movies(_), do: {:error, "Unexpected type when encoding Collection.movies"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Collection.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Collection.name"}
+
+  def decode_slug(value) when is_binary(value), do: value
+  def decode_slug(_), do: {:error, "Unexpected type when decoding Collection.slug"}
+
+  def encode_slug(value) when is_binary(value), do: value
+  def encode_slug(_), do: {:error, "Unexpected type when encoding Collection.slug"}
+
   def from_map(m) do
     %Collection{
-      id: m["id"],
-      movies: m["movies"],
-      name: m["name"],
-      slug: m["slug"],
+      id: decode_id(m["id"]),
+      movies: decode_movies(m["movies"]),
+      name: decode_name(m["name"]),
+      slug: decode_slug(m["slug"]),
     }
   end
 
@@ -107,15 +131,51 @@ defmodule Detail do
           title: String.t()
         }
 
+  def decode_cast(value) when is_binary(value), do: value
+  def decode_cast(_), do: {:error, "Unexpected type when decoding Detail.cast"}
+
+  def encode_cast(value) when is_binary(value), do: value
+  def encode_cast(_), do: {:error, "Unexpected type when encoding Detail.cast"}
+
+  def decode_director(value) when is_binary(value), do: value
+  def decode_director(_), do: {:error, "Unexpected type when decoding Detail.director"}
+
+  def encode_director(value) when is_binary(value), do: value
+  def encode_director(_), do: {:error, "Unexpected type when encoding Detail.director"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Detail.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Detail.id"}
+
+  def decode_storyline(value) when is_binary(value), do: value
+  def decode_storyline(_), do: {:error, "Unexpected type when decoding Detail.storyline"}
+
+  def encode_storyline(value) when is_binary(value), do: value
+  def encode_storyline(_), do: {:error, "Unexpected type when encoding Detail.storyline"}
+
+  def decode_tagline(value) when is_binary(value), do: value
+  def decode_tagline(_), do: {:error, "Unexpected type when decoding Detail.tagline"}
+
+  def encode_tagline(value) when is_binary(value), do: value
+  def encode_tagline(_), do: {:error, "Unexpected type when encoding Detail.tagline"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Detail.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Detail.title"}
+
   def from_map(m) do
     %Detail{
-      cast: m["cast"],
-      director: m["director"],
-      id: m["id"],
+      cast: decode_cast(m["cast"]),
+      director: decode_director(m["director"]),
+      id: decode_id(m["id"]),
       language: DetailLanguage.decode(m["language"]),
-      storyline: m["storyline"],
-      tagline: m["tagline"],
-      title: m["title"],
+      storyline: decode_storyline(m["storyline"]),
+      tagline: decode_tagline(m["tagline"]),
+      title: decode_title(m["title"]),
     }
   end
 
@@ -154,11 +214,29 @@ defmodule FavMovie do
           watched: boolean()
         }
 
+  def decode_follow(value) when is_boolean(value), do: value
+  def decode_follow(_), do: {:error, "Unexpected type when decoding FavMovie.follow"}
+
+  def encode_follow(value) when is_boolean(value), do: value
+  def encode_follow(_), do: {:error, "Unexpected type when encoding FavMovie.follow"}
+
+  def decode_star(value) when is_boolean(value), do: value
+  def decode_star(_), do: {:error, "Unexpected type when decoding FavMovie.star"}
+
+  def encode_star(value) when is_boolean(value), do: value
+  def encode_star(_), do: {:error, "Unexpected type when encoding FavMovie.star"}
+
+  def decode_watched(value) when is_boolean(value), do: value
+  def decode_watched(_), do: {:error, "Unexpected type when decoding FavMovie.watched"}
+
+  def encode_watched(value) when is_boolean(value), do: value
+  def encode_watched(_), do: {:error, "Unexpected type when encoding FavMovie.watched"}
+
   def from_map(m) do
     %FavMovie{
-      follow: m["follow"],
-      star: m["star"],
-      watched: m["watched"],
+      follow: decode_follow(m["follow"]),
+      star: decode_star(m["star"]),
+      watched: decode_watched(m["watched"]),
     }
   end
 
@@ -241,13 +319,37 @@ defmodule Image do
           url: String.t()
         }
 
+  def decode_favs(value) when is_integer(value), do: value
+  def decode_favs(_), do: {:error, "Unexpected type when decoding Image.favs"}
+
+  def encode_favs(value) when is_integer(value), do: value
+  def encode_favs(_), do: {:error, "Unexpected type when encoding Image.favs"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Image.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Image.id"}
+
+  def decode_thumbnail(value) when is_binary(value), do: value
+  def decode_thumbnail(_), do: {:error, "Unexpected type when decoding Image.thumbnail"}
+
+  def encode_thumbnail(value) when is_binary(value), do: value
+  def encode_thumbnail(_), do: {:error, "Unexpected type when encoding Image.thumbnail"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Image.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Image.url"}
+
   def from_map(m) do
     %Image{
-      favs: m["favs"],
-      id: m["id"],
-      thumbnail: m["thumbnail"],
+      favs: decode_favs(m["favs"]),
+      id: decode_id(m["id"]),
+      thumbnail: decode_thumbnail(m["thumbnail"]),
       type: Type.decode(m["type"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
     }
   end
 
@@ -331,12 +433,30 @@ defmodule Video do
           url: String.t()
         }
 
+  def decode_kind(value) when is_binary(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Video.kind"}
+
+  def encode_kind(value) when is_binary(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Video.kind"}
+
+  def decode_source(value) when is_binary(value), do: value
+  def decode_source(_), do: {:error, "Unexpected type when decoding Video.source"}
+
+  def encode_source(value) when is_binary(value), do: value
+  def encode_source(_), do: {:error, "Unexpected type when encoding Video.source"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Video.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Video.url"}
+
   def from_map(m) do
     %Video{
-      kind: m["kind"],
+      kind: decode_kind(m["kind"]),
       language: ResultLanguage.decode(m["language"]),
-      source: m["source"],
-      url: m["url"],
+      source: decode_source(m["source"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -372,11 +492,29 @@ defmodule VoteScore do
           total: integer()
         }
 
+  def decode_avg(value) when is_integer(value), do: value
+  def decode_avg(_), do: {:error, "Unexpected type when decoding VoteScore.avg"}
+
+  def encode_avg(value) when is_integer(value), do: value
+  def encode_avg(_), do: {:error, "Unexpected type when encoding VoteScore.avg"}
+
+  def decode_score(value) when is_integer(value), do: value
+  def decode_score(_), do: {:error, "Unexpected type when decoding VoteScore.score"}
+
+  def encode_score(value) when is_integer(value), do: value
+  def encode_score(_), do: {:error, "Unexpected type when encoding VoteScore.score"}
+
+  def decode_total(value) when is_integer(value), do: value
+  def decode_total(_), do: {:error, "Unexpected type when decoding VoteScore.total"}
+
+  def encode_total(value) when is_integer(value), do: value
+  def encode_total(_), do: {:error, "Unexpected type when encoding VoteScore.total"}
+
   def from_map(m) do
     %VoteScore{
-      avg: m["avg"],
-      score: m["score"],
-      total: m["total"],
+      avg: decode_avg(m["avg"]),
+      score: decode_score(m["score"]),
+      total: decode_total(m["total"]),
     }
   end
 
@@ -423,23 +561,95 @@ defmodule Result do
           watches: integer()
         }
 
+  def decode_active_screens(value) when is_integer(value), do: value
+  def decode_active_screens(_), do: {:error, "Unexpected type when decoding Result.active_screens"}
+
+  def encode_active_screens(value) when is_integer(value), do: value
+  def encode_active_screens(_), do: {:error, "Unexpected type when encoding Result.active_screens"}
+
+  def decode_collections(value) when is_list(value), do: value
+  def decode_collections(_), do: {:error, "Unexpected type when decoding Result.collections"}
+
+  def encode_collections(value) when is_list(value), do: value
+  def encode_collections(_), do: {:error, "Unexpected type when encoding Result.collections"}
+
+  def decode_details(value) when is_list(value), do: value
+  def decode_details(_), do: {:error, "Unexpected type when decoding Result.details"}
+
+  def encode_details(value) when is_list(value), do: value
+  def encode_details(_), do: {:error, "Unexpected type when encoding Result.details"}
+
+  def decode_duration(value) when is_integer(value), do: value
+  def decode_duration(_), do: {:error, "Unexpected type when decoding Result.duration"}
+
+  def encode_duration(value) when is_integer(value), do: value
+  def encode_duration(_), do: {:error, "Unexpected type when encoding Result.duration"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Result.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Result.id"}
+
+  def decode_images(value) when is_list(value), do: value
+  def decode_images(_), do: {:error, "Unexpected type when decoding Result.images"}
+
+  def encode_images(value) when is_list(value), do: value
+  def encode_images(_), do: {:error, "Unexpected type when encoding Result.images"}
+
+  def decode_release_date(value) when is_binary(value), do: value
+  def decode_release_date(_), do: {:error, "Unexpected type when decoding Result.release_date"}
+
+  def encode_release_date(value) when is_binary(value), do: value
+  def encode_release_date(_), do: {:error, "Unexpected type when encoding Result.release_date"}
+
+  def decode_stars(value) when is_integer(value), do: value
+  def decode_stars(_), do: {:error, "Unexpected type when decoding Result.stars"}
+
+  def encode_stars(value) when is_integer(value), do: value
+  def encode_stars(_), do: {:error, "Unexpected type when encoding Result.stars"}
+
+
+  def decode_tags_element(_), do: {:error, "Unexpected type when decoding Result.tags"}
+
+
+  def encode_tags_element(_), do: {:error, "Unexpected type when encoding Result.tags"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Result.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Result.title"}
+
+  def decode_videos(value) when is_list(value), do: value
+  def decode_videos(_), do: {:error, "Unexpected type when decoding Result.videos"}
+
+  def encode_videos(value) when is_list(value), do: value
+  def encode_videos(_), do: {:error, "Unexpected type when encoding Result.videos"}
+
+  def decode_watches(value) when is_integer(value), do: value
+  def decode_watches(_), do: {:error, "Unexpected type when decoding Result.watches"}
+
+  def encode_watches(value) when is_integer(value), do: value
+  def encode_watches(_), do: {:error, "Unexpected type when encoding Result.watches"}
+
   def from_map(m) do
     %Result{
-      active_screens: m["active_screens"],
+      active_screens: decode_active_screens(m["active_screens"]),
       collections: Enum.map(m["collections"], &Collection.from_map/1),
       details: Enum.map(m["details"], &Detail.from_map/1),
-      duration: m["duration"],
+      duration: decode_duration(m["duration"]),
       fav_movie: FavMovie.from_map(m["fav_movie"]),
-      id: m["id"],
+      id: decode_id(m["id"]),
       images: Enum.map(m["images"], &Image.from_map/1),
       language: ResultLanguage.decode(m["language"]),
-      release_date: m["release_date"],
-      stars: m["stars"],
+      release_date: decode_release_date(m["release_date"]),
+      stars: decode_stars(m["stars"]),
       tags: m["tags"],
-      title: m["title"],
+      title: decode_title(m["title"]),
       videos: Enum.map(m["videos"], &Video.from_map/1),
       vote_score: VoteScore.from_map(m["vote_score"]),
-      watches: m["watches"],
+      watches: decode_watches(m["watches"]),
     }
   end
 
@@ -487,11 +697,35 @@ defmodule TopLevel do
           results: [Result.t()]
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding TopLevel.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding TopLevel.count"}
+
+  def decode_next(value) when is_binary(value), do: value
+  def decode_next(_), do: {:error, "Unexpected type when decoding TopLevel.next"}
+
+  def encode_next(value) when is_binary(value), do: value
+  def encode_next(_), do: {:error, "Unexpected type when encoding TopLevel.next"}
+
+  def decode_previous(value) when is_nil(value), do: value
+  def decode_previous(_), do: {:error, "Unexpected type when decoding TopLevel.previous"}
+
+  def encode_previous(value) when is_nil(value), do: value
+  def encode_previous(_), do: {:error, "Unexpected type when encoding TopLevel.previous"}
+
+  def decode_results(value) when is_list(value), do: value
+  def decode_results(_), do: {:error, "Unexpected type when decoding TopLevel.results"}
+
+  def encode_results(value) when is_list(value), do: value
+  def encode_results(_), do: {:error, "Unexpected type when encoding TopLevel.results"}
+
   def from_map(m) do
     %TopLevel{
-      count: m["count"],
-      next: m["next"],
-      previous: m["previous"],
+      count: decode_count(m["count"]),
+      next: decode_next(m["next"]),
+      previous: decode_previous(m["previous"]),
       results: Enum.map(m["results"], &Result.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/0fecf.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/0fecf.json/default/QuickType.ex
index 5f70c10..8919019 100644
--- a/base/elixir/test/inputs/json/misc/0fecf.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/0fecf.json/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule TopLevel do
           countries: [String.t()]
         }
 
+  def decode_countries(value) when is_list(value), do: value
+  def decode_countries(_), do: {:error, "Unexpected type when decoding TopLevel.countries"}
+
+  def encode_countries(value) when is_list(value), do: value
+  def encode_countries(_), do: {:error, "Unexpected type when encoding TopLevel.countries"}
+
   def from_map(m) do
     %TopLevel{
-      countries: m["countries"],
+      countries: decode_countries(m["countries"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/10be4.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/10be4.json/default/QuickType.ex
index a2da62e..a0bb327 100644
--- a/base/elixir/test/inputs/json/misc/10be4.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/10be4.json/default/QuickType.ex
@@ -61,9 +61,15 @@ defmodule Identifier do
           scheme: Scheme.t()
         }
 
+  def decode_identifier(value) when is_binary(value), do: value
+  def decode_identifier(_), do: {:error, "Unexpected type when decoding Identifier.identifier"}
+
+  def encode_identifier(value) when is_binary(value), do: value
+  def encode_identifier(_), do: {:error, "Unexpected type when encoding Identifier.identifier"}
+
   def from_map(m) do
     %Identifier{
-      identifier: m["identifier"],
+      identifier: decode_identifier(m["identifier"]),
       scheme: Scheme.decode(m["scheme"]),
     }
   end
@@ -203,10 +209,16 @@ defmodule Link do
           url: String.t()
         }
 
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Link.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Link.url"}
+
   def from_map(m) do
     %Link{
       note: Note.decode(m["note"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
     }
   end
 
@@ -239,9 +251,15 @@ defmodule OtherName do
           note: nil | String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding OtherName.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding OtherName.name"}
+
   def from_map(m) do
     %OtherName{
-      name: m["name"],
+      name: decode_name(m["name"]),
       note: m["note"],
     }
   end
@@ -370,11 +388,17 @@ defmodule Text do
           url: String.t()
         }
 
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Text.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Text.url"}
+
   def from_map(m) do
     %Text{
       media_type: MediaType.decode(m["media_type"]),
       title: Title.decode(m["title"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
     }
   end
 
@@ -414,13 +438,55 @@ defmodule TopLevelElement do
           text: [Text.t()]
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_identifiers(value) when is_list(value), do: value
+  def decode_identifiers(_), do: {:error, "Unexpected type when decoding TopLevelElement.identifiers"}
+
+  def encode_identifiers(value) when is_list(value), do: value
+  def encode_identifiers(_), do: {:error, "Unexpected type when encoding TopLevelElement.identifiers"}
+
+  def decode_keywords(value) when is_list(value), do: value
+  def decode_keywords(_), do: {:error, "Unexpected type when decoding TopLevelElement.keywords"}
+
+  def encode_keywords(value) when is_list(value), do: value
+  def encode_keywords(_), do: {:error, "Unexpected type when encoding TopLevelElement.keywords"}
+
+  def decode_links(value) when is_list(value), do: value
+  def decode_links(_), do: {:error, "Unexpected type when decoding TopLevelElement.links"}
+
+  def encode_links(value) when is_list(value), do: value
+  def encode_links(_), do: {:error, "Unexpected type when encoding TopLevelElement.links"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.name"}
+
+  def decode_other_names(value) when is_list(value), do: value
+  def decode_other_names(_), do: {:error, "Unexpected type when decoding TopLevelElement.other_names"}
+
+  def encode_other_names(value) when is_list(value), do: value
+  def encode_other_names(_), do: {:error, "Unexpected type when encoding TopLevelElement.other_names"}
+
+  def decode_text(value) when is_list(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding TopLevelElement.text"}
+
+  def encode_text(value) when is_list(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding TopLevelElement.text"}
+
   def from_map(m) do
     %TopLevelElement{
-      id: m["id"],
+      id: decode_id(m["id"]),
       identifiers: Enum.map(m["identifiers"], &Identifier.from_map/1),
       keywords: Enum.map(m["keywords"], &KeywordElement.decode/1),
       links: Enum.map(m["links"], &Link.from_map/1),
-      name: m["name"],
+      name: decode_name(m["name"]),
       other_names: Enum.map(m["other_names"], &OtherName.from_map/1),
       superseded_by: m["superseded_by"],
       text: Enum.map(m["text"], &Text.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/112b5.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/112b5.json/default/QuickType.ex
index 19b0349..96c683d 100644
--- a/base/elixir/test/inputs/json/misc/112b5.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/112b5.json/default/QuickType.ex
@@ -45,12 +45,36 @@ defmodule Headers do
           user_agent: String.t()
         }
 
+  def decode_accept_encoding(value) when is_binary(value), do: value
+  def decode_accept_encoding(_), do: {:error, "Unexpected type when decoding Headers.accept_encoding"}
+
+  def encode_accept_encoding(value) when is_binary(value), do: value
+  def encode_accept_encoding(_), do: {:error, "Unexpected type when encoding Headers.accept_encoding"}
+
+  def decode_connection(value) when is_binary(value), do: value
+  def decode_connection(_), do: {:error, "Unexpected type when decoding Headers.connection"}
+
+  def encode_connection(value) when is_binary(value), do: value
+  def encode_connection(_), do: {:error, "Unexpected type when encoding Headers.connection"}
+
+  def decode_host(value) when is_binary(value), do: value
+  def decode_host(_), do: {:error, "Unexpected type when decoding Headers.host"}
+
+  def encode_host(value) when is_binary(value), do: value
+  def encode_host(_), do: {:error, "Unexpected type when encoding Headers.host"}
+
+  def decode_user_agent(value) when is_binary(value), do: value
+  def decode_user_agent(_), do: {:error, "Unexpected type when decoding Headers.user_agent"}
+
+  def encode_user_agent(value) when is_binary(value), do: value
+  def encode_user_agent(_), do: {:error, "Unexpected type when encoding Headers.user_agent"}
+
   def from_map(m) do
     %Headers{
-      accept_encoding: m["Accept-Encoding"],
-      connection: m["Connection"],
-      host: m["Host"],
-      user_agent: m["User-Agent"],
+      accept_encoding: decode_accept_encoding(m["Accept-Encoding"]),
+      connection: decode_connection(m["Connection"]),
+      host: decode_host(m["Host"]),
+      user_agent: decode_user_agent(m["User-Agent"]),
     }
   end
 
@@ -87,12 +111,24 @@ defmodule TopLevel do
           url: String.t()
         }
 
+  def decode_origin(value) when is_binary(value), do: value
+  def decode_origin(_), do: {:error, "Unexpected type when decoding TopLevel.origin"}
+
+  def encode_origin(value) when is_binary(value), do: value
+  def encode_origin(_), do: {:error, "Unexpected type when encoding TopLevel.origin"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding TopLevel.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding TopLevel.url"}
+
   def from_map(m) do
     %TopLevel{
       args: Args.from_map(m["args"]),
       headers: Headers.from_map(m["headers"]),
-      origin: m["origin"],
-      url: m["url"],
+      origin: decode_origin(m["origin"]),
+      url: decode_url(m["url"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/127a1.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/127a1.json/default/QuickType.ex
index f06d11d..f204979 100644
--- a/base/elixir/test/inputs/json/misc/127a1.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/127a1.json/default/QuickType.ex
@@ -16,12 +16,30 @@ defmodule The480_WStill do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding The480_WStill.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding The480_WStill.height"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding The480_WStill.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding The480_WStill.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding The480_WStill.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding The480_WStill.width"}
+
   def from_map(m) do
     %The480_WStill{
-      height: m["height"],
+      height: decode_height(m["height"]),
       size: m["size"],
-      url: m["url"],
-      width: m["width"],
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -58,12 +76,36 @@ defmodule DownsizedSmall do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding DownsizedSmall.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding DownsizedSmall.height"}
+
+  def decode_mp4(value) when is_binary(value), do: value
+  def decode_mp4(_), do: {:error, "Unexpected type when decoding DownsizedSmall.mp4"}
+
+  def encode_mp4(value) when is_binary(value), do: value
+  def encode_mp4(_), do: {:error, "Unexpected type when encoding DownsizedSmall.mp4"}
+
+  def decode_mp4_size(value) when is_binary(value), do: value
+  def decode_mp4_size(_), do: {:error, "Unexpected type when decoding DownsizedSmall.mp4_size"}
+
+  def encode_mp4_size(value) when is_binary(value), do: value
+  def encode_mp4_size(_), do: {:error, "Unexpected type when encoding DownsizedSmall.mp4_size"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding DownsizedSmall.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding DownsizedSmall.width"}
+
   def from_map(m) do
     %DownsizedSmall{
-      height: m["height"],
-      mp4: m["mp4"],
-      mp4_size: m["mp4_size"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      mp4: decode_mp4(m["mp4"]),
+      mp4_size: decode_mp4_size(m["mp4_size"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -106,18 +148,54 @@ defmodule FixedHeight do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding FixedHeight.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding FixedHeight.height"}
+
+  def decode_size(value) when is_binary(value), do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding FixedHeight.size"}
+
+  def encode_size(value) when is_binary(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding FixedHeight.size"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding FixedHeight.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding FixedHeight.url"}
+
+  def decode_webp(value) when is_binary(value), do: value
+  def decode_webp(_), do: {:error, "Unexpected type when decoding FixedHeight.webp"}
+
+  def encode_webp(value) when is_binary(value), do: value
+  def encode_webp(_), do: {:error, "Unexpected type when encoding FixedHeight.webp"}
+
+  def decode_webp_size(value) when is_binary(value), do: value
+  def decode_webp_size(_), do: {:error, "Unexpected type when decoding FixedHeight.webp_size"}
+
+  def encode_webp_size(value) when is_binary(value), do: value
+  def encode_webp_size(_), do: {:error, "Unexpected type when encoding FixedHeight.webp_size"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding FixedHeight.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding FixedHeight.width"}
+
   def from_map(m) do
     %FixedHeight{
       frames: m["frames"],
       hash: m["hash"],
-      height: m["height"],
+      height: decode_height(m["height"]),
       mp4: m["mp4"],
       mp4_size: m["mp4_size"],
-      size: m["size"],
-      url: m["url"],
-      webp: m["webp"],
-      webp_size: m["webp_size"],
-      width: m["width"],
+      size: decode_size(m["size"]),
+      url: decode_url(m["url"]),
+      webp: decode_webp(m["webp"]),
+      webp_size: decode_webp_size(m["webp_size"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -158,10 +236,22 @@ defmodule Looping do
           mp4_size: String.t()
         }
 
+  def decode_mp4(value) when is_binary(value), do: value
+  def decode_mp4(_), do: {:error, "Unexpected type when decoding Looping.mp4"}
+
+  def encode_mp4(value) when is_binary(value), do: value
+  def encode_mp4(_), do: {:error, "Unexpected type when encoding Looping.mp4"}
+
+  def decode_mp4_size(value) when is_binary(value), do: value
+  def decode_mp4_size(_), do: {:error, "Unexpected type when decoding Looping.mp4_size"}
+
+  def encode_mp4_size(value) when is_binary(value), do: value
+  def encode_mp4_size(_), do: {:error, "Unexpected type when encoding Looping.mp4_size"}
+
   def from_map(m) do
     %Looping{
-      mp4: m["mp4"],
-      mp4_size: m["mp4_size"],
+      mp4: decode_mp4(m["mp4"]),
+      mp4_size: decode_mp4_size(m["mp4_size"]),
     }
   end
 
@@ -435,12 +525,36 @@ defmodule User do
           username: Username.t()
         }
 
+  def decode_avatar_url(value) when is_binary(value), do: value
+  def decode_avatar_url(_), do: {:error, "Unexpected type when decoding User.avatar_url"}
+
+  def encode_avatar_url(value) when is_binary(value), do: value
+  def encode_avatar_url(_), do: {:error, "Unexpected type when encoding User.avatar_url"}
+
+  def decode_banner_url(value) when is_binary(value), do: value
+  def decode_banner_url(_), do: {:error, "Unexpected type when decoding User.banner_url"}
+
+  def encode_banner_url(value) when is_binary(value), do: value
+  def encode_banner_url(_), do: {:error, "Unexpected type when encoding User.banner_url"}
+
+  def decode_display_name(value) when is_binary(value), do: value
+  def decode_display_name(_), do: {:error, "Unexpected type when decoding User.display_name"}
+
+  def encode_display_name(value) when is_binary(value), do: value
+  def encode_display_name(_), do: {:error, "Unexpected type when encoding User.display_name"}
+
+  def decode_profile_url(value) when is_binary(value), do: value
+  def decode_profile_url(_), do: {:error, "Unexpected type when decoding User.profile_url"}
+
+  def encode_profile_url(value) when is_binary(value), do: value
+  def encode_profile_url(_), do: {:error, "Unexpected type when encoding User.profile_url"}
+
   def from_map(m) do
     %User{
-      avatar_url: m["avatar_url"],
-      banner_url: m["banner_url"],
-      display_name: m["display_name"],
-      profile_url: m["profile_url"],
+      avatar_url: decode_avatar_url(m["avatar_url"]),
+      banner_url: decode_banner_url(m["banner_url"]),
+      display_name: decode_display_name(m["display_name"]),
+      profile_url: decode_profile_url(m["profile_url"]),
       twitter: m["twitter"],
       username: Username.decode(m["username"]),
     }
@@ -495,24 +609,102 @@ defmodule Datum do
           username: Username.t()
         }
 
+  def decode_bitly_gif_url(value) when is_binary(value), do: value
+  def decode_bitly_gif_url(_), do: {:error, "Unexpected type when decoding Datum.bitly_gif_url"}
+
+  def encode_bitly_gif_url(value) when is_binary(value), do: value
+  def encode_bitly_gif_url(_), do: {:error, "Unexpected type when encoding Datum.bitly_gif_url"}
+
+  def decode_bitly_url(value) when is_binary(value), do: value
+  def decode_bitly_url(_), do: {:error, "Unexpected type when decoding Datum.bitly_url"}
+
+  def encode_bitly_url(value) when is_binary(value), do: value
+  def encode_bitly_url(_), do: {:error, "Unexpected type when encoding Datum.bitly_url"}
+
+  def decode_content_url(value) when is_binary(value), do: value
+  def decode_content_url(_), do: {:error, "Unexpected type when decoding Datum.content_url"}
+
+  def encode_content_url(value) when is_binary(value), do: value
+  def encode_content_url(_), do: {:error, "Unexpected type when encoding Datum.content_url"}
+
+  def decode_embed_url(value) when is_binary(value), do: value
+  def decode_embed_url(_), do: {:error, "Unexpected type when decoding Datum.embed_url"}
+
+  def encode_embed_url(value) when is_binary(value), do: value
+  def encode_embed_url(_), do: {:error, "Unexpected type when encoding Datum.embed_url"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Datum.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Datum.id"}
+
+  def decode_import_datetime(value) when is_binary(value), do: value
+  def decode_import_datetime(_), do: {:error, "Unexpected type when decoding Datum.import_datetime"}
+
+  def encode_import_datetime(value) when is_binary(value), do: value
+  def encode_import_datetime(_), do: {:error, "Unexpected type when encoding Datum.import_datetime"}
+
+  def decode_is_indexable(value) when is_integer(value), do: value
+  def decode_is_indexable(_), do: {:error, "Unexpected type when decoding Datum.is_indexable"}
+
+  def encode_is_indexable(value) when is_integer(value), do: value
+  def encode_is_indexable(_), do: {:error, "Unexpected type when encoding Datum.is_indexable"}
+
+  def decode_slug(value) when is_binary(value), do: value
+  def decode_slug(_), do: {:error, "Unexpected type when decoding Datum.slug"}
+
+  def encode_slug(value) when is_binary(value), do: value
+  def encode_slug(_), do: {:error, "Unexpected type when encoding Datum.slug"}
+
+  def decode_source(value) when is_binary(value), do: value
+  def decode_source(_), do: {:error, "Unexpected type when decoding Datum.source"}
+
+  def encode_source(value) when is_binary(value), do: value
+  def encode_source(_), do: {:error, "Unexpected type when encoding Datum.source"}
+
+  def decode_source_post_url(value) when is_binary(value), do: value
+  def decode_source_post_url(_), do: {:error, "Unexpected type when decoding Datum.source_post_url"}
+
+  def encode_source_post_url(value) when is_binary(value), do: value
+  def encode_source_post_url(_), do: {:error, "Unexpected type when encoding Datum.source_post_url"}
+
+  def decode_source_tld(value) when is_binary(value), do: value
+  def decode_source_tld(_), do: {:error, "Unexpected type when decoding Datum.source_tld"}
+
+  def encode_source_tld(value) when is_binary(value), do: value
+  def encode_source_tld(_), do: {:error, "Unexpected type when encoding Datum.source_tld"}
+
+  def decode_trending_datetime(value) when is_binary(value), do: value
+  def decode_trending_datetime(_), do: {:error, "Unexpected type when decoding Datum.trending_datetime"}
+
+  def encode_trending_datetime(value) when is_binary(value), do: value
+  def encode_trending_datetime(_), do: {:error, "Unexpected type when encoding Datum.trending_datetime"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Datum.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Datum.url"}
+
   def from_map(m) do
     %Datum{
-      bitly_gif_url: m["bitly_gif_url"],
-      bitly_url: m["bitly_url"],
-      content_url: m["content_url"],
-      embed_url: m["embed_url"],
-      id: m["id"],
+      bitly_gif_url: decode_bitly_gif_url(m["bitly_gif_url"]),
+      bitly_url: decode_bitly_url(m["bitly_url"]),
+      content_url: decode_content_url(m["content_url"]),
+      embed_url: decode_embed_url(m["embed_url"]),
+      id: decode_id(m["id"]),
       images: Images.from_map(m["images"]),
-      import_datetime: m["import_datetime"],
-      is_indexable: m["is_indexable"],
+      import_datetime: decode_import_datetime(m["import_datetime"]),
+      is_indexable: decode_is_indexable(m["is_indexable"]),
       rating: Rating.decode(m["rating"]),
-      slug: m["slug"],
-      source: m["source"],
-      source_post_url: m["source_post_url"],
-      source_tld: m["source_tld"],
-      trending_datetime: m["trending_datetime"],
+      slug: decode_slug(m["slug"]),
+      source: decode_source(m["source"]),
+      source_post_url: decode_source_post_url(m["source_post_url"]),
+      source_tld: decode_source_tld(m["source_tld"]),
+      trending_datetime: decode_trending_datetime(m["trending_datetime"]),
       type: Type.decode(m["type"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
       user: m["user"] && User.from_map(m["user"]),
       username: Username.decode(m["username"]),
     }
@@ -564,11 +756,29 @@ defmodule Meta do
           status: integer()
         }
 
+  def decode_msg(value) when is_binary(value), do: value
+  def decode_msg(_), do: {:error, "Unexpected type when decoding Meta.msg"}
+
+  def encode_msg(value) when is_binary(value), do: value
+  def encode_msg(_), do: {:error, "Unexpected type when encoding Meta.msg"}
+
+  def decode_response_id(value) when is_binary(value), do: value
+  def decode_response_id(_), do: {:error, "Unexpected type when decoding Meta.response_id"}
+
+  def encode_response_id(value) when is_binary(value), do: value
+  def encode_response_id(_), do: {:error, "Unexpected type when encoding Meta.response_id"}
+
+  def decode_status(value) when is_integer(value), do: value
+  def decode_status(_), do: {:error, "Unexpected type when decoding Meta.status"}
+
+  def encode_status(value) when is_integer(value), do: value
+  def encode_status(_), do: {:error, "Unexpected type when encoding Meta.status"}
+
   def from_map(m) do
     %Meta{
-      msg: m["msg"],
-      response_id: m["response_id"],
-      status: m["status"],
+      msg: decode_msg(m["msg"]),
+      response_id: decode_response_id(m["response_id"]),
+      status: decode_status(m["status"]),
     }
   end
 
@@ -603,11 +813,29 @@ defmodule Pagination do
           total_count: integer()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Pagination.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Pagination.count"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding Pagination.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding Pagination.offset"}
+
+  def decode_total_count(value) when is_integer(value), do: value
+  def decode_total_count(_), do: {:error, "Unexpected type when decoding Pagination.total_count"}
+
+  def encode_total_count(value) when is_integer(value), do: value
+  def encode_total_count(_), do: {:error, "Unexpected type when encoding Pagination.total_count"}
+
   def from_map(m) do
     %Pagination{
-      count: m["count"],
-      offset: m["offset"],
-      total_count: m["total_count"],
+      count: decode_count(m["count"]),
+      offset: decode_offset(m["offset"]),
+      total_count: decode_total_count(m["total_count"]),
     }
   end
 
@@ -642,6 +870,12 @@ defmodule TopLevel do
           pagination: Pagination.t()
         }
 
+  def decode_data(value) when is_list(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data(value) when is_list(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
   def from_map(m) do
     %TopLevel{
       data: Enum.map(m["data"], &Datum.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/13d8d.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/13d8d.json/default/QuickType.ex
index b4633fb..8f34c60 100644
--- a/base/elixir/test/inputs/json/misc/13d8d.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/13d8d.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Street do
           name: String.t()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Street.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Street.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Street.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Street.name"}
+
   def from_map(m) do
     %Street{
-      id: m["id"],
-      name: m["name"],
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
     }
   end
 
@@ -51,10 +63,22 @@ defmodule Location do
           street: Street.t()
         }
 
+  def decode_latitude(value) when is_binary(value), do: value
+  def decode_latitude(_), do: {:error, "Unexpected type when decoding Location.latitude"}
+
+  def encode_latitude(value) when is_binary(value), do: value
+  def encode_latitude(_), do: {:error, "Unexpected type when encoding Location.latitude"}
+
+  def decode_longitude(value) when is_binary(value), do: value
+  def decode_longitude(_), do: {:error, "Unexpected type when decoding Location.longitude"}
+
+  def encode_longitude(value) when is_binary(value), do: value
+  def encode_longitude(_), do: {:error, "Unexpected type when encoding Location.longitude"}
+
   def from_map(m) do
     %Location{
-      latitude: m["latitude"],
-      longitude: m["longitude"],
+      latitude: decode_latitude(m["latitude"]),
+      longitude: decode_longitude(m["longitude"]),
       street: Street.from_map(m["street"]),
     }
   end
@@ -89,10 +113,22 @@ defmodule OutcomeStatus do
           date: String.t()
         }
 
+  def decode_category(value) when is_binary(value), do: value
+  def decode_category(_), do: {:error, "Unexpected type when decoding OutcomeStatus.category"}
+
+  def encode_category(value) when is_binary(value), do: value
+  def encode_category(_), do: {:error, "Unexpected type when encoding OutcomeStatus.category"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding OutcomeStatus.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding OutcomeStatus.date"}
+
   def from_map(m) do
     %OutcomeStatus{
-      category: m["category"],
-      date: m["date"],
+      category: decode_category(m["category"]),
+      date: decode_date(m["date"]),
     }
   end
 
@@ -132,17 +168,59 @@ defmodule TopLevelElement do
           persistent_id: String.t()
         }
 
+  def decode_category(value) when is_binary(value), do: value
+  def decode_category(_), do: {:error, "Unexpected type when decoding TopLevelElement.category"}
+
+  def encode_category(value) when is_binary(value), do: value
+  def encode_category(_), do: {:error, "Unexpected type when encoding TopLevelElement.category"}
+
+  def decode_context(value) when is_binary(value), do: value
+  def decode_context(_), do: {:error, "Unexpected type when decoding TopLevelElement.context"}
+
+  def encode_context(value) when is_binary(value), do: value
+  def encode_context(_), do: {:error, "Unexpected type when encoding TopLevelElement.context"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_location_subtype(value) when is_binary(value), do: value
+  def decode_location_subtype(_), do: {:error, "Unexpected type when decoding TopLevelElement.location_subtype"}
+
+  def encode_location_subtype(value) when is_binary(value), do: value
+  def encode_location_subtype(_), do: {:error, "Unexpected type when encoding TopLevelElement.location_subtype"}
+
+  def decode_location_type(value) when is_binary(value), do: value
+  def decode_location_type(_), do: {:error, "Unexpected type when decoding TopLevelElement.location_type"}
+
+  def encode_location_type(value) when is_binary(value), do: value
+  def encode_location_type(_), do: {:error, "Unexpected type when encoding TopLevelElement.location_type"}
+
+  def decode_month(value) when is_binary(value), do: value
+  def decode_month(_), do: {:error, "Unexpected type when decoding TopLevelElement.month"}
+
+  def encode_month(value) when is_binary(value), do: value
+  def encode_month(_), do: {:error, "Unexpected type when encoding TopLevelElement.month"}
+
+  def decode_persistent_id(value) when is_binary(value), do: value
+  def decode_persistent_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.persistent_id"}
+
+  def encode_persistent_id(value) when is_binary(value), do: value
+  def encode_persistent_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.persistent_id"}
+
   def from_map(m) do
     %TopLevelElement{
-      category: m["category"],
-      context: m["context"],
-      id: m["id"],
+      category: decode_category(m["category"]),
+      context: decode_context(m["context"]),
+      id: decode_id(m["id"]),
       location: Location.from_map(m["location"]),
-      location_subtype: m["location_subtype"],
-      location_type: m["location_type"],
-      month: m["month"],
+      location_subtype: decode_location_subtype(m["location_subtype"]),
+      location_type: decode_location_type(m["location_type"]),
+      month: decode_month(m["month"]),
       outcome_status: OutcomeStatus.from_map(m["outcome_status"]),
-      persistent_id: m["persistent_id"],
+      persistent_id: decode_persistent_id(m["persistent_id"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/14d38.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/14d38.json/default/QuickType.ex
index de6b138..e035c68 100644
--- a/base/elixir/test/inputs/json/misc/14d38.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/14d38.json/default/QuickType.ex
@@ -16,12 +16,36 @@ defmodule Headers do
           user_agent: String.t()
         }
 
+  def decode_accept_encoding(value) when is_binary(value), do: value
+  def decode_accept_encoding(_), do: {:error, "Unexpected type when decoding Headers.accept_encoding"}
+
+  def encode_accept_encoding(value) when is_binary(value), do: value
+  def encode_accept_encoding(_), do: {:error, "Unexpected type when encoding Headers.accept_encoding"}
+
+  def decode_connection(value) when is_binary(value), do: value
+  def decode_connection(_), do: {:error, "Unexpected type when decoding Headers.connection"}
+
+  def encode_connection(value) when is_binary(value), do: value
+  def encode_connection(_), do: {:error, "Unexpected type when encoding Headers.connection"}
+
+  def decode_host(value) when is_binary(value), do: value
+  def decode_host(_), do: {:error, "Unexpected type when decoding Headers.host"}
+
+  def encode_host(value) when is_binary(value), do: value
+  def encode_host(_), do: {:error, "Unexpected type when encoding Headers.host"}
+
+  def decode_user_agent(value) when is_binary(value), do: value
+  def decode_user_agent(_), do: {:error, "Unexpected type when decoding Headers.user_agent"}
+
+  def encode_user_agent(value) when is_binary(value), do: value
+  def encode_user_agent(_), do: {:error, "Unexpected type when encoding Headers.user_agent"}
+
   def from_map(m) do
     %Headers{
-      accept_encoding: m["Accept-Encoding"],
-      connection: m["Connection"],
-      host: m["Host"],
-      user_agent: m["User-Agent"],
+      accept_encoding: decode_accept_encoding(m["Accept-Encoding"]),
+      connection: decode_connection(m["Connection"]),
+      host: decode_host(m["Host"]),
+      user_agent: decode_user_agent(m["User-Agent"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/167d6.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/167d6.json/default/QuickType.ex
index 8937606..db497b1 100644
--- a/base/elixir/test/inputs/json/misc/167d6.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/167d6.json/default/QuickType.ex
@@ -15,11 +15,32 @@ defmodule TopLevel do
           rates: %{String.t() => float()}
         }
 
+  def decode_base(value) when is_binary(value), do: value
+  def decode_base(_), do: {:error, "Unexpected type when decoding TopLevel.base"}
+
+  def encode_base(value) when is_binary(value), do: value
+  def encode_base(_), do: {:error, "Unexpected type when encoding TopLevel.base"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel.date"}
+
+  def decode_rates_value(value) when is_float(value), do: value
+  def decode_rates_value(value) when is_integer(value), do: value
+  def decode_rates_value(_), do: {:error, "Unexpected type when decoding TopLevel.rates"}
+
+  def encode_rates_value(value) when is_float(value), do: value
+  def encode_rates_value(value) when is_integer(value), do: value
+  def encode_rates_value(_), do: {:error, "Unexpected type when encoding TopLevel.rates"}
+
   def from_map(m) do
     %TopLevel{
-      base: m["base"],
-      date: m["date"],
-      rates: m["rates"],
+      base: decode_base(m["base"]),
+      date: decode_date(m["date"]),
+      rates: m["rates"]
+      |> Map.new(fn {key, value} -> {key, decode_rates_value(value)} end),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/16bc5.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/16bc5.json/default/QuickType.ex
index ee06b77..98852a1 100644
--- a/base/elixir/test/inputs/json/misc/16bc5.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/16bc5.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Astronomy do
           sunset: String.t()
         }
 
+  def decode_sunrise(value) when is_binary(value), do: value
+  def decode_sunrise(_), do: {:error, "Unexpected type when decoding Astronomy.sunrise"}
+
+  def encode_sunrise(value) when is_binary(value), do: value
+  def encode_sunrise(_), do: {:error, "Unexpected type when encoding Astronomy.sunrise"}
+
+  def decode_sunset(value) when is_binary(value), do: value
+  def decode_sunset(_), do: {:error, "Unexpected type when decoding Astronomy.sunset"}
+
+  def encode_sunset(value) when is_binary(value), do: value
+  def encode_sunset(_), do: {:error, "Unexpected type when encoding Astronomy.sunset"}
+
   def from_map(m) do
     %Astronomy{
-      sunrise: m["sunrise"],
-      sunset: m["sunset"],
+      sunrise: decode_sunrise(m["sunrise"]),
+      sunset: decode_sunset(m["sunset"]),
     }
   end
 
@@ -52,12 +64,36 @@ defmodule Atmosphere do
           visibility: String.t()
         }
 
+  def decode_humidity(value) when is_binary(value), do: value
+  def decode_humidity(_), do: {:error, "Unexpected type when decoding Atmosphere.humidity"}
+
+  def encode_humidity(value) when is_binary(value), do: value
+  def encode_humidity(_), do: {:error, "Unexpected type when encoding Atmosphere.humidity"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Atmosphere.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Atmosphere.pressure"}
+
+  def decode_rising(value) when is_binary(value), do: value
+  def decode_rising(_), do: {:error, "Unexpected type when decoding Atmosphere.rising"}
+
+  def encode_rising(value) when is_binary(value), do: value
+  def encode_rising(_), do: {:error, "Unexpected type when encoding Atmosphere.rising"}
+
+  def decode_visibility(value) when is_binary(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Atmosphere.visibility"}
+
+  def encode_visibility(value) when is_binary(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Atmosphere.visibility"}
+
   def from_map(m) do
     %Atmosphere{
-      humidity: m["humidity"],
-      pressure: m["pressure"],
-      rising: m["rising"],
-      visibility: m["visibility"],
+      humidity: decode_humidity(m["humidity"]),
+      pressure: decode_pressure(m["pressure"]),
+      rising: decode_rising(m["rising"]),
+      visibility: decode_visibility(m["visibility"]),
     }
   end
 
@@ -95,13 +131,43 @@ defmodule Image do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Image.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Image.height"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Image.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Image.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Image.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Image.title"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Image.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Image.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Image.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Image.width"}
+
   def from_map(m) do
     %Image{
-      height: m["height"],
-      link: m["link"],
-      title: m["title"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      link: decode_link(m["link"]),
+      title: decode_title(m["title"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -139,12 +205,36 @@ defmodule Condition do
           text: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Condition.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Condition.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Condition.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Condition.date"}
+
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Condition.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Condition.temp"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Condition.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Condition.text"}
+
   def from_map(m) do
     %Condition{
-      code: m["code"],
-      date: m["date"],
-      temp: m["temp"],
-      text: m["text"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      temp: decode_temp(m["temp"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -183,14 +273,50 @@ defmodule Forecast do
           text: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Forecast.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Forecast.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Forecast.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Forecast.date"}
+
+  def decode_day(value) when is_binary(value), do: value
+  def decode_day(_), do: {:error, "Unexpected type when decoding Forecast.day"}
+
+  def encode_day(value) when is_binary(value), do: value
+  def encode_day(_), do: {:error, "Unexpected type when encoding Forecast.day"}
+
+  def decode_high(value) when is_binary(value), do: value
+  def decode_high(_), do: {:error, "Unexpected type when decoding Forecast.high"}
+
+  def encode_high(value) when is_binary(value), do: value
+  def encode_high(_), do: {:error, "Unexpected type when encoding Forecast.high"}
+
+  def decode_low(value) when is_binary(value), do: value
+  def decode_low(_), do: {:error, "Unexpected type when decoding Forecast.low"}
+
+  def encode_low(value) when is_binary(value), do: value
+  def encode_low(_), do: {:error, "Unexpected type when encoding Forecast.low"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Forecast.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Forecast.text"}
+
   def from_map(m) do
     %Forecast{
-      code: m["code"],
-      date: m["date"],
-      day: m["day"],
-      high: m["high"],
-      low: m["low"],
-      text: m["text"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      day: decode_day(m["day"]),
+      high: decode_high(m["high"]),
+      low: decode_low(m["low"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -226,9 +352,15 @@ defmodule GUID do
           is_perma_link: String.t()
         }
 
+  def decode_is_perma_link(value) when is_binary(value), do: value
+  def decode_is_perma_link(_), do: {:error, "Unexpected type when decoding GUID.is_perma_link"}
+
+  def encode_is_perma_link(value) when is_binary(value), do: value
+  def encode_is_perma_link(_), do: {:error, "Unexpected type when encoding GUID.is_perma_link"}
+
   def from_map(m) do
     %GUID{
-      is_perma_link: m["isPermaLink"],
+      is_perma_link: decode_is_perma_link(m["isPermaLink"]),
     }
   end
 
@@ -267,17 +399,59 @@ defmodule Item do
           title: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Item.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Item.description"}
+
+  def decode_forecast(value) when is_list(value), do: value
+  def decode_forecast(_), do: {:error, "Unexpected type when decoding Item.forecast"}
+
+  def encode_forecast(value) when is_list(value), do: value
+  def encode_forecast(_), do: {:error, "Unexpected type when encoding Item.forecast"}
+
+  def decode_lat(value) when is_binary(value), do: value
+  def decode_lat(_), do: {:error, "Unexpected type when decoding Item.lat"}
+
+  def encode_lat(value) when is_binary(value), do: value
+  def encode_lat(_), do: {:error, "Unexpected type when encoding Item.lat"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Item.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Item.link"}
+
+  def decode_long(value) when is_binary(value), do: value
+  def decode_long(_), do: {:error, "Unexpected type when decoding Item.long"}
+
+  def encode_long(value) when is_binary(value), do: value
+  def encode_long(_), do: {:error, "Unexpected type when encoding Item.long"}
+
+  def decode_pub_date(value) when is_binary(value), do: value
+  def decode_pub_date(_), do: {:error, "Unexpected type when decoding Item.pub_date"}
+
+  def encode_pub_date(value) when is_binary(value), do: value
+  def encode_pub_date(_), do: {:error, "Unexpected type when encoding Item.pub_date"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Item.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Item.title"}
+
   def from_map(m) do
     %Item{
       condition: Condition.from_map(m["condition"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       forecast: Enum.map(m["forecast"], &Forecast.from_map/1),
       guid: GUID.from_map(m["guid"]),
-      lat: m["lat"],
-      link: m["link"],
-      long: m["long"],
-      pub_date: m["pubDate"],
-      title: m["title"],
+      lat: decode_lat(m["lat"]),
+      link: decode_link(m["link"]),
+      long: decode_long(m["long"]),
+      pub_date: decode_pub_date(m["pubDate"]),
+      title: decode_title(m["title"]),
     }
   end
 
@@ -318,11 +492,29 @@ defmodule Location do
           region: String.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding Location.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding Location.city"}
+
+  def decode_country(value) when is_binary(value), do: value
+  def decode_country(_), do: {:error, "Unexpected type when decoding Location.country"}
+
+  def encode_country(value) when is_binary(value), do: value
+  def encode_country(_), do: {:error, "Unexpected type when encoding Location.country"}
+
+  def decode_region(value) when is_binary(value), do: value
+  def decode_region(_), do: {:error, "Unexpected type when decoding Location.region"}
+
+  def encode_region(value) when is_binary(value), do: value
+  def encode_region(_), do: {:error, "Unexpected type when encoding Location.region"}
+
   def from_map(m) do
     %Location{
-      city: m["city"],
-      country: m["country"],
-      region: m["region"],
+      city: decode_city(m["city"]),
+      country: decode_country(m["country"]),
+      region: decode_region(m["region"]),
     }
   end
 
@@ -358,12 +550,36 @@ defmodule Units do
           temperature: String.t()
         }
 
+  def decode_distance(value) when is_binary(value), do: value
+  def decode_distance(_), do: {:error, "Unexpected type when decoding Units.distance"}
+
+  def encode_distance(value) when is_binary(value), do: value
+  def encode_distance(_), do: {:error, "Unexpected type when encoding Units.distance"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Units.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Units.pressure"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Units.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Units.speed"}
+
+  def decode_temperature(value) when is_binary(value), do: value
+  def decode_temperature(_), do: {:error, "Unexpected type when decoding Units.temperature"}
+
+  def encode_temperature(value) when is_binary(value), do: value
+  def encode_temperature(_), do: {:error, "Unexpected type when encoding Units.temperature"}
+
   def from_map(m) do
     %Units{
-      distance: m["distance"],
-      pressure: m["pressure"],
-      speed: m["speed"],
-      temperature: m["temperature"],
+      distance: decode_distance(m["distance"]),
+      pressure: decode_pressure(m["pressure"]),
+      speed: decode_speed(m["speed"]),
+      temperature: decode_temperature(m["temperature"]),
     }
   end
 
@@ -399,11 +615,29 @@ defmodule Wind do
           speed: String.t()
         }
 
+  def decode_chill(value) when is_binary(value), do: value
+  def decode_chill(_), do: {:error, "Unexpected type when decoding Wind.chill"}
+
+  def encode_chill(value) when is_binary(value), do: value
+  def encode_chill(_), do: {:error, "Unexpected type when encoding Wind.chill"}
+
+  def decode_direction(value) when is_binary(value), do: value
+  def decode_direction(_), do: {:error, "Unexpected type when decoding Wind.direction"}
+
+  def encode_direction(value) when is_binary(value), do: value
+  def encode_direction(_), do: {:error, "Unexpected type when encoding Wind.direction"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Wind.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Wind.speed"}
+
   def from_map(m) do
     %Wind{
-      chill: m["chill"],
-      direction: m["direction"],
-      speed: m["speed"],
+      chill: decode_chill(m["chill"]),
+      direction: decode_direction(m["direction"]),
+      speed: decode_speed(m["speed"]),
     }
   end
 
@@ -448,19 +682,55 @@ defmodule Channel do
           wind: Wind.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Channel.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Channel.description"}
+
+  def decode_language(value) when is_binary(value), do: value
+  def decode_language(_), do: {:error, "Unexpected type when decoding Channel.language"}
+
+  def encode_language(value) when is_binary(value), do: value
+  def encode_language(_), do: {:error, "Unexpected type when encoding Channel.language"}
+
+  def decode_last_build_date(value) when is_binary(value), do: value
+  def decode_last_build_date(_), do: {:error, "Unexpected type when decoding Channel.last_build_date"}
+
+  def encode_last_build_date(value) when is_binary(value), do: value
+  def encode_last_build_date(_), do: {:error, "Unexpected type when encoding Channel.last_build_date"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Channel.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Channel.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Channel.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Channel.title"}
+
+  def decode_ttl(value) when is_binary(value), do: value
+  def decode_ttl(_), do: {:error, "Unexpected type when decoding Channel.ttl"}
+
+  def encode_ttl(value) when is_binary(value), do: value
+  def encode_ttl(_), do: {:error, "Unexpected type when encoding Channel.ttl"}
+
   def from_map(m) do
     %Channel{
       astronomy: Astronomy.from_map(m["astronomy"]),
       atmosphere: Atmosphere.from_map(m["atmosphere"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       image: Image.from_map(m["image"]),
       item: Item.from_map(m["item"]),
-      language: m["language"],
-      last_build_date: m["lastBuildDate"],
-      link: m["link"],
+      language: decode_language(m["language"]),
+      last_build_date: decode_last_build_date(m["lastBuildDate"]),
+      link: decode_link(m["link"]),
       location: Location.from_map(m["location"]),
-      title: m["title"],
-      ttl: m["ttl"],
+      title: decode_title(m["title"]),
+      ttl: decode_ttl(m["ttl"]),
       units: Units.from_map(m["units"]),
       wind: Wind.from_map(m["wind"]),
     }
@@ -541,11 +811,29 @@ defmodule Query do
           results: Results.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Query.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Query.count"}
+
+  def decode_created(value) when is_binary(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding Query.created"}
+
+  def encode_created(value) when is_binary(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding Query.created"}
+
+  def decode_lang(value) when is_binary(value), do: value
+  def decode_lang(_), do: {:error, "Unexpected type when decoding Query.lang"}
+
+  def encode_lang(value) when is_binary(value), do: value
+  def encode_lang(_), do: {:error, "Unexpected type when encoding Query.lang"}
+
   def from_map(m) do
     %Query{
-      count: m["count"],
-      created: m["created"],
-      lang: m["lang"],
+      count: decode_count(m["count"]),
+      created: decode_created(m["created"]),
+      lang: decode_lang(m["lang"]),
       results: Results.from_map(m["results"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/176f1.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/176f1.json/default/QuickType.ex
index e4cbd35..b988c51 100644
--- a/base/elixir/test/inputs/json/misc/176f1.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/176f1.json/default/QuickType.ex
@@ -52,13 +52,43 @@ defmodule Datum do
           year: String.t()
         }
 
+  def decode_footnotes(value) when is_list(value), do: value
+  def decode_footnotes(_), do: {:error, "Unexpected type when decoding Datum.footnotes"}
+
+  def encode_footnotes(value) when is_list(value), do: value
+  def encode_footnotes(_), do: {:error, "Unexpected type when encoding Datum.footnotes"}
+
+  def decode_period(value) when is_binary(value), do: value
+  def decode_period(_), do: {:error, "Unexpected type when decoding Datum.period"}
+
+  def encode_period(value) when is_binary(value), do: value
+  def encode_period(_), do: {:error, "Unexpected type when encoding Datum.period"}
+
+  def decode_period_name(value) when is_binary(value), do: value
+  def decode_period_name(_), do: {:error, "Unexpected type when decoding Datum.period_name"}
+
+  def encode_period_name(value) when is_binary(value), do: value
+  def encode_period_name(_), do: {:error, "Unexpected type when encoding Datum.period_name"}
+
+  def decode_value(value) when is_binary(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding Datum.value"}
+
+  def encode_value(value) when is_binary(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding Datum.value"}
+
+  def decode_year(value) when is_binary(value), do: value
+  def decode_year(_), do: {:error, "Unexpected type when decoding Datum.year"}
+
+  def encode_year(value) when is_binary(value), do: value
+  def encode_year(_), do: {:error, "Unexpected type when encoding Datum.year"}
+
   def from_map(m) do
     %Datum{
       footnotes: Enum.map(m["footnotes"], &Footnote.from_map/1),
-      period: m["period"],
-      period_name: m["periodName"],
-      value: m["value"],
-      year: m["year"],
+      period: decode_period(m["period"]),
+      period_name: decode_period_name(m["periodName"]),
+      value: decode_value(m["value"]),
+      year: decode_year(m["year"]),
     }
   end
 
@@ -94,10 +124,22 @@ defmodule Series do
           series_id: String.t()
         }
 
+  def decode_data(value) when is_list(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding Series.data"}
+
+  def encode_data(value) when is_list(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding Series.data"}
+
+  def decode_series_id(value) when is_binary(value), do: value
+  def decode_series_id(_), do: {:error, "Unexpected type when decoding Series.series_id"}
+
+  def encode_series_id(value) when is_binary(value), do: value
+  def encode_series_id(_), do: {:error, "Unexpected type when encoding Series.series_id"}
+
   def from_map(m) do
     %Series{
       data: Enum.map(m["data"], &Datum.from_map/1),
-      series_id: m["seriesID"],
+      series_id: decode_series_id(m["seriesID"]),
     }
   end
 
@@ -129,6 +171,12 @@ defmodule Results do
           series: [Series.t()]
         }
 
+  def decode_series(value) when is_list(value), do: value
+  def decode_series(_), do: {:error, "Unexpected type when decoding Results.series"}
+
+  def encode_series(value) when is_list(value), do: value
+  def encode_series(_), do: {:error, "Unexpected type when encoding Results.series"}
+
   def from_map(m) do
     %Results{
       series: Enum.map(m["series"], &Series.from_map/1),
@@ -165,12 +213,30 @@ defmodule TopLevel do
           status: String.t()
         }
 
+  def decode_message(value) when is_list(value), do: value
+  def decode_message(_), do: {:error, "Unexpected type when decoding TopLevel.message"}
+
+  def encode_message(value) when is_list(value), do: value
+  def encode_message(_), do: {:error, "Unexpected type when encoding TopLevel.message"}
+
+  def decode_response_time(value) when is_integer(value), do: value
+  def decode_response_time(_), do: {:error, "Unexpected type when decoding TopLevel.response_time"}
+
+  def encode_response_time(value) when is_integer(value), do: value
+  def encode_response_time(_), do: {:error, "Unexpected type when encoding TopLevel.response_time"}
+
+  def decode_status(value) when is_binary(value), do: value
+  def decode_status(_), do: {:error, "Unexpected type when decoding TopLevel.status"}
+
+  def encode_status(value) when is_binary(value), do: value
+  def encode_status(_), do: {:error, "Unexpected type when encoding TopLevel.status"}
+
   def from_map(m) do
     %TopLevel{
-      message: m["message"],
-      response_time: m["responseTime"],
+      message: decode_message(m["message"]),
+      response_time: decode_response_time(m["responseTime"]),
       results: Results.from_map(m["Results"]),
-      status: m["status"],
+      status: decode_status(m["status"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/1a7f5.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/1a7f5.json/default/QuickType.ex
index 193f7cc..81e4144 100644
--- a/base/elixir/test/inputs/json/misc/1a7f5.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/1a7f5.json/default/QuickType.ex
@@ -63,14 +63,44 @@ defmodule TopLevelElement do
           year: integer()
         }
 
+  def decode_age(value) when is_integer(value), do: value
+  def decode_age(_), do: {:error, "Unexpected type when decoding TopLevelElement.age"}
+
+  def encode_age(value) when is_integer(value), do: value
+  def encode_age(_), do: {:error, "Unexpected type when encoding TopLevelElement.age"}
+
+  def decode_females(value) when is_integer(value), do: value
+  def decode_females(_), do: {:error, "Unexpected type when decoding TopLevelElement.females"}
+
+  def encode_females(value) when is_integer(value), do: value
+  def encode_females(_), do: {:error, "Unexpected type when encoding TopLevelElement.females"}
+
+  def decode_males(value) when is_integer(value), do: value
+  def decode_males(_), do: {:error, "Unexpected type when decoding TopLevelElement.males"}
+
+  def encode_males(value) when is_integer(value), do: value
+  def encode_males(_), do: {:error, "Unexpected type when encoding TopLevelElement.males"}
+
+  def decode_total(value) when is_integer(value), do: value
+  def decode_total(_), do: {:error, "Unexpected type when decoding TopLevelElement.total"}
+
+  def encode_total(value) when is_integer(value), do: value
+  def encode_total(_), do: {:error, "Unexpected type when encoding TopLevelElement.total"}
+
+  def decode_year(value) when is_integer(value), do: value
+  def decode_year(_), do: {:error, "Unexpected type when decoding TopLevelElement.year"}
+
+  def encode_year(value) when is_integer(value), do: value
+  def encode_year(_), do: {:error, "Unexpected type when encoding TopLevelElement.year"}
+
   def from_map(m) do
     %TopLevelElement{
-      age: m["age"],
+      age: decode_age(m["age"]),
       country: Country.decode(m["country"]),
-      females: m["females"],
-      males: m["males"],
-      total: m["total"],
-      year: m["year"],
+      females: decode_females(m["females"]),
+      males: decode_males(m["males"]),
+      total: decode_total(m["total"]),
+      year: decode_year(m["year"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/1b28c.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/1b28c.json/default/QuickType.ex
index bf47bf0..b805b08 100644
--- a/base/elixir/test/inputs/json/misc/1b28c.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/1b28c.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule TotalPopulation do
           population: integer()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TotalPopulation.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TotalPopulation.date"}
+
+  def decode_population(value) when is_integer(value), do: value
+  def decode_population(_), do: {:error, "Unexpected type when decoding TotalPopulation.population"}
+
+  def encode_population(value) when is_integer(value), do: value
+  def encode_population(_), do: {:error, "Unexpected type when encoding TotalPopulation.population"}
+
   def from_map(m) do
     %TotalPopulation{
-      date: m["date"],
-      population: m["population"],
+      date: decode_date(m["date"]),
+      population: decode_population(m["population"]),
     }
   end
 
@@ -49,6 +61,12 @@ defmodule TopLevel do
           total_population: [TotalPopulation.t()]
         }
 
+  def decode_total_population(value) when is_list(value), do: value
+  def decode_total_population(_), do: {:error, "Unexpected type when decoding TopLevel.total_population"}
+
+  def encode_total_population(value) when is_list(value), do: value
+  def encode_total_population(_), do: {:error, "Unexpected type when encoding TopLevel.total_population"}
+
   def from_map(m) do
     %TopLevel{
       total_population: Enum.map(m["total_population"], &TotalPopulation.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/1b409.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/1b409.json/default/QuickType.ex
index 2ee46f9..a0ce338 100644
--- a/base/elixir/test/inputs/json/misc/1b409.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/1b409.json/default/QuickType.ex
@@ -15,11 +15,29 @@ defmodule Meta do
           total_count: integer()
         }
 
+  def decode_limit(value) when is_integer(value), do: value
+  def decode_limit(_), do: {:error, "Unexpected type when decoding Meta.limit"}
+
+  def encode_limit(value) when is_integer(value), do: value
+  def encode_limit(_), do: {:error, "Unexpected type when encoding Meta.limit"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding Meta.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding Meta.offset"}
+
+  def decode_total_count(value) when is_integer(value), do: value
+  def decode_total_count(_), do: {:error, "Unexpected type when decoding Meta.total_count"}
+
+  def encode_total_count(value) when is_integer(value), do: value
+  def encode_total_count(_), do: {:error, "Unexpected type when encoding Meta.total_count"}
+
   def from_map(m) do
     %Meta{
-      limit: m["limit"],
-      offset: m["offset"],
-      total_count: m["total_count"],
+      limit: decode_limit(m["limit"]),
+      offset: decode_offset(m["offset"]),
+      total_count: decode_total_count(m["total_count"]),
     }
   end
 
@@ -56,12 +74,24 @@ defmodule Extra do
           rss_url: String.t() | nil
         }
 
+  def decode_address(value) when is_binary(value), do: value
+  def decode_address(_), do: {:error, "Unexpected type when decoding Extra.address"}
+
+  def encode_address(value) when is_binary(value), do: value
+  def encode_address(_), do: {:error, "Unexpected type when encoding Extra.address"}
+
+  def decode_office(value) when is_binary(value), do: value
+  def decode_office(_), do: {:error, "Unexpected type when decoding Extra.office"}
+
+  def encode_office(value) when is_binary(value), do: value
+  def encode_office(_), do: {:error, "Unexpected type when encoding Extra.office"}
+
   def from_map(m) do
     %Extra{
-      address: m["address"],
+      address: decode_address(m["address"]),
       contact_form: m["contact_form"],
       fax: m["fax"],
-      office: m["office"],
+      office: decode_office(m["office"]),
       rss_url: m["rss_url"],
     }
   end
@@ -301,24 +331,96 @@ defmodule Person do
           youtubeid: nil | String.t()
         }
 
+  def decode_bioguideid(value) when is_binary(value), do: value
+  def decode_bioguideid(_), do: {:error, "Unexpected type when decoding Person.bioguideid"}
+
+  def encode_bioguideid(value) when is_binary(value), do: value
+  def encode_bioguideid(_), do: {:error, "Unexpected type when encoding Person.bioguideid"}
+
+  def decode_birthday(value) when is_binary(value), do: value
+  def decode_birthday(_), do: {:error, "Unexpected type when decoding Person.birthday"}
+
+  def encode_birthday(value) when is_binary(value), do: value
+  def encode_birthday(_), do: {:error, "Unexpected type when encoding Person.birthday"}
+
+  def decode_cspanid(value) when is_integer(value), do: value
+  def decode_cspanid(_), do: {:error, "Unexpected type when decoding Person.cspanid"}
+
+  def encode_cspanid(value) when is_integer(value), do: value
+  def encode_cspanid(_), do: {:error, "Unexpected type when encoding Person.cspanid"}
+
+  def decode_firstname(value) when is_binary(value), do: value
+  def decode_firstname(_), do: {:error, "Unexpected type when decoding Person.firstname"}
+
+  def encode_firstname(value) when is_binary(value), do: value
+  def encode_firstname(_), do: {:error, "Unexpected type when encoding Person.firstname"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Person.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Person.id"}
+
+  def decode_lastname(value) when is_binary(value), do: value
+  def decode_lastname(_), do: {:error, "Unexpected type when decoding Person.lastname"}
+
+  def encode_lastname(value) when is_binary(value), do: value
+  def encode_lastname(_), do: {:error, "Unexpected type when encoding Person.lastname"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Person.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Person.link"}
+
+  def decode_middlename(value) when is_binary(value), do: value
+  def decode_middlename(_), do: {:error, "Unexpected type when decoding Person.middlename"}
+
+  def encode_middlename(value) when is_binary(value), do: value
+  def encode_middlename(_), do: {:error, "Unexpected type when encoding Person.middlename"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Person.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Person.name"}
+
+  def decode_nickname(value) when is_binary(value), do: value
+  def decode_nickname(_), do: {:error, "Unexpected type when decoding Person.nickname"}
+
+  def encode_nickname(value) when is_binary(value), do: value
+  def encode_nickname(_), do: {:error, "Unexpected type when encoding Person.nickname"}
+
+  def decode_osid(value) when is_binary(value), do: value
+  def decode_osid(_), do: {:error, "Unexpected type when decoding Person.osid"}
+
+  def encode_osid(value) when is_binary(value), do: value
+  def encode_osid(_), do: {:error, "Unexpected type when encoding Person.osid"}
+
+  def decode_sortname(value) when is_binary(value), do: value
+  def decode_sortname(_), do: {:error, "Unexpected type when decoding Person.sortname"}
+
+  def encode_sortname(value) when is_binary(value), do: value
+  def encode_sortname(_), do: {:error, "Unexpected type when encoding Person.sortname"}
+
   def from_map(m) do
     %Person{
-      bioguideid: m["bioguideid"],
-      birthday: m["birthday"],
-      cspanid: m["cspanid"],
-      firstname: m["firstname"],
+      bioguideid: decode_bioguideid(m["bioguideid"]),
+      birthday: decode_birthday(m["birthday"]),
+      cspanid: decode_cspanid(m["cspanid"]),
+      firstname: decode_firstname(m["firstname"]),
       gender: Gender.decode(m["gender"]),
       gender_label: GenderLabel.decode(m["gender_label"]),
-      id: m["id"],
-      lastname: m["lastname"],
-      link: m["link"],
-      middlename: m["middlename"],
-      name: m["name"],
+      id: decode_id(m["id"]),
+      lastname: decode_lastname(m["lastname"]),
+      link: decode_link(m["link"]),
+      middlename: decode_middlename(m["middlename"]),
+      name: decode_name(m["name"]),
       namemod: Namemod.decode(m["namemod"]),
-      nickname: m["nickname"],
-      osid: m["osid"],
+      nickname: decode_nickname(m["nickname"]),
+      osid: decode_osid(m["osid"]),
       pvsid: m["pvsid"],
-      sortname: m["sortname"],
+      sortname: decode_sortname(m["sortname"]),
       twitterid: m["twitterid"],
       youtubeid: m["youtubeid"],
     }
@@ -526,29 +628,107 @@ defmodule Object do
           website: String.t()
         }
 
+  def decode_caucus(value) when is_nil(value), do: value
+  def decode_caucus(_), do: {:error, "Unexpected type when decoding Object.caucus"}
+
+  def encode_caucus(value) when is_nil(value), do: value
+  def encode_caucus(_), do: {:error, "Unexpected type when encoding Object.caucus"}
+
+  def decode_congress_numbers(value) when is_list(value), do: value
+  def decode_congress_numbers(_), do: {:error, "Unexpected type when decoding Object.congress_numbers"}
+
+  def encode_congress_numbers(value) when is_list(value), do: value
+  def encode_congress_numbers(_), do: {:error, "Unexpected type when encoding Object.congress_numbers"}
+
+  def decode_current(value) when is_boolean(value), do: value
+  def decode_current(_), do: {:error, "Unexpected type when decoding Object.current"}
+
+  def encode_current(value) when is_boolean(value), do: value
+  def encode_current(_), do: {:error, "Unexpected type when encoding Object.current"}
+
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Object.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Object.description"}
+
+  def decode_district(value) when is_integer(value), do: value
+  def decode_district(_), do: {:error, "Unexpected type when decoding Object.district"}
+
+  def encode_district(value) when is_integer(value), do: value
+  def encode_district(_), do: {:error, "Unexpected type when encoding Object.district"}
+
+  def decode_enddate(value) when is_binary(value), do: value
+  def decode_enddate(_), do: {:error, "Unexpected type when decoding Object.enddate"}
+
+  def encode_enddate(value) when is_binary(value), do: value
+  def encode_enddate(_), do: {:error, "Unexpected type when encoding Object.enddate"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Object.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Object.id"}
+
+  def decode_phone(value) when is_binary(value), do: value
+  def decode_phone(_), do: {:error, "Unexpected type when decoding Object.phone"}
+
+  def encode_phone(value) when is_binary(value), do: value
+  def encode_phone(_), do: {:error, "Unexpected type when encoding Object.phone"}
+
+  def decode_senator_class(value) when is_nil(value), do: value
+  def decode_senator_class(_), do: {:error, "Unexpected type when decoding Object.senator_class"}
+
+  def encode_senator_class(value) when is_nil(value), do: value
+  def encode_senator_class(_), do: {:error, "Unexpected type when encoding Object.senator_class"}
+
+  def decode_senator_rank(value) when is_nil(value), do: value
+  def decode_senator_rank(_), do: {:error, "Unexpected type when decoding Object.senator_rank"}
+
+  def encode_senator_rank(value) when is_nil(value), do: value
+  def encode_senator_rank(_), do: {:error, "Unexpected type when encoding Object.senator_rank"}
+
+  def decode_startdate(value) when is_binary(value), do: value
+  def decode_startdate(_), do: {:error, "Unexpected type when decoding Object.startdate"}
+
+  def encode_startdate(value) when is_binary(value), do: value
+  def encode_startdate(_), do: {:error, "Unexpected type when encoding Object.startdate"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding Object.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding Object.state"}
+
+  def decode_website(value) when is_binary(value), do: value
+  def decode_website(_), do: {:error, "Unexpected type when decoding Object.website"}
+
+  def encode_website(value) when is_binary(value), do: value
+  def encode_website(_), do: {:error, "Unexpected type when encoding Object.website"}
+
   def from_map(m) do
     %Object{
-      caucus: m["caucus"],
-      congress_numbers: m["congress_numbers"],
-      current: m["current"],
-      description: m["description"],
-      district: m["district"],
-      enddate: m["enddate"],
+      caucus: decode_caucus(m["caucus"]),
+      congress_numbers: decode_congress_numbers(m["congress_numbers"]),
+      current: decode_current(m["current"]),
+      description: decode_description(m["description"]),
+      district: decode_district(m["district"]),
+      enddate: decode_enddate(m["enddate"]),
       extra: Extra.from_map(m["extra"]),
-      id: m["id"],
+      id: decode_id(m["id"]),
       leadership_title: m["leadership_title"],
       party: Party.decode(m["party"]),
       person: Person.from_map(m["person"]),
-      phone: m["phone"],
+      phone: decode_phone(m["phone"]),
       role_type: RoleType.decode(m["role_type"]),
       role_type_label: RoleTypeLabel.decode(m["role_type_label"]),
-      senator_class: m["senator_class"],
-      senator_rank: m["senator_rank"],
-      startdate: m["startdate"],
-      state: m["state"],
+      senator_class: decode_senator_class(m["senator_class"]),
+      senator_rank: decode_senator_rank(m["senator_rank"]),
+      startdate: decode_startdate(m["startdate"]),
+      state: decode_state(m["state"]),
       title: Title.decode(m["title"]),
       title_long: RoleTypeLabel.decode(m["title_long"]),
-      website: m["website"],
+      website: decode_website(m["website"]),
     }
   end
 
@@ -600,6 +780,12 @@ defmodule TopLevel do
           objects: [Object.t()]
         }
 
+  def decode_objects(value) when is_list(value), do: value
+  def decode_objects(_), do: {:error, "Unexpected type when decoding TopLevel.objects"}
+
+  def encode_objects(value) when is_list(value), do: value
+  def encode_objects(_), do: {:error, "Unexpected type when encoding TopLevel.objects"}
+
   def from_map(m) do
     %TopLevel{
       meta: Meta.from_map(m["meta"]),
diff --git a/base/elixir/test/inputs/json/misc/2465e.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/2465e.json/default/QuickType.ex
index 6233d72..8e43023 100644
--- a/base/elixir/test/inputs/json/misc/2465e.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/2465e.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Annotations do
           type: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Annotations.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Annotations.description"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Annotations.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Annotations.type"}
+
   def from_map(m) do
     %Annotations{
-      description: m["description"],
-      type: m["type"],
+      description: decode_description(m["description"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -165,11 +177,29 @@ defmodule Info do
           version: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Info.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Info.description"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Info.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Info.title"}
+
+  def decode_version(value) when is_binary(value), do: value
+  def decode_version(_), do: {:error, "Unexpected type when decoding Info.version"}
+
+  def encode_version(value) when is_binary(value), do: value
+  def encode_version(_), do: {:error, "Unexpected type when encoding Info.version"}
+
   def from_map(m) do
     %Info{
-      description: m["description"],
-      title: m["title"],
-      version: m["version"],
+      description: decode_description(m["description"]),
+      title: decode_title(m["title"]),
+      version: decode_version(m["version"]),
     }
   end
 
@@ -207,14 +237,50 @@ defmodule Parameter do
           type: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Parameter.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Parameter.description"}
+
+  def decode_format(value) when is_binary(value), do: value
+  def decode_format(_), do: {:error, "Unexpected type when decoding Parameter.format"}
+
+  def encode_format(value) when is_binary(value), do: value
+  def encode_format(_), do: {:error, "Unexpected type when encoding Parameter.format"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Parameter.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Parameter.name"}
+
+  def decode_parameter_in(value) when is_binary(value), do: value
+  def decode_parameter_in(_), do: {:error, "Unexpected type when decoding Parameter.parameter_in"}
+
+  def encode_parameter_in(value) when is_binary(value), do: value
+  def encode_parameter_in(_), do: {:error, "Unexpected type when encoding Parameter.parameter_in"}
+
+  def decode_required(value) when is_boolean(value), do: value
+  def decode_required(_), do: {:error, "Unexpected type when decoding Parameter.required"}
+
+  def encode_required(value) when is_boolean(value), do: value
+  def encode_required(_), do: {:error, "Unexpected type when encoding Parameter.required"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Parameter.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Parameter.type"}
+
   def from_map(m) do
     %Parameter{
-      description: m["description"],
-      format: m["format"],
-      name: m["name"],
-      parameter_in: m["in"],
-      required: m["required"],
-      type: m["type"],
+      description: decode_description(m["description"]),
+      format: decode_format(m["format"]),
+      name: decode_name(m["name"]),
+      parameter_in: decode_parameter_in(m["in"]),
+      required: decode_required(m["required"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -250,9 +316,15 @@ defmodule Schema do
           ref: String.t()
         }
 
+  def decode_ref(value) when is_binary(value), do: value
+  def decode_ref(_), do: {:error, "Unexpected type when decoding Schema.ref"}
+
+  def encode_ref(value) when is_binary(value), do: value
+  def encode_ref(_), do: {:error, "Unexpected type when encoding Schema.ref"}
+
   def from_map(m) do
     %Schema{
-      ref: m["$ref"],
+      ref: decode_ref(m["$ref"]),
     }
   end
 
@@ -284,9 +356,15 @@ defmodule The200N do
           schema: Schema.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding The200N.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding The200N.description"}
+
   def from_map(m) do
     %The200N{
-      description: m["description"],
+      description: decode_description(m["description"]),
       schema: Schema.from_map(m["schema"]),
     }
   end
@@ -356,13 +434,37 @@ defmodule Get do
           tags: [String.t()]
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Get.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Get.description"}
+
+  def decode_parameters(value) when is_list(value), do: value
+  def decode_parameters(_), do: {:error, "Unexpected type when decoding Get.parameters"}
+
+  def encode_parameters(value) when is_list(value), do: value
+  def encode_parameters(_), do: {:error, "Unexpected type when encoding Get.parameters"}
+
+  def decode_summary(value) when is_binary(value), do: value
+  def decode_summary(_), do: {:error, "Unexpected type when decoding Get.summary"}
+
+  def encode_summary(value) when is_binary(value), do: value
+  def encode_summary(_), do: {:error, "Unexpected type when encoding Get.summary"}
+
+  def decode_tags(value) when is_list(value), do: value
+  def decode_tags(_), do: {:error, "Unexpected type when decoding Get.tags"}
+
+  def encode_tags(value) when is_list(value), do: value
+  def encode_tags(_), do: {:error, "Unexpected type when encoding Get.tags"}
+
   def from_map(m) do
     %Get{
-      description: m["description"],
+      description: decode_description(m["description"]),
       parameters: Enum.map(m["parameters"], &Parameter.from_map/1),
       responses: Responses.from_map(m["responses"]),
-      summary: m["summary"],
-      tags: m["tags"],
+      summary: decode_summary(m["summary"]),
+      tags: decode_tags(m["tags"]),
     }
   end
 
@@ -470,16 +572,46 @@ defmodule TopLevel do
           swagger: String.t()
         }
 
+  def decode_base_path(value) when is_binary(value), do: value
+  def decode_base_path(_), do: {:error, "Unexpected type when decoding TopLevel.base_path"}
+
+  def encode_base_path(value) when is_binary(value), do: value
+  def encode_base_path(_), do: {:error, "Unexpected type when encoding TopLevel.base_path"}
+
+  def decode_host(value) when is_binary(value), do: value
+  def decode_host(_), do: {:error, "Unexpected type when decoding TopLevel.host"}
+
+  def encode_host(value) when is_binary(value), do: value
+  def encode_host(_), do: {:error, "Unexpected type when encoding TopLevel.host"}
+
+  def decode_produces(value) when is_list(value), do: value
+  def decode_produces(_), do: {:error, "Unexpected type when decoding TopLevel.produces"}
+
+  def encode_produces(value) when is_list(value), do: value
+  def encode_produces(_), do: {:error, "Unexpected type when encoding TopLevel.produces"}
+
+  def decode_schemes(value) when is_list(value), do: value
+  def decode_schemes(_), do: {:error, "Unexpected type when decoding TopLevel.schemes"}
+
+  def encode_schemes(value) when is_list(value), do: value
+  def encode_schemes(_), do: {:error, "Unexpected type when encoding TopLevel.schemes"}
+
+  def decode_swagger(value) when is_binary(value), do: value
+  def decode_swagger(_), do: {:error, "Unexpected type when decoding TopLevel.swagger"}
+
+  def encode_swagger(value) when is_binary(value), do: value
+  def encode_swagger(_), do: {:error, "Unexpected type when encoding TopLevel.swagger"}
+
   def from_map(m) do
     %TopLevel{
-      base_path: m["basePath"],
+      base_path: decode_base_path(m["basePath"]),
       definitions: Definitions.from_map(m["definitions"]),
-      host: m["host"],
+      host: decode_host(m["host"]),
       info: Info.from_map(m["info"]),
       paths: Paths.from_map(m["paths"]),
-      produces: m["produces"],
-      schemes: m["schemes"],
-      swagger: m["swagger"],
+      produces: decode_produces(m["produces"]),
+      schemes: decode_schemes(m["schemes"]),
+      swagger: decode_swagger(m["swagger"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/24f52.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/24f52.json/default/QuickType.ex
index b9f86f4..e9a4777 100644
--- a/base/elixir/test/inputs/json/misc/24f52.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/24f52.json/default/QuickType.ex
@@ -21,17 +21,71 @@ defmodule Status do
           type: String.t()
         }
 
+  def decode_avg_delay(value) when is_binary(value), do: value
+  def decode_avg_delay(_), do: {:error, "Unexpected type when decoding Status.avg_delay"}
+
+  def encode_avg_delay(value) when is_binary(value), do: value
+  def encode_avg_delay(_), do: {:error, "Unexpected type when encoding Status.avg_delay"}
+
+  def decode_closure_begin(value) when is_binary(value), do: value
+  def decode_closure_begin(_), do: {:error, "Unexpected type when decoding Status.closure_begin"}
+
+  def encode_closure_begin(value) when is_binary(value), do: value
+  def encode_closure_begin(_), do: {:error, "Unexpected type when encoding Status.closure_begin"}
+
+  def decode_closure_end(value) when is_binary(value), do: value
+  def decode_closure_end(_), do: {:error, "Unexpected type when decoding Status.closure_end"}
+
+  def encode_closure_end(value) when is_binary(value), do: value
+  def encode_closure_end(_), do: {:error, "Unexpected type when encoding Status.closure_end"}
+
+  def decode_end_time(value) when is_binary(value), do: value
+  def decode_end_time(_), do: {:error, "Unexpected type when decoding Status.end_time"}
+
+  def encode_end_time(value) when is_binary(value), do: value
+  def encode_end_time(_), do: {:error, "Unexpected type when encoding Status.end_time"}
+
+  def decode_max_delay(value) when is_binary(value), do: value
+  def decode_max_delay(_), do: {:error, "Unexpected type when decoding Status.max_delay"}
+
+  def encode_max_delay(value) when is_binary(value), do: value
+  def encode_max_delay(_), do: {:error, "Unexpected type when encoding Status.max_delay"}
+
+  def decode_min_delay(value) when is_binary(value), do: value
+  def decode_min_delay(_), do: {:error, "Unexpected type when decoding Status.min_delay"}
+
+  def encode_min_delay(value) when is_binary(value), do: value
+  def encode_min_delay(_), do: {:error, "Unexpected type when encoding Status.min_delay"}
+
+  def decode_reason(value) when is_binary(value), do: value
+  def decode_reason(_), do: {:error, "Unexpected type when decoding Status.reason"}
+
+  def encode_reason(value) when is_binary(value), do: value
+  def encode_reason(_), do: {:error, "Unexpected type when encoding Status.reason"}
+
+  def decode_trend(value) when is_binary(value), do: value
+  def decode_trend(_), do: {:error, "Unexpected type when decoding Status.trend"}
+
+  def encode_trend(value) when is_binary(value), do: value
+  def encode_trend(_), do: {:error, "Unexpected type when encoding Status.trend"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Status.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Status.type"}
+
   def from_map(m) do
     %Status{
-      avg_delay: m["avgDelay"],
-      closure_begin: m["closureBegin"],
-      closure_end: m["closureEnd"],
-      end_time: m["endTime"],
-      max_delay: m["maxDelay"],
-      min_delay: m["minDelay"],
-      reason: m["reason"],
-      trend: m["trend"],
-      type: m["type"],
+      avg_delay: decode_avg_delay(m["avgDelay"]),
+      closure_begin: decode_closure_begin(m["closureBegin"]),
+      closure_end: decode_closure_end(m["closureEnd"]),
+      end_time: decode_end_time(m["endTime"]),
+      max_delay: decode_max_delay(m["maxDelay"]),
+      min_delay: decode_min_delay(m["minDelay"]),
+      reason: decode_reason(m["reason"]),
+      trend: decode_trend(m["trend"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -72,11 +126,29 @@ defmodule Meta do
           url: String.t()
         }
 
+  def decode_credit(value) when is_binary(value), do: value
+  def decode_credit(_), do: {:error, "Unexpected type when decoding Meta.credit"}
+
+  def encode_credit(value) when is_binary(value), do: value
+  def encode_credit(_), do: {:error, "Unexpected type when encoding Meta.credit"}
+
+  def decode_updated(value) when is_binary(value), do: value
+  def decode_updated(_), do: {:error, "Unexpected type when decoding Meta.updated"}
+
+  def encode_updated(value) when is_binary(value), do: value
+  def encode_updated(_), do: {:error, "Unexpected type when encoding Meta.updated"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Meta.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Meta.url"}
+
   def from_map(m) do
     %Meta{
-      credit: m["credit"],
-      updated: m["updated"],
-      url: m["url"],
+      credit: decode_credit(m["credit"]),
+      updated: decode_updated(m["updated"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -113,13 +185,39 @@ defmodule Weather do
           wind: String.t()
         }
 
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Weather.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Weather.temp"}
+
+  def decode_visibility(value) when is_float(value), do: value
+  def decode_visibility(value) when is_integer(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Weather.visibility"}
+
+  def encode_visibility(value) when is_float(value), do: value
+  def encode_visibility(value) when is_integer(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Weather.visibility"}
+
+  def decode_weather(value) when is_binary(value), do: value
+  def decode_weather(_), do: {:error, "Unexpected type when decoding Weather.weather"}
+
+  def encode_weather(value) when is_binary(value), do: value
+  def encode_weather(_), do: {:error, "Unexpected type when encoding Weather.weather"}
+
+  def decode_wind(value) when is_binary(value), do: value
+  def decode_wind(_), do: {:error, "Unexpected type when decoding Weather.wind"}
+
+  def encode_wind(value) when is_binary(value), do: value
+  def encode_wind(_), do: {:error, "Unexpected type when encoding Weather.wind"}
+
   def from_map(m) do
     %Weather{
       meta: Meta.from_map(m["meta"]),
-      temp: m["temp"],
-      visibility: m["visibility"],
-      weather: m["weather"],
-      wind: m["wind"],
+      temp: decode_temp(m["temp"]),
+      visibility: decode_visibility(m["visibility"]),
+      weather: decode_weather(m["weather"]),
+      wind: decode_wind(m["wind"]),
     }
   end
 
@@ -161,14 +259,50 @@ defmodule TopLevel do
           weather: Weather.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding TopLevel.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding TopLevel.city"}
+
+  def decode_delay(value) when is_binary(value), do: value
+  def decode_delay(_), do: {:error, "Unexpected type when decoding TopLevel.delay"}
+
+  def encode_delay(value) when is_binary(value), do: value
+  def encode_delay(_), do: {:error, "Unexpected type when encoding TopLevel.delay"}
+
+  def decode_iata(value) when is_binary(value), do: value
+  def decode_iata(_), do: {:error, "Unexpected type when decoding TopLevel.iata"}
+
+  def encode_iata(value) when is_binary(value), do: value
+  def encode_iata(_), do: {:error, "Unexpected type when encoding TopLevel.iata"}
+
+  def decode_icao(value) when is_binary(value), do: value
+  def decode_icao(_), do: {:error, "Unexpected type when decoding TopLevel.icao"}
+
+  def encode_icao(value) when is_binary(value), do: value
+  def encode_icao(_), do: {:error, "Unexpected type when encoding TopLevel.icao"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding TopLevel.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding TopLevel.state"}
+
   def from_map(m) do
     %TopLevel{
-      city: m["city"],
-      delay: m["delay"],
-      iata: m["IATA"],
-      icao: m["ICAO"],
-      name: m["name"],
-      state: m["state"],
+      city: decode_city(m["city"]),
+      delay: decode_delay(m["delay"]),
+      iata: decode_iata(m["IATA"]),
+      icao: decode_icao(m["ICAO"]),
+      name: decode_name(m["name"]),
+      state: decode_state(m["state"]),
       status: Status.from_map(m["status"]),
       weather: Weather.from_map(m["weather"]),
     }
diff --git a/base/elixir/test/inputs/json/misc/262f0.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/262f0.json/default/QuickType.ex
index dbaa502..1dc500b 100644
--- a/base/elixir/test/inputs/json/misc/262f0.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/262f0.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Astronomy do
           sunset: String.t()
         }
 
+  def decode_sunrise(value) when is_binary(value), do: value
+  def decode_sunrise(_), do: {:error, "Unexpected type when decoding Astronomy.sunrise"}
+
+  def encode_sunrise(value) when is_binary(value), do: value
+  def encode_sunrise(_), do: {:error, "Unexpected type when encoding Astronomy.sunrise"}
+
+  def decode_sunset(value) when is_binary(value), do: value
+  def decode_sunset(_), do: {:error, "Unexpected type when decoding Astronomy.sunset"}
+
+  def encode_sunset(value) when is_binary(value), do: value
+  def encode_sunset(_), do: {:error, "Unexpected type when encoding Astronomy.sunset"}
+
   def from_map(m) do
     %Astronomy{
-      sunrise: m["sunrise"],
-      sunset: m["sunset"],
+      sunrise: decode_sunrise(m["sunrise"]),
+      sunset: decode_sunset(m["sunset"]),
     }
   end
 
@@ -52,12 +64,36 @@ defmodule Atmosphere do
           visibility: String.t()
         }
 
+  def decode_humidity(value) when is_binary(value), do: value
+  def decode_humidity(_), do: {:error, "Unexpected type when decoding Atmosphere.humidity"}
+
+  def encode_humidity(value) when is_binary(value), do: value
+  def encode_humidity(_), do: {:error, "Unexpected type when encoding Atmosphere.humidity"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Atmosphere.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Atmosphere.pressure"}
+
+  def decode_rising(value) when is_binary(value), do: value
+  def decode_rising(_), do: {:error, "Unexpected type when decoding Atmosphere.rising"}
+
+  def encode_rising(value) when is_binary(value), do: value
+  def encode_rising(_), do: {:error, "Unexpected type when encoding Atmosphere.rising"}
+
+  def decode_visibility(value) when is_binary(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Atmosphere.visibility"}
+
+  def encode_visibility(value) when is_binary(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Atmosphere.visibility"}
+
   def from_map(m) do
     %Atmosphere{
-      humidity: m["humidity"],
-      pressure: m["pressure"],
-      rising: m["rising"],
-      visibility: m["visibility"],
+      humidity: decode_humidity(m["humidity"]),
+      pressure: decode_pressure(m["pressure"]),
+      rising: decode_rising(m["rising"]),
+      visibility: decode_visibility(m["visibility"]),
     }
   end
 
@@ -95,13 +131,43 @@ defmodule Image do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Image.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Image.height"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Image.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Image.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Image.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Image.title"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Image.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Image.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Image.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Image.width"}
+
   def from_map(m) do
     %Image{
-      height: m["height"],
-      link: m["link"],
-      title: m["title"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      link: decode_link(m["link"]),
+      title: decode_title(m["title"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -186,11 +252,29 @@ defmodule Condition do
           text: Text.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Condition.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Condition.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Condition.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Condition.date"}
+
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Condition.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Condition.temp"}
+
   def from_map(m) do
     %Condition{
-      code: m["code"],
-      date: m["date"],
-      temp: m["temp"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      temp: decode_temp(m["temp"]),
       text: Text.decode(m["text"]),
     }
   end
@@ -230,13 +314,43 @@ defmodule Forecast do
           text: Text.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Forecast.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Forecast.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Forecast.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Forecast.date"}
+
+  def decode_day(value) when is_binary(value), do: value
+  def decode_day(_), do: {:error, "Unexpected type when decoding Forecast.day"}
+
+  def encode_day(value) when is_binary(value), do: value
+  def encode_day(_), do: {:error, "Unexpected type when encoding Forecast.day"}
+
+  def decode_high(value) when is_binary(value), do: value
+  def decode_high(_), do: {:error, "Unexpected type when decoding Forecast.high"}
+
+  def encode_high(value) when is_binary(value), do: value
+  def encode_high(_), do: {:error, "Unexpected type when encoding Forecast.high"}
+
+  def decode_low(value) when is_binary(value), do: value
+  def decode_low(_), do: {:error, "Unexpected type when decoding Forecast.low"}
+
+  def encode_low(value) when is_binary(value), do: value
+  def encode_low(_), do: {:error, "Unexpected type when encoding Forecast.low"}
+
   def from_map(m) do
     %Forecast{
-      code: m["code"],
-      date: m["date"],
-      day: m["day"],
-      high: m["high"],
-      low: m["low"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      day: decode_day(m["day"]),
+      high: decode_high(m["high"]),
+      low: decode_low(m["low"]),
       text: Text.decode(m["text"]),
     }
   end
@@ -273,9 +387,15 @@ defmodule GUID do
           is_perma_link: String.t()
         }
 
+  def decode_is_perma_link(value) when is_binary(value), do: value
+  def decode_is_perma_link(_), do: {:error, "Unexpected type when decoding GUID.is_perma_link"}
+
+  def encode_is_perma_link(value) when is_binary(value), do: value
+  def encode_is_perma_link(_), do: {:error, "Unexpected type when encoding GUID.is_perma_link"}
+
   def from_map(m) do
     %GUID{
-      is_perma_link: m["isPermaLink"],
+      is_perma_link: decode_is_perma_link(m["isPermaLink"]),
     }
   end
 
@@ -314,17 +434,59 @@ defmodule Item do
           title: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Item.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Item.description"}
+
+  def decode_forecast(value) when is_list(value), do: value
+  def decode_forecast(_), do: {:error, "Unexpected type when decoding Item.forecast"}
+
+  def encode_forecast(value) when is_list(value), do: value
+  def encode_forecast(_), do: {:error, "Unexpected type when encoding Item.forecast"}
+
+  def decode_lat(value) when is_binary(value), do: value
+  def decode_lat(_), do: {:error, "Unexpected type when decoding Item.lat"}
+
+  def encode_lat(value) when is_binary(value), do: value
+  def encode_lat(_), do: {:error, "Unexpected type when encoding Item.lat"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Item.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Item.link"}
+
+  def decode_long(value) when is_binary(value), do: value
+  def decode_long(_), do: {:error, "Unexpected type when decoding Item.long"}
+
+  def encode_long(value) when is_binary(value), do: value
+  def encode_long(_), do: {:error, "Unexpected type when encoding Item.long"}
+
+  def decode_pub_date(value) when is_binary(value), do: value
+  def decode_pub_date(_), do: {:error, "Unexpected type when decoding Item.pub_date"}
+
+  def encode_pub_date(value) when is_binary(value), do: value
+  def encode_pub_date(_), do: {:error, "Unexpected type when encoding Item.pub_date"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Item.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Item.title"}
+
   def from_map(m) do
     %Item{
       condition: Condition.from_map(m["condition"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       forecast: Enum.map(m["forecast"], &Forecast.from_map/1),
       guid: GUID.from_map(m["guid"]),
-      lat: m["lat"],
-      link: m["link"],
-      long: m["long"],
-      pub_date: m["pubDate"],
-      title: m["title"],
+      lat: decode_lat(m["lat"]),
+      link: decode_link(m["link"]),
+      long: decode_long(m["long"]),
+      pub_date: decode_pub_date(m["pubDate"]),
+      title: decode_title(m["title"]),
     }
   end
 
@@ -365,11 +527,29 @@ defmodule Location do
           region: String.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding Location.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding Location.city"}
+
+  def decode_country(value) when is_binary(value), do: value
+  def decode_country(_), do: {:error, "Unexpected type when decoding Location.country"}
+
+  def encode_country(value) when is_binary(value), do: value
+  def encode_country(_), do: {:error, "Unexpected type when encoding Location.country"}
+
+  def decode_region(value) when is_binary(value), do: value
+  def decode_region(_), do: {:error, "Unexpected type when decoding Location.region"}
+
+  def encode_region(value) when is_binary(value), do: value
+  def encode_region(_), do: {:error, "Unexpected type when encoding Location.region"}
+
   def from_map(m) do
     %Location{
-      city: m["city"],
-      country: m["country"],
-      region: m["region"],
+      city: decode_city(m["city"]),
+      country: decode_country(m["country"]),
+      region: decode_region(m["region"]),
     }
   end
 
@@ -405,12 +585,36 @@ defmodule Units do
           temperature: String.t()
         }
 
+  def decode_distance(value) when is_binary(value), do: value
+  def decode_distance(_), do: {:error, "Unexpected type when decoding Units.distance"}
+
+  def encode_distance(value) when is_binary(value), do: value
+  def encode_distance(_), do: {:error, "Unexpected type when encoding Units.distance"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Units.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Units.pressure"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Units.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Units.speed"}
+
+  def decode_temperature(value) when is_binary(value), do: value
+  def decode_temperature(_), do: {:error, "Unexpected type when decoding Units.temperature"}
+
+  def encode_temperature(value) when is_binary(value), do: value
+  def encode_temperature(_), do: {:error, "Unexpected type when encoding Units.temperature"}
+
   def from_map(m) do
     %Units{
-      distance: m["distance"],
-      pressure: m["pressure"],
-      speed: m["speed"],
-      temperature: m["temperature"],
+      distance: decode_distance(m["distance"]),
+      pressure: decode_pressure(m["pressure"]),
+      speed: decode_speed(m["speed"]),
+      temperature: decode_temperature(m["temperature"]),
     }
   end
 
@@ -446,11 +650,29 @@ defmodule Wind do
           speed: String.t()
         }
 
+  def decode_chill(value) when is_binary(value), do: value
+  def decode_chill(_), do: {:error, "Unexpected type when decoding Wind.chill"}
+
+  def encode_chill(value) when is_binary(value), do: value
+  def encode_chill(_), do: {:error, "Unexpected type when encoding Wind.chill"}
+
+  def decode_direction(value) when is_binary(value), do: value
+  def decode_direction(_), do: {:error, "Unexpected type when decoding Wind.direction"}
+
+  def encode_direction(value) when is_binary(value), do: value
+  def encode_direction(_), do: {:error, "Unexpected type when encoding Wind.direction"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Wind.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Wind.speed"}
+
   def from_map(m) do
     %Wind{
-      chill: m["chill"],
-      direction: m["direction"],
-      speed: m["speed"],
+      chill: decode_chill(m["chill"]),
+      direction: decode_direction(m["direction"]),
+      speed: decode_speed(m["speed"]),
     }
   end
 
@@ -495,19 +717,55 @@ defmodule Channel do
           wind: Wind.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Channel.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Channel.description"}
+
+  def decode_language(value) when is_binary(value), do: value
+  def decode_language(_), do: {:error, "Unexpected type when decoding Channel.language"}
+
+  def encode_language(value) when is_binary(value), do: value
+  def encode_language(_), do: {:error, "Unexpected type when encoding Channel.language"}
+
+  def decode_last_build_date(value) when is_binary(value), do: value
+  def decode_last_build_date(_), do: {:error, "Unexpected type when decoding Channel.last_build_date"}
+
+  def encode_last_build_date(value) when is_binary(value), do: value
+  def encode_last_build_date(_), do: {:error, "Unexpected type when encoding Channel.last_build_date"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Channel.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Channel.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Channel.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Channel.title"}
+
+  def decode_ttl(value) when is_binary(value), do: value
+  def decode_ttl(_), do: {:error, "Unexpected type when decoding Channel.ttl"}
+
+  def encode_ttl(value) when is_binary(value), do: value
+  def encode_ttl(_), do: {:error, "Unexpected type when encoding Channel.ttl"}
+
   def from_map(m) do
     %Channel{
       astronomy: Astronomy.from_map(m["astronomy"]),
       atmosphere: Atmosphere.from_map(m["atmosphere"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       image: Image.from_map(m["image"]),
       item: Item.from_map(m["item"]),
-      language: m["language"],
-      last_build_date: m["lastBuildDate"],
-      link: m["link"],
+      language: decode_language(m["language"]),
+      last_build_date: decode_last_build_date(m["lastBuildDate"]),
+      link: decode_link(m["link"]),
       location: Location.from_map(m["location"]),
-      title: m["title"],
-      ttl: m["ttl"],
+      title: decode_title(m["title"]),
+      ttl: decode_ttl(m["ttl"]),
       units: Units.from_map(m["units"]),
       wind: Wind.from_map(m["wind"]),
     }
@@ -588,11 +846,29 @@ defmodule Query do
           results: Results.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Query.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Query.count"}
+
+  def decode_created(value) when is_binary(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding Query.created"}
+
+  def encode_created(value) when is_binary(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding Query.created"}
+
+  def decode_lang(value) when is_binary(value), do: value
+  def decode_lang(_), do: {:error, "Unexpected type when decoding Query.lang"}
+
+  def encode_lang(value) when is_binary(value), do: value
+  def encode_lang(_), do: {:error, "Unexpected type when encoding Query.lang"}
+
   def from_map(m) do
     %Query{
-      count: m["count"],
-      created: m["created"],
-      lang: m["lang"],
+      count: decode_count(m["count"]),
+      created: decode_created(m["created"]),
+      lang: decode_lang(m["lang"]),
       results: Results.from_map(m["results"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/26b49.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/26b49.json/default/QuickType.ex
index 0a7a5a9..cad56db 100644
--- a/base/elixir/test/inputs/json/misc/26b49.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/26b49.json/default/QuickType.ex
@@ -16,12 +16,30 @@ defmodule The480_WStill do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding The480_WStill.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding The480_WStill.height"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding The480_WStill.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding The480_WStill.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding The480_WStill.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding The480_WStill.width"}
+
   def from_map(m) do
     %The480_WStill{
-      height: m["height"],
+      height: decode_height(m["height"]),
       size: m["size"],
-      url: m["url"],
-      width: m["width"],
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -58,12 +76,36 @@ defmodule DownsizedSmall do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding DownsizedSmall.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding DownsizedSmall.height"}
+
+  def decode_mp4(value) when is_binary(value), do: value
+  def decode_mp4(_), do: {:error, "Unexpected type when decoding DownsizedSmall.mp4"}
+
+  def encode_mp4(value) when is_binary(value), do: value
+  def encode_mp4(_), do: {:error, "Unexpected type when encoding DownsizedSmall.mp4"}
+
+  def decode_mp4_size(value) when is_binary(value), do: value
+  def decode_mp4_size(_), do: {:error, "Unexpected type when decoding DownsizedSmall.mp4_size"}
+
+  def encode_mp4_size(value) when is_binary(value), do: value
+  def encode_mp4_size(_), do: {:error, "Unexpected type when encoding DownsizedSmall.mp4_size"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding DownsizedSmall.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding DownsizedSmall.width"}
+
   def from_map(m) do
     %DownsizedSmall{
-      height: m["height"],
-      mp4: m["mp4"],
-      mp4_size: m["mp4_size"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      mp4: decode_mp4(m["mp4"]),
+      mp4_size: decode_mp4_size(m["mp4_size"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -106,18 +148,54 @@ defmodule FixedHeight do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding FixedHeight.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding FixedHeight.height"}
+
+  def decode_size(value) when is_binary(value), do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding FixedHeight.size"}
+
+  def encode_size(value) when is_binary(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding FixedHeight.size"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding FixedHeight.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding FixedHeight.url"}
+
+  def decode_webp(value) when is_binary(value), do: value
+  def decode_webp(_), do: {:error, "Unexpected type when decoding FixedHeight.webp"}
+
+  def encode_webp(value) when is_binary(value), do: value
+  def encode_webp(_), do: {:error, "Unexpected type when encoding FixedHeight.webp"}
+
+  def decode_webp_size(value) when is_binary(value), do: value
+  def decode_webp_size(_), do: {:error, "Unexpected type when decoding FixedHeight.webp_size"}
+
+  def encode_webp_size(value) when is_binary(value), do: value
+  def encode_webp_size(_), do: {:error, "Unexpected type when encoding FixedHeight.webp_size"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding FixedHeight.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding FixedHeight.width"}
+
   def from_map(m) do
     %FixedHeight{
       frames: m["frames"],
       hash: m["hash"],
-      height: m["height"],
+      height: decode_height(m["height"]),
       mp4: m["mp4"],
       mp4_size: m["mp4_size"],
-      size: m["size"],
-      url: m["url"],
-      webp: m["webp"],
-      webp_size: m["webp_size"],
-      width: m["width"],
+      size: decode_size(m["size"]),
+      url: decode_url(m["url"]),
+      webp: decode_webp(m["webp"]),
+      webp_size: decode_webp_size(m["webp_size"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -158,10 +236,22 @@ defmodule Looping do
           mp4_size: String.t()
         }
 
+  def decode_mp4(value) when is_binary(value), do: value
+  def decode_mp4(_), do: {:error, "Unexpected type when decoding Looping.mp4"}
+
+  def encode_mp4(value) when is_binary(value), do: value
+  def encode_mp4(_), do: {:error, "Unexpected type when encoding Looping.mp4"}
+
+  def decode_mp4_size(value) when is_binary(value), do: value
+  def decode_mp4_size(_), do: {:error, "Unexpected type when decoding Looping.mp4_size"}
+
+  def encode_mp4_size(value) when is_binary(value), do: value
+  def encode_mp4_size(_), do: {:error, "Unexpected type when encoding Looping.mp4_size"}
+
   def from_map(m) do
     %Looping{
-      mp4: m["mp4"],
-      mp4_size: m["mp4_size"],
+      mp4: decode_mp4(m["mp4"]),
+      mp4_size: decode_mp4_size(m["mp4_size"]),
     }
   end
 
@@ -393,14 +483,44 @@ defmodule User do
           username: String.t()
         }
 
+  def decode_avatar_url(value) when is_binary(value), do: value
+  def decode_avatar_url(_), do: {:error, "Unexpected type when decoding User.avatar_url"}
+
+  def encode_avatar_url(value) when is_binary(value), do: value
+  def encode_avatar_url(_), do: {:error, "Unexpected type when encoding User.avatar_url"}
+
+  def decode_banner_url(value) when is_binary(value), do: value
+  def decode_banner_url(_), do: {:error, "Unexpected type when decoding User.banner_url"}
+
+  def encode_banner_url(value) when is_binary(value), do: value
+  def encode_banner_url(_), do: {:error, "Unexpected type when encoding User.banner_url"}
+
+  def decode_display_name(value) when is_binary(value), do: value
+  def decode_display_name(_), do: {:error, "Unexpected type when decoding User.display_name"}
+
+  def encode_display_name(value) when is_binary(value), do: value
+  def encode_display_name(_), do: {:error, "Unexpected type when encoding User.display_name"}
+
+  def decode_profile_url(value) when is_binary(value), do: value
+  def decode_profile_url(_), do: {:error, "Unexpected type when decoding User.profile_url"}
+
+  def encode_profile_url(value) when is_binary(value), do: value
+  def encode_profile_url(_), do: {:error, "Unexpected type when encoding User.profile_url"}
+
+  def decode_username(value) when is_binary(value), do: value
+  def decode_username(_), do: {:error, "Unexpected type when decoding User.username"}
+
+  def encode_username(value) when is_binary(value), do: value
+  def encode_username(_), do: {:error, "Unexpected type when encoding User.username"}
+
   def from_map(m) do
     %User{
-      avatar_url: m["avatar_url"],
-      banner_url: m["banner_url"],
-      display_name: m["display_name"],
-      profile_url: m["profile_url"],
+      avatar_url: decode_avatar_url(m["avatar_url"]),
+      banner_url: decode_banner_url(m["banner_url"]),
+      display_name: decode_display_name(m["display_name"]),
+      profile_url: decode_profile_url(m["profile_url"]),
       twitter: m["twitter"],
-      username: m["username"],
+      username: decode_username(m["username"]),
     }
   end
 
@@ -453,26 +573,110 @@ defmodule Datum do
           username: String.t()
         }
 
+  def decode_bitly_gif_url(value) when is_binary(value), do: value
+  def decode_bitly_gif_url(_), do: {:error, "Unexpected type when decoding Datum.bitly_gif_url"}
+
+  def encode_bitly_gif_url(value) when is_binary(value), do: value
+  def encode_bitly_gif_url(_), do: {:error, "Unexpected type when encoding Datum.bitly_gif_url"}
+
+  def decode_bitly_url(value) when is_binary(value), do: value
+  def decode_bitly_url(_), do: {:error, "Unexpected type when decoding Datum.bitly_url"}
+
+  def encode_bitly_url(value) when is_binary(value), do: value
+  def encode_bitly_url(_), do: {:error, "Unexpected type when encoding Datum.bitly_url"}
+
+  def decode_content_url(value) when is_binary(value), do: value
+  def decode_content_url(_), do: {:error, "Unexpected type when decoding Datum.content_url"}
+
+  def encode_content_url(value) when is_binary(value), do: value
+  def encode_content_url(_), do: {:error, "Unexpected type when encoding Datum.content_url"}
+
+  def decode_embed_url(value) when is_binary(value), do: value
+  def decode_embed_url(_), do: {:error, "Unexpected type when decoding Datum.embed_url"}
+
+  def encode_embed_url(value) when is_binary(value), do: value
+  def encode_embed_url(_), do: {:error, "Unexpected type when encoding Datum.embed_url"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Datum.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Datum.id"}
+
+  def decode_import_datetime(value) when is_binary(value), do: value
+  def decode_import_datetime(_), do: {:error, "Unexpected type when decoding Datum.import_datetime"}
+
+  def encode_import_datetime(value) when is_binary(value), do: value
+  def encode_import_datetime(_), do: {:error, "Unexpected type when encoding Datum.import_datetime"}
+
+  def decode_is_indexable(value) when is_integer(value), do: value
+  def decode_is_indexable(_), do: {:error, "Unexpected type when decoding Datum.is_indexable"}
+
+  def encode_is_indexable(value) when is_integer(value), do: value
+  def encode_is_indexable(_), do: {:error, "Unexpected type when encoding Datum.is_indexable"}
+
+  def decode_slug(value) when is_binary(value), do: value
+  def decode_slug(_), do: {:error, "Unexpected type when decoding Datum.slug"}
+
+  def encode_slug(value) when is_binary(value), do: value
+  def encode_slug(_), do: {:error, "Unexpected type when encoding Datum.slug"}
+
+  def decode_source(value) when is_binary(value), do: value
+  def decode_source(_), do: {:error, "Unexpected type when decoding Datum.source"}
+
+  def encode_source(value) when is_binary(value), do: value
+  def encode_source(_), do: {:error, "Unexpected type when encoding Datum.source"}
+
+  def decode_source_post_url(value) when is_binary(value), do: value
+  def decode_source_post_url(_), do: {:error, "Unexpected type when decoding Datum.source_post_url"}
+
+  def encode_source_post_url(value) when is_binary(value), do: value
+  def encode_source_post_url(_), do: {:error, "Unexpected type when encoding Datum.source_post_url"}
+
+  def decode_source_tld(value) when is_binary(value), do: value
+  def decode_source_tld(_), do: {:error, "Unexpected type when decoding Datum.source_tld"}
+
+  def encode_source_tld(value) when is_binary(value), do: value
+  def encode_source_tld(_), do: {:error, "Unexpected type when encoding Datum.source_tld"}
+
+  def decode_trending_datetime(value) when is_binary(value), do: value
+  def decode_trending_datetime(_), do: {:error, "Unexpected type when decoding Datum.trending_datetime"}
+
+  def encode_trending_datetime(value) when is_binary(value), do: value
+  def encode_trending_datetime(_), do: {:error, "Unexpected type when encoding Datum.trending_datetime"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Datum.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Datum.url"}
+
+  def decode_username(value) when is_binary(value), do: value
+  def decode_username(_), do: {:error, "Unexpected type when decoding Datum.username"}
+
+  def encode_username(value) when is_binary(value), do: value
+  def encode_username(_), do: {:error, "Unexpected type when encoding Datum.username"}
+
   def from_map(m) do
     %Datum{
-      bitly_gif_url: m["bitly_gif_url"],
-      bitly_url: m["bitly_url"],
-      content_url: m["content_url"],
-      embed_url: m["embed_url"],
-      id: m["id"],
+      bitly_gif_url: decode_bitly_gif_url(m["bitly_gif_url"]),
+      bitly_url: decode_bitly_url(m["bitly_url"]),
+      content_url: decode_content_url(m["content_url"]),
+      embed_url: decode_embed_url(m["embed_url"]),
+      id: decode_id(m["id"]),
       images: Images.from_map(m["images"]),
-      import_datetime: m["import_datetime"],
-      is_indexable: m["is_indexable"],
+      import_datetime: decode_import_datetime(m["import_datetime"]),
+      is_indexable: decode_is_indexable(m["is_indexable"]),
       rating: Rating.decode(m["rating"]),
-      slug: m["slug"],
-      source: m["source"],
-      source_post_url: m["source_post_url"],
-      source_tld: m["source_tld"],
-      trending_datetime: m["trending_datetime"],
+      slug: decode_slug(m["slug"]),
+      source: decode_source(m["source"]),
+      source_post_url: decode_source_post_url(m["source_post_url"]),
+      source_tld: decode_source_tld(m["source_tld"]),
+      trending_datetime: decode_trending_datetime(m["trending_datetime"]),
       type: Type.decode(m["type"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
       user: m["user"] && User.from_map(m["user"]),
-      username: m["username"],
+      username: decode_username(m["username"]),
     }
   end
 
@@ -522,11 +726,29 @@ defmodule Meta do
           status: integer()
         }
 
+  def decode_msg(value) when is_binary(value), do: value
+  def decode_msg(_), do: {:error, "Unexpected type when decoding Meta.msg"}
+
+  def encode_msg(value) when is_binary(value), do: value
+  def encode_msg(_), do: {:error, "Unexpected type when encoding Meta.msg"}
+
+  def decode_response_id(value) when is_binary(value), do: value
+  def decode_response_id(_), do: {:error, "Unexpected type when decoding Meta.response_id"}
+
+  def encode_response_id(value) when is_binary(value), do: value
+  def encode_response_id(_), do: {:error, "Unexpected type when encoding Meta.response_id"}
+
+  def decode_status(value) when is_integer(value), do: value
+  def decode_status(_), do: {:error, "Unexpected type when decoding Meta.status"}
+
+  def encode_status(value) when is_integer(value), do: value
+  def encode_status(_), do: {:error, "Unexpected type when encoding Meta.status"}
+
   def from_map(m) do
     %Meta{
-      msg: m["msg"],
-      response_id: m["response_id"],
-      status: m["status"],
+      msg: decode_msg(m["msg"]),
+      response_id: decode_response_id(m["response_id"]),
+      status: decode_status(m["status"]),
     }
   end
 
@@ -561,11 +783,29 @@ defmodule Pagination do
           total_count: integer()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Pagination.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Pagination.count"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding Pagination.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding Pagination.offset"}
+
+  def decode_total_count(value) when is_integer(value), do: value
+  def decode_total_count(_), do: {:error, "Unexpected type when decoding Pagination.total_count"}
+
+  def encode_total_count(value) when is_integer(value), do: value
+  def encode_total_count(_), do: {:error, "Unexpected type when encoding Pagination.total_count"}
+
   def from_map(m) do
     %Pagination{
-      count: m["count"],
-      offset: m["offset"],
-      total_count: m["total_count"],
+      count: decode_count(m["count"]),
+      offset: decode_offset(m["offset"]),
+      total_count: decode_total_count(m["total_count"]),
     }
   end
 
@@ -600,6 +840,12 @@ defmodule TopLevel do
           pagination: Pagination.t()
         }
 
+  def decode_data(value) when is_list(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data(value) when is_list(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
   def from_map(m) do
     %TopLevel{
       data: Enum.map(m["data"], &Datum.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/26c9c.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/26c9c.json/default/QuickType.ex
index 904db09..b184dc8 100644
--- a/base/elixir/test/inputs/json/misc/26c9c.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/26c9c.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Top do
           item: String.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Top.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Top.count"}
+
+  def decode_item(value) when is_binary(value), do: value
+  def decode_item(_), do: {:error, "Unexpected type when decoding Top.item"}
+
+  def encode_item(value) when is_binary(value), do: value
+  def encode_item(_), do: {:error, "Unexpected type when encoding Top.item"}
+
   def from_map(m) do
     %Top{
-      count: m["count"],
-      item: m["item"],
+      count: decode_count(m["count"]),
+      item: decode_item(m["item"]),
     }
   end
 
@@ -55,13 +67,43 @@ defmodule CachedContents do
           top: [Top.t()]
         }
 
+  def decode_largest(value) when is_binary(value), do: value
+  def decode_largest(_), do: {:error, "Unexpected type when decoding CachedContents.largest"}
+
+  def encode_largest(value) when is_binary(value), do: value
+  def encode_largest(_), do: {:error, "Unexpected type when encoding CachedContents.largest"}
+
+  def decode_non_null(value) when is_integer(value), do: value
+  def decode_non_null(_), do: {:error, "Unexpected type when decoding CachedContents.non_null"}
+
+  def encode_non_null(value) when is_integer(value), do: value
+  def encode_non_null(_), do: {:error, "Unexpected type when encoding CachedContents.non_null"}
+
+  def decode_null(value) when is_integer(value), do: value
+  def decode_null(_), do: {:error, "Unexpected type when decoding CachedContents.null"}
+
+  def encode_null(value) when is_integer(value), do: value
+  def encode_null(_), do: {:error, "Unexpected type when encoding CachedContents.null"}
+
+  def decode_smallest(value) when is_binary(value), do: value
+  def decode_smallest(_), do: {:error, "Unexpected type when decoding CachedContents.smallest"}
+
+  def encode_smallest(value) when is_binary(value), do: value
+  def encode_smallest(_), do: {:error, "Unexpected type when encoding CachedContents.smallest"}
+
+  def decode_top(value) when is_list(value), do: value
+  def decode_top(_), do: {:error, "Unexpected type when decoding CachedContents.top"}
+
+  def encode_top(value) when is_list(value), do: value
+  def encode_top(_), do: {:error, "Unexpected type when encoding CachedContents.top"}
+
   def from_map(m) do
     %CachedContents{
       average: m["average"],
-      largest: m["largest"],
-      non_null: m["non_null"],
-      null: m["null"],
-      smallest: m["smallest"],
+      largest: decode_largest(m["largest"]),
+      non_null: decode_non_null(m["non_null"]),
+      null: decode_null(m["null"]),
+      smallest: decode_smallest(m["smallest"]),
       sum: m["sum"],
       top: Enum.map(m["top"], &Top.from_map/1),
     }
@@ -151,17 +193,53 @@ defmodule Column do
           width: integer() | nil
         }
 
+  def decode_data_type_name(value) when is_binary(value), do: value
+  def decode_data_type_name(_), do: {:error, "Unexpected type when decoding Column.data_type_name"}
+
+  def encode_data_type_name(value) when is_binary(value), do: value
+  def encode_data_type_name(_), do: {:error, "Unexpected type when encoding Column.data_type_name"}
+
+  def decode_field_name(value) when is_binary(value), do: value
+  def decode_field_name(_), do: {:error, "Unexpected type when decoding Column.field_name"}
+
+  def encode_field_name(value) when is_binary(value), do: value
+  def encode_field_name(_), do: {:error, "Unexpected type when encoding Column.field_name"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Column.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Column.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Column.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Column.name"}
+
+  def decode_position(value) when is_integer(value), do: value
+  def decode_position(_), do: {:error, "Unexpected type when decoding Column.position"}
+
+  def encode_position(value) when is_integer(value), do: value
+  def encode_position(_), do: {:error, "Unexpected type when encoding Column.position"}
+
+  def decode_render_type_name(value) when is_binary(value), do: value
+  def decode_render_type_name(_), do: {:error, "Unexpected type when decoding Column.render_type_name"}
+
+  def encode_render_type_name(value) when is_binary(value), do: value
+  def encode_render_type_name(_), do: {:error, "Unexpected type when encoding Column.render_type_name"}
+
   def from_map(m) do
     %Column{
       cached_contents: m["cachedContents"] && CachedContents.from_map(m["cachedContents"]),
-      data_type_name: m["dataTypeName"],
-      field_name: m["fieldName"],
+      data_type_name: decode_data_type_name(m["dataTypeName"]),
+      field_name: decode_field_name(m["fieldName"]),
       flags: m["flags"],
       format: Format.from_map(m["format"]),
-      id: m["id"],
-      name: m["name"],
-      position: m["position"],
-      render_type_name: m["renderTypeName"],
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
+      position: decode_position(m["position"]),
+      render_type_name: decode_render_type_name(m["renderTypeName"]),
       table_column_id: m["tableColumnId"],
       width: m["width"],
     }
@@ -206,11 +284,29 @@ defmodule Grant do
           type: String.t()
         }
 
+  def decode_flags(value) when is_list(value), do: value
+  def decode_flags(_), do: {:error, "Unexpected type when decoding Grant.flags"}
+
+  def encode_flags(value) when is_list(value), do: value
+  def encode_flags(_), do: {:error, "Unexpected type when encoding Grant.flags"}
+
+  def decode_inherited(value) when is_boolean(value), do: value
+  def decode_inherited(_), do: {:error, "Unexpected type when decoding Grant.inherited"}
+
+  def encode_inherited(value) when is_boolean(value), do: value
+  def encode_inherited(_), do: {:error, "Unexpected type when encoding Grant.inherited"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Grant.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Grant.type"}
+
   def from_map(m) do
     %Grant{
-      flags: m["flags"],
-      inherited: m["inherited"],
-      type: m["type"],
+      flags: decode_flags(m["flags"]),
+      inherited: decode_inherited(m["inherited"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -246,12 +342,36 @@ defmodule Attachment do
           name: String.t()
         }
 
+  def decode_asset_id(value) when is_binary(value), do: value
+  def decode_asset_id(_), do: {:error, "Unexpected type when decoding Attachment.asset_id"}
+
+  def encode_asset_id(value) when is_binary(value), do: value
+  def encode_asset_id(_), do: {:error, "Unexpected type when encoding Attachment.asset_id"}
+
+  def decode_blob_id(value) when is_binary(value), do: value
+  def decode_blob_id(_), do: {:error, "Unexpected type when decoding Attachment.blob_id"}
+
+  def encode_blob_id(value) when is_binary(value), do: value
+  def encode_blob_id(_), do: {:error, "Unexpected type when encoding Attachment.blob_id"}
+
+  def decode_filename(value) when is_binary(value), do: value
+  def decode_filename(_), do: {:error, "Unexpected type when decoding Attachment.filename"}
+
+  def encode_filename(value) when is_binary(value), do: value
+  def encode_filename(_), do: {:error, "Unexpected type when encoding Attachment.filename"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Attachment.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Attachment.name"}
+
   def from_map(m) do
     %Attachment{
-      asset_id: m["assetId"],
-      blob_id: m["blobId"],
-      filename: m["filename"],
-      name: m["name"],
+      asset_id: decode_asset_id(m["assetId"]),
+      blob_id: decode_blob_id(m["blobId"]),
+      filename: decode_filename(m["filename"]),
+      name: decode_name(m["name"]),
     }
   end
 
@@ -286,10 +406,22 @@ defmodule AdditionalResources do
           see_also: String.t()
         }
 
+  def decode_additional_resources_see_also(value) when is_binary(value), do: value
+  def decode_additional_resources_see_also(_), do: {:error, "Unexpected type when decoding AdditionalResources.additional_resources_see_also"}
+
+  def encode_additional_resources_see_also(value) when is_binary(value), do: value
+  def encode_additional_resources_see_also(_), do: {:error, "Unexpected type when encoding AdditionalResources.additional_resources_see_also"}
+
+  def decode_see_also(value) when is_binary(value), do: value
+  def decode_see_also(_), do: {:error, "Unexpected type when decoding AdditionalResources.see_also"}
+
+  def encode_see_also(value) when is_binary(value), do: value
+  def encode_see_also(_), do: {:error, "Unexpected type when encoding AdditionalResources.see_also"}
+
   def from_map(m) do
     %AdditionalResources{
-      additional_resources_see_also: m["See Also "],
-      see_also: m["See Also"],
+      additional_resources_see_also: decode_additional_resources_see_also(m["See Also "]),
+      see_also: decode_see_also(m["See Also"]),
     }
   end
 
@@ -323,11 +455,29 @@ defmodule CommonCore do
           publisher: String.t()
         }
 
+  def decode_contact_email(value) when is_binary(value), do: value
+  def decode_contact_email(_), do: {:error, "Unexpected type when decoding CommonCore.contact_email"}
+
+  def encode_contact_email(value) when is_binary(value), do: value
+  def encode_contact_email(_), do: {:error, "Unexpected type when encoding CommonCore.contact_email"}
+
+  def decode_contact_name(value) when is_binary(value), do: value
+  def decode_contact_name(_), do: {:error, "Unexpected type when decoding CommonCore.contact_name"}
+
+  def encode_contact_name(value) when is_binary(value), do: value
+  def encode_contact_name(_), do: {:error, "Unexpected type when encoding CommonCore.contact_name"}
+
+  def decode_publisher(value) when is_binary(value), do: value
+  def decode_publisher(_), do: {:error, "Unexpected type when decoding CommonCore.publisher"}
+
+  def encode_publisher(value) when is_binary(value), do: value
+  def encode_publisher(_), do: {:error, "Unexpected type when encoding CommonCore.publisher"}
+
   def from_map(m) do
     %CommonCore{
-      contact_email: m["Contact Email"],
-      contact_name: m["Contact Name"],
-      publisher: m["Publisher"],
+      contact_email: decode_contact_email(m["Contact Email"]),
+      contact_name: decode_contact_name(m["Contact Name"]),
+      publisher: decode_publisher(m["Publisher"]),
     }
   end
 
@@ -360,9 +510,15 @@ defmodule DatasetInformation do
           agency: String.t()
         }
 
+  def decode_agency(value) when is_binary(value), do: value
+  def decode_agency(_), do: {:error, "Unexpected type when decoding DatasetInformation.agency"}
+
+  def encode_agency(value) when is_binary(value), do: value
+  def encode_agency(_), do: {:error, "Unexpected type when encoding DatasetInformation.agency"}
+
   def from_map(m) do
     %DatasetInformation{
-      agency: m["Agency"],
+      agency: decode_agency(m["Agency"]),
     }
   end
 
@@ -401,17 +557,71 @@ defmodule DatasetSummary do
           units: String.t()
         }
 
+  def decode_contact_information(value) when is_binary(value), do: value
+  def decode_contact_information(_), do: {:error, "Unexpected type when decoding DatasetSummary.contact_information"}
+
+  def encode_contact_information(value) when is_binary(value), do: value
+  def encode_contact_information(_), do: {:error, "Unexpected type when encoding DatasetSummary.contact_information"}
+
+  def decode_coverage(value) when is_binary(value), do: value
+  def decode_coverage(_), do: {:error, "Unexpected type when decoding DatasetSummary.coverage"}
+
+  def encode_coverage(value) when is_binary(value), do: value
+  def encode_coverage(_), do: {:error, "Unexpected type when encoding DatasetSummary.coverage"}
+
+  def decode_data_frequency(value) when is_binary(value), do: value
+  def decode_data_frequency(_), do: {:error, "Unexpected type when decoding DatasetSummary.data_frequency"}
+
+  def encode_data_frequency(value) when is_binary(value), do: value
+  def encode_data_frequency(_), do: {:error, "Unexpected type when encoding DatasetSummary.data_frequency"}
+
+  def decode_dataset_owner(value) when is_binary(value), do: value
+  def decode_dataset_owner(_), do: {:error, "Unexpected type when decoding DatasetSummary.dataset_owner"}
+
+  def encode_dataset_owner(value) when is_binary(value), do: value
+  def encode_dataset_owner(_), do: {:error, "Unexpected type when encoding DatasetSummary.dataset_owner"}
+
+  def decode_granularity(value) when is_binary(value), do: value
+  def decode_granularity(_), do: {:error, "Unexpected type when decoding DatasetSummary.granularity"}
+
+  def encode_granularity(value) when is_binary(value), do: value
+  def encode_granularity(_), do: {:error, "Unexpected type when encoding DatasetSummary.granularity"}
+
+  def decode_organization(value) when is_binary(value), do: value
+  def decode_organization(_), do: {:error, "Unexpected type when decoding DatasetSummary.organization"}
+
+  def encode_organization(value) when is_binary(value), do: value
+  def encode_organization(_), do: {:error, "Unexpected type when encoding DatasetSummary.organization"}
+
+  def decode_posting_frequency(value) when is_binary(value), do: value
+  def decode_posting_frequency(_), do: {:error, "Unexpected type when decoding DatasetSummary.posting_frequency"}
+
+  def encode_posting_frequency(value) when is_binary(value), do: value
+  def encode_posting_frequency(_), do: {:error, "Unexpected type when encoding DatasetSummary.posting_frequency"}
+
+  def decode_time_period(value) when is_binary(value), do: value
+  def decode_time_period(_), do: {:error, "Unexpected type when decoding DatasetSummary.time_period"}
+
+  def encode_time_period(value) when is_binary(value), do: value
+  def encode_time_period(_), do: {:error, "Unexpected type when encoding DatasetSummary.time_period"}
+
+  def decode_units(value) when is_binary(value), do: value
+  def decode_units(_), do: {:error, "Unexpected type when decoding DatasetSummary.units"}
+
+  def encode_units(value) when is_binary(value), do: value
+  def encode_units(_), do: {:error, "Unexpected type when encoding DatasetSummary.units"}
+
   def from_map(m) do
     %DatasetSummary{
-      contact_information: m["Contact Information"],
-      coverage: m["Coverage"],
-      data_frequency: m["Data Frequency"],
-      dataset_owner: m["Dataset Owner"],
-      granularity: m["Granularity"],
-      organization: m["Organization"],
-      posting_frequency: m["Posting Frequency"],
-      time_period: m["Time Period"],
-      units: m["Units"],
+      contact_information: decode_contact_information(m["Contact Information"]),
+      coverage: decode_coverage(m["Coverage"]),
+      data_frequency: decode_data_frequency(m["Data Frequency"]),
+      dataset_owner: decode_dataset_owner(m["Dataset Owner"]),
+      granularity: decode_granularity(m["Granularity"]),
+      organization: decode_organization(m["Organization"]),
+      posting_frequency: decode_posting_frequency(m["Posting Frequency"]),
+      time_period: decode_time_period(m["Time Period"]),
+      units: decode_units(m["Units"]),
     }
   end
 
@@ -450,9 +660,15 @@ defmodule Notes do
           notes: String.t()
         }
 
+  def decode_notes(value) when is_binary(value), do: value
+  def decode_notes(_), do: {:error, "Unexpected type when decoding Notes.notes"}
+
+  def encode_notes(value) when is_binary(value), do: value
+  def encode_notes(_), do: {:error, "Unexpected type when encoding Notes.notes"}
+
   def from_map(m) do
     %Notes{
-      notes: m["Notes"],
+      notes: decode_notes(m["Notes"]),
     }
   end
 
@@ -529,10 +745,22 @@ defmodule Order do
           column_field_name: String.t()
         }
 
+  def decode_ascending(value) when is_boolean(value), do: value
+  def decode_ascending(_), do: {:error, "Unexpected type when decoding Order.ascending"}
+
+  def encode_ascending(value) when is_boolean(value), do: value
+  def encode_ascending(_), do: {:error, "Unexpected type when encoding Order.ascending"}
+
+  def decode_column_field_name(value) when is_binary(value), do: value
+  def decode_column_field_name(_), do: {:error, "Unexpected type when decoding Order.column_field_name"}
+
+  def encode_column_field_name(value) when is_binary(value), do: value
+  def encode_column_field_name(_), do: {:error, "Unexpected type when encoding Order.column_field_name"}
+
   def from_map(m) do
     %Order{
-      ascending: m["ascending"],
-      column_field_name: m["columnFieldName"],
+      ascending: decode_ascending(m["ascending"]),
+      column_field_name: decode_column_field_name(m["columnFieldName"]),
     }
   end
 
@@ -564,6 +792,12 @@ defmodule JSONQuery do
           order: [Order.t()]
         }
 
+  def decode_order(value) when is_list(value), do: value
+  def decode_order(_), do: {:error, "Unexpected type when decoding JSONQuery.order"}
+
+  def encode_order(value) when is_list(value), do: value
+  def encode_order(_), do: {:error, "Unexpected type when encoding JSONQuery.order"}
+
   def from_map(m) do
     %JSONQuery{
       order: Enum.map(m["order"], &Order.from_map/1),
@@ -597,9 +831,15 @@ defmodule Visible do
           table: boolean()
         }
 
+  def decode_table(value) when is_boolean(value), do: value
+  def decode_table(_), do: {:error, "Unexpected type when decoding Visible.table"}
+
+  def encode_table(value) when is_boolean(value), do: value
+  def encode_table(_), do: {:error, "Unexpected type when encoding Visible.table"}
+
   def from_map(m) do
     %Visible{
-      table: m["table"],
+      table: decode_table(m["table"]),
     }
   end
 
@@ -668,13 +908,31 @@ defmodule Metadata do
           render_type_config: RenderTypeConfig.t()
         }
 
+  def decode_attachments(value) when is_list(value), do: value
+  def decode_attachments(_), do: {:error, "Unexpected type when decoding Metadata.attachments"}
+
+  def encode_attachments(value) when is_list(value), do: value
+  def encode_attachments(_), do: {:error, "Unexpected type when encoding Metadata.attachments"}
+
+  def decode_available_display_types(value) when is_list(value), do: value
+  def decode_available_display_types(_), do: {:error, "Unexpected type when decoding Metadata.available_display_types"}
+
+  def encode_available_display_types(value) when is_list(value), do: value
+  def encode_available_display_types(_), do: {:error, "Unexpected type when encoding Metadata.available_display_types"}
+
+  def decode_rdf_subject(value) when is_binary(value), do: value
+  def decode_rdf_subject(_), do: {:error, "Unexpected type when decoding Metadata.rdf_subject"}
+
+  def encode_rdf_subject(value) when is_binary(value), do: value
+  def encode_rdf_subject(_), do: {:error, "Unexpected type when encoding Metadata.rdf_subject"}
+
   def from_map(m) do
     %Metadata{
       attachments: Enum.map(m["attachments"], &Attachment.from_map/1),
-      available_display_types: m["availableDisplayTypes"],
+      available_display_types: decode_available_display_types(m["availableDisplayTypes"]),
       custom_fields: CustomFields.from_map(m["custom_fields"]),
       json_query: JSONQuery.from_map(m["jsonQuery"]),
-      rdf_subject: m["rdfSubject"],
+      rdf_subject: decode_rdf_subject(m["rdfSubject"]),
       render_type_config: RenderTypeConfig.from_map(m["renderTypeConfig"]),
     }
   end
@@ -718,16 +976,64 @@ defmodule Owner do
           screen_name: String.t()
         }
 
+  def decode_display_name(value) when is_binary(value), do: value
+  def decode_display_name(_), do: {:error, "Unexpected type when decoding Owner.display_name"}
+
+  def encode_display_name(value) when is_binary(value), do: value
+  def encode_display_name(_), do: {:error, "Unexpected type when encoding Owner.display_name"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Owner.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Owner.id"}
+
+  def decode_profile_image_url_large(value) when is_binary(value), do: value
+  def decode_profile_image_url_large(_), do: {:error, "Unexpected type when decoding Owner.profile_image_url_large"}
+
+  def encode_profile_image_url_large(value) when is_binary(value), do: value
+  def encode_profile_image_url_large(_), do: {:error, "Unexpected type when encoding Owner.profile_image_url_large"}
+
+  def decode_profile_image_url_medium(value) when is_binary(value), do: value
+  def decode_profile_image_url_medium(_), do: {:error, "Unexpected type when decoding Owner.profile_image_url_medium"}
+
+  def encode_profile_image_url_medium(value) when is_binary(value), do: value
+  def encode_profile_image_url_medium(_), do: {:error, "Unexpected type when encoding Owner.profile_image_url_medium"}
+
+  def decode_profile_image_url_small(value) when is_binary(value), do: value
+  def decode_profile_image_url_small(_), do: {:error, "Unexpected type when decoding Owner.profile_image_url_small"}
+
+  def encode_profile_image_url_small(value) when is_binary(value), do: value
+  def encode_profile_image_url_small(_), do: {:error, "Unexpected type when encoding Owner.profile_image_url_small"}
+
+  def decode_rights(value) when is_list(value), do: value
+  def decode_rights(_), do: {:error, "Unexpected type when decoding Owner.rights"}
+
+  def encode_rights(value) when is_list(value), do: value
+  def encode_rights(_), do: {:error, "Unexpected type when encoding Owner.rights"}
+
+  def decode_role_name(value) when is_binary(value), do: value
+  def decode_role_name(_), do: {:error, "Unexpected type when decoding Owner.role_name"}
+
+  def encode_role_name(value) when is_binary(value), do: value
+  def encode_role_name(_), do: {:error, "Unexpected type when encoding Owner.role_name"}
+
+  def decode_screen_name(value) when is_binary(value), do: value
+  def decode_screen_name(_), do: {:error, "Unexpected type when decoding Owner.screen_name"}
+
+  def encode_screen_name(value) when is_binary(value), do: value
+  def encode_screen_name(_), do: {:error, "Unexpected type when encoding Owner.screen_name"}
+
   def from_map(m) do
     %Owner{
-      display_name: m["displayName"],
-      id: m["id"],
-      profile_image_url_large: m["profileImageUrlLarge"],
-      profile_image_url_medium: m["profileImageUrlMedium"],
-      profile_image_url_small: m["profileImageUrlSmall"],
-      rights: m["rights"],
-      role_name: m["roleName"],
-      screen_name: m["screenName"],
+      display_name: decode_display_name(m["displayName"]),
+      id: decode_id(m["id"]),
+      profile_image_url_large: decode_profile_image_url_large(m["profileImageUrlLarge"]),
+      profile_image_url_medium: decode_profile_image_url_medium(m["profileImageUrlMedium"]),
+      profile_image_url_small: decode_profile_image_url_small(m["profileImageUrlSmall"]),
+      rights: decode_rights(m["rights"]),
+      role_name: decode_role_name(m["roleName"]),
+      screen_name: decode_screen_name(m["screenName"]),
     }
   end
 
@@ -766,10 +1072,22 @@ defmodule Expression do
           type: String.t()
         }
 
+  def decode_column_id(value) when is_integer(value), do: value
+  def decode_column_id(_), do: {:error, "Unexpected type when decoding Expression.column_id"}
+
+  def encode_column_id(value) when is_integer(value), do: value
+  def encode_column_id(_), do: {:error, "Unexpected type when encoding Expression.column_id"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Expression.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Expression.type"}
+
   def from_map(m) do
     %Expression{
-      column_id: m["columnId"],
-      type: m["type"],
+      column_id: decode_column_id(m["columnId"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -802,9 +1120,15 @@ defmodule OrderBy do
           expression: Expression.t()
         }
 
+  def decode_ascending(value) when is_boolean(value), do: value
+  def decode_ascending(_), do: {:error, "Unexpected type when decoding OrderBy.ascending"}
+
+  def encode_ascending(value) when is_boolean(value), do: value
+  def encode_ascending(_), do: {:error, "Unexpected type when encoding OrderBy.ascending"}
+
   def from_map(m) do
     %OrderBy{
-      ascending: m["ascending"],
+      ascending: decode_ascending(m["ascending"]),
       expression: Expression.from_map(m["expression"]),
     }
   end
@@ -837,6 +1161,12 @@ defmodule Query do
           order_bys: [OrderBy.t()]
         }
 
+  def decode_order_bys(value) when is_list(value), do: value
+  def decode_order_bys(_), do: {:error, "Unexpected type when decoding Query.order_bys"}
+
+  def encode_order_bys(value) when is_list(value), do: value
+  def encode_order_bys(_), do: {:error, "Unexpected type when encoding Query.order_bys"}
+
   def from_map(m) do
     %Query{
       order_bys: Enum.map(m["orderBys"], &OrderBy.from_map/1),
@@ -907,46 +1237,250 @@ defmodule View do
           view_type: String.t()
         }
 
+  def decode_attribution(value) when is_binary(value), do: value
+  def decode_attribution(_), do: {:error, "Unexpected type when decoding View.attribution"}
+
+  def encode_attribution(value) when is_binary(value), do: value
+  def encode_attribution(_), do: {:error, "Unexpected type when encoding View.attribution"}
+
+  def decode_attribution_link(value) when is_binary(value), do: value
+  def decode_attribution_link(_), do: {:error, "Unexpected type when decoding View.attribution_link"}
+
+  def encode_attribution_link(value) when is_binary(value), do: value
+  def encode_attribution_link(_), do: {:error, "Unexpected type when encoding View.attribution_link"}
+
+  def decode_average_rating(value) when is_integer(value), do: value
+  def decode_average_rating(_), do: {:error, "Unexpected type when decoding View.average_rating"}
+
+  def encode_average_rating(value) when is_integer(value), do: value
+  def encode_average_rating(_), do: {:error, "Unexpected type when encoding View.average_rating"}
+
+  def decode_category(value) when is_binary(value), do: value
+  def decode_category(_), do: {:error, "Unexpected type when decoding View.category"}
+
+  def encode_category(value) when is_binary(value), do: value
+  def encode_category(_), do: {:error, "Unexpected type when encoding View.category"}
+
+  def decode_columns(value) when is_list(value), do: value
+  def decode_columns(_), do: {:error, "Unexpected type when decoding View.columns"}
+
+  def encode_columns(value) when is_list(value), do: value
+  def encode_columns(_), do: {:error, "Unexpected type when encoding View.columns"}
+
+  def decode_created_at(value) when is_integer(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding View.created_at"}
+
+  def encode_created_at(value) when is_integer(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding View.created_at"}
+
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding View.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding View.description"}
+
+  def decode_display_type(value) when is_binary(value), do: value
+  def decode_display_type(_), do: {:error, "Unexpected type when decoding View.display_type"}
+
+  def encode_display_type(value) when is_binary(value), do: value
+  def encode_display_type(_), do: {:error, "Unexpected type when encoding View.display_type"}
+
+  def decode_download_count(value) when is_integer(value), do: value
+  def decode_download_count(_), do: {:error, "Unexpected type when decoding View.download_count"}
+
+  def encode_download_count(value) when is_integer(value), do: value
+  def encode_download_count(_), do: {:error, "Unexpected type when encoding View.download_count"}
+
+  def decode_flags(value) when is_list(value), do: value
+  def decode_flags(_), do: {:error, "Unexpected type when decoding View.flags"}
+
+  def encode_flags(value) when is_list(value), do: value
+  def encode_flags(_), do: {:error, "Unexpected type when encoding View.flags"}
+
+  def decode_grants(value) when is_list(value), do: value
+  def decode_grants(_), do: {:error, "Unexpected type when decoding View.grants"}
+
+  def encode_grants(value) when is_list(value), do: value
+  def encode_grants(_), do: {:error, "Unexpected type when encoding View.grants"}
+
+  def decode_hide_from_catalog(value) when is_boolean(value), do: value
+  def decode_hide_from_catalog(_), do: {:error, "Unexpected type when decoding View.hide_from_catalog"}
+
+  def encode_hide_from_catalog(value) when is_boolean(value), do: value
+  def encode_hide_from_catalog(_), do: {:error, "Unexpected type when encoding View.hide_from_catalog"}
+
+  def decode_hide_from_data_json(value) when is_boolean(value), do: value
+  def decode_hide_from_data_json(_), do: {:error, "Unexpected type when decoding View.hide_from_data_json"}
+
+  def encode_hide_from_data_json(value) when is_boolean(value), do: value
+  def encode_hide_from_data_json(_), do: {:error, "Unexpected type when encoding View.hide_from_data_json"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding View.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding View.id"}
+
+  def decode_index_updated_at(value) when is_integer(value), do: value
+  def decode_index_updated_at(_), do: {:error, "Unexpected type when decoding View.index_updated_at"}
+
+  def encode_index_updated_at(value) when is_integer(value), do: value
+  def encode_index_updated_at(_), do: {:error, "Unexpected type when encoding View.index_updated_at"}
+
+  def decode_locale(value) when is_binary(value), do: value
+  def decode_locale(_), do: {:error, "Unexpected type when decoding View.locale"}
+
+  def encode_locale(value) when is_binary(value), do: value
+  def encode_locale(_), do: {:error, "Unexpected type when encoding View.locale"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding View.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding View.name"}
+
+  def decode_new_backend(value) when is_boolean(value), do: value
+  def decode_new_backend(_), do: {:error, "Unexpected type when decoding View.new_backend"}
+
+  def encode_new_backend(value) when is_boolean(value), do: value
+  def encode_new_backend(_), do: {:error, "Unexpected type when encoding View.new_backend"}
+
+  def decode_number_of_comments(value) when is_integer(value), do: value
+  def decode_number_of_comments(_), do: {:error, "Unexpected type when decoding View.number_of_comments"}
+
+  def encode_number_of_comments(value) when is_integer(value), do: value
+  def encode_number_of_comments(_), do: {:error, "Unexpected type when encoding View.number_of_comments"}
+
+  def decode_oid(value) when is_integer(value), do: value
+  def decode_oid(_), do: {:error, "Unexpected type when decoding View.oid"}
+
+  def encode_oid(value) when is_integer(value), do: value
+  def encode_oid(_), do: {:error, "Unexpected type when encoding View.oid"}
+
+  def decode_provenance(value) when is_binary(value), do: value
+  def decode_provenance(_), do: {:error, "Unexpected type when decoding View.provenance"}
+
+  def encode_provenance(value) when is_binary(value), do: value
+  def encode_provenance(_), do: {:error, "Unexpected type when encoding View.provenance"}
+
+  def decode_publication_append_enabled(value) when is_boolean(value), do: value
+  def decode_publication_append_enabled(_), do: {:error, "Unexpected type when decoding View.publication_append_enabled"}
+
+  def encode_publication_append_enabled(value) when is_boolean(value), do: value
+  def encode_publication_append_enabled(_), do: {:error, "Unexpected type when encoding View.publication_append_enabled"}
+
+  def decode_publication_date(value) when is_integer(value), do: value
+  def decode_publication_date(_), do: {:error, "Unexpected type when decoding View.publication_date"}
+
+  def encode_publication_date(value) when is_integer(value), do: value
+  def encode_publication_date(_), do: {:error, "Unexpected type when encoding View.publication_date"}
+
+  def decode_publication_group(value) when is_integer(value), do: value
+  def decode_publication_group(_), do: {:error, "Unexpected type when decoding View.publication_group"}
+
+  def encode_publication_group(value) when is_integer(value), do: value
+  def encode_publication_group(_), do: {:error, "Unexpected type when encoding View.publication_group"}
+
+  def decode_publication_stage(value) when is_binary(value), do: value
+  def decode_publication_stage(_), do: {:error, "Unexpected type when decoding View.publication_stage"}
+
+  def encode_publication_stage(value) when is_binary(value), do: value
+  def encode_publication_stage(_), do: {:error, "Unexpected type when encoding View.publication_stage"}
+
+  def decode_rights(value) when is_list(value), do: value
+  def decode_rights(_), do: {:error, "Unexpected type when decoding View.rights"}
+
+  def encode_rights(value) when is_list(value), do: value
+  def encode_rights(_), do: {:error, "Unexpected type when encoding View.rights"}
+
+  def decode_rows_updated_at(value) when is_integer(value), do: value
+  def decode_rows_updated_at(_), do: {:error, "Unexpected type when decoding View.rows_updated_at"}
+
+  def encode_rows_updated_at(value) when is_integer(value), do: value
+  def encode_rows_updated_at(_), do: {:error, "Unexpected type when encoding View.rows_updated_at"}
+
+  def decode_rows_updated_by(value) when is_binary(value), do: value
+  def decode_rows_updated_by(_), do: {:error, "Unexpected type when decoding View.rows_updated_by"}
+
+  def encode_rows_updated_by(value) when is_binary(value), do: value
+  def encode_rows_updated_by(_), do: {:error, "Unexpected type when encoding View.rows_updated_by"}
+
+  def decode_table_id(value) when is_integer(value), do: value
+  def decode_table_id(_), do: {:error, "Unexpected type when decoding View.table_id"}
+
+  def encode_table_id(value) when is_integer(value), do: value
+  def encode_table_id(_), do: {:error, "Unexpected type when encoding View.table_id"}
+
+  def decode_tags(value) when is_list(value), do: value
+  def decode_tags(_), do: {:error, "Unexpected type when decoding View.tags"}
+
+  def encode_tags(value) when is_list(value), do: value
+  def encode_tags(_), do: {:error, "Unexpected type when encoding View.tags"}
+
+  def decode_total_times_rated(value) when is_integer(value), do: value
+  def decode_total_times_rated(_), do: {:error, "Unexpected type when decoding View.total_times_rated"}
+
+  def encode_total_times_rated(value) when is_integer(value), do: value
+  def encode_total_times_rated(_), do: {:error, "Unexpected type when encoding View.total_times_rated"}
+
+  def decode_view_count(value) when is_integer(value), do: value
+  def decode_view_count(_), do: {:error, "Unexpected type when decoding View.view_count"}
+
+  def encode_view_count(value) when is_integer(value), do: value
+  def encode_view_count(_), do: {:error, "Unexpected type when encoding View.view_count"}
+
+  def decode_view_last_modified(value) when is_integer(value), do: value
+  def decode_view_last_modified(_), do: {:error, "Unexpected type when decoding View.view_last_modified"}
+
+  def encode_view_last_modified(value) when is_integer(value), do: value
+  def encode_view_last_modified(_), do: {:error, "Unexpected type when encoding View.view_last_modified"}
+
+  def decode_view_type(value) when is_binary(value), do: value
+  def decode_view_type(_), do: {:error, "Unexpected type when decoding View.view_type"}
+
+  def encode_view_type(value) when is_binary(value), do: value
+  def encode_view_type(_), do: {:error, "Unexpected type when encoding View.view_type"}
+
   def from_map(m) do
     %View{
-      attribution: m["attribution"],
-      attribution_link: m["attributionLink"],
-      average_rating: m["averageRating"],
-      category: m["category"],
+      attribution: decode_attribution(m["attribution"]),
+      attribution_link: decode_attribution_link(m["attributionLink"]),
+      average_rating: decode_average_rating(m["averageRating"]),
+      category: decode_category(m["category"]),
       columns: Enum.map(m["columns"], &Column.from_map/1),
-      created_at: m["createdAt"],
-      description: m["description"],
-      display_type: m["displayType"],
-      download_count: m["downloadCount"],
-      flags: m["flags"],
+      created_at: decode_created_at(m["createdAt"]),
+      description: decode_description(m["description"]),
+      display_type: decode_display_type(m["displayType"]),
+      download_count: decode_download_count(m["downloadCount"]),
+      flags: decode_flags(m["flags"]),
       grants: Enum.map(m["grants"], &Grant.from_map/1),
-      hide_from_catalog: m["hideFromCatalog"],
-      hide_from_data_json: m["hideFromDataJson"],
-      id: m["id"],
-      index_updated_at: m["indexUpdatedAt"],
-      locale: m["locale"],
+      hide_from_catalog: decode_hide_from_catalog(m["hideFromCatalog"]),
+      hide_from_data_json: decode_hide_from_data_json(m["hideFromDataJson"]),
+      id: decode_id(m["id"]),
+      index_updated_at: decode_index_updated_at(m["indexUpdatedAt"]),
+      locale: decode_locale(m["locale"]),
       metadata: Metadata.from_map(m["metadata"]),
-      name: m["name"],
-      new_backend: m["newBackend"],
-      number_of_comments: m["numberOfComments"],
-      oid: m["oid"],
+      name: decode_name(m["name"]),
+      new_backend: decode_new_backend(m["newBackend"]),
+      number_of_comments: decode_number_of_comments(m["numberOfComments"]),
+      oid: decode_oid(m["oid"]),
       owner: Owner.from_map(m["owner"]),
-      provenance: m["provenance"],
-      publication_append_enabled: m["publicationAppendEnabled"],
-      publication_date: m["publicationDate"],
-      publication_group: m["publicationGroup"],
-      publication_stage: m["publicationStage"],
+      provenance: decode_provenance(m["provenance"]),
+      publication_append_enabled: decode_publication_append_enabled(m["publicationAppendEnabled"]),
+      publication_date: decode_publication_date(m["publicationDate"]),
+      publication_group: decode_publication_group(m["publicationGroup"]),
+      publication_stage: decode_publication_stage(m["publicationStage"]),
       query: Query.from_map(m["query"]),
-      rights: m["rights"],
-      rows_updated_at: m["rowsUpdatedAt"],
-      rows_updated_by: m["rowsUpdatedBy"],
+      rights: decode_rights(m["rights"]),
+      rows_updated_at: decode_rows_updated_at(m["rowsUpdatedAt"]),
+      rows_updated_by: decode_rows_updated_by(m["rowsUpdatedBy"]),
       table_author: Owner.from_map(m["tableAuthor"]),
-      table_id: m["tableId"],
-      tags: m["tags"],
-      total_times_rated: m["totalTimesRated"],
-      view_count: m["viewCount"],
-      view_last_modified: m["viewLastModified"],
-      view_type: m["viewType"],
+      table_id: decode_table_id(m["tableId"]),
+      tags: decode_tags(m["tags"]),
+      total_times_rated: decode_total_times_rated(m["totalTimesRated"]),
+      view_count: decode_view_count(m["viewCount"]),
+      view_last_modified: decode_view_last_modified(m["viewLastModified"]),
+      view_type: decode_view_type(m["viewType"]),
     }
   end
 
@@ -1048,9 +1582,15 @@ defmodule TopLevel do
           meta: Meta.t()
         }
 
+  def decode_data(value) when is_list(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data(value) when is_list(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
   def from_map(m) do
     %TopLevel{
-      data: m["data"],
+      data: decode_data(m["data"]),
       meta: Meta.from_map(m["meta"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/27332.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/27332.json/default/QuickType.ex
index ecb3f71..ee5a81f 100644
--- a/base/elixir/test/inputs/json/misc/27332.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/27332.json/default/QuickType.ex
@@ -72,20 +72,92 @@ defmodule Oembed do
           width: integer()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Oembed.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Oembed.description"}
+
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Oembed.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Oembed.height"}
+
+  def decode_html(value) when is_binary(value), do: value
+  def decode_html(_), do: {:error, "Unexpected type when decoding Oembed.html"}
+
+  def encode_html(value) when is_binary(value), do: value
+  def encode_html(_), do: {:error, "Unexpected type when encoding Oembed.html"}
+
+  def decode_provider_name(value) when is_binary(value), do: value
+  def decode_provider_name(_), do: {:error, "Unexpected type when decoding Oembed.provider_name"}
+
+  def encode_provider_name(value) when is_binary(value), do: value
+  def encode_provider_name(_), do: {:error, "Unexpected type when encoding Oembed.provider_name"}
+
+  def decode_provider_url(value) when is_binary(value), do: value
+  def decode_provider_url(_), do: {:error, "Unexpected type when decoding Oembed.provider_url"}
+
+  def encode_provider_url(value) when is_binary(value), do: value
+  def encode_provider_url(_), do: {:error, "Unexpected type when encoding Oembed.provider_url"}
+
+  def decode_thumbnail_height(value) when is_integer(value), do: value
+  def decode_thumbnail_height(_), do: {:error, "Unexpected type when decoding Oembed.thumbnail_height"}
+
+  def encode_thumbnail_height(value) when is_integer(value), do: value
+  def encode_thumbnail_height(_), do: {:error, "Unexpected type when encoding Oembed.thumbnail_height"}
+
+  def decode_thumbnail_url(value) when is_binary(value), do: value
+  def decode_thumbnail_url(_), do: {:error, "Unexpected type when decoding Oembed.thumbnail_url"}
+
+  def encode_thumbnail_url(value) when is_binary(value), do: value
+  def encode_thumbnail_url(_), do: {:error, "Unexpected type when encoding Oembed.thumbnail_url"}
+
+  def decode_thumbnail_width(value) when is_integer(value), do: value
+  def decode_thumbnail_width(_), do: {:error, "Unexpected type when decoding Oembed.thumbnail_width"}
+
+  def encode_thumbnail_width(value) when is_integer(value), do: value
+  def encode_thumbnail_width(_), do: {:error, "Unexpected type when encoding Oembed.thumbnail_width"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Oembed.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Oembed.title"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Oembed.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Oembed.type"}
+
+  def decode_version(value) when is_binary(value), do: value
+  def decode_version(_), do: {:error, "Unexpected type when decoding Oembed.version"}
+
+  def encode_version(value) when is_binary(value), do: value
+  def encode_version(_), do: {:error, "Unexpected type when encoding Oembed.version"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Oembed.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Oembed.width"}
+
   def from_map(m) do
     %Oembed{
-      description: m["description"],
-      height: m["height"],
-      html: m["html"],
-      provider_name: m["provider_name"],
-      provider_url: m["provider_url"],
-      thumbnail_height: m["thumbnail_height"],
-      thumbnail_url: m["thumbnail_url"],
-      thumbnail_width: m["thumbnail_width"],
-      title: m["title"],
-      type: m["type"],
-      version: m["version"],
-      width: m["width"],
+      description: decode_description(m["description"]),
+      height: decode_height(m["height"]),
+      html: decode_html(m["html"]),
+      provider_name: decode_provider_name(m["provider_name"]),
+      provider_url: decode_provider_url(m["provider_url"]),
+      thumbnail_height: decode_thumbnail_height(m["thumbnail_height"]),
+      thumbnail_url: decode_thumbnail_url(m["thumbnail_url"]),
+      thumbnail_width: decode_thumbnail_width(m["thumbnail_width"]),
+      title: decode_title(m["title"]),
+      type: decode_type(m["type"]),
+      version: decode_version(m["version"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -252,11 +324,29 @@ defmodule Source do
           width: integer()
         }
 
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Source.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Source.height"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Source.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Source.url"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Source.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Source.width"}
+
   def from_map(m) do
     %Source{
-      height: m["height"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -321,9 +411,21 @@ defmodule Image do
           variants: Variants.t()
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Image.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Image.id"}
+
+  def decode_resolutions(value) when is_list(value), do: value
+  def decode_resolutions(_), do: {:error, "Unexpected type when decoding Image.resolutions"}
+
+  def encode_resolutions(value) when is_list(value), do: value
+  def encode_resolutions(_), do: {:error, "Unexpected type when encoding Image.resolutions"}
+
   def from_map(m) do
     %Image{
-      id: m["id"],
+      id: decode_id(m["id"]),
       resolutions: Enum.map(m["resolutions"], &Source.from_map/1),
       source: Source.from_map(m["source"]),
       variants: Variants.from_map(m["variants"]),
@@ -361,9 +463,21 @@ defmodule Preview do
           images: [Image.t()]
         }
 
+  def decode_enabled(value) when is_boolean(value), do: value
+  def decode_enabled(_), do: {:error, "Unexpected type when decoding Preview.enabled"}
+
+  def encode_enabled(value) when is_boolean(value), do: value
+  def encode_enabled(_), do: {:error, "Unexpected type when encoding Preview.enabled"}
+
+  def decode_images(value) when is_list(value), do: value
+  def decode_images(_), do: {:error, "Unexpected type when decoding Preview.images"}
+
+  def encode_images(value) when is_list(value), do: value
+  def encode_images(_), do: {:error, "Unexpected type when encoding Preview.images"}
+
   def from_map(m) do
     %Preview{
-      enabled: m["enabled"],
+      enabled: decode_enabled(m["enabled"]),
       images: Enum.map(m["images"], &Image.from_map/1),
     }
   end
@@ -639,72 +753,346 @@ defmodule ChildData do
           visited: boolean()
         }
 
+  def decode_approved_at_utc(value) when is_nil(value), do: value
+  def decode_approved_at_utc(_), do: {:error, "Unexpected type when decoding ChildData.approved_at_utc"}
+
+  def encode_approved_at_utc(value) when is_nil(value), do: value
+  def encode_approved_at_utc(_), do: {:error, "Unexpected type when encoding ChildData.approved_at_utc"}
+
+  def decode_approved_by(value) when is_nil(value), do: value
+  def decode_approved_by(_), do: {:error, "Unexpected type when decoding ChildData.approved_by"}
+
+  def encode_approved_by(value) when is_nil(value), do: value
+  def encode_approved_by(_), do: {:error, "Unexpected type when encoding ChildData.approved_by"}
+
+  def decode_archived(value) when is_boolean(value), do: value
+  def decode_archived(_), do: {:error, "Unexpected type when decoding ChildData.archived"}
+
+  def encode_archived(value) when is_boolean(value), do: value
+  def encode_archived(_), do: {:error, "Unexpected type when encoding ChildData.archived"}
+
+  def decode_author(value) when is_binary(value), do: value
+  def decode_author(_), do: {:error, "Unexpected type when decoding ChildData.author"}
+
+  def encode_author(value) when is_binary(value), do: value
+  def encode_author(_), do: {:error, "Unexpected type when encoding ChildData.author"}
+
+  def decode_banned_at_utc(value) when is_nil(value), do: value
+  def decode_banned_at_utc(_), do: {:error, "Unexpected type when decoding ChildData.banned_at_utc"}
+
+  def encode_banned_at_utc(value) when is_nil(value), do: value
+  def encode_banned_at_utc(_), do: {:error, "Unexpected type when encoding ChildData.banned_at_utc"}
+
+  def decode_banned_by(value) when is_nil(value), do: value
+  def decode_banned_by(_), do: {:error, "Unexpected type when decoding ChildData.banned_by"}
+
+  def encode_banned_by(value) when is_nil(value), do: value
+  def encode_banned_by(_), do: {:error, "Unexpected type when encoding ChildData.banned_by"}
+
+  def decode_brand_safe(value) when is_boolean(value), do: value
+  def decode_brand_safe(_), do: {:error, "Unexpected type when decoding ChildData.brand_safe"}
+
+  def encode_brand_safe(value) when is_boolean(value), do: value
+  def encode_brand_safe(_), do: {:error, "Unexpected type when encoding ChildData.brand_safe"}
+
+  def decode_can_gild(value) when is_boolean(value), do: value
+  def decode_can_gild(_), do: {:error, "Unexpected type when decoding ChildData.can_gild"}
+
+  def encode_can_gild(value) when is_boolean(value), do: value
+  def encode_can_gild(_), do: {:error, "Unexpected type when encoding ChildData.can_gild"}
+
+  def decode_can_mod_post(value) when is_boolean(value), do: value
+  def decode_can_mod_post(_), do: {:error, "Unexpected type when decoding ChildData.can_mod_post"}
+
+  def encode_can_mod_post(value) when is_boolean(value), do: value
+  def encode_can_mod_post(_), do: {:error, "Unexpected type when encoding ChildData.can_mod_post"}
+
+  def decode_clicked(value) when is_boolean(value), do: value
+  def decode_clicked(_), do: {:error, "Unexpected type when decoding ChildData.clicked"}
+
+  def encode_clicked(value) when is_boolean(value), do: value
+  def encode_clicked(_), do: {:error, "Unexpected type when encoding ChildData.clicked"}
+
+  def decode_contest_mode(value) when is_boolean(value), do: value
+  def decode_contest_mode(_), do: {:error, "Unexpected type when decoding ChildData.contest_mode"}
+
+  def encode_contest_mode(value) when is_boolean(value), do: value
+  def encode_contest_mode(_), do: {:error, "Unexpected type when encoding ChildData.contest_mode"}
+
+  def decode_created(value) when is_float(value), do: value
+  def decode_created(value) when is_integer(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding ChildData.created"}
+
+  def encode_created(value) when is_float(value), do: value
+  def encode_created(value) when is_integer(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding ChildData.created"}
+
+  def decode_created_utc(value) when is_float(value), do: value
+  def decode_created_utc(value) when is_integer(value), do: value
+  def decode_created_utc(_), do: {:error, "Unexpected type when decoding ChildData.created_utc"}
+
+  def encode_created_utc(value) when is_float(value), do: value
+  def encode_created_utc(value) when is_integer(value), do: value
+  def encode_created_utc(_), do: {:error, "Unexpected type when encoding ChildData.created_utc"}
+
+  def decode_downs(value) when is_integer(value), do: value
+  def decode_downs(_), do: {:error, "Unexpected type when decoding ChildData.downs"}
+
+  def encode_downs(value) when is_integer(value), do: value
+  def encode_downs(_), do: {:error, "Unexpected type when encoding ChildData.downs"}
+
+  def decode_edited(value) when is_boolean(value), do: value
+  def decode_edited(_), do: {:error, "Unexpected type when decoding ChildData.edited"}
+
+  def encode_edited(value) when is_boolean(value), do: value
+  def encode_edited(_), do: {:error, "Unexpected type when encoding ChildData.edited"}
+
+  def decode_gilded(value) when is_integer(value), do: value
+  def decode_gilded(_), do: {:error, "Unexpected type when decoding ChildData.gilded"}
+
+  def encode_gilded(value) when is_integer(value), do: value
+  def encode_gilded(_), do: {:error, "Unexpected type when encoding ChildData.gilded"}
+
+  def decode_hidden(value) when is_boolean(value), do: value
+  def decode_hidden(_), do: {:error, "Unexpected type when decoding ChildData.hidden"}
+
+  def encode_hidden(value) when is_boolean(value), do: value
+  def encode_hidden(_), do: {:error, "Unexpected type when encoding ChildData.hidden"}
+
+  def decode_hide_score(value) when is_boolean(value), do: value
+  def decode_hide_score(_), do: {:error, "Unexpected type when decoding ChildData.hide_score"}
+
+  def encode_hide_score(value) when is_boolean(value), do: value
+  def encode_hide_score(_), do: {:error, "Unexpected type when encoding ChildData.hide_score"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding ChildData.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding ChildData.id"}
+
+  def decode_is_self(value) when is_boolean(value), do: value
+  def decode_is_self(_), do: {:error, "Unexpected type when decoding ChildData.is_self"}
+
+  def encode_is_self(value) when is_boolean(value), do: value
+  def encode_is_self(_), do: {:error, "Unexpected type when encoding ChildData.is_self"}
+
+  def decode_is_video(value) when is_boolean(value), do: value
+  def decode_is_video(_), do: {:error, "Unexpected type when decoding ChildData.is_video"}
+
+  def encode_is_video(value) when is_boolean(value), do: value
+  def encode_is_video(_), do: {:error, "Unexpected type when encoding ChildData.is_video"}
+
+  def decode_likes(value) when is_nil(value), do: value
+  def decode_likes(_), do: {:error, "Unexpected type when decoding ChildData.likes"}
+
+  def encode_likes(value) when is_nil(value), do: value
+  def encode_likes(_), do: {:error, "Unexpected type when encoding ChildData.likes"}
+
+  def decode_locked(value) when is_boolean(value), do: value
+  def decode_locked(_), do: {:error, "Unexpected type when decoding ChildData.locked"}
+
+  def encode_locked(value) when is_boolean(value), do: value
+  def encode_locked(_), do: {:error, "Unexpected type when encoding ChildData.locked"}
+
+  def decode_mod_reports(value) when is_list(value), do: value
+  def decode_mod_reports(_), do: {:error, "Unexpected type when decoding ChildData.mod_reports"}
+
+  def encode_mod_reports(value) when is_list(value), do: value
+  def encode_mod_reports(_), do: {:error, "Unexpected type when encoding ChildData.mod_reports"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding ChildData.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding ChildData.name"}
+
+  def decode_num_comments(value) when is_integer(value), do: value
+  def decode_num_comments(_), do: {:error, "Unexpected type when decoding ChildData.num_comments"}
+
+  def encode_num_comments(value) when is_integer(value), do: value
+  def encode_num_comments(_), do: {:error, "Unexpected type when encoding ChildData.num_comments"}
+
+  def decode_num_reports(value) when is_nil(value), do: value
+  def decode_num_reports(_), do: {:error, "Unexpected type when decoding ChildData.num_reports"}
+
+  def encode_num_reports(value) when is_nil(value), do: value
+  def encode_num_reports(_), do: {:error, "Unexpected type when encoding ChildData.num_reports"}
+
+  def decode_over_18(value) when is_boolean(value), do: value
+  def decode_over_18(_), do: {:error, "Unexpected type when decoding ChildData.over_18"}
+
+  def encode_over_18(value) when is_boolean(value), do: value
+  def encode_over_18(_), do: {:error, "Unexpected type when encoding ChildData.over_18"}
+
+  def decode_permalink(value) when is_binary(value), do: value
+  def decode_permalink(_), do: {:error, "Unexpected type when decoding ChildData.permalink"}
+
+  def encode_permalink(value) when is_binary(value), do: value
+  def encode_permalink(_), do: {:error, "Unexpected type when encoding ChildData.permalink"}
+
+  def decode_quarantine(value) when is_boolean(value), do: value
+  def decode_quarantine(_), do: {:error, "Unexpected type when decoding ChildData.quarantine"}
+
+  def encode_quarantine(value) when is_boolean(value), do: value
+  def encode_quarantine(_), do: {:error, "Unexpected type when encoding ChildData.quarantine"}
+
+  def decode_removal_reason(value) when is_nil(value), do: value
+  def decode_removal_reason(_), do: {:error, "Unexpected type when decoding ChildData.removal_reason"}
+
+  def encode_removal_reason(value) when is_nil(value), do: value
+  def encode_removal_reason(_), do: {:error, "Unexpected type when encoding ChildData.removal_reason"}
+
+  def decode_report_reasons(value) when is_nil(value), do: value
+  def decode_report_reasons(_), do: {:error, "Unexpected type when decoding ChildData.report_reasons"}
+
+  def encode_report_reasons(value) when is_nil(value), do: value
+  def encode_report_reasons(_), do: {:error, "Unexpected type when encoding ChildData.report_reasons"}
+
+  def decode_saved(value) when is_boolean(value), do: value
+  def decode_saved(_), do: {:error, "Unexpected type when decoding ChildData.saved"}
+
+  def encode_saved(value) when is_boolean(value), do: value
+  def encode_saved(_), do: {:error, "Unexpected type when encoding ChildData.saved"}
+
+  def decode_score(value) when is_integer(value), do: value
+  def decode_score(_), do: {:error, "Unexpected type when decoding ChildData.score"}
+
+  def encode_score(value) when is_integer(value), do: value
+  def encode_score(_), do: {:error, "Unexpected type when encoding ChildData.score"}
+
+  def decode_selftext(value) when is_binary(value), do: value
+  def decode_selftext(_), do: {:error, "Unexpected type when decoding ChildData.selftext"}
+
+  def encode_selftext(value) when is_binary(value), do: value
+  def encode_selftext(_), do: {:error, "Unexpected type when encoding ChildData.selftext"}
+
+  def decode_spoiler(value) when is_boolean(value), do: value
+  def decode_spoiler(_), do: {:error, "Unexpected type when decoding ChildData.spoiler"}
+
+  def encode_spoiler(value) when is_boolean(value), do: value
+  def encode_spoiler(_), do: {:error, "Unexpected type when encoding ChildData.spoiler"}
+
+  def decode_stickied(value) when is_boolean(value), do: value
+  def decode_stickied(_), do: {:error, "Unexpected type when decoding ChildData.stickied"}
+
+  def encode_stickied(value) when is_boolean(value), do: value
+  def encode_stickied(_), do: {:error, "Unexpected type when encoding ChildData.stickied"}
+
+  def decode_suggested_sort(value) when is_nil(value), do: value
+  def decode_suggested_sort(_), do: {:error, "Unexpected type when decoding ChildData.suggested_sort"}
+
+  def encode_suggested_sort(value) when is_nil(value), do: value
+  def encode_suggested_sort(_), do: {:error, "Unexpected type when encoding ChildData.suggested_sort"}
+
+  def decode_thumbnail(value) when is_binary(value), do: value
+  def decode_thumbnail(_), do: {:error, "Unexpected type when decoding ChildData.thumbnail"}
+
+  def encode_thumbnail(value) when is_binary(value), do: value
+  def encode_thumbnail(_), do: {:error, "Unexpected type when encoding ChildData.thumbnail"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding ChildData.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding ChildData.title"}
+
+  def decode_ups(value) when is_integer(value), do: value
+  def decode_ups(_), do: {:error, "Unexpected type when decoding ChildData.ups"}
+
+  def encode_ups(value) when is_integer(value), do: value
+  def encode_ups(_), do: {:error, "Unexpected type when encoding ChildData.ups"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding ChildData.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding ChildData.url"}
+
+  def decode_user_reports(value) when is_list(value), do: value
+  def decode_user_reports(_), do: {:error, "Unexpected type when decoding ChildData.user_reports"}
+
+  def encode_user_reports(value) when is_list(value), do: value
+  def encode_user_reports(_), do: {:error, "Unexpected type when encoding ChildData.user_reports"}
+
+  def decode_view_count(value) when is_nil(value), do: value
+  def decode_view_count(_), do: {:error, "Unexpected type when decoding ChildData.view_count"}
+
+  def encode_view_count(value) when is_nil(value), do: value
+  def encode_view_count(_), do: {:error, "Unexpected type when encoding ChildData.view_count"}
+
+  def decode_visited(value) when is_boolean(value), do: value
+  def decode_visited(_), do: {:error, "Unexpected type when decoding ChildData.visited"}
+
+  def encode_visited(value) when is_boolean(value), do: value
+  def encode_visited(_), do: {:error, "Unexpected type when encoding ChildData.visited"}
+
   def from_map(m) do
     %ChildData{
-      approved_at_utc: m["approved_at_utc"],
-      approved_by: m["approved_by"],
-      archived: m["archived"],
-      author: m["author"],
+      approved_at_utc: decode_approved_at_utc(m["approved_at_utc"]),
+      approved_by: decode_approved_by(m["approved_by"]),
+      archived: decode_archived(m["archived"]),
+      author: decode_author(m["author"]),
       author_flair_css_class: m["author_flair_css_class"],
       author_flair_text: m["author_flair_text"],
-      banned_at_utc: m["banned_at_utc"],
-      banned_by: m["banned_by"],
-      brand_safe: m["brand_safe"],
-      can_gild: m["can_gild"],
-      can_mod_post: m["can_mod_post"],
-      clicked: m["clicked"],
-      contest_mode: m["contest_mode"],
-      created: m["created"],
-      created_utc: m["created_utc"],
+      banned_at_utc: decode_banned_at_utc(m["banned_at_utc"]),
+      banned_by: decode_banned_by(m["banned_by"]),
+      brand_safe: decode_brand_safe(m["brand_safe"]),
+      can_gild: decode_can_gild(m["can_gild"]),
+      can_mod_post: decode_can_mod_post(m["can_mod_post"]),
+      clicked: decode_clicked(m["clicked"]),
+      contest_mode: decode_contest_mode(m["contest_mode"]),
+      created: decode_created(m["created"]),
+      created_utc: decode_created_utc(m["created_utc"]),
       distinguished: m["distinguished"],
       domain: Domain.decode(m["domain"]),
-      downs: m["downs"],
-      edited: m["edited"],
-      gilded: m["gilded"],
-      hidden: m["hidden"],
-      hide_score: m["hide_score"],
-      id: m["id"],
-      is_self: m["is_self"],
-      is_video: m["is_video"],
-      likes: m["likes"],
+      downs: decode_downs(m["downs"]),
+      edited: decode_edited(m["edited"]),
+      gilded: decode_gilded(m["gilded"]),
+      hidden: decode_hidden(m["hidden"]),
+      hide_score: decode_hide_score(m["hide_score"]),
+      id: decode_id(m["id"]),
+      is_self: decode_is_self(m["is_self"]),
+      is_video: decode_is_video(m["is_video"]),
+      likes: decode_likes(m["likes"]),
       link_flair_css_class: m["link_flair_css_class"],
       link_flair_text: m["link_flair_text"],
-      locked: m["locked"],
+      locked: decode_locked(m["locked"]),
       media: m["media"] && Media.from_map(m["media"]),
       media_embed: MediaEmbed.from_map(m["media_embed"]),
-      mod_reports: m["mod_reports"],
-      name: m["name"],
-      num_comments: m["num_comments"],
-      num_reports: m["num_reports"],
-      over_18: m["over_18"],
-      permalink: m["permalink"],
+      mod_reports: decode_mod_reports(m["mod_reports"]),
+      name: decode_name(m["name"]),
+      num_comments: decode_num_comments(m["num_comments"]),
+      num_reports: decode_num_reports(m["num_reports"]),
+      over_18: decode_over_18(m["over_18"]),
+      permalink: decode_permalink(m["permalink"]),
       post_hint: m["post_hint"] && PostHint.decode(m["post_hint"]),
       preview: m["preview"] && Preview.from_map(m["preview"]),
-      quarantine: m["quarantine"],
-      removal_reason: m["removal_reason"],
-      report_reasons: m["report_reasons"],
-      saved: m["saved"],
-      score: m["score"],
+      quarantine: decode_quarantine(m["quarantine"]),
+      removal_reason: decode_removal_reason(m["removal_reason"]),
+      report_reasons: decode_report_reasons(m["report_reasons"]),
+      saved: decode_saved(m["saved"]),
+      score: decode_score(m["score"]),
       secure_media: m["secure_media"] && Media.from_map(m["secure_media"]),
       secure_media_embed: MediaEmbed.from_map(m["secure_media_embed"]),
-      selftext: m["selftext"],
+      selftext: decode_selftext(m["selftext"]),
       selftext_html: m["selftext_html"],
-      spoiler: m["spoiler"],
-      stickied: m["stickied"],
+      spoiler: decode_spoiler(m["spoiler"]),
+      stickied: decode_stickied(m["stickied"]),
       subreddit: Subreddit.decode(m["subreddit"]),
       subreddit_id: SubredditID.decode(m["subreddit_id"]),
       subreddit_name_prefixed: SubredditNamePrefixed.decode(m["subreddit_name_prefixed"]),
       subreddit_type: SubredditType.decode(m["subreddit_type"]),
-      suggested_sort: m["suggested_sort"],
-      thumbnail: m["thumbnail"],
+      suggested_sort: decode_suggested_sort(m["suggested_sort"]),
+      thumbnail: decode_thumbnail(m["thumbnail"]),
       thumbnail_height: m["thumbnail_height"],
       thumbnail_width: m["thumbnail_width"],
-      title: m["title"],
-      ups: m["ups"],
-      url: m["url"],
-      user_reports: m["user_reports"],
-      view_count: m["view_count"],
-      visited: m["visited"],
+      title: decode_title(m["title"]),
+      ups: decode_ups(m["ups"]),
+      url: decode_url(m["url"]),
+      user_reports: decode_user_reports(m["user_reports"]),
+      view_count: decode_view_count(m["view_count"]),
+      visited: decode_visited(m["visited"]),
     }
   end
 
@@ -882,12 +1270,36 @@ defmodule TopLevelData do
           modhash: String.t()
         }
 
+  def decode_before(value) when is_nil(value), do: value
+  def decode_before(_), do: {:error, "Unexpected type when decoding TopLevelData.before"}
+
+  def encode_before(value) when is_nil(value), do: value
+  def encode_before(_), do: {:error, "Unexpected type when encoding TopLevelData.before"}
+
+  def decode_children(value) when is_list(value), do: value
+  def decode_children(_), do: {:error, "Unexpected type when decoding TopLevelData.children"}
+
+  def encode_children(value) when is_list(value), do: value
+  def encode_children(_), do: {:error, "Unexpected type when encoding TopLevelData.children"}
+
+  def decode_data_after(value) when is_binary(value), do: value
+  def decode_data_after(_), do: {:error, "Unexpected type when decoding TopLevelData.data_after"}
+
+  def encode_data_after(value) when is_binary(value), do: value
+  def encode_data_after(_), do: {:error, "Unexpected type when encoding TopLevelData.data_after"}
+
+  def decode_modhash(value) when is_binary(value), do: value
+  def decode_modhash(_), do: {:error, "Unexpected type when decoding TopLevelData.modhash"}
+
+  def encode_modhash(value) when is_binary(value), do: value
+  def encode_modhash(_), do: {:error, "Unexpected type when encoding TopLevelData.modhash"}
+
   def from_map(m) do
     %TopLevelData{
-      before: m["before"],
+      before: decode_before(m["before"]),
       children: Enum.map(m["children"], &Child.from_map/1),
-      data_after: m["after"],
-      modhash: m["modhash"],
+      data_after: decode_data_after(m["after"]),
+      modhash: decode_modhash(m["modhash"]),
     }
   end
 
@@ -922,10 +1334,16 @@ defmodule TopLevel do
           kind: String.t()
         }
 
+  def decode_kind(value) when is_binary(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding TopLevel.kind"}
+
+  def encode_kind(value) when is_binary(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding TopLevel.kind"}
+
   def from_map(m) do
     %TopLevel{
       data: TopLevelData.from_map(m["data"]),
-      kind: m["kind"],
+      kind: decode_kind(m["kind"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/29f47.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/29f47.json/default/QuickType.ex
index 3a0f4ef..8d48b29 100644
--- a/base/elixir/test/inputs/json/misc/29f47.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/29f47.json/default/QuickType.ex
@@ -181,11 +181,29 @@ defmodule Source do
           width: integer()
         }
 
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Source.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Source.height"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Source.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Source.url"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Source.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Source.width"}
+
   def from_map(m) do
     %Source{
-      height: m["height"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -219,6 +237,12 @@ defmodule GIF do
           source: Source.t()
         }
 
+  def decode_resolutions(value) when is_list(value), do: value
+  def decode_resolutions(_), do: {:error, "Unexpected type when decoding GIF.resolutions"}
+
+  def encode_resolutions(value) when is_list(value), do: value
+  def encode_resolutions(_), do: {:error, "Unexpected type when encoding GIF.resolutions"}
+
   def from_map(m) do
     %GIF{
       resolutions: Enum.map(m["resolutions"], &Source.from_map/1),
@@ -292,9 +316,21 @@ defmodule Image do
           variants: Variants.t()
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Image.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Image.id"}
+
+  def decode_resolutions(value) when is_list(value), do: value
+  def decode_resolutions(_), do: {:error, "Unexpected type when decoding Image.resolutions"}
+
+  def encode_resolutions(value) when is_list(value), do: value
+  def encode_resolutions(_), do: {:error, "Unexpected type when encoding Image.resolutions"}
+
   def from_map(m) do
     %Image{
-      id: m["id"],
+      id: decode_id(m["id"]),
       resolutions: Enum.map(m["resolutions"], &Source.from_map/1),
       source: Source.from_map(m["source"]),
       variants: Variants.from_map(m["variants"]),
@@ -332,9 +368,21 @@ defmodule Preview do
           images: [Image.t()]
         }
 
+  def decode_enabled(value) when is_boolean(value), do: value
+  def decode_enabled(_), do: {:error, "Unexpected type when decoding Preview.enabled"}
+
+  def encode_enabled(value) when is_boolean(value), do: value
+  def encode_enabled(_), do: {:error, "Unexpected type when encoding Preview.enabled"}
+
+  def decode_images(value) when is_list(value), do: value
+  def decode_images(_), do: {:error, "Unexpected type when decoding Preview.images"}
+
+  def encode_images(value) when is_list(value), do: value
+  def encode_images(_), do: {:error, "Unexpected type when encoding Preview.images"}
+
   def from_map(m) do
     %Preview{
-      enabled: m["enabled"],
+      enabled: decode_enabled(m["enabled"]),
       images: Enum.map(m["images"], &Image.from_map/1),
     }
   end
@@ -610,72 +658,370 @@ defmodule ChildData do
           visited: boolean()
         }
 
+  def decode_approved_at_utc(value) when is_nil(value), do: value
+  def decode_approved_at_utc(_), do: {:error, "Unexpected type when decoding ChildData.approved_at_utc"}
+
+  def encode_approved_at_utc(value) when is_nil(value), do: value
+  def encode_approved_at_utc(_), do: {:error, "Unexpected type when encoding ChildData.approved_at_utc"}
+
+  def decode_approved_by(value) when is_nil(value), do: value
+  def decode_approved_by(_), do: {:error, "Unexpected type when decoding ChildData.approved_by"}
+
+  def encode_approved_by(value) when is_nil(value), do: value
+  def encode_approved_by(_), do: {:error, "Unexpected type when encoding ChildData.approved_by"}
+
+  def decode_archived(value) when is_boolean(value), do: value
+  def decode_archived(_), do: {:error, "Unexpected type when decoding ChildData.archived"}
+
+  def encode_archived(value) when is_boolean(value), do: value
+  def encode_archived(_), do: {:error, "Unexpected type when encoding ChildData.archived"}
+
+  def decode_author(value) when is_binary(value), do: value
+  def decode_author(_), do: {:error, "Unexpected type when decoding ChildData.author"}
+
+  def encode_author(value) when is_binary(value), do: value
+  def encode_author(_), do: {:error, "Unexpected type when encoding ChildData.author"}
+
+  def decode_author_flair_css_class(value) when is_nil(value), do: value
+  def decode_author_flair_css_class(_), do: {:error, "Unexpected type when decoding ChildData.author_flair_css_class"}
+
+  def encode_author_flair_css_class(value) when is_nil(value), do: value
+  def encode_author_flair_css_class(_), do: {:error, "Unexpected type when encoding ChildData.author_flair_css_class"}
+
+  def decode_author_flair_text(value) when is_nil(value), do: value
+  def decode_author_flair_text(_), do: {:error, "Unexpected type when decoding ChildData.author_flair_text"}
+
+  def encode_author_flair_text(value) when is_nil(value), do: value
+  def encode_author_flair_text(_), do: {:error, "Unexpected type when encoding ChildData.author_flair_text"}
+
+  def decode_banned_at_utc(value) when is_nil(value), do: value
+  def decode_banned_at_utc(_), do: {:error, "Unexpected type when decoding ChildData.banned_at_utc"}
+
+  def encode_banned_at_utc(value) when is_nil(value), do: value
+  def encode_banned_at_utc(_), do: {:error, "Unexpected type when encoding ChildData.banned_at_utc"}
+
+  def decode_banned_by(value) when is_nil(value), do: value
+  def decode_banned_by(_), do: {:error, "Unexpected type when decoding ChildData.banned_by"}
+
+  def encode_banned_by(value) when is_nil(value), do: value
+  def encode_banned_by(_), do: {:error, "Unexpected type when encoding ChildData.banned_by"}
+
+  def decode_brand_safe(value) when is_boolean(value), do: value
+  def decode_brand_safe(_), do: {:error, "Unexpected type when decoding ChildData.brand_safe"}
+
+  def encode_brand_safe(value) when is_boolean(value), do: value
+  def encode_brand_safe(_), do: {:error, "Unexpected type when encoding ChildData.brand_safe"}
+
+  def decode_can_gild(value) when is_boolean(value), do: value
+  def decode_can_gild(_), do: {:error, "Unexpected type when decoding ChildData.can_gild"}
+
+  def encode_can_gild(value) when is_boolean(value), do: value
+  def encode_can_gild(_), do: {:error, "Unexpected type when encoding ChildData.can_gild"}
+
+  def decode_can_mod_post(value) when is_boolean(value), do: value
+  def decode_can_mod_post(_), do: {:error, "Unexpected type when decoding ChildData.can_mod_post"}
+
+  def encode_can_mod_post(value) when is_boolean(value), do: value
+  def encode_can_mod_post(_), do: {:error, "Unexpected type when encoding ChildData.can_mod_post"}
+
+  def decode_clicked(value) when is_boolean(value), do: value
+  def decode_clicked(_), do: {:error, "Unexpected type when decoding ChildData.clicked"}
+
+  def encode_clicked(value) when is_boolean(value), do: value
+  def encode_clicked(_), do: {:error, "Unexpected type when encoding ChildData.clicked"}
+
+  def decode_contest_mode(value) when is_boolean(value), do: value
+  def decode_contest_mode(_), do: {:error, "Unexpected type when decoding ChildData.contest_mode"}
+
+  def encode_contest_mode(value) when is_boolean(value), do: value
+  def encode_contest_mode(_), do: {:error, "Unexpected type when encoding ChildData.contest_mode"}
+
+  def decode_created(value) when is_float(value), do: value
+  def decode_created(value) when is_integer(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding ChildData.created"}
+
+  def encode_created(value) when is_float(value), do: value
+  def encode_created(value) when is_integer(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding ChildData.created"}
+
+  def decode_created_utc(value) when is_float(value), do: value
+  def decode_created_utc(value) when is_integer(value), do: value
+  def decode_created_utc(_), do: {:error, "Unexpected type when decoding ChildData.created_utc"}
+
+  def encode_created_utc(value) when is_float(value), do: value
+  def encode_created_utc(value) when is_integer(value), do: value
+  def encode_created_utc(_), do: {:error, "Unexpected type when encoding ChildData.created_utc"}
+
+  def decode_downs(value) when is_integer(value), do: value
+  def decode_downs(_), do: {:error, "Unexpected type when decoding ChildData.downs"}
+
+  def encode_downs(value) when is_integer(value), do: value
+  def encode_downs(_), do: {:error, "Unexpected type when encoding ChildData.downs"}
+
+  def decode_gilded(value) when is_integer(value), do: value
+  def decode_gilded(_), do: {:error, "Unexpected type when decoding ChildData.gilded"}
+
+  def encode_gilded(value) when is_integer(value), do: value
+  def encode_gilded(_), do: {:error, "Unexpected type when encoding ChildData.gilded"}
+
+  def decode_hidden(value) when is_boolean(value), do: value
+  def decode_hidden(_), do: {:error, "Unexpected type when decoding ChildData.hidden"}
+
+  def encode_hidden(value) when is_boolean(value), do: value
+  def encode_hidden(_), do: {:error, "Unexpected type when encoding ChildData.hidden"}
+
+  def decode_hide_score(value) when is_boolean(value), do: value
+  def decode_hide_score(_), do: {:error, "Unexpected type when decoding ChildData.hide_score"}
+
+  def encode_hide_score(value) when is_boolean(value), do: value
+  def encode_hide_score(_), do: {:error, "Unexpected type when encoding ChildData.hide_score"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding ChildData.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding ChildData.id"}
+
+  def decode_is_self(value) when is_boolean(value), do: value
+  def decode_is_self(_), do: {:error, "Unexpected type when decoding ChildData.is_self"}
+
+  def encode_is_self(value) when is_boolean(value), do: value
+  def encode_is_self(_), do: {:error, "Unexpected type when encoding ChildData.is_self"}
+
+  def decode_is_video(value) when is_boolean(value), do: value
+  def decode_is_video(_), do: {:error, "Unexpected type when decoding ChildData.is_video"}
+
+  def encode_is_video(value) when is_boolean(value), do: value
+  def encode_is_video(_), do: {:error, "Unexpected type when encoding ChildData.is_video"}
+
+  def decode_likes(value) when is_nil(value), do: value
+  def decode_likes(_), do: {:error, "Unexpected type when decoding ChildData.likes"}
+
+  def encode_likes(value) when is_nil(value), do: value
+  def encode_likes(_), do: {:error, "Unexpected type when encoding ChildData.likes"}
+
+  def decode_link_flair_css_class(value) when is_nil(value), do: value
+  def decode_link_flair_css_class(_), do: {:error, "Unexpected type when decoding ChildData.link_flair_css_class"}
+
+  def encode_link_flair_css_class(value) when is_nil(value), do: value
+  def encode_link_flair_css_class(_), do: {:error, "Unexpected type when encoding ChildData.link_flair_css_class"}
+
+  def decode_link_flair_text(value) when is_nil(value), do: value
+  def decode_link_flair_text(_), do: {:error, "Unexpected type when decoding ChildData.link_flair_text"}
+
+  def encode_link_flair_text(value) when is_nil(value), do: value
+  def encode_link_flair_text(_), do: {:error, "Unexpected type when encoding ChildData.link_flair_text"}
+
+  def decode_locked(value) when is_boolean(value), do: value
+  def decode_locked(_), do: {:error, "Unexpected type when decoding ChildData.locked"}
+
+  def encode_locked(value) when is_boolean(value), do: value
+  def encode_locked(_), do: {:error, "Unexpected type when encoding ChildData.locked"}
+
+  def decode_media(value) when is_nil(value), do: value
+  def decode_media(_), do: {:error, "Unexpected type when decoding ChildData.media"}
+
+  def encode_media(value) when is_nil(value), do: value
+  def encode_media(_), do: {:error, "Unexpected type when encoding ChildData.media"}
+
+  def decode_mod_reports(value) when is_list(value), do: value
+  def decode_mod_reports(_), do: {:error, "Unexpected type when decoding ChildData.mod_reports"}
+
+  def encode_mod_reports(value) when is_list(value), do: value
+  def encode_mod_reports(_), do: {:error, "Unexpected type when encoding ChildData.mod_reports"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding ChildData.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding ChildData.name"}
+
+  def decode_num_comments(value) when is_integer(value), do: value
+  def decode_num_comments(_), do: {:error, "Unexpected type when decoding ChildData.num_comments"}
+
+  def encode_num_comments(value) when is_integer(value), do: value
+  def encode_num_comments(_), do: {:error, "Unexpected type when encoding ChildData.num_comments"}
+
+  def decode_num_reports(value) when is_nil(value), do: value
+  def decode_num_reports(_), do: {:error, "Unexpected type when decoding ChildData.num_reports"}
+
+  def encode_num_reports(value) when is_nil(value), do: value
+  def encode_num_reports(_), do: {:error, "Unexpected type when encoding ChildData.num_reports"}
+
+  def decode_over_18(value) when is_boolean(value), do: value
+  def decode_over_18(_), do: {:error, "Unexpected type when decoding ChildData.over_18"}
+
+  def encode_over_18(value) when is_boolean(value), do: value
+  def encode_over_18(_), do: {:error, "Unexpected type when encoding ChildData.over_18"}
+
+  def decode_permalink(value) when is_binary(value), do: value
+  def decode_permalink(_), do: {:error, "Unexpected type when decoding ChildData.permalink"}
+
+  def encode_permalink(value) when is_binary(value), do: value
+  def encode_permalink(_), do: {:error, "Unexpected type when encoding ChildData.permalink"}
+
+  def decode_quarantine(value) when is_boolean(value), do: value
+  def decode_quarantine(_), do: {:error, "Unexpected type when decoding ChildData.quarantine"}
+
+  def encode_quarantine(value) when is_boolean(value), do: value
+  def encode_quarantine(_), do: {:error, "Unexpected type when encoding ChildData.quarantine"}
+
+  def decode_removal_reason(value) when is_nil(value), do: value
+  def decode_removal_reason(_), do: {:error, "Unexpected type when decoding ChildData.removal_reason"}
+
+  def encode_removal_reason(value) when is_nil(value), do: value
+  def encode_removal_reason(_), do: {:error, "Unexpected type when encoding ChildData.removal_reason"}
+
+  def decode_report_reasons(value) when is_nil(value), do: value
+  def decode_report_reasons(_), do: {:error, "Unexpected type when decoding ChildData.report_reasons"}
+
+  def encode_report_reasons(value) when is_nil(value), do: value
+  def encode_report_reasons(_), do: {:error, "Unexpected type when encoding ChildData.report_reasons"}
+
+  def decode_saved(value) when is_boolean(value), do: value
+  def decode_saved(_), do: {:error, "Unexpected type when decoding ChildData.saved"}
+
+  def encode_saved(value) when is_boolean(value), do: value
+  def encode_saved(_), do: {:error, "Unexpected type when encoding ChildData.saved"}
+
+  def decode_score(value) when is_integer(value), do: value
+  def decode_score(_), do: {:error, "Unexpected type when decoding ChildData.score"}
+
+  def encode_score(value) when is_integer(value), do: value
+  def encode_score(_), do: {:error, "Unexpected type when encoding ChildData.score"}
+
+  def decode_secure_media(value) when is_nil(value), do: value
+  def decode_secure_media(_), do: {:error, "Unexpected type when decoding ChildData.secure_media"}
+
+  def encode_secure_media(value) when is_nil(value), do: value
+  def encode_secure_media(_), do: {:error, "Unexpected type when encoding ChildData.secure_media"}
+
+  def decode_selftext(value) when is_binary(value), do: value
+  def decode_selftext(_), do: {:error, "Unexpected type when decoding ChildData.selftext"}
+
+  def encode_selftext(value) when is_binary(value), do: value
+  def encode_selftext(_), do: {:error, "Unexpected type when encoding ChildData.selftext"}
+
+  def decode_spoiler(value) when is_boolean(value), do: value
+  def decode_spoiler(_), do: {:error, "Unexpected type when decoding ChildData.spoiler"}
+
+  def encode_spoiler(value) when is_boolean(value), do: value
+  def encode_spoiler(_), do: {:error, "Unexpected type when encoding ChildData.spoiler"}
+
+  def decode_stickied(value) when is_boolean(value), do: value
+  def decode_stickied(_), do: {:error, "Unexpected type when decoding ChildData.stickied"}
+
+  def encode_stickied(value) when is_boolean(value), do: value
+  def encode_stickied(_), do: {:error, "Unexpected type when encoding ChildData.stickied"}
+
+  def decode_thumbnail(value) when is_binary(value), do: value
+  def decode_thumbnail(_), do: {:error, "Unexpected type when decoding ChildData.thumbnail"}
+
+  def encode_thumbnail(value) when is_binary(value), do: value
+  def encode_thumbnail(_), do: {:error, "Unexpected type when encoding ChildData.thumbnail"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding ChildData.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding ChildData.title"}
+
+  def decode_ups(value) when is_integer(value), do: value
+  def decode_ups(_), do: {:error, "Unexpected type when decoding ChildData.ups"}
+
+  def encode_ups(value) when is_integer(value), do: value
+  def encode_ups(_), do: {:error, "Unexpected type when encoding ChildData.ups"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding ChildData.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding ChildData.url"}
+
+  def decode_user_reports(value) when is_list(value), do: value
+  def decode_user_reports(_), do: {:error, "Unexpected type when decoding ChildData.user_reports"}
+
+  def encode_user_reports(value) when is_list(value), do: value
+  def encode_user_reports(_), do: {:error, "Unexpected type when encoding ChildData.user_reports"}
+
+  def decode_view_count(value) when is_nil(value), do: value
+  def decode_view_count(_), do: {:error, "Unexpected type when decoding ChildData.view_count"}
+
+  def encode_view_count(value) when is_nil(value), do: value
+  def encode_view_count(_), do: {:error, "Unexpected type when encoding ChildData.view_count"}
+
+  def decode_visited(value) when is_boolean(value), do: value
+  def decode_visited(_), do: {:error, "Unexpected type when decoding ChildData.visited"}
+
+  def encode_visited(value) when is_boolean(value), do: value
+  def encode_visited(_), do: {:error, "Unexpected type when encoding ChildData.visited"}
+
   def from_map(m) do
     %ChildData{
-      approved_at_utc: m["approved_at_utc"],
-      approved_by: m["approved_by"],
-      archived: m["archived"],
-      author: m["author"],
-      author_flair_css_class: m["author_flair_css_class"],
-      author_flair_text: m["author_flair_text"],
-      banned_at_utc: m["banned_at_utc"],
-      banned_by: m["banned_by"],
-      brand_safe: m["brand_safe"],
-      can_gild: m["can_gild"],
-      can_mod_post: m["can_mod_post"],
-      clicked: m["clicked"],
-      contest_mode: m["contest_mode"],
-      created: m["created"],
-      created_utc: m["created_utc"],
+      approved_at_utc: decode_approved_at_utc(m["approved_at_utc"]),
+      approved_by: decode_approved_by(m["approved_by"]),
+      archived: decode_archived(m["archived"]),
+      author: decode_author(m["author"]),
+      author_flair_css_class: decode_author_flair_css_class(m["author_flair_css_class"]),
+      author_flair_text: decode_author_flair_text(m["author_flair_text"]),
+      banned_at_utc: decode_banned_at_utc(m["banned_at_utc"]),
+      banned_by: decode_banned_by(m["banned_by"]),
+      brand_safe: decode_brand_safe(m["brand_safe"]),
+      can_gild: decode_can_gild(m["can_gild"]),
+      can_mod_post: decode_can_mod_post(m["can_mod_post"]),
+      clicked: decode_clicked(m["clicked"]),
+      contest_mode: decode_contest_mode(m["contest_mode"]),
+      created: decode_created(m["created"]),
+      created_utc: decode_created_utc(m["created_utc"]),
       distinguished: Distinguished.decode(m["distinguished"]),
       domain: Domain.decode(m["domain"]),
-      downs: m["downs"],
+      downs: decode_downs(m["downs"]),
       edited: m["edited"],
-      gilded: m["gilded"],
-      hidden: m["hidden"],
-      hide_score: m["hide_score"],
-      id: m["id"],
-      is_self: m["is_self"],
-      is_video: m["is_video"],
-      likes: m["likes"],
-      link_flair_css_class: m["link_flair_css_class"],
-      link_flair_text: m["link_flair_text"],
-      locked: m["locked"],
-      media: m["media"],
+      gilded: decode_gilded(m["gilded"]),
+      hidden: decode_hidden(m["hidden"]),
+      hide_score: decode_hide_score(m["hide_score"]),
+      id: decode_id(m["id"]),
+      is_self: decode_is_self(m["is_self"]),
+      is_video: decode_is_video(m["is_video"]),
+      likes: decode_likes(m["likes"]),
+      link_flair_css_class: decode_link_flair_css_class(m["link_flair_css_class"]),
+      link_flair_text: decode_link_flair_text(m["link_flair_text"]),
+      locked: decode_locked(m["locked"]),
+      media: decode_media(m["media"]),
       media_embed: MediaEmbed.from_map(m["media_embed"]),
-      mod_reports: m["mod_reports"],
-      name: m["name"],
-      num_comments: m["num_comments"],
-      num_reports: m["num_reports"],
-      over_18: m["over_18"],
-      permalink: m["permalink"],
+      mod_reports: decode_mod_reports(m["mod_reports"]),
+      name: decode_name(m["name"]),
+      num_comments: decode_num_comments(m["num_comments"]),
+      num_reports: decode_num_reports(m["num_reports"]),
+      over_18: decode_over_18(m["over_18"]),
+      permalink: decode_permalink(m["permalink"]),
       post_hint: m["post_hint"] && PostHint.decode(m["post_hint"]),
       preview: m["preview"] && Preview.from_map(m["preview"]),
-      quarantine: m["quarantine"],
-      removal_reason: m["removal_reason"],
-      report_reasons: m["report_reasons"],
-      saved: m["saved"],
-      score: m["score"],
-      secure_media: m["secure_media"],
+      quarantine: decode_quarantine(m["quarantine"]),
+      removal_reason: decode_removal_reason(m["removal_reason"]),
+      report_reasons: decode_report_reasons(m["report_reasons"]),
+      saved: decode_saved(m["saved"]),
+      score: decode_score(m["score"]),
+      secure_media: decode_secure_media(m["secure_media"]),
       secure_media_embed: MediaEmbed.from_map(m["secure_media_embed"]),
-      selftext: m["selftext"],
+      selftext: decode_selftext(m["selftext"]),
       selftext_html: m["selftext_html"],
-      spoiler: m["spoiler"],
-      stickied: m["stickied"],
+      spoiler: decode_spoiler(m["spoiler"]),
+      stickied: decode_stickied(m["stickied"]),
       subreddit: Subreddit.decode(m["subreddit"]),
       subreddit_id: SubredditID.decode(m["subreddit_id"]),
       subreddit_name_prefixed: SubredditNamePrefixed.decode(m["subreddit_name_prefixed"]),
       subreddit_type: SubredditType.decode(m["subreddit_type"]),
       suggested_sort: m["suggested_sort"],
-      thumbnail: m["thumbnail"],
+      thumbnail: decode_thumbnail(m["thumbnail"]),
       thumbnail_height: m["thumbnail_height"],
       thumbnail_width: m["thumbnail_width"],
-      title: m["title"],
-      ups: m["ups"],
-      url: m["url"],
-      user_reports: m["user_reports"],
-      view_count: m["view_count"],
-      visited: m["visited"],
+      title: decode_title(m["title"]),
+      ups: decode_ups(m["ups"]),
+      url: decode_url(m["url"]),
+      user_reports: decode_user_reports(m["user_reports"]),
+      view_count: decode_view_count(m["view_count"]),
+      visited: decode_visited(m["visited"]),
     }
   end
 
@@ -853,12 +1199,36 @@ defmodule TopLevelData do
           modhash: String.t()
         }
 
+  def decode_before(value) when is_nil(value), do: value
+  def decode_before(_), do: {:error, "Unexpected type when decoding TopLevelData.before"}
+
+  def encode_before(value) when is_nil(value), do: value
+  def encode_before(_), do: {:error, "Unexpected type when encoding TopLevelData.before"}
+
+  def decode_children(value) when is_list(value), do: value
+  def decode_children(_), do: {:error, "Unexpected type when decoding TopLevelData.children"}
+
+  def encode_children(value) when is_list(value), do: value
+  def encode_children(_), do: {:error, "Unexpected type when encoding TopLevelData.children"}
+
+  def decode_data_after(value) when is_binary(value), do: value
+  def decode_data_after(_), do: {:error, "Unexpected type when decoding TopLevelData.data_after"}
+
+  def encode_data_after(value) when is_binary(value), do: value
+  def encode_data_after(_), do: {:error, "Unexpected type when encoding TopLevelData.data_after"}
+
+  def decode_modhash(value) when is_binary(value), do: value
+  def decode_modhash(_), do: {:error, "Unexpected type when decoding TopLevelData.modhash"}
+
+  def encode_modhash(value) when is_binary(value), do: value
+  def encode_modhash(_), do: {:error, "Unexpected type when encoding TopLevelData.modhash"}
+
   def from_map(m) do
     %TopLevelData{
-      before: m["before"],
+      before: decode_before(m["before"]),
       children: Enum.map(m["children"], &Child.from_map/1),
-      data_after: m["after"],
-      modhash: m["modhash"],
+      data_after: decode_data_after(m["after"]),
+      modhash: decode_modhash(m["modhash"]),
     }
   end
 
@@ -893,10 +1263,16 @@ defmodule TopLevel do
           kind: String.t()
         }
 
+  def decode_kind(value) when is_binary(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding TopLevel.kind"}
+
+  def encode_kind(value) when is_binary(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding TopLevel.kind"}
+
   def from_map(m) do
     %TopLevel{
       data: TopLevelData.from_map(m["data"]),
-      kind: m["kind"],
+      kind: decode_kind(m["kind"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/2d4e2.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/2d4e2.json/default/QuickType.ex
index 95c591a..ccf2eb6 100644
--- a/base/elixir/test/inputs/json/misc/2d4e2.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/2d4e2.json/default/QuickType.ex
@@ -15,11 +15,29 @@ defmodule Meta do
           total_count: integer()
         }
 
+  def decode_limit(value) when is_integer(value), do: value
+  def decode_limit(_), do: {:error, "Unexpected type when decoding Meta.limit"}
+
+  def encode_limit(value) when is_integer(value), do: value
+  def encode_limit(_), do: {:error, "Unexpected type when encoding Meta.limit"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding Meta.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding Meta.offset"}
+
+  def decode_total_count(value) when is_integer(value), do: value
+  def decode_total_count(_), do: {:error, "Unexpected type when decoding Meta.total_count"}
+
+  def encode_total_count(value) when is_integer(value), do: value
+  def encode_total_count(_), do: {:error, "Unexpected type when encoding Meta.total_count"}
+
   def from_map(m) do
     %Meta{
-      limit: m["limit"],
-      offset: m["offset"],
-      total_count: m["total_count"],
+      limit: decode_limit(m["limit"]),
+      offset: decode_offset(m["offset"]),
+      total_count: decode_total_count(m["total_count"]),
     }
   end
 
@@ -103,12 +121,30 @@ defmodule Extra do
           rss_url: String.t() | nil
         }
 
+  def decode_address(value) when is_binary(value), do: value
+  def decode_address(_), do: {:error, "Unexpected type when decoding Extra.address"}
+
+  def encode_address(value) when is_binary(value), do: value
+  def encode_address(_), do: {:error, "Unexpected type when encoding Extra.address"}
+
+  def decode_contact_form(value) when is_binary(value), do: value
+  def decode_contact_form(_), do: {:error, "Unexpected type when decoding Extra.contact_form"}
+
+  def encode_contact_form(value) when is_binary(value), do: value
+  def encode_contact_form(_), do: {:error, "Unexpected type when encoding Extra.contact_form"}
+
+  def decode_office(value) when is_binary(value), do: value
+  def decode_office(_), do: {:error, "Unexpected type when decoding Extra.office"}
+
+  def encode_office(value) when is_binary(value), do: value
+  def encode_office(_), do: {:error, "Unexpected type when encoding Extra.office"}
+
   def from_map(m) do
     %Extra{
-      address: m["address"],
-      contact_form: m["contact_form"],
+      address: decode_address(m["address"]),
+      contact_form: decode_contact_form(m["contact_form"]),
       fax: m["fax"],
-      office: m["office"],
+      office: decode_office(m["office"]),
       rss_url: m["rss_url"],
     }
   end
@@ -300,24 +336,102 @@ defmodule Person do
           youtubeid: nil | String.t()
         }
 
+  def decode_bioguideid(value) when is_binary(value), do: value
+  def decode_bioguideid(_), do: {:error, "Unexpected type when decoding Person.bioguideid"}
+
+  def encode_bioguideid(value) when is_binary(value), do: value
+  def encode_bioguideid(_), do: {:error, "Unexpected type when encoding Person.bioguideid"}
+
+  def decode_birthday(value) when is_binary(value), do: value
+  def decode_birthday(_), do: {:error, "Unexpected type when decoding Person.birthday"}
+
+  def encode_birthday(value) when is_binary(value), do: value
+  def encode_birthday(_), do: {:error, "Unexpected type when encoding Person.birthday"}
+
+  def decode_cspanid(value) when is_integer(value), do: value
+  def decode_cspanid(_), do: {:error, "Unexpected type when decoding Person.cspanid"}
+
+  def encode_cspanid(value) when is_integer(value), do: value
+  def encode_cspanid(_), do: {:error, "Unexpected type when encoding Person.cspanid"}
+
+  def decode_firstname(value) when is_binary(value), do: value
+  def decode_firstname(_), do: {:error, "Unexpected type when decoding Person.firstname"}
+
+  def encode_firstname(value) when is_binary(value), do: value
+  def encode_firstname(_), do: {:error, "Unexpected type when encoding Person.firstname"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Person.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Person.id"}
+
+  def decode_lastname(value) when is_binary(value), do: value
+  def decode_lastname(_), do: {:error, "Unexpected type when decoding Person.lastname"}
+
+  def encode_lastname(value) when is_binary(value), do: value
+  def encode_lastname(_), do: {:error, "Unexpected type when encoding Person.lastname"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Person.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Person.link"}
+
+  def decode_middlename(value) when is_binary(value), do: value
+  def decode_middlename(_), do: {:error, "Unexpected type when decoding Person.middlename"}
+
+  def encode_middlename(value) when is_binary(value), do: value
+  def encode_middlename(_), do: {:error, "Unexpected type when encoding Person.middlename"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Person.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Person.name"}
+
+  def decode_nickname(value) when is_binary(value), do: value
+  def decode_nickname(_), do: {:error, "Unexpected type when decoding Person.nickname"}
+
+  def encode_nickname(value) when is_binary(value), do: value
+  def encode_nickname(_), do: {:error, "Unexpected type when encoding Person.nickname"}
+
+  def decode_osid(value) when is_binary(value), do: value
+  def decode_osid(_), do: {:error, "Unexpected type when decoding Person.osid"}
+
+  def encode_osid(value) when is_binary(value), do: value
+  def encode_osid(_), do: {:error, "Unexpected type when encoding Person.osid"}
+
+  def decode_pvsid(value) when is_binary(value), do: value
+  def decode_pvsid(_), do: {:error, "Unexpected type when decoding Person.pvsid"}
+
+  def encode_pvsid(value) when is_binary(value), do: value
+  def encode_pvsid(_), do: {:error, "Unexpected type when encoding Person.pvsid"}
+
+  def decode_sortname(value) when is_binary(value), do: value
+  def decode_sortname(_), do: {:error, "Unexpected type when decoding Person.sortname"}
+
+  def encode_sortname(value) when is_binary(value), do: value
+  def encode_sortname(_), do: {:error, "Unexpected type when encoding Person.sortname"}
+
   def from_map(m) do
     %Person{
-      bioguideid: m["bioguideid"],
-      birthday: m["birthday"],
-      cspanid: m["cspanid"],
-      firstname: m["firstname"],
+      bioguideid: decode_bioguideid(m["bioguideid"]),
+      birthday: decode_birthday(m["birthday"]),
+      cspanid: decode_cspanid(m["cspanid"]),
+      firstname: decode_firstname(m["firstname"]),
       gender: Gender.decode(m["gender"]),
       gender_label: GenderLabel.decode(m["gender_label"]),
-      id: m["id"],
-      lastname: m["lastname"],
-      link: m["link"],
-      middlename: m["middlename"],
-      name: m["name"],
+      id: decode_id(m["id"]),
+      lastname: decode_lastname(m["lastname"]),
+      link: decode_link(m["link"]),
+      middlename: decode_middlename(m["middlename"]),
+      name: decode_name(m["name"]),
       namemod: Namemod.decode(m["namemod"]),
-      nickname: m["nickname"],
-      osid: m["osid"],
-      pvsid: m["pvsid"],
-      sortname: m["sortname"],
+      nickname: decode_nickname(m["nickname"]),
+      osid: decode_osid(m["osid"]),
+      pvsid: decode_pvsid(m["pvsid"]),
+      sortname: decode_sortname(m["sortname"]),
       twitterid: m["twitterid"],
       youtubeid: m["youtubeid"],
     }
@@ -710,31 +824,91 @@ defmodule Object do
           website: String.t()
         }
 
+  def decode_congress_numbers(value) when is_list(value), do: value
+  def decode_congress_numbers(_), do: {:error, "Unexpected type when decoding Object.congress_numbers"}
+
+  def encode_congress_numbers(value) when is_list(value), do: value
+  def encode_congress_numbers(_), do: {:error, "Unexpected type when encoding Object.congress_numbers"}
+
+  def decode_current(value) when is_boolean(value), do: value
+  def decode_current(_), do: {:error, "Unexpected type when decoding Object.current"}
+
+  def encode_current(value) when is_boolean(value), do: value
+  def encode_current(_), do: {:error, "Unexpected type when encoding Object.current"}
+
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Object.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Object.description"}
+
+  def decode_district(value) when is_nil(value), do: value
+  def decode_district(_), do: {:error, "Unexpected type when decoding Object.district"}
+
+  def encode_district(value) when is_nil(value), do: value
+  def encode_district(_), do: {:error, "Unexpected type when encoding Object.district"}
+
+  def decode_enddate(value) when is_binary(value), do: value
+  def decode_enddate(_), do: {:error, "Unexpected type when decoding Object.enddate"}
+
+  def encode_enddate(value) when is_binary(value), do: value
+  def encode_enddate(_), do: {:error, "Unexpected type when encoding Object.enddate"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Object.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Object.id"}
+
+  def decode_phone(value) when is_binary(value), do: value
+  def decode_phone(_), do: {:error, "Unexpected type when decoding Object.phone"}
+
+  def encode_phone(value) when is_binary(value), do: value
+  def encode_phone(_), do: {:error, "Unexpected type when encoding Object.phone"}
+
+  def decode_startdate(value) when is_binary(value), do: value
+  def decode_startdate(_), do: {:error, "Unexpected type when decoding Object.startdate"}
+
+  def encode_startdate(value) when is_binary(value), do: value
+  def encode_startdate(_), do: {:error, "Unexpected type when encoding Object.startdate"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding Object.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding Object.state"}
+
+  def decode_website(value) when is_binary(value), do: value
+  def decode_website(_), do: {:error, "Unexpected type when decoding Object.website"}
+
+  def encode_website(value) when is_binary(value), do: value
+  def encode_website(_), do: {:error, "Unexpected type when encoding Object.website"}
+
   def from_map(m) do
     %Object{
       caucus: m["caucus"] && Party.decode(m["caucus"]),
-      congress_numbers: m["congress_numbers"],
-      current: m["current"],
-      description: m["description"],
-      district: m["district"],
-      enddate: m["enddate"],
+      congress_numbers: decode_congress_numbers(m["congress_numbers"]),
+      current: decode_current(m["current"]),
+      description: decode_description(m["description"]),
+      district: decode_district(m["district"]),
+      enddate: decode_enddate(m["enddate"]),
       extra: Extra.from_map(m["extra"]),
-      id: m["id"],
+      id: decode_id(m["id"]),
       leadership_title: m["leadership_title"],
       party: Party.decode(m["party"]),
       person: Person.from_map(m["person"]),
-      phone: m["phone"],
+      phone: decode_phone(m["phone"]),
       role_type: RoleType.decode(m["role_type"]),
       role_type_label: RoleTypeLabel.decode(m["role_type_label"]),
       senator_class: SenatorClass.decode(m["senator_class"]),
       senator_class_label: SenatorClassLabel.decode(m["senator_class_label"]),
       senator_rank: SenatorRank.decode(m["senator_rank"]),
       senator_rank_label: SenatorRankLabel.decode(m["senator_rank_label"]),
-      startdate: m["startdate"],
-      state: m["state"],
+      startdate: decode_startdate(m["startdate"]),
+      state: decode_state(m["state"]),
       title: Title.decode(m["title"]),
       title_long: RoleTypeLabel.decode(m["title_long"]),
-      website: m["website"],
+      website: decode_website(m["website"]),
     }
   end
 
@@ -788,6 +962,12 @@ defmodule TopLevel do
           objects: [Object.t()]
         }
 
+  def decode_objects(value) when is_list(value), do: value
+  def decode_objects(_), do: {:error, "Unexpected type when decoding TopLevel.objects"}
+
+  def encode_objects(value) when is_list(value), do: value
+  def encode_objects(_), do: {:error, "Unexpected type when encoding TopLevel.objects"}
+
   def from_map(m) do
     %TopLevel{
       meta: Meta.from_map(m["meta"]),
diff --git a/base/elixir/test/inputs/json/misc/2df80.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/2df80.json/default/QuickType.ex
index 25ba10e..f84b4c0 100644
--- a/base/elixir/test/inputs/json/misc/2df80.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/2df80.json/default/QuickType.ex
@@ -190,17 +190,53 @@ defmodule TopLevel1 do
           region: Adminregion.t()
         }
 
+  def decode_capital_city(value) when is_binary(value), do: value
+  def decode_capital_city(_), do: {:error, "Unexpected type when decoding TopLevel1.capital_city"}
+
+  def encode_capital_city(value) when is_binary(value), do: value
+  def encode_capital_city(_), do: {:error, "Unexpected type when encoding TopLevel1.capital_city"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevel1.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevel1.id"}
+
+  def decode_iso2_code(value) when is_binary(value), do: value
+  def decode_iso2_code(_), do: {:error, "Unexpected type when decoding TopLevel1.iso2_code"}
+
+  def encode_iso2_code(value) when is_binary(value), do: value
+  def encode_iso2_code(_), do: {:error, "Unexpected type when encoding TopLevel1.iso2_code"}
+
+  def decode_latitude(value) when is_binary(value), do: value
+  def decode_latitude(_), do: {:error, "Unexpected type when decoding TopLevel1.latitude"}
+
+  def encode_latitude(value) when is_binary(value), do: value
+  def encode_latitude(_), do: {:error, "Unexpected type when encoding TopLevel1.latitude"}
+
+  def decode_longitude(value) when is_binary(value), do: value
+  def decode_longitude(_), do: {:error, "Unexpected type when decoding TopLevel1.longitude"}
+
+  def encode_longitude(value) when is_binary(value), do: value
+  def encode_longitude(_), do: {:error, "Unexpected type when encoding TopLevel1.longitude"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel1.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel1.name"}
+
   def from_map(m) do
     %TopLevel1{
       adminregion: Adminregion.from_map(m["adminregion"]),
-      capital_city: m["capitalCity"],
-      id: m["id"],
+      capital_city: decode_capital_city(m["capitalCity"]),
+      id: decode_id(m["id"]),
       income_level: Adminregion.from_map(m["incomeLevel"]),
-      iso2_code: m["iso2Code"],
-      latitude: m["latitude"],
+      iso2_code: decode_iso2_code(m["iso2Code"]),
+      latitude: decode_latitude(m["latitude"]),
       lending_type: Adminregion.from_map(m["lendingType"]),
-      longitude: m["longitude"],
-      name: m["name"],
+      longitude: decode_longitude(m["longitude"]),
+      name: decode_name(m["name"]),
       region: Adminregion.from_map(m["region"]),
     }
   end
@@ -244,12 +280,36 @@ defmodule TopLevel2 do
           total: integer()
         }
 
+  def decode_page(value) when is_integer(value), do: value
+  def decode_page(_), do: {:error, "Unexpected type when decoding TopLevel2.page"}
+
+  def encode_page(value) when is_integer(value), do: value
+  def encode_page(_), do: {:error, "Unexpected type when encoding TopLevel2.page"}
+
+  def decode_pages(value) when is_integer(value), do: value
+  def decode_pages(_), do: {:error, "Unexpected type when decoding TopLevel2.pages"}
+
+  def encode_pages(value) when is_integer(value), do: value
+  def encode_pages(_), do: {:error, "Unexpected type when encoding TopLevel2.pages"}
+
+  def decode_per_page(value) when is_binary(value), do: value
+  def decode_per_page(_), do: {:error, "Unexpected type when decoding TopLevel2.per_page"}
+
+  def encode_per_page(value) when is_binary(value), do: value
+  def encode_per_page(_), do: {:error, "Unexpected type when encoding TopLevel2.per_page"}
+
+  def decode_total(value) when is_integer(value), do: value
+  def decode_total(_), do: {:error, "Unexpected type when decoding TopLevel2.total"}
+
+  def encode_total(value) when is_integer(value), do: value
+  def encode_total(_), do: {:error, "Unexpected type when encoding TopLevel2.total"}
+
   def from_map(m) do
     %TopLevel2{
-      page: m["page"],
-      pages: m["pages"],
-      per_page: m["per_page"],
-      total: m["total"],
+      page: decode_page(m["page"]),
+      pages: decode_pages(m["pages"]),
+      per_page: decode_per_page(m["per_page"]),
+      total: decode_total(m["total"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/31189.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/31189.json/default/QuickType.ex
index 00bdad9..cadf6d3 100644
--- a/base/elixir/test/inputs/json/misc/31189.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/31189.json/default/QuickType.ex
@@ -18,13 +18,21 @@ defmodule Rates do
           super_reduced: float() | nil
         }
 
+  def decode_standard(value) when is_float(value), do: value
+  def decode_standard(value) when is_integer(value), do: value
+  def decode_standard(_), do: {:error, "Unexpected type when decoding Rates.standard"}
+
+  def encode_standard(value) when is_float(value), do: value
+  def encode_standard(value) when is_integer(value), do: value
+  def encode_standard(_), do: {:error, "Unexpected type when encoding Rates.standard"}
+
   def from_map(m) do
     %Rates{
       parking: m["parking"],
       reduced: m["reduced"],
       reduced1: m["reduced1"],
       reduced2: m["reduced2"],
-      standard: m["standard"],
+      standard: decode_standard(m["standard"]),
       super_reduced: m["super_reduced"],
     }
   end
@@ -62,9 +70,15 @@ defmodule Period do
           rates: Rates.t()
         }
 
+  def decode_effective_from(value) when is_binary(value), do: value
+  def decode_effective_from(_), do: {:error, "Unexpected type when decoding Period.effective_from"}
+
+  def encode_effective_from(value) when is_binary(value), do: value
+  def encode_effective_from(_), do: {:error, "Unexpected type when encoding Period.effective_from"}
+
   def from_map(m) do
     %Period{
-      effective_from: m["effective_from"],
+      effective_from: decode_effective_from(m["effective_from"]),
       rates: Rates.from_map(m["rates"]),
     }
   end
@@ -100,11 +114,35 @@ defmodule Rate do
           periods: [Period.t()]
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Rate.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Rate.code"}
+
+  def decode_country_code(value) when is_binary(value), do: value
+  def decode_country_code(_), do: {:error, "Unexpected type when decoding Rate.country_code"}
+
+  def encode_country_code(value) when is_binary(value), do: value
+  def encode_country_code(_), do: {:error, "Unexpected type when encoding Rate.country_code"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Rate.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Rate.name"}
+
+  def decode_periods(value) when is_list(value), do: value
+  def decode_periods(_), do: {:error, "Unexpected type when decoding Rate.periods"}
+
+  def encode_periods(value) when is_list(value), do: value
+  def encode_periods(_), do: {:error, "Unexpected type when encoding Rate.periods"}
+
   def from_map(m) do
     %Rate{
-      code: m["code"],
-      country_code: m["country_code"],
-      name: m["name"],
+      code: decode_code(m["code"]),
+      country_code: decode_country_code(m["country_code"]),
+      name: decode_name(m["name"]),
       periods: Enum.map(m["periods"], &Period.from_map/1),
     }
   end
@@ -141,11 +179,29 @@ defmodule TopLevel do
           version: nil
         }
 
+  def decode_details(value) when is_binary(value), do: value
+  def decode_details(_), do: {:error, "Unexpected type when decoding TopLevel.details"}
+
+  def encode_details(value) when is_binary(value), do: value
+  def encode_details(_), do: {:error, "Unexpected type when encoding TopLevel.details"}
+
+  def decode_rates(value) when is_list(value), do: value
+  def decode_rates(_), do: {:error, "Unexpected type when decoding TopLevel.rates"}
+
+  def encode_rates(value) when is_list(value), do: value
+  def encode_rates(_), do: {:error, "Unexpected type when encoding TopLevel.rates"}
+
+  def decode_version(value) when is_nil(value), do: value
+  def decode_version(_), do: {:error, "Unexpected type when decoding TopLevel.version"}
+
+  def encode_version(value) when is_nil(value), do: value
+  def encode_version(_), do: {:error, "Unexpected type when encoding TopLevel.version"}
+
   def from_map(m) do
     %TopLevel{
-      details: m["details"],
+      details: decode_details(m["details"]),
       rates: Enum.map(m["rates"], &Rate.from_map/1),
-      version: m["version"],
+      version: decode_version(m["version"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/32431.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/32431.json/default/QuickType.ex
index baa9de1..605caf4 100644
--- a/base/elixir/test/inputs/json/misc/32431.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/32431.json/default/QuickType.ex
@@ -59,9 +59,15 @@ defmodule Geometry do
           type: GeometryType.t()
         }
 
+  def decode_coordinates(value) when is_list(value), do: value
+  def decode_coordinates(_), do: {:error, "Unexpected type when decoding Geometry.coordinates"}
+
+  def encode_coordinates(value) when is_list(value), do: value
+  def encode_coordinates(_), do: {:error, "Unexpected type when encoding Geometry.coordinates"}
+
   def from_map(m) do
     %Geometry{
-      coordinates: m["coordinates"],
+      coordinates: decode_coordinates(m["coordinates"]),
       type: GeometryType.decode(m["type"]),
     }
   end
@@ -257,34 +263,158 @@ defmodule Properties do
           url: String.t()
         }
 
+  def decode_alert(value) when is_nil(value), do: value
+  def decode_alert(_), do: {:error, "Unexpected type when decoding Properties.alert"}
+
+  def encode_alert(value) when is_nil(value), do: value
+  def encode_alert(_), do: {:error, "Unexpected type when encoding Properties.alert"}
+
+  def decode_cdi(value) when is_nil(value), do: value
+  def decode_cdi(_), do: {:error, "Unexpected type when decoding Properties.cdi"}
+
+  def encode_cdi(value) when is_nil(value), do: value
+  def encode_cdi(_), do: {:error, "Unexpected type when encoding Properties.cdi"}
+
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Properties.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Properties.code"}
+
+  def decode_detail(value) when is_binary(value), do: value
+  def decode_detail(_), do: {:error, "Unexpected type when decoding Properties.detail"}
+
+  def encode_detail(value) when is_binary(value), do: value
+  def encode_detail(_), do: {:error, "Unexpected type when encoding Properties.detail"}
+
+  def decode_felt(value) when is_nil(value), do: value
+  def decode_felt(_), do: {:error, "Unexpected type when decoding Properties.felt"}
+
+  def encode_felt(value) when is_nil(value), do: value
+  def encode_felt(_), do: {:error, "Unexpected type when encoding Properties.felt"}
+
+  def decode_ids(value) when is_binary(value), do: value
+  def decode_ids(_), do: {:error, "Unexpected type when decoding Properties.ids"}
+
+  def encode_ids(value) when is_binary(value), do: value
+  def encode_ids(_), do: {:error, "Unexpected type when encoding Properties.ids"}
+
+  def decode_mag(value) when is_float(value), do: value
+  def decode_mag(value) when is_integer(value), do: value
+  def decode_mag(_), do: {:error, "Unexpected type when decoding Properties.mag"}
+
+  def encode_mag(value) when is_float(value), do: value
+  def encode_mag(value) when is_integer(value), do: value
+  def encode_mag(_), do: {:error, "Unexpected type when encoding Properties.mag"}
+
+  def decode_mmi(value) when is_nil(value), do: value
+  def decode_mmi(_), do: {:error, "Unexpected type when decoding Properties.mmi"}
+
+  def encode_mmi(value) when is_nil(value), do: value
+  def encode_mmi(_), do: {:error, "Unexpected type when encoding Properties.mmi"}
+
+  def decode_net(value) when is_binary(value), do: value
+  def decode_net(_), do: {:error, "Unexpected type when decoding Properties.net"}
+
+  def encode_net(value) when is_binary(value), do: value
+  def encode_net(_), do: {:error, "Unexpected type when encoding Properties.net"}
+
+  def decode_place(value) when is_binary(value), do: value
+  def decode_place(_), do: {:error, "Unexpected type when decoding Properties.place"}
+
+  def encode_place(value) when is_binary(value), do: value
+  def encode_place(_), do: {:error, "Unexpected type when encoding Properties.place"}
+
+  def decode_rms(value) when is_float(value), do: value
+  def decode_rms(value) when is_integer(value), do: value
+  def decode_rms(_), do: {:error, "Unexpected type when decoding Properties.rms"}
+
+  def encode_rms(value) when is_float(value), do: value
+  def encode_rms(value) when is_integer(value), do: value
+  def encode_rms(_), do: {:error, "Unexpected type when encoding Properties.rms"}
+
+  def decode_sig(value) when is_integer(value), do: value
+  def decode_sig(_), do: {:error, "Unexpected type when decoding Properties.sig"}
+
+  def encode_sig(value) when is_integer(value), do: value
+  def encode_sig(_), do: {:error, "Unexpected type when encoding Properties.sig"}
+
+  def decode_sources(value) when is_binary(value), do: value
+  def decode_sources(_), do: {:error, "Unexpected type when decoding Properties.sources"}
+
+  def encode_sources(value) when is_binary(value), do: value
+  def encode_sources(_), do: {:error, "Unexpected type when encoding Properties.sources"}
+
+  def decode_time(value) when is_integer(value), do: value
+  def decode_time(_), do: {:error, "Unexpected type when decoding Properties.time"}
+
+  def encode_time(value) when is_integer(value), do: value
+  def encode_time(_), do: {:error, "Unexpected type when encoding Properties.time"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Properties.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Properties.title"}
+
+  def decode_tsunami(value) when is_integer(value), do: value
+  def decode_tsunami(_), do: {:error, "Unexpected type when decoding Properties.tsunami"}
+
+  def encode_tsunami(value) when is_integer(value), do: value
+  def encode_tsunami(_), do: {:error, "Unexpected type when encoding Properties.tsunami"}
+
+  def decode_types(value) when is_binary(value), do: value
+  def decode_types(_), do: {:error, "Unexpected type when decoding Properties.types"}
+
+  def encode_types(value) when is_binary(value), do: value
+  def encode_types(_), do: {:error, "Unexpected type when encoding Properties.types"}
+
+  def decode_tz(value) when is_integer(value), do: value
+  def decode_tz(_), do: {:error, "Unexpected type when decoding Properties.tz"}
+
+  def encode_tz(value) when is_integer(value), do: value
+  def encode_tz(_), do: {:error, "Unexpected type when encoding Properties.tz"}
+
+  def decode_updated(value) when is_integer(value), do: value
+  def decode_updated(_), do: {:error, "Unexpected type when decoding Properties.updated"}
+
+  def encode_updated(value) when is_integer(value), do: value
+  def encode_updated(_), do: {:error, "Unexpected type when encoding Properties.updated"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Properties.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Properties.url"}
+
   def from_map(m) do
     %Properties{
-      alert: m["alert"],
-      cdi: m["cdi"],
-      code: m["code"],
-      detail: m["detail"],
+      alert: decode_alert(m["alert"]),
+      cdi: decode_cdi(m["cdi"]),
+      code: decode_code(m["code"]),
+      detail: decode_detail(m["detail"]),
       dmin: m["dmin"],
-      felt: m["felt"],
+      felt: decode_felt(m["felt"]),
       gap: m["gap"],
-      ids: m["ids"],
-      mag: m["mag"],
+      ids: decode_ids(m["ids"]),
+      mag: decode_mag(m["mag"]),
       mag_type: MagType.decode(m["magType"]),
-      mmi: m["mmi"],
-      net: m["net"],
+      mmi: decode_mmi(m["mmi"]),
+      net: decode_net(m["net"]),
       nst: m["nst"],
-      place: m["place"],
-      rms: m["rms"],
-      sig: m["sig"],
-      sources: m["sources"],
+      place: decode_place(m["place"]),
+      rms: decode_rms(m["rms"]),
+      sig: decode_sig(m["sig"]),
+      sources: decode_sources(m["sources"]),
       status: Status.decode(m["status"]),
-      time: m["time"],
-      title: m["title"],
-      tsunami: m["tsunami"],
+      time: decode_time(m["time"]),
+      title: decode_title(m["title"]),
+      tsunami: decode_tsunami(m["tsunami"]),
       type: PropertiesType.decode(m["type"]),
-      types: m["types"],
-      tz: m["tz"],
-      updated: m["updated"],
-      url: m["url"],
+      types: decode_types(m["types"]),
+      tz: decode_tz(m["tz"]),
+      updated: decode_updated(m["updated"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -388,10 +518,16 @@ defmodule Feature do
           type: FeatureType.t()
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Feature.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Feature.id"}
+
   def from_map(m) do
     %Feature{
       geometry: Geometry.from_map(m["geometry"]),
-      id: m["id"],
+      id: decode_id(m["id"]),
       properties: Properties.from_map(m["properties"]),
       type: FeatureType.decode(m["type"]),
     }
@@ -432,14 +568,50 @@ defmodule Metadata do
           url: String.t()
         }
 
+  def decode_api(value) when is_binary(value), do: value
+  def decode_api(_), do: {:error, "Unexpected type when decoding Metadata.api"}
+
+  def encode_api(value) when is_binary(value), do: value
+  def encode_api(_), do: {:error, "Unexpected type when encoding Metadata.api"}
+
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Metadata.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Metadata.count"}
+
+  def decode_generated(value) when is_integer(value), do: value
+  def decode_generated(_), do: {:error, "Unexpected type when decoding Metadata.generated"}
+
+  def encode_generated(value) when is_integer(value), do: value
+  def encode_generated(_), do: {:error, "Unexpected type when encoding Metadata.generated"}
+
+  def decode_status(value) when is_integer(value), do: value
+  def decode_status(_), do: {:error, "Unexpected type when decoding Metadata.status"}
+
+  def encode_status(value) when is_integer(value), do: value
+  def encode_status(_), do: {:error, "Unexpected type when encoding Metadata.status"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Metadata.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Metadata.title"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Metadata.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Metadata.url"}
+
   def from_map(m) do
     %Metadata{
-      api: m["api"],
-      count: m["count"],
-      generated: m["generated"],
-      status: m["status"],
-      title: m["title"],
-      url: m["url"],
+      api: decode_api(m["api"]),
+      count: decode_count(m["count"]),
+      generated: decode_generated(m["generated"]),
+      status: decode_status(m["status"]),
+      title: decode_title(m["title"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -478,12 +650,30 @@ defmodule TopLevel do
           type: String.t()
         }
 
+  def decode_bbox(value) when is_list(value), do: value
+  def decode_bbox(_), do: {:error, "Unexpected type when decoding TopLevel.bbox"}
+
+  def encode_bbox(value) when is_list(value), do: value
+  def encode_bbox(_), do: {:error, "Unexpected type when encoding TopLevel.bbox"}
+
+  def decode_features(value) when is_list(value), do: value
+  def decode_features(_), do: {:error, "Unexpected type when decoding TopLevel.features"}
+
+  def encode_features(value) when is_list(value), do: value
+  def encode_features(_), do: {:error, "Unexpected type when encoding TopLevel.features"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding TopLevel.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding TopLevel.type"}
+
   def from_map(m) do
     %TopLevel{
-      bbox: m["bbox"],
+      bbox: decode_bbox(m["bbox"]),
       features: Enum.map(m["features"], &Feature.from_map/1),
       metadata: Metadata.from_map(m["metadata"]),
-      type: m["type"],
+      type: decode_type(m["type"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/32d5c.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/32d5c.json/default/QuickType.ex
index be65093..8af387a 100644
--- a/base/elixir/test/inputs/json/misc/32d5c.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/32d5c.json/default/QuickType.ex
@@ -20,16 +20,58 @@ defmodule TopLevelElement do
           preferred_name: String.t()
         }
 
+  def decode_birth_date_is_protected(value) when is_boolean(value), do: value
+  def decode_birth_date_is_protected(_), do: {:error, "Unexpected type when decoding TopLevelElement.birth_date_is_protected"}
+
+  def encode_birth_date_is_protected(value) when is_boolean(value), do: value
+  def encode_birth_date_is_protected(_), do: {:error, "Unexpected type when encoding TopLevelElement.birth_date_is_protected"}
+
+  def decode_gender_type_id(value) when is_integer(value), do: value
+  def decode_gender_type_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.gender_type_id"}
+
+  def encode_gender_type_id(value) when is_integer(value), do: value
+  def encode_gender_type_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.gender_type_id"}
+
+  def decode_notes(value) when is_binary(value), do: value
+  def decode_notes(_), do: {:error, "Unexpected type when decoding TopLevelElement.notes"}
+
+  def encode_notes(value) when is_binary(value), do: value
+  def encode_notes(_), do: {:error, "Unexpected type when encoding TopLevelElement.notes"}
+
+  def decode_parliamentary_name(value) when is_binary(value), do: value
+  def decode_parliamentary_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.parliamentary_name"}
+
+  def encode_parliamentary_name(value) when is_binary(value), do: value
+  def encode_parliamentary_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.parliamentary_name"}
+
+  def decode_person_id(value) when is_integer(value), do: value
+  def decode_person_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.person_id"}
+
+  def encode_person_id(value) when is_integer(value), do: value
+  def encode_person_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.person_id"}
+
+  def decode_photo_url(value) when is_binary(value), do: value
+  def decode_photo_url(_), do: {:error, "Unexpected type when decoding TopLevelElement.photo_url"}
+
+  def encode_photo_url(value) when is_binary(value), do: value
+  def encode_photo_url(_), do: {:error, "Unexpected type when encoding TopLevelElement.photo_url"}
+
+  def decode_preferred_name(value) when is_binary(value), do: value
+  def decode_preferred_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.preferred_name"}
+
+  def encode_preferred_name(value) when is_binary(value), do: value
+  def encode_preferred_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.preferred_name"}
+
   def from_map(m) do
     %TopLevelElement{
       birth_date: m["BirthDate"],
-      birth_date_is_protected: m["BirthDateIsProtected"],
-      gender_type_id: m["GenderTypeID"],
-      notes: m["Notes"],
-      parliamentary_name: m["ParliamentaryName"],
-      person_id: m["PersonID"],
-      photo_url: m["PhotoURL"],
-      preferred_name: m["PreferredName"],
+      birth_date_is_protected: decode_birth_date_is_protected(m["BirthDateIsProtected"]),
+      gender_type_id: decode_gender_type_id(m["GenderTypeID"]),
+      notes: decode_notes(m["Notes"]),
+      parliamentary_name: decode_parliamentary_name(m["ParliamentaryName"]),
+      person_id: decode_person_id(m["PersonID"]),
+      photo_url: decode_photo_url(m["PhotoURL"]),
+      preferred_name: decode_preferred_name(m["PreferredName"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/337ed.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/337ed.json/default/QuickType.ex
index b60b7c7..096e4ce 100644
--- a/base/elixir/test/inputs/json/misc/337ed.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/337ed.json/default/QuickType.ex
@@ -141,16 +141,52 @@ defmodule CustomIncome do
           uri: String.t()
         }
 
+  def decode_amount(value) when is_integer(value), do: value
+  def decode_amount(_), do: {:error, "Unexpected type when decoding CustomIncome.amount"}
+
+  def encode_amount(value) when is_integer(value), do: value
+  def encode_amount(_), do: {:error, "Unexpected type when encoding CustomIncome.amount"}
+
+  def decode_created_at(value) when is_binary(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding CustomIncome.created_at"}
+
+  def encode_created_at(value) when is_binary(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding CustomIncome.created_at"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding CustomIncome.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding CustomIncome.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding CustomIncome.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding CustomIncome.name"}
+
+  def decode_updated_at(value) when is_binary(value), do: value
+  def decode_updated_at(_), do: {:error, "Unexpected type when decoding CustomIncome.updated_at"}
+
+  def encode_updated_at(value) when is_binary(value), do: value
+  def encode_updated_at(_), do: {:error, "Unexpected type when encoding CustomIncome.updated_at"}
+
+  def decode_uri(value) when is_binary(value), do: value
+  def decode_uri(_), do: {:error, "Unexpected type when decoding CustomIncome.uri"}
+
+  def encode_uri(value) when is_binary(value), do: value
+  def encode_uri(_), do: {:error, "Unexpected type when encoding CustomIncome.uri"}
+
   def from_map(m) do
     %CustomIncome{
-      amount: m["amount"],
-      created_at: m["created_at"],
-      id: m["id"],
-      name: m["name"],
+      amount: decode_amount(m["amount"]),
+      created_at: decode_created_at(m["created_at"]),
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
       status: Status.decode(m["status"]),
       type: CustomIncomeType.decode(m["type"]),
-      updated_at: m["updated_at"],
-      uri: m["uri"],
+      updated_at: decode_updated_at(m["updated_at"]),
+      uri: decode_uri(m["uri"]),
     }
   end
 
@@ -266,22 +302,100 @@ defmodule Result do
           uri: String.t()
         }
 
+  def decode_created_at(value) when is_binary(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding Result.created_at"}
+
+  def encode_created_at(value) when is_binary(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding Result.created_at"}
+
+  def decode_custom_incomes(value) when is_list(value), do: value
+  def decode_custom_incomes(_), do: {:error, "Unexpected type when decoding Result.custom_incomes"}
+
+  def encode_custom_incomes(value) when is_list(value), do: value
+  def encode_custom_incomes(_), do: {:error, "Unexpected type when encoding Result.custom_incomes"}
+
+  def decode_direct_rep_costs_max(value) when is_nil(value), do: value
+  def decode_direct_rep_costs_max(_), do: {:error, "Unexpected type when decoding Result.direct_rep_costs_max"}
+
+  def encode_direct_rep_costs_max(value) when is_nil(value), do: value
+  def encode_direct_rep_costs_max(_), do: {:error, "Unexpected type when encoding Result.direct_rep_costs_max"}
+
+  def decode_direct_rep_costs_min(value) when is_nil(value), do: value
+  def decode_direct_rep_costs_min(_), do: {:error, "Unexpected type when decoding Result.direct_rep_costs_min"}
+
+  def encode_direct_rep_costs_min(value) when is_nil(value), do: value
+  def encode_direct_rep_costs_min(_), do: {:error, "Unexpected type when encoding Result.direct_rep_costs_min"}
+
+  def decode_end_date(value) when is_binary(value), do: value
+  def decode_end_date(_), do: {:error, "Unexpected type when decoding Result.end_date"}
+
+  def encode_end_date(value) when is_binary(value), do: value
+  def encode_end_date(_), do: {:error, "Unexpected type when encoding Result.end_date"}
+
+  def decode_eur_sources_grants(value) when is_integer(value), do: value
+  def decode_eur_sources_grants(_), do: {:error, "Unexpected type when decoding Result.eur_sources_grants"}
+
+  def encode_eur_sources_grants(value) when is_integer(value), do: value
+  def encode_eur_sources_grants(_), do: {:error, "Unexpected type when encoding Result.eur_sources_grants"}
+
+  def decode_eur_sources_procurement(value) when is_integer(value), do: value
+  def decode_eur_sources_procurement(_), do: {:error, "Unexpected type when decoding Result.eur_sources_procurement"}
+
+  def encode_eur_sources_procurement(value) when is_integer(value), do: value
+  def encode_eur_sources_procurement(_), do: {:error, "Unexpected type when encoding Result.eur_sources_procurement"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Result.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Result.id"}
+
+  def decode_new_organisation(value) when is_nil(value), do: value
+  def decode_new_organisation(_), do: {:error, "Unexpected type when decoding Result.new_organisation"}
+
+  def encode_new_organisation(value) when is_nil(value), do: value
+  def encode_new_organisation(_), do: {:error, "Unexpected type when encoding Result.new_organisation"}
+
+  def decode_representative(value) when is_binary(value), do: value
+  def decode_representative(_), do: {:error, "Unexpected type when decoding Result.representative"}
+
+  def encode_representative(value) when is_binary(value), do: value
+  def encode_representative(_), do: {:error, "Unexpected type when encoding Result.representative"}
+
+  def decode_start_date(value) when is_binary(value), do: value
+  def decode_start_date(_), do: {:error, "Unexpected type when decoding Result.start_date"}
+
+  def encode_start_date(value) when is_binary(value), do: value
+  def encode_start_date(_), do: {:error, "Unexpected type when encoding Result.start_date"}
+
+  def decode_updated_at(value) when is_binary(value), do: value
+  def decode_updated_at(_), do: {:error, "Unexpected type when decoding Result.updated_at"}
+
+  def encode_updated_at(value) when is_binary(value), do: value
+  def encode_updated_at(_), do: {:error, "Unexpected type when encoding Result.updated_at"}
+
+  def decode_uri(value) when is_binary(value), do: value
+  def decode_uri(_), do: {:error, "Unexpected type when decoding Result.uri"}
+
+  def encode_uri(value) when is_binary(value), do: value
+  def encode_uri(_), do: {:error, "Unexpected type when encoding Result.uri"}
+
   def from_map(m) do
     %Result{
       cost_absolute: m["cost_absolute"],
       cost_max: m["cost_max"],
       cost_min: m["cost_min"],
-      created_at: m["created_at"],
+      created_at: decode_created_at(m["created_at"]),
       custom_incomes: Enum.map(m["customIncomes"], &CustomIncome.from_map/1),
-      direct_rep_costs_max: m["direct_rep_costs_max"],
-      direct_rep_costs_min: m["direct_rep_costs_min"],
-      end_date: m["end_date"],
-      eur_sources_grants: m["eur_sources_grants"],
+      direct_rep_costs_max: decode_direct_rep_costs_max(m["direct_rep_costs_max"]),
+      direct_rep_costs_min: decode_direct_rep_costs_min(m["direct_rep_costs_min"]),
+      end_date: decode_end_date(m["end_date"]),
+      eur_sources_grants: decode_eur_sources_grants(m["eur_sources_grants"]),
       eur_sources_grants_src: m["eur_sources_grants_src"],
-      eur_sources_procurement: m["eur_sources_procurement"],
+      eur_sources_procurement: decode_eur_sources_procurement(m["eur_sources_procurement"]),
       eur_sources_procurement_src: m["eur_sources_procurement_src"],
-      id: m["id"],
-      new_organisation: m["new_organisation"],
+      id: decode_id(m["id"]),
+      new_organisation: decode_new_organisation(m["new_organisation"]),
       no_clients: m["no_clients"],
       other_financial_information: m["other_financial_information"],
       other_sources_contributions: m["other_sources_contributions"],
@@ -290,16 +404,16 @@ defmodule Result do
       public_financing_infranational: m["public_financing_infranational"],
       public_financing_national: m["public_financing_national"],
       public_financing_total: m["public_financing_total"],
-      representative: m["representative"],
-      start_date: m["start_date"],
+      representative: decode_representative(m["representative"]),
+      start_date: decode_start_date(m["start_date"]),
       status: Status.decode(m["status"]),
       total_budget: m["total_budget"],
       turnover_absolute: m["turnover_absolute"],
       turnover_max: m["turnover_max"],
       turnover_min: m["turnover_min"],
       type: ResultType.decode(m["type"]),
-      updated_at: m["updated_at"],
-      uri: m["uri"],
+      updated_at: decode_updated_at(m["updated_at"]),
+      uri: decode_uri(m["uri"]),
     }
   end
 
@@ -367,14 +481,50 @@ defmodule TopLevel do
           results: [Result.t()]
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding TopLevel.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding TopLevel.count"}
+
+  def decode_limit(value) when is_integer(value), do: value
+  def decode_limit(_), do: {:error, "Unexpected type when decoding TopLevel.limit"}
+
+  def encode_limit(value) when is_integer(value), do: value
+  def encode_limit(_), do: {:error, "Unexpected type when encoding TopLevel.limit"}
+
+  def decode_next(value) when is_binary(value), do: value
+  def decode_next(_), do: {:error, "Unexpected type when decoding TopLevel.next"}
+
+  def encode_next(value) when is_binary(value), do: value
+  def encode_next(_), do: {:error, "Unexpected type when encoding TopLevel.next"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding TopLevel.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding TopLevel.offset"}
+
+  def decode_previous(value) when is_boolean(value), do: value
+  def decode_previous(_), do: {:error, "Unexpected type when decoding TopLevel.previous"}
+
+  def encode_previous(value) when is_boolean(value), do: value
+  def encode_previous(_), do: {:error, "Unexpected type when encoding TopLevel.previous"}
+
+  def decode_results(value) when is_list(value), do: value
+  def decode_results(_), do: {:error, "Unexpected type when decoding TopLevel.results"}
+
+  def encode_results(value) when is_list(value), do: value
+  def encode_results(_), do: {:error, "Unexpected type when encoding TopLevel.results"}
+
   def from_map(m) do
     %TopLevel{
-      count: m["count"],
+      count: decode_count(m["count"]),
       facets: Facets.from_map(m["facets"]),
-      limit: m["limit"],
-      next: m["next"],
-      offset: m["offset"],
-      previous: m["previous"],
+      limit: decode_limit(m["limit"]),
+      next: decode_next(m["next"]),
+      offset: decode_offset(m["offset"]),
+      previous: decode_previous(m["previous"]),
       results: Enum.map(m["results"], &Result.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/33d2e.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/33d2e.json/default/QuickType.ex
index ccc4971..4d1e705 100644
--- a/base/elixir/test/inputs/json/misc/33d2e.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/33d2e.json/default/QuickType.ex
@@ -153,6 +153,12 @@ defmodule Prize do
           year: String.t() | nil
         }
 
+  def decode_affiliations(value) when is_list(value), do: value
+  def decode_affiliations(_), do: {:error, "Unexpected type when decoding Prize.affiliations"}
+
+  def encode_affiliations(value) when is_list(value), do: value
+  def encode_affiliations(_), do: {:error, "Unexpected type when encoding Prize.affiliations"}
+
   def decode_affiliations_element(%{} = value), do: AffiliationClass.from_map(value)
   def decode_affiliations_element(value) when is_list(value), do: value
   def decode_affiliations_element(_), do: {:error, "Unexpected type when decoding Prize.affiliations"}
@@ -216,19 +222,43 @@ defmodule Laureate do
           surname: String.t() | nil
         }
 
+  def decode_born(value) when is_binary(value), do: value
+  def decode_born(_), do: {:error, "Unexpected type when decoding Laureate.born"}
+
+  def encode_born(value) when is_binary(value), do: value
+  def encode_born(_), do: {:error, "Unexpected type when encoding Laureate.born"}
+
+  def decode_died(value) when is_binary(value), do: value
+  def decode_died(_), do: {:error, "Unexpected type when decoding Laureate.died"}
+
+  def encode_died(value) when is_binary(value), do: value
+  def encode_died(_), do: {:error, "Unexpected type when encoding Laureate.died"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Laureate.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Laureate.id"}
+
+  def decode_prizes(value) when is_list(value), do: value
+  def decode_prizes(_), do: {:error, "Unexpected type when decoding Laureate.prizes"}
+
+  def encode_prizes(value) when is_list(value), do: value
+  def encode_prizes(_), do: {:error, "Unexpected type when encoding Laureate.prizes"}
+
   def from_map(m) do
     %Laureate{
-      born: m["born"],
+      born: decode_born(m["born"]),
       born_city: m["bornCity"],
       born_country: m["bornCountry"],
       born_country_code: m["bornCountryCode"],
-      died: m["died"],
+      died: decode_died(m["died"]),
       died_city: m["diedCity"],
       died_country: m["diedCountry"],
       died_country_code: m["diedCountryCode"],
       firstname: m["firstname"],
       gender: Gender.decode(m["gender"]),
-      id: m["id"],
+      id: decode_id(m["id"]),
       prizes: Enum.map(m["prizes"], &Prize.from_map/1),
       surname: m["surname"],
     }
@@ -273,6 +303,12 @@ defmodule TopLevel do
           laureates: [Laureate.t()]
         }
 
+  def decode_laureates(value) when is_list(value), do: value
+  def decode_laureates(_), do: {:error, "Unexpected type when decoding TopLevel.laureates"}
+
+  def encode_laureates(value) when is_list(value), do: value
+  def encode_laureates(_), do: {:error, "Unexpected type when encoding TopLevel.laureates"}
+
   def from_map(m) do
     %TopLevel{
       laureates: Enum.map(m["laureates"], &Laureate.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/34702.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/34702.json/default/QuickType.ex
index 0db0bcc..92d4816 100644
--- a/base/elixir/test/inputs/json/misc/34702.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/34702.json/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule CRSProperties do
           name: String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding CRSProperties.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding CRSProperties.name"}
+
   def from_map(m) do
     %CRSProperties{
-      name: m["name"],
+      name: decode_name(m["name"]),
     }
   end
 
@@ -47,10 +53,16 @@ defmodule CRS do
           type: String.t()
         }
 
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding CRS.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding CRS.type"}
+
   def from_map(m) do
     %CRS{
       properties: CRSProperties.from_map(m["properties"]),
-      type: m["type"],
+      type: decode_type(m["type"]),
     }
   end
 
@@ -128,9 +140,15 @@ defmodule Geometry do
           type: GeometryType.t()
         }
 
+  def decode_coordinates(value) when is_list(value), do: value
+  def decode_coordinates(_), do: {:error, "Unexpected type when decoding Geometry.coordinates"}
+
+  def encode_coordinates(value) when is_list(value), do: value
+  def encode_coordinates(_), do: {:error, "Unexpected type when encoding Geometry.coordinates"}
+
   def from_map(m) do
     %Geometry{
-      coordinates: m["coordinates"],
+      coordinates: decode_coordinates(m["coordinates"]),
       type: GeometryType.decode(m["type"]),
     }
   end
@@ -384,22 +402,96 @@ defmodule FeatureProperties do
           type: PropertiesType.t() | nil
         }
 
+  def decode_division(value) when is_binary(value), do: value
+  def decode_division(_), do: {:error, "Unexpected type when decoding FeatureProperties.division"}
+
+  def encode_division(value) when is_binary(value), do: value
+  def encode_division(_), do: {:error, "Unexpected type when encoding FeatureProperties.division"}
+
+  def decode_fax(value) when is_float(value), do: value
+  def decode_fax(value) when is_integer(value), do: value
+  def decode_fax(_), do: {:error, "Unexpected type when decoding FeatureProperties.fax"}
+
+  def encode_fax(value) when is_float(value), do: value
+  def encode_fax(value) when is_integer(value), do: value
+  def encode_fax(_), do: {:error, "Unexpected type when encoding FeatureProperties.fax"}
+
+  def decode_latitude(value) when is_float(value), do: value
+  def decode_latitude(value) when is_integer(value), do: value
+  def decode_latitude(_), do: {:error, "Unexpected type when decoding FeatureProperties.latitude"}
+
+  def encode_latitude(value) when is_float(value), do: value
+  def encode_latitude(value) when is_integer(value), do: value
+  def encode_latitude(_), do: {:error, "Unexpected type when encoding FeatureProperties.latitude"}
+
+  def decode_local_govt(value) when is_binary(value), do: value
+  def decode_local_govt(_), do: {:error, "Unexpected type when decoding FeatureProperties.local_govt"}
+
+  def encode_local_govt(value) when is_binary(value), do: value
+  def encode_local_govt(_), do: {:error, "Unexpected type when encoding FeatureProperties.local_govt"}
+
+  def decode_longitude(value) when is_float(value), do: value
+  def decode_longitude(value) when is_integer(value), do: value
+  def decode_longitude(_), do: {:error, "Unexpected type when decoding FeatureProperties.longitude"}
+
+  def encode_longitude(value) when is_float(value), do: value
+  def encode_longitude(value) when is_integer(value), do: value
+  def encode_longitude(_), do: {:error, "Unexpected type when encoding FeatureProperties.longitude"}
+
+  def decode_phone(value) when is_float(value), do: value
+  def decode_phone(value) when is_integer(value), do: value
+  def decode_phone(_), do: {:error, "Unexpected type when decoding FeatureProperties.phone"}
+
+  def encode_phone(value) when is_float(value), do: value
+  def encode_phone(value) when is_integer(value), do: value
+  def encode_phone(_), do: {:error, "Unexpected type when encoding FeatureProperties.phone"}
+
+  def decode_postcode(value) when is_integer(value), do: value
+  def decode_postcode(_), do: {:error, "Unexpected type when decoding FeatureProperties.postcode"}
+
+  def encode_postcode(value) when is_integer(value), do: value
+  def encode_postcode(_), do: {:error, "Unexpected type when encoding FeatureProperties.postcode"}
+
+  def decode_psa(value) when is_binary(value), do: value
+  def decode_psa(_), do: {:error, "Unexpected type when decoding FeatureProperties.psa"}
+
+  def encode_psa(value) when is_binary(value), do: value
+  def encode_psa(_), do: {:error, "Unexpected type when encoding FeatureProperties.psa"}
+
+  def decode_station(value) when is_binary(value), do: value
+  def decode_station(_), do: {:error, "Unexpected type when decoding FeatureProperties.station"}
+
+  def encode_station(value) when is_binary(value), do: value
+  def encode_station(_), do: {:error, "Unexpected type when encoding FeatureProperties.station"}
+
+  def decode_street(value) when is_binary(value), do: value
+  def decode_street(_), do: {:error, "Unexpected type when decoding FeatureProperties.street"}
+
+  def encode_street(value) when is_binary(value), do: value
+  def encode_street(_), do: {:error, "Unexpected type when encoding FeatureProperties.street"}
+
+  def decode_suburb(value) when is_binary(value), do: value
+  def decode_suburb(_), do: {:error, "Unexpected type when decoding FeatureProperties.suburb"}
+
+  def encode_suburb(value) when is_binary(value), do: value
+  def encode_suburb(_), do: {:error, "Unexpected type when encoding FeatureProperties.suburb"}
+
   def from_map(m) do
     %FeatureProperties{
-      division: m["division"],
-      fax: m["fax"],
+      division: decode_division(m["division"]),
+      fax: decode_fax(m["fax"]),
       fire_ban_r: m["fire_ban_r"] && FireBanR.decode(m["fire_ban_r"]),
-      latitude: m["latitude"],
-      local_govt: m["local_govt"],
-      longitude: m["longitude"],
+      latitude: decode_latitude(m["latitude"]),
+      local_govt: decode_local_govt(m["local_govt"]),
+      longitude: decode_longitude(m["longitude"]),
       no: m["no"],
-      phone: m["phone"],
-      postcode: m["postcode"],
-      psa: m["psa"],
+      phone: decode_phone(m["phone"]),
+      postcode: decode_postcode(m["postcode"]),
+      psa: decode_psa(m["psa"]),
       region: Region.decode(m["region"]),
-      station: m["station"],
-      street: m["street"],
-      suburb: m["suburb"],
+      station: decode_station(m["station"]),
+      street: decode_street(m["street"]),
+      suburb: decode_suburb(m["suburb"]),
       type: m["type"] && PropertiesType.decode(m["type"]),
     }
   end
@@ -494,11 +586,17 @@ defmodule Feature do
           type: FeatureType.t()
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Feature.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Feature.id"}
+
   def from_map(m) do
     %Feature{
       geometry: Geometry.from_map(m["geometry"]),
       geometry_name: GeometryName.decode(m["geometry_name"]),
-      id: m["id"],
+      id: decode_id(m["id"]),
       properties: FeatureProperties.from_map(m["properties"]),
       type: FeatureType.decode(m["type"]),
     }
@@ -538,12 +636,30 @@ defmodule TopLevel do
           type: String.t()
         }
 
+  def decode_features(value) when is_list(value), do: value
+  def decode_features(_), do: {:error, "Unexpected type when decoding TopLevel.features"}
+
+  def encode_features(value) when is_list(value), do: value
+  def encode_features(_), do: {:error, "Unexpected type when encoding TopLevel.features"}
+
+  def decode_total_features(value) when is_integer(value), do: value
+  def decode_total_features(_), do: {:error, "Unexpected type when decoding TopLevel.total_features"}
+
+  def encode_total_features(value) when is_integer(value), do: value
+  def encode_total_features(_), do: {:error, "Unexpected type when encoding TopLevel.total_features"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding TopLevel.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding TopLevel.type"}
+
   def from_map(m) do
     %TopLevel{
       crs: CRS.from_map(m["crs"]),
       features: Enum.map(m["features"], &Feature.from_map/1),
-      total_features: m["totalFeatures"],
-      type: m["type"],
+      total_features: decode_total_features(m["totalFeatures"]),
+      type: decode_type(m["type"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/3536b.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/3536b.json/default/QuickType.ex
index a515952..226aab6 100644
--- a/base/elixir/test/inputs/json/misc/3536b.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/3536b.json/default/QuickType.ex
@@ -61,9 +61,15 @@ defmodule Identifier do
           scheme: Scheme.t()
         }
 
+  def decode_identifier(value) when is_binary(value), do: value
+  def decode_identifier(_), do: {:error, "Unexpected type when decoding Identifier.identifier"}
+
+  def encode_identifier(value) when is_binary(value), do: value
+  def encode_identifier(_), do: {:error, "Unexpected type when encoding Identifier.identifier"}
+
   def from_map(m) do
     %Identifier{
-      identifier: m["identifier"],
+      identifier: decode_identifier(m["identifier"]),
       scheme: Scheme.decode(m["scheme"]),
     }
   end
@@ -144,10 +150,22 @@ defmodule Link do
           url: String.t()
         }
 
+  def decode_note(value) when is_binary(value), do: value
+  def decode_note(_), do: {:error, "Unexpected type when decoding Link.note"}
+
+  def encode_note(value) when is_binary(value), do: value
+  def encode_note(_), do: {:error, "Unexpected type when encoding Link.note"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Link.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Link.url"}
+
   def from_map(m) do
     %Link{
-      note: m["note"],
-      url: m["url"],
+      note: decode_note(m["note"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -181,11 +199,29 @@ defmodule Text do
           url: String.t()
         }
 
+  def decode_media_type(value) when is_binary(value), do: value
+  def decode_media_type(_), do: {:error, "Unexpected type when decoding Text.media_type"}
+
+  def encode_media_type(value) when is_binary(value), do: value
+  def encode_media_type(_), do: {:error, "Unexpected type when encoding Text.media_type"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Text.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Text.title"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Text.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Text.url"}
+
   def from_map(m) do
     %Text{
-      media_type: m["media_type"],
-      title: m["title"],
-      url: m["url"],
+      media_type: decode_media_type(m["media_type"]),
+      title: decode_title(m["title"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -225,15 +261,63 @@ defmodule TopLevelElement do
           text: [Text.t()]
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_identifiers(value) when is_list(value), do: value
+  def decode_identifiers(_), do: {:error, "Unexpected type when decoding TopLevelElement.identifiers"}
+
+  def encode_identifiers(value) when is_list(value), do: value
+  def encode_identifiers(_), do: {:error, "Unexpected type when encoding TopLevelElement.identifiers"}
+
+  def decode_keywords(value) when is_list(value), do: value
+  def decode_keywords(_), do: {:error, "Unexpected type when decoding TopLevelElement.keywords"}
+
+  def encode_keywords(value) when is_list(value), do: value
+  def encode_keywords(_), do: {:error, "Unexpected type when encoding TopLevelElement.keywords"}
+
+  def decode_links(value) when is_list(value), do: value
+  def decode_links(_), do: {:error, "Unexpected type when decoding TopLevelElement.links"}
+
+  def encode_links(value) when is_list(value), do: value
+  def encode_links(_), do: {:error, "Unexpected type when encoding TopLevelElement.links"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.name"}
+
+  def decode_other_names(value) when is_list(value), do: value
+  def decode_other_names(_), do: {:error, "Unexpected type when decoding TopLevelElement.other_names"}
+
+  def encode_other_names(value) when is_list(value), do: value
+  def encode_other_names(_), do: {:error, "Unexpected type when encoding TopLevelElement.other_names"}
+
+  def decode_superseded_by(value) when is_binary(value), do: value
+  def decode_superseded_by(_), do: {:error, "Unexpected type when decoding TopLevelElement.superseded_by"}
+
+  def encode_superseded_by(value) when is_binary(value), do: value
+  def encode_superseded_by(_), do: {:error, "Unexpected type when encoding TopLevelElement.superseded_by"}
+
+  def decode_text(value) when is_list(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding TopLevelElement.text"}
+
+  def encode_text(value) when is_list(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding TopLevelElement.text"}
+
   def from_map(m) do
     %TopLevelElement{
-      id: m["id"],
+      id: decode_id(m["id"]),
       identifiers: Enum.map(m["identifiers"], &Identifier.from_map/1),
       keywords: Enum.map(m["keywords"], &KeywordElement.decode/1),
       links: Enum.map(m["links"], &Link.from_map/1),
-      name: m["name"],
-      other_names: m["other_names"],
-      superseded_by: m["superseded_by"],
+      name: decode_name(m["name"]),
+      other_names: decode_other_names(m["other_names"]),
+      superseded_by: decode_superseded_by(m["superseded_by"]),
       text: Enum.map(m["text"], &Text.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/3659d.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/3659d.json/default/QuickType.ex
index bf47bf0..b805b08 100644
--- a/base/elixir/test/inputs/json/misc/3659d.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/3659d.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule TotalPopulation do
           population: integer()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TotalPopulation.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TotalPopulation.date"}
+
+  def decode_population(value) when is_integer(value), do: value
+  def decode_population(_), do: {:error, "Unexpected type when decoding TotalPopulation.population"}
+
+  def encode_population(value) when is_integer(value), do: value
+  def encode_population(_), do: {:error, "Unexpected type when encoding TotalPopulation.population"}
+
   def from_map(m) do
     %TotalPopulation{
-      date: m["date"],
-      population: m["population"],
+      date: decode_date(m["date"]),
+      population: decode_population(m["population"]),
     }
   end
 
@@ -49,6 +61,12 @@ defmodule TopLevel do
           total_population: [TotalPopulation.t()]
         }
 
+  def decode_total_population(value) when is_list(value), do: value
+  def decode_total_population(_), do: {:error, "Unexpected type when decoding TopLevel.total_population"}
+
+  def encode_total_population(value) when is_list(value), do: value
+  def encode_total_population(_), do: {:error, "Unexpected type when encoding TopLevel.total_population"}
+
   def from_map(m) do
     %TopLevel{
       total_population: Enum.map(m["total_population"], &TotalPopulation.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/36d5d.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/36d5d.json/default/QuickType.ex
index b9f86f4..e9a4777 100644
--- a/base/elixir/test/inputs/json/misc/36d5d.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/36d5d.json/default/QuickType.ex
@@ -21,17 +21,71 @@ defmodule Status do
           type: String.t()
         }
 
+  def decode_avg_delay(value) when is_binary(value), do: value
+  def decode_avg_delay(_), do: {:error, "Unexpected type when decoding Status.avg_delay"}
+
+  def encode_avg_delay(value) when is_binary(value), do: value
+  def encode_avg_delay(_), do: {:error, "Unexpected type when encoding Status.avg_delay"}
+
+  def decode_closure_begin(value) when is_binary(value), do: value
+  def decode_closure_begin(_), do: {:error, "Unexpected type when decoding Status.closure_begin"}
+
+  def encode_closure_begin(value) when is_binary(value), do: value
+  def encode_closure_begin(_), do: {:error, "Unexpected type when encoding Status.closure_begin"}
+
+  def decode_closure_end(value) when is_binary(value), do: value
+  def decode_closure_end(_), do: {:error, "Unexpected type when decoding Status.closure_end"}
+
+  def encode_closure_end(value) when is_binary(value), do: value
+  def encode_closure_end(_), do: {:error, "Unexpected type when encoding Status.closure_end"}
+
+  def decode_end_time(value) when is_binary(value), do: value
+  def decode_end_time(_), do: {:error, "Unexpected type when decoding Status.end_time"}
+
+  def encode_end_time(value) when is_binary(value), do: value
+  def encode_end_time(_), do: {:error, "Unexpected type when encoding Status.end_time"}
+
+  def decode_max_delay(value) when is_binary(value), do: value
+  def decode_max_delay(_), do: {:error, "Unexpected type when decoding Status.max_delay"}
+
+  def encode_max_delay(value) when is_binary(value), do: value
+  def encode_max_delay(_), do: {:error, "Unexpected type when encoding Status.max_delay"}
+
+  def decode_min_delay(value) when is_binary(value), do: value
+  def decode_min_delay(_), do: {:error, "Unexpected type when decoding Status.min_delay"}
+
+  def encode_min_delay(value) when is_binary(value), do: value
+  def encode_min_delay(_), do: {:error, "Unexpected type when encoding Status.min_delay"}
+
+  def decode_reason(value) when is_binary(value), do: value
+  def decode_reason(_), do: {:error, "Unexpected type when decoding Status.reason"}
+
+  def encode_reason(value) when is_binary(value), do: value
+  def encode_reason(_), do: {:error, "Unexpected type when encoding Status.reason"}
+
+  def decode_trend(value) when is_binary(value), do: value
+  def decode_trend(_), do: {:error, "Unexpected type when decoding Status.trend"}
+
+  def encode_trend(value) when is_binary(value), do: value
+  def encode_trend(_), do: {:error, "Unexpected type when encoding Status.trend"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Status.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Status.type"}
+
   def from_map(m) do
     %Status{
-      avg_delay: m["avgDelay"],
-      closure_begin: m["closureBegin"],
-      closure_end: m["closureEnd"],
-      end_time: m["endTime"],
-      max_delay: m["maxDelay"],
-      min_delay: m["minDelay"],
-      reason: m["reason"],
-      trend: m["trend"],
-      type: m["type"],
+      avg_delay: decode_avg_delay(m["avgDelay"]),
+      closure_begin: decode_closure_begin(m["closureBegin"]),
+      closure_end: decode_closure_end(m["closureEnd"]),
+      end_time: decode_end_time(m["endTime"]),
+      max_delay: decode_max_delay(m["maxDelay"]),
+      min_delay: decode_min_delay(m["minDelay"]),
+      reason: decode_reason(m["reason"]),
+      trend: decode_trend(m["trend"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -72,11 +126,29 @@ defmodule Meta do
           url: String.t()
         }
 
+  def decode_credit(value) when is_binary(value), do: value
+  def decode_credit(_), do: {:error, "Unexpected type when decoding Meta.credit"}
+
+  def encode_credit(value) when is_binary(value), do: value
+  def encode_credit(_), do: {:error, "Unexpected type when encoding Meta.credit"}
+
+  def decode_updated(value) when is_binary(value), do: value
+  def decode_updated(_), do: {:error, "Unexpected type when decoding Meta.updated"}
+
+  def encode_updated(value) when is_binary(value), do: value
+  def encode_updated(_), do: {:error, "Unexpected type when encoding Meta.updated"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Meta.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Meta.url"}
+
   def from_map(m) do
     %Meta{
-      credit: m["credit"],
-      updated: m["updated"],
-      url: m["url"],
+      credit: decode_credit(m["credit"]),
+      updated: decode_updated(m["updated"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -113,13 +185,39 @@ defmodule Weather do
           wind: String.t()
         }
 
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Weather.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Weather.temp"}
+
+  def decode_visibility(value) when is_float(value), do: value
+  def decode_visibility(value) when is_integer(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Weather.visibility"}
+
+  def encode_visibility(value) when is_float(value), do: value
+  def encode_visibility(value) when is_integer(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Weather.visibility"}
+
+  def decode_weather(value) when is_binary(value), do: value
+  def decode_weather(_), do: {:error, "Unexpected type when decoding Weather.weather"}
+
+  def encode_weather(value) when is_binary(value), do: value
+  def encode_weather(_), do: {:error, "Unexpected type when encoding Weather.weather"}
+
+  def decode_wind(value) when is_binary(value), do: value
+  def decode_wind(_), do: {:error, "Unexpected type when decoding Weather.wind"}
+
+  def encode_wind(value) when is_binary(value), do: value
+  def encode_wind(_), do: {:error, "Unexpected type when encoding Weather.wind"}
+
   def from_map(m) do
     %Weather{
       meta: Meta.from_map(m["meta"]),
-      temp: m["temp"],
-      visibility: m["visibility"],
-      weather: m["weather"],
-      wind: m["wind"],
+      temp: decode_temp(m["temp"]),
+      visibility: decode_visibility(m["visibility"]),
+      weather: decode_weather(m["weather"]),
+      wind: decode_wind(m["wind"]),
     }
   end
 
@@ -161,14 +259,50 @@ defmodule TopLevel do
           weather: Weather.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding TopLevel.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding TopLevel.city"}
+
+  def decode_delay(value) when is_binary(value), do: value
+  def decode_delay(_), do: {:error, "Unexpected type when decoding TopLevel.delay"}
+
+  def encode_delay(value) when is_binary(value), do: value
+  def encode_delay(_), do: {:error, "Unexpected type when encoding TopLevel.delay"}
+
+  def decode_iata(value) when is_binary(value), do: value
+  def decode_iata(_), do: {:error, "Unexpected type when decoding TopLevel.iata"}
+
+  def encode_iata(value) when is_binary(value), do: value
+  def encode_iata(_), do: {:error, "Unexpected type when encoding TopLevel.iata"}
+
+  def decode_icao(value) when is_binary(value), do: value
+  def decode_icao(_), do: {:error, "Unexpected type when decoding TopLevel.icao"}
+
+  def encode_icao(value) when is_binary(value), do: value
+  def encode_icao(_), do: {:error, "Unexpected type when encoding TopLevel.icao"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding TopLevel.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding TopLevel.state"}
+
   def from_map(m) do
     %TopLevel{
-      city: m["city"],
-      delay: m["delay"],
-      iata: m["IATA"],
-      icao: m["ICAO"],
-      name: m["name"],
-      state: m["state"],
+      city: decode_city(m["city"]),
+      delay: decode_delay(m["delay"]),
+      iata: decode_iata(m["IATA"]),
+      icao: decode_icao(m["ICAO"]),
+      name: decode_name(m["name"]),
+      state: decode_state(m["state"]),
       status: Status.from_map(m["status"]),
       weather: Weather.from_map(m["weather"]),
     }
diff --git a/base/elixir/test/inputs/json/misc/3a6b3.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/3a6b3.json/default/QuickType.ex
index b9f86f4..e9a4777 100644
--- a/base/elixir/test/inputs/json/misc/3a6b3.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/3a6b3.json/default/QuickType.ex
@@ -21,17 +21,71 @@ defmodule Status do
           type: String.t()
         }
 
+  def decode_avg_delay(value) when is_binary(value), do: value
+  def decode_avg_delay(_), do: {:error, "Unexpected type when decoding Status.avg_delay"}
+
+  def encode_avg_delay(value) when is_binary(value), do: value
+  def encode_avg_delay(_), do: {:error, "Unexpected type when encoding Status.avg_delay"}
+
+  def decode_closure_begin(value) when is_binary(value), do: value
+  def decode_closure_begin(_), do: {:error, "Unexpected type when decoding Status.closure_begin"}
+
+  def encode_closure_begin(value) when is_binary(value), do: value
+  def encode_closure_begin(_), do: {:error, "Unexpected type when encoding Status.closure_begin"}
+
+  def decode_closure_end(value) when is_binary(value), do: value
+  def decode_closure_end(_), do: {:error, "Unexpected type when decoding Status.closure_end"}
+
+  def encode_closure_end(value) when is_binary(value), do: value
+  def encode_closure_end(_), do: {:error, "Unexpected type when encoding Status.closure_end"}
+
+  def decode_end_time(value) when is_binary(value), do: value
+  def decode_end_time(_), do: {:error, "Unexpected type when decoding Status.end_time"}
+
+  def encode_end_time(value) when is_binary(value), do: value
+  def encode_end_time(_), do: {:error, "Unexpected type when encoding Status.end_time"}
+
+  def decode_max_delay(value) when is_binary(value), do: value
+  def decode_max_delay(_), do: {:error, "Unexpected type when decoding Status.max_delay"}
+
+  def encode_max_delay(value) when is_binary(value), do: value
+  def encode_max_delay(_), do: {:error, "Unexpected type when encoding Status.max_delay"}
+
+  def decode_min_delay(value) when is_binary(value), do: value
+  def decode_min_delay(_), do: {:error, "Unexpected type when decoding Status.min_delay"}
+
+  def encode_min_delay(value) when is_binary(value), do: value
+  def encode_min_delay(_), do: {:error, "Unexpected type when encoding Status.min_delay"}
+
+  def decode_reason(value) when is_binary(value), do: value
+  def decode_reason(_), do: {:error, "Unexpected type when decoding Status.reason"}
+
+  def encode_reason(value) when is_binary(value), do: value
+  def encode_reason(_), do: {:error, "Unexpected type when encoding Status.reason"}
+
+  def decode_trend(value) when is_binary(value), do: value
+  def decode_trend(_), do: {:error, "Unexpected type when decoding Status.trend"}
+
+  def encode_trend(value) when is_binary(value), do: value
+  def encode_trend(_), do: {:error, "Unexpected type when encoding Status.trend"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Status.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Status.type"}
+
   def from_map(m) do
     %Status{
-      avg_delay: m["avgDelay"],
-      closure_begin: m["closureBegin"],
-      closure_end: m["closureEnd"],
-      end_time: m["endTime"],
-      max_delay: m["maxDelay"],
-      min_delay: m["minDelay"],
-      reason: m["reason"],
-      trend: m["trend"],
-      type: m["type"],
+      avg_delay: decode_avg_delay(m["avgDelay"]),
+      closure_begin: decode_closure_begin(m["closureBegin"]),
+      closure_end: decode_closure_end(m["closureEnd"]),
+      end_time: decode_end_time(m["endTime"]),
+      max_delay: decode_max_delay(m["maxDelay"]),
+      min_delay: decode_min_delay(m["minDelay"]),
+      reason: decode_reason(m["reason"]),
+      trend: decode_trend(m["trend"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -72,11 +126,29 @@ defmodule Meta do
           url: String.t()
         }
 
+  def decode_credit(value) when is_binary(value), do: value
+  def decode_credit(_), do: {:error, "Unexpected type when decoding Meta.credit"}
+
+  def encode_credit(value) when is_binary(value), do: value
+  def encode_credit(_), do: {:error, "Unexpected type when encoding Meta.credit"}
+
+  def decode_updated(value) when is_binary(value), do: value
+  def decode_updated(_), do: {:error, "Unexpected type when decoding Meta.updated"}
+
+  def encode_updated(value) when is_binary(value), do: value
+  def encode_updated(_), do: {:error, "Unexpected type when encoding Meta.updated"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Meta.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Meta.url"}
+
   def from_map(m) do
     %Meta{
-      credit: m["credit"],
-      updated: m["updated"],
-      url: m["url"],
+      credit: decode_credit(m["credit"]),
+      updated: decode_updated(m["updated"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -113,13 +185,39 @@ defmodule Weather do
           wind: String.t()
         }
 
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Weather.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Weather.temp"}
+
+  def decode_visibility(value) when is_float(value), do: value
+  def decode_visibility(value) when is_integer(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Weather.visibility"}
+
+  def encode_visibility(value) when is_float(value), do: value
+  def encode_visibility(value) when is_integer(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Weather.visibility"}
+
+  def decode_weather(value) when is_binary(value), do: value
+  def decode_weather(_), do: {:error, "Unexpected type when decoding Weather.weather"}
+
+  def encode_weather(value) when is_binary(value), do: value
+  def encode_weather(_), do: {:error, "Unexpected type when encoding Weather.weather"}
+
+  def decode_wind(value) when is_binary(value), do: value
+  def decode_wind(_), do: {:error, "Unexpected type when decoding Weather.wind"}
+
+  def encode_wind(value) when is_binary(value), do: value
+  def encode_wind(_), do: {:error, "Unexpected type when encoding Weather.wind"}
+
   def from_map(m) do
     %Weather{
       meta: Meta.from_map(m["meta"]),
-      temp: m["temp"],
-      visibility: m["visibility"],
-      weather: m["weather"],
-      wind: m["wind"],
+      temp: decode_temp(m["temp"]),
+      visibility: decode_visibility(m["visibility"]),
+      weather: decode_weather(m["weather"]),
+      wind: decode_wind(m["wind"]),
     }
   end
 
@@ -161,14 +259,50 @@ defmodule TopLevel do
           weather: Weather.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding TopLevel.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding TopLevel.city"}
+
+  def decode_delay(value) when is_binary(value), do: value
+  def decode_delay(_), do: {:error, "Unexpected type when decoding TopLevel.delay"}
+
+  def encode_delay(value) when is_binary(value), do: value
+  def encode_delay(_), do: {:error, "Unexpected type when encoding TopLevel.delay"}
+
+  def decode_iata(value) when is_binary(value), do: value
+  def decode_iata(_), do: {:error, "Unexpected type when decoding TopLevel.iata"}
+
+  def encode_iata(value) when is_binary(value), do: value
+  def encode_iata(_), do: {:error, "Unexpected type when encoding TopLevel.iata"}
+
+  def decode_icao(value) when is_binary(value), do: value
+  def decode_icao(_), do: {:error, "Unexpected type when decoding TopLevel.icao"}
+
+  def encode_icao(value) when is_binary(value), do: value
+  def encode_icao(_), do: {:error, "Unexpected type when encoding TopLevel.icao"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding TopLevel.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding TopLevel.state"}
+
   def from_map(m) do
     %TopLevel{
-      city: m["city"],
-      delay: m["delay"],
-      iata: m["IATA"],
-      icao: m["ICAO"],
-      name: m["name"],
-      state: m["state"],
+      city: decode_city(m["city"]),
+      delay: decode_delay(m["delay"]),
+      iata: decode_iata(m["IATA"]),
+      icao: decode_icao(m["ICAO"]),
+      name: decode_name(m["name"]),
+      state: decode_state(m["state"]),
       status: Status.from_map(m["status"]),
       weather: Weather.from_map(m["weather"]),
     }
diff --git a/base/elixir/test/inputs/json/misc/3e9a3.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/3e9a3.json/default/QuickType.ex
index e4cbd35..b988c51 100644
--- a/base/elixir/test/inputs/json/misc/3e9a3.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/3e9a3.json/default/QuickType.ex
@@ -52,13 +52,43 @@ defmodule Datum do
           year: String.t()
         }
 
+  def decode_footnotes(value) when is_list(value), do: value
+  def decode_footnotes(_), do: {:error, "Unexpected type when decoding Datum.footnotes"}
+
+  def encode_footnotes(value) when is_list(value), do: value
+  def encode_footnotes(_), do: {:error, "Unexpected type when encoding Datum.footnotes"}
+
+  def decode_period(value) when is_binary(value), do: value
+  def decode_period(_), do: {:error, "Unexpected type when decoding Datum.period"}
+
+  def encode_period(value) when is_binary(value), do: value
+  def encode_period(_), do: {:error, "Unexpected type when encoding Datum.period"}
+
+  def decode_period_name(value) when is_binary(value), do: value
+  def decode_period_name(_), do: {:error, "Unexpected type when decoding Datum.period_name"}
+
+  def encode_period_name(value) when is_binary(value), do: value
+  def encode_period_name(_), do: {:error, "Unexpected type when encoding Datum.period_name"}
+
+  def decode_value(value) when is_binary(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding Datum.value"}
+
+  def encode_value(value) when is_binary(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding Datum.value"}
+
+  def decode_year(value) when is_binary(value), do: value
+  def decode_year(_), do: {:error, "Unexpected type when decoding Datum.year"}
+
+  def encode_year(value) when is_binary(value), do: value
+  def encode_year(_), do: {:error, "Unexpected type when encoding Datum.year"}
+
   def from_map(m) do
     %Datum{
       footnotes: Enum.map(m["footnotes"], &Footnote.from_map/1),
-      period: m["period"],
-      period_name: m["periodName"],
-      value: m["value"],
-      year: m["year"],
+      period: decode_period(m["period"]),
+      period_name: decode_period_name(m["periodName"]),
+      value: decode_value(m["value"]),
+      year: decode_year(m["year"]),
     }
   end
 
@@ -94,10 +124,22 @@ defmodule Series do
           series_id: String.t()
         }
 
+  def decode_data(value) when is_list(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding Series.data"}
+
+  def encode_data(value) when is_list(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding Series.data"}
+
+  def decode_series_id(value) when is_binary(value), do: value
+  def decode_series_id(_), do: {:error, "Unexpected type when decoding Series.series_id"}
+
+  def encode_series_id(value) when is_binary(value), do: value
+  def encode_series_id(_), do: {:error, "Unexpected type when encoding Series.series_id"}
+
   def from_map(m) do
     %Series{
       data: Enum.map(m["data"], &Datum.from_map/1),
-      series_id: m["seriesID"],
+      series_id: decode_series_id(m["seriesID"]),
     }
   end
 
@@ -129,6 +171,12 @@ defmodule Results do
           series: [Series.t()]
         }
 
+  def decode_series(value) when is_list(value), do: value
+  def decode_series(_), do: {:error, "Unexpected type when decoding Results.series"}
+
+  def encode_series(value) when is_list(value), do: value
+  def encode_series(_), do: {:error, "Unexpected type when encoding Results.series"}
+
   def from_map(m) do
     %Results{
       series: Enum.map(m["series"], &Series.from_map/1),
@@ -165,12 +213,30 @@ defmodule TopLevel do
           status: String.t()
         }
 
+  def decode_message(value) when is_list(value), do: value
+  def decode_message(_), do: {:error, "Unexpected type when decoding TopLevel.message"}
+
+  def encode_message(value) when is_list(value), do: value
+  def encode_message(_), do: {:error, "Unexpected type when encoding TopLevel.message"}
+
+  def decode_response_time(value) when is_integer(value), do: value
+  def decode_response_time(_), do: {:error, "Unexpected type when decoding TopLevel.response_time"}
+
+  def encode_response_time(value) when is_integer(value), do: value
+  def encode_response_time(_), do: {:error, "Unexpected type when encoding TopLevel.response_time"}
+
+  def decode_status(value) when is_binary(value), do: value
+  def decode_status(_), do: {:error, "Unexpected type when decoding TopLevel.status"}
+
+  def encode_status(value) when is_binary(value), do: value
+  def encode_status(_), do: {:error, "Unexpected type when encoding TopLevel.status"}
+
   def from_map(m) do
     %TopLevel{
-      message: m["message"],
-      response_time: m["responseTime"],
+      message: decode_message(m["message"]),
+      response_time: decode_response_time(m["responseTime"]),
       results: Results.from_map(m["Results"]),
-      status: m["status"],
+      status: decode_status(m["status"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/3f1ce.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/3f1ce.json/default/QuickType.ex
index 06b2e4b..cbbb8d1 100644
--- a/base/elixir/test/inputs/json/misc/3f1ce.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/3f1ce.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Astronomy do
           sunset: String.t()
         }
 
+  def decode_sunrise(value) when is_binary(value), do: value
+  def decode_sunrise(_), do: {:error, "Unexpected type when decoding Astronomy.sunrise"}
+
+  def encode_sunrise(value) when is_binary(value), do: value
+  def encode_sunrise(_), do: {:error, "Unexpected type when encoding Astronomy.sunrise"}
+
+  def decode_sunset(value) when is_binary(value), do: value
+  def decode_sunset(_), do: {:error, "Unexpected type when decoding Astronomy.sunset"}
+
+  def encode_sunset(value) when is_binary(value), do: value
+  def encode_sunset(_), do: {:error, "Unexpected type when encoding Astronomy.sunset"}
+
   def from_map(m) do
     %Astronomy{
-      sunrise: m["sunrise"],
-      sunset: m["sunset"],
+      sunrise: decode_sunrise(m["sunrise"]),
+      sunset: decode_sunset(m["sunset"]),
     }
   end
 
@@ -52,12 +64,36 @@ defmodule Atmosphere do
           visibility: String.t()
         }
 
+  def decode_humidity(value) when is_binary(value), do: value
+  def decode_humidity(_), do: {:error, "Unexpected type when decoding Atmosphere.humidity"}
+
+  def encode_humidity(value) when is_binary(value), do: value
+  def encode_humidity(_), do: {:error, "Unexpected type when encoding Atmosphere.humidity"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Atmosphere.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Atmosphere.pressure"}
+
+  def decode_rising(value) when is_binary(value), do: value
+  def decode_rising(_), do: {:error, "Unexpected type when decoding Atmosphere.rising"}
+
+  def encode_rising(value) when is_binary(value), do: value
+  def encode_rising(_), do: {:error, "Unexpected type when encoding Atmosphere.rising"}
+
+  def decode_visibility(value) when is_binary(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Atmosphere.visibility"}
+
+  def encode_visibility(value) when is_binary(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Atmosphere.visibility"}
+
   def from_map(m) do
     %Atmosphere{
-      humidity: m["humidity"],
-      pressure: m["pressure"],
-      rising: m["rising"],
-      visibility: m["visibility"],
+      humidity: decode_humidity(m["humidity"]),
+      pressure: decode_pressure(m["pressure"]),
+      rising: decode_rising(m["rising"]),
+      visibility: decode_visibility(m["visibility"]),
     }
   end
 
@@ -95,13 +131,43 @@ defmodule Image do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Image.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Image.height"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Image.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Image.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Image.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Image.title"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Image.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Image.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Image.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Image.width"}
+
   def from_map(m) do
     %Image{
-      height: m["height"],
-      link: m["link"],
-      title: m["title"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      link: decode_link(m["link"]),
+      title: decode_title(m["title"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -139,12 +205,36 @@ defmodule Condition do
           text: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Condition.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Condition.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Condition.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Condition.date"}
+
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Condition.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Condition.temp"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Condition.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Condition.text"}
+
   def from_map(m) do
     %Condition{
-      code: m["code"],
-      date: m["date"],
-      temp: m["temp"],
-      text: m["text"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      temp: decode_temp(m["temp"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -228,13 +318,43 @@ defmodule Forecast do
           text: Text.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Forecast.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Forecast.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Forecast.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Forecast.date"}
+
+  def decode_day(value) when is_binary(value), do: value
+  def decode_day(_), do: {:error, "Unexpected type when decoding Forecast.day"}
+
+  def encode_day(value) when is_binary(value), do: value
+  def encode_day(_), do: {:error, "Unexpected type when encoding Forecast.day"}
+
+  def decode_high(value) when is_binary(value), do: value
+  def decode_high(_), do: {:error, "Unexpected type when decoding Forecast.high"}
+
+  def encode_high(value) when is_binary(value), do: value
+  def encode_high(_), do: {:error, "Unexpected type when encoding Forecast.high"}
+
+  def decode_low(value) when is_binary(value), do: value
+  def decode_low(_), do: {:error, "Unexpected type when decoding Forecast.low"}
+
+  def encode_low(value) when is_binary(value), do: value
+  def encode_low(_), do: {:error, "Unexpected type when encoding Forecast.low"}
+
   def from_map(m) do
     %Forecast{
-      code: m["code"],
-      date: m["date"],
-      day: m["day"],
-      high: m["high"],
-      low: m["low"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      day: decode_day(m["day"]),
+      high: decode_high(m["high"]),
+      low: decode_low(m["low"]),
       text: Text.decode(m["text"]),
     }
   end
@@ -271,9 +391,15 @@ defmodule GUID do
           is_perma_link: String.t()
         }
 
+  def decode_is_perma_link(value) when is_binary(value), do: value
+  def decode_is_perma_link(_), do: {:error, "Unexpected type when decoding GUID.is_perma_link"}
+
+  def encode_is_perma_link(value) when is_binary(value), do: value
+  def encode_is_perma_link(_), do: {:error, "Unexpected type when encoding GUID.is_perma_link"}
+
   def from_map(m) do
     %GUID{
-      is_perma_link: m["isPermaLink"],
+      is_perma_link: decode_is_perma_link(m["isPermaLink"]),
     }
   end
 
@@ -312,17 +438,59 @@ defmodule Item do
           title: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Item.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Item.description"}
+
+  def decode_forecast(value) when is_list(value), do: value
+  def decode_forecast(_), do: {:error, "Unexpected type when decoding Item.forecast"}
+
+  def encode_forecast(value) when is_list(value), do: value
+  def encode_forecast(_), do: {:error, "Unexpected type when encoding Item.forecast"}
+
+  def decode_lat(value) when is_binary(value), do: value
+  def decode_lat(_), do: {:error, "Unexpected type when decoding Item.lat"}
+
+  def encode_lat(value) when is_binary(value), do: value
+  def encode_lat(_), do: {:error, "Unexpected type when encoding Item.lat"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Item.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Item.link"}
+
+  def decode_long(value) when is_binary(value), do: value
+  def decode_long(_), do: {:error, "Unexpected type when decoding Item.long"}
+
+  def encode_long(value) when is_binary(value), do: value
+  def encode_long(_), do: {:error, "Unexpected type when encoding Item.long"}
+
+  def decode_pub_date(value) when is_binary(value), do: value
+  def decode_pub_date(_), do: {:error, "Unexpected type when decoding Item.pub_date"}
+
+  def encode_pub_date(value) when is_binary(value), do: value
+  def encode_pub_date(_), do: {:error, "Unexpected type when encoding Item.pub_date"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Item.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Item.title"}
+
   def from_map(m) do
     %Item{
       condition: Condition.from_map(m["condition"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       forecast: Enum.map(m["forecast"], &Forecast.from_map/1),
       guid: GUID.from_map(m["guid"]),
-      lat: m["lat"],
-      link: m["link"],
-      long: m["long"],
-      pub_date: m["pubDate"],
-      title: m["title"],
+      lat: decode_lat(m["lat"]),
+      link: decode_link(m["link"]),
+      long: decode_long(m["long"]),
+      pub_date: decode_pub_date(m["pubDate"]),
+      title: decode_title(m["title"]),
     }
   end
 
@@ -363,11 +531,29 @@ defmodule Location do
           region: String.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding Location.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding Location.city"}
+
+  def decode_country(value) when is_binary(value), do: value
+  def decode_country(_), do: {:error, "Unexpected type when decoding Location.country"}
+
+  def encode_country(value) when is_binary(value), do: value
+  def encode_country(_), do: {:error, "Unexpected type when encoding Location.country"}
+
+  def decode_region(value) when is_binary(value), do: value
+  def decode_region(_), do: {:error, "Unexpected type when decoding Location.region"}
+
+  def encode_region(value) when is_binary(value), do: value
+  def encode_region(_), do: {:error, "Unexpected type when encoding Location.region"}
+
   def from_map(m) do
     %Location{
-      city: m["city"],
-      country: m["country"],
-      region: m["region"],
+      city: decode_city(m["city"]),
+      country: decode_country(m["country"]),
+      region: decode_region(m["region"]),
     }
   end
 
@@ -403,12 +589,36 @@ defmodule Units do
           temperature: String.t()
         }
 
+  def decode_distance(value) when is_binary(value), do: value
+  def decode_distance(_), do: {:error, "Unexpected type when decoding Units.distance"}
+
+  def encode_distance(value) when is_binary(value), do: value
+  def encode_distance(_), do: {:error, "Unexpected type when encoding Units.distance"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Units.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Units.pressure"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Units.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Units.speed"}
+
+  def decode_temperature(value) when is_binary(value), do: value
+  def decode_temperature(_), do: {:error, "Unexpected type when decoding Units.temperature"}
+
+  def encode_temperature(value) when is_binary(value), do: value
+  def encode_temperature(_), do: {:error, "Unexpected type when encoding Units.temperature"}
+
   def from_map(m) do
     %Units{
-      distance: m["distance"],
-      pressure: m["pressure"],
-      speed: m["speed"],
-      temperature: m["temperature"],
+      distance: decode_distance(m["distance"]),
+      pressure: decode_pressure(m["pressure"]),
+      speed: decode_speed(m["speed"]),
+      temperature: decode_temperature(m["temperature"]),
     }
   end
 
@@ -444,11 +654,29 @@ defmodule Wind do
           speed: String.t()
         }
 
+  def decode_chill(value) when is_binary(value), do: value
+  def decode_chill(_), do: {:error, "Unexpected type when decoding Wind.chill"}
+
+  def encode_chill(value) when is_binary(value), do: value
+  def encode_chill(_), do: {:error, "Unexpected type when encoding Wind.chill"}
+
+  def decode_direction(value) when is_binary(value), do: value
+  def decode_direction(_), do: {:error, "Unexpected type when decoding Wind.direction"}
+
+  def encode_direction(value) when is_binary(value), do: value
+  def encode_direction(_), do: {:error, "Unexpected type when encoding Wind.direction"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Wind.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Wind.speed"}
+
   def from_map(m) do
     %Wind{
-      chill: m["chill"],
-      direction: m["direction"],
-      speed: m["speed"],
+      chill: decode_chill(m["chill"]),
+      direction: decode_direction(m["direction"]),
+      speed: decode_speed(m["speed"]),
     }
   end
 
@@ -493,19 +721,55 @@ defmodule Channel do
           wind: Wind.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Channel.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Channel.description"}
+
+  def decode_language(value) when is_binary(value), do: value
+  def decode_language(_), do: {:error, "Unexpected type when decoding Channel.language"}
+
+  def encode_language(value) when is_binary(value), do: value
+  def encode_language(_), do: {:error, "Unexpected type when encoding Channel.language"}
+
+  def decode_last_build_date(value) when is_binary(value), do: value
+  def decode_last_build_date(_), do: {:error, "Unexpected type when decoding Channel.last_build_date"}
+
+  def encode_last_build_date(value) when is_binary(value), do: value
+  def encode_last_build_date(_), do: {:error, "Unexpected type when encoding Channel.last_build_date"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Channel.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Channel.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Channel.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Channel.title"}
+
+  def decode_ttl(value) when is_binary(value), do: value
+  def decode_ttl(_), do: {:error, "Unexpected type when decoding Channel.ttl"}
+
+  def encode_ttl(value) when is_binary(value), do: value
+  def encode_ttl(_), do: {:error, "Unexpected type when encoding Channel.ttl"}
+
   def from_map(m) do
     %Channel{
       astronomy: Astronomy.from_map(m["astronomy"]),
       atmosphere: Atmosphere.from_map(m["atmosphere"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       image: Image.from_map(m["image"]),
       item: Item.from_map(m["item"]),
-      language: m["language"],
-      last_build_date: m["lastBuildDate"],
-      link: m["link"],
+      language: decode_language(m["language"]),
+      last_build_date: decode_last_build_date(m["lastBuildDate"]),
+      link: decode_link(m["link"]),
       location: Location.from_map(m["location"]),
-      title: m["title"],
-      ttl: m["ttl"],
+      title: decode_title(m["title"]),
+      ttl: decode_ttl(m["ttl"]),
       units: Units.from_map(m["units"]),
       wind: Wind.from_map(m["wind"]),
     }
@@ -586,11 +850,29 @@ defmodule Query do
           results: Results.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Query.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Query.count"}
+
+  def decode_created(value) when is_binary(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding Query.created"}
+
+  def encode_created(value) when is_binary(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding Query.created"}
+
+  def decode_lang(value) when is_binary(value), do: value
+  def decode_lang(_), do: {:error, "Unexpected type when decoding Query.lang"}
+
+  def encode_lang(value) when is_binary(value), do: value
+  def encode_lang(_), do: {:error, "Unexpected type when encoding Query.lang"}
+
   def from_map(m) do
     %Query{
-      count: m["count"],
-      created: m["created"],
-      lang: m["lang"],
+      count: decode_count(m["count"]),
+      created: decode_created(m["created"]),
+      lang: decode_lang(m["lang"]),
       results: Results.from_map(m["results"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/421d4.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/421d4.json/default/QuickType.ex
index 4876cc5..3db23cc 100644
--- a/base/elixir/test/inputs/json/misc/421d4.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/421d4.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Top do
           item: String.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Top.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Top.count"}
+
+  def decode_item(value) when is_binary(value), do: value
+  def decode_item(_), do: {:error, "Unexpected type when decoding Top.item"}
+
+  def encode_item(value) when is_binary(value), do: value
+  def encode_item(_), do: {:error, "Unexpected type when encoding Top.item"}
+
   def from_map(m) do
     %Top{
-      count: m["count"],
-      item: m["item"],
+      count: decode_count(m["count"]),
+      item: decode_item(m["item"]),
     }
   end
 
@@ -55,12 +67,24 @@ defmodule CachedContents do
           top: [Top.t()] | nil
         }
 
+  def decode_non_null(value) when is_integer(value), do: value
+  def decode_non_null(_), do: {:error, "Unexpected type when decoding CachedContents.non_null"}
+
+  def encode_non_null(value) when is_integer(value), do: value
+  def encode_non_null(_), do: {:error, "Unexpected type when encoding CachedContents.non_null"}
+
+  def decode_null(value) when is_integer(value), do: value
+  def decode_null(_), do: {:error, "Unexpected type when decoding CachedContents.null"}
+
+  def encode_null(value) when is_integer(value), do: value
+  def encode_null(_), do: {:error, "Unexpected type when encoding CachedContents.null"}
+
   def from_map(m) do
     %CachedContents{
       average: m["average"],
       largest: m["largest"],
-      non_null: m["non_null"],
-      null: m["null"],
+      non_null: decode_non_null(m["non_null"]),
+      null: decode_null(m["null"]),
       smallest: m["smallest"],
       sum: m["sum"],
       top: m["top"] && Enum.map(m["top"], &Top.from_map/1),
@@ -139,17 +163,53 @@ defmodule Column do
           width: integer() | nil
         }
 
+  def decode_data_type_name(value) when is_binary(value), do: value
+  def decode_data_type_name(_), do: {:error, "Unexpected type when decoding Column.data_type_name"}
+
+  def encode_data_type_name(value) when is_binary(value), do: value
+  def encode_data_type_name(_), do: {:error, "Unexpected type when encoding Column.data_type_name"}
+
+  def decode_field_name(value) when is_binary(value), do: value
+  def decode_field_name(_), do: {:error, "Unexpected type when decoding Column.field_name"}
+
+  def encode_field_name(value) when is_binary(value), do: value
+  def encode_field_name(_), do: {:error, "Unexpected type when encoding Column.field_name"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Column.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Column.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Column.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Column.name"}
+
+  def decode_position(value) when is_integer(value), do: value
+  def decode_position(_), do: {:error, "Unexpected type when decoding Column.position"}
+
+  def encode_position(value) when is_integer(value), do: value
+  def encode_position(_), do: {:error, "Unexpected type when encoding Column.position"}
+
+  def decode_render_type_name(value) when is_binary(value), do: value
+  def decode_render_type_name(_), do: {:error, "Unexpected type when decoding Column.render_type_name"}
+
+  def encode_render_type_name(value) when is_binary(value), do: value
+  def encode_render_type_name(_), do: {:error, "Unexpected type when encoding Column.render_type_name"}
+
   def from_map(m) do
     %Column{
       cached_contents: m["cachedContents"] && CachedContents.from_map(m["cachedContents"]),
-      data_type_name: m["dataTypeName"],
-      field_name: m["fieldName"],
+      data_type_name: decode_data_type_name(m["dataTypeName"]),
+      field_name: decode_field_name(m["fieldName"]),
       flags: m["flags"],
       format: Query.from_map(m["format"]),
-      id: m["id"],
-      name: m["name"],
-      position: m["position"],
-      render_type_name: m["renderTypeName"],
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
+      position: decode_position(m["position"]),
+      render_type_name: decode_render_type_name(m["renderTypeName"]),
       table_column_id: m["tableColumnId"],
       width: m["width"],
     }
@@ -194,11 +254,29 @@ defmodule Grant do
           type: String.t()
         }
 
+  def decode_flags(value) when is_list(value), do: value
+  def decode_flags(_), do: {:error, "Unexpected type when decoding Grant.flags"}
+
+  def encode_flags(value) when is_list(value), do: value
+  def encode_flags(_), do: {:error, "Unexpected type when encoding Grant.flags"}
+
+  def decode_inherited(value) when is_boolean(value), do: value
+  def decode_inherited(_), do: {:error, "Unexpected type when decoding Grant.inherited"}
+
+  def encode_inherited(value) when is_boolean(value), do: value
+  def encode_inherited(_), do: {:error, "Unexpected type when encoding Grant.inherited"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Grant.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Grant.type"}
+
   def from_map(m) do
     %Grant{
-      flags: m["flags"],
-      inherited: m["inherited"],
-      type: m["type"],
+      flags: decode_flags(m["flags"]),
+      inherited: decode_inherited(m["inherited"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -231,9 +309,15 @@ defmodule License do
           name: String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding License.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding License.name"}
+
   def from_map(m) do
     %License{
-      name: m["name"],
+      name: decode_name(m["name"]),
     }
   end
 
@@ -264,9 +348,15 @@ defmodule Visible do
           table: boolean()
         }
 
+  def decode_table(value) when is_boolean(value), do: value
+  def decode_table(_), do: {:error, "Unexpected type when decoding Visible.table"}
+
+  def encode_table(value) when is_boolean(value), do: value
+  def encode_table(_), do: {:error, "Unexpected type when encoding Visible.table"}
+
   def from_map(m) do
     %Visible{
-      table: m["table"],
+      table: decode_table(m["table"]),
     }
   end
 
@@ -334,13 +424,37 @@ defmodule Metadata do
           row_identifier: String.t()
         }
 
+  def decode_available_display_types(value) when is_list(value), do: value
+  def decode_available_display_types(_), do: {:error, "Unexpected type when decoding Metadata.available_display_types"}
+
+  def encode_available_display_types(value) when is_list(value), do: value
+  def encode_available_display_types(_), do: {:error, "Unexpected type when encoding Metadata.available_display_types"}
+
+  def decode_rdf_class(value) when is_binary(value), do: value
+  def decode_rdf_class(_), do: {:error, "Unexpected type when decoding Metadata.rdf_class"}
+
+  def encode_rdf_class(value) when is_binary(value), do: value
+  def encode_rdf_class(_), do: {:error, "Unexpected type when encoding Metadata.rdf_class"}
+
+  def decode_rdf_subject(value) when is_binary(value), do: value
+  def decode_rdf_subject(_), do: {:error, "Unexpected type when decoding Metadata.rdf_subject"}
+
+  def encode_rdf_subject(value) when is_binary(value), do: value
+  def encode_rdf_subject(_), do: {:error, "Unexpected type when encoding Metadata.rdf_subject"}
+
+  def decode_row_identifier(value) when is_binary(value), do: value
+  def decode_row_identifier(_), do: {:error, "Unexpected type when decoding Metadata.row_identifier"}
+
+  def encode_row_identifier(value) when is_binary(value), do: value
+  def encode_row_identifier(_), do: {:error, "Unexpected type when encoding Metadata.row_identifier"}
+
   def from_map(m) do
     %Metadata{
-      available_display_types: m["availableDisplayTypes"],
-      rdf_class: m["rdfClass"],
-      rdf_subject: m["rdfSubject"],
+      available_display_types: decode_available_display_types(m["availableDisplayTypes"]),
+      rdf_class: decode_rdf_class(m["rdfClass"]),
+      rdf_subject: decode_rdf_subject(m["rdfSubject"]),
       render_type_config: RenderTypeConfig.from_map(m["renderTypeConfig"]),
-      row_identifier: m["rowIdentifier"],
+      row_identifier: decode_row_identifier(m["rowIdentifier"]),
     }
   end
 
@@ -377,11 +491,29 @@ defmodule Owner do
           screen_name: String.t()
         }
 
+  def decode_display_name(value) when is_binary(value), do: value
+  def decode_display_name(_), do: {:error, "Unexpected type when decoding Owner.display_name"}
+
+  def encode_display_name(value) when is_binary(value), do: value
+  def encode_display_name(_), do: {:error, "Unexpected type when encoding Owner.display_name"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Owner.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Owner.id"}
+
+  def decode_screen_name(value) when is_binary(value), do: value
+  def decode_screen_name(_), do: {:error, "Unexpected type when decoding Owner.screen_name"}
+
+  def encode_screen_name(value) when is_binary(value), do: value
+  def encode_screen_name(_), do: {:error, "Unexpected type when encoding Owner.screen_name"}
+
   def from_map(m) do
     %Owner{
-      display_name: m["displayName"],
-      id: m["id"],
-      screen_name: m["screenName"],
+      display_name: decode_display_name(m["displayName"]),
+      id: decode_id(m["id"]),
+      screen_name: decode_screen_name(m["screenName"]),
     }
   end
 
@@ -453,48 +585,258 @@ defmodule View do
           view_type: String.t()
         }
 
+  def decode_attribution(value) when is_binary(value), do: value
+  def decode_attribution(_), do: {:error, "Unexpected type when decoding View.attribution"}
+
+  def encode_attribution(value) when is_binary(value), do: value
+  def encode_attribution(_), do: {:error, "Unexpected type when encoding View.attribution"}
+
+  def decode_average_rating(value) when is_integer(value), do: value
+  def decode_average_rating(_), do: {:error, "Unexpected type when decoding View.average_rating"}
+
+  def encode_average_rating(value) when is_integer(value), do: value
+  def encode_average_rating(_), do: {:error, "Unexpected type when encoding View.average_rating"}
+
+  def decode_category(value) when is_binary(value), do: value
+  def decode_category(_), do: {:error, "Unexpected type when decoding View.category"}
+
+  def encode_category(value) when is_binary(value), do: value
+  def encode_category(_), do: {:error, "Unexpected type when encoding View.category"}
+
+  def decode_columns(value) when is_list(value), do: value
+  def decode_columns(_), do: {:error, "Unexpected type when decoding View.columns"}
+
+  def encode_columns(value) when is_list(value), do: value
+  def encode_columns(_), do: {:error, "Unexpected type when encoding View.columns"}
+
+  def decode_created_at(value) when is_integer(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding View.created_at"}
+
+  def encode_created_at(value) when is_integer(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding View.created_at"}
+
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding View.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding View.description"}
+
+  def decode_display_type(value) when is_binary(value), do: value
+  def decode_display_type(_), do: {:error, "Unexpected type when decoding View.display_type"}
+
+  def encode_display_type(value) when is_binary(value), do: value
+  def encode_display_type(_), do: {:error, "Unexpected type when encoding View.display_type"}
+
+  def decode_download_count(value) when is_integer(value), do: value
+  def decode_download_count(_), do: {:error, "Unexpected type when decoding View.download_count"}
+
+  def encode_download_count(value) when is_integer(value), do: value
+  def encode_download_count(_), do: {:error, "Unexpected type when encoding View.download_count"}
+
+  def decode_flags(value) when is_list(value), do: value
+  def decode_flags(_), do: {:error, "Unexpected type when decoding View.flags"}
+
+  def encode_flags(value) when is_list(value), do: value
+  def encode_flags(_), do: {:error, "Unexpected type when encoding View.flags"}
+
+  def decode_grants(value) when is_list(value), do: value
+  def decode_grants(_), do: {:error, "Unexpected type when decoding View.grants"}
+
+  def encode_grants(value) when is_list(value), do: value
+  def encode_grants(_), do: {:error, "Unexpected type when encoding View.grants"}
+
+  def decode_hide_from_catalog(value) when is_boolean(value), do: value
+  def decode_hide_from_catalog(_), do: {:error, "Unexpected type when decoding View.hide_from_catalog"}
+
+  def encode_hide_from_catalog(value) when is_boolean(value), do: value
+  def encode_hide_from_catalog(_), do: {:error, "Unexpected type when encoding View.hide_from_catalog"}
+
+  def decode_hide_from_data_json(value) when is_boolean(value), do: value
+  def decode_hide_from_data_json(_), do: {:error, "Unexpected type when decoding View.hide_from_data_json"}
+
+  def encode_hide_from_data_json(value) when is_boolean(value), do: value
+  def encode_hide_from_data_json(_), do: {:error, "Unexpected type when encoding View.hide_from_data_json"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding View.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding View.id"}
+
+  def decode_index_updated_at(value) when is_integer(value), do: value
+  def decode_index_updated_at(_), do: {:error, "Unexpected type when decoding View.index_updated_at"}
+
+  def encode_index_updated_at(value) when is_integer(value), do: value
+  def encode_index_updated_at(_), do: {:error, "Unexpected type when encoding View.index_updated_at"}
+
+  def decode_license_id(value) when is_binary(value), do: value
+  def decode_license_id(_), do: {:error, "Unexpected type when decoding View.license_id"}
+
+  def encode_license_id(value) when is_binary(value), do: value
+  def encode_license_id(_), do: {:error, "Unexpected type when encoding View.license_id"}
+
+  def decode_locale(value) when is_binary(value), do: value
+  def decode_locale(_), do: {:error, "Unexpected type when decoding View.locale"}
+
+  def encode_locale(value) when is_binary(value), do: value
+  def encode_locale(_), do: {:error, "Unexpected type when encoding View.locale"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding View.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding View.name"}
+
+  def decode_new_backend(value) when is_boolean(value), do: value
+  def decode_new_backend(_), do: {:error, "Unexpected type when decoding View.new_backend"}
+
+  def encode_new_backend(value) when is_boolean(value), do: value
+  def encode_new_backend(_), do: {:error, "Unexpected type when encoding View.new_backend"}
+
+  def decode_number_of_comments(value) when is_integer(value), do: value
+  def decode_number_of_comments(_), do: {:error, "Unexpected type when decoding View.number_of_comments"}
+
+  def encode_number_of_comments(value) when is_integer(value), do: value
+  def encode_number_of_comments(_), do: {:error, "Unexpected type when encoding View.number_of_comments"}
+
+  def decode_oid(value) when is_integer(value), do: value
+  def decode_oid(_), do: {:error, "Unexpected type when decoding View.oid"}
+
+  def encode_oid(value) when is_integer(value), do: value
+  def encode_oid(_), do: {:error, "Unexpected type when encoding View.oid"}
+
+  def decode_provenance(value) when is_binary(value), do: value
+  def decode_provenance(_), do: {:error, "Unexpected type when decoding View.provenance"}
+
+  def encode_provenance(value) when is_binary(value), do: value
+  def encode_provenance(_), do: {:error, "Unexpected type when encoding View.provenance"}
+
+  def decode_publication_append_enabled(value) when is_boolean(value), do: value
+  def decode_publication_append_enabled(_), do: {:error, "Unexpected type when decoding View.publication_append_enabled"}
+
+  def encode_publication_append_enabled(value) when is_boolean(value), do: value
+  def encode_publication_append_enabled(_), do: {:error, "Unexpected type when encoding View.publication_append_enabled"}
+
+  def decode_publication_date(value) when is_integer(value), do: value
+  def decode_publication_date(_), do: {:error, "Unexpected type when decoding View.publication_date"}
+
+  def encode_publication_date(value) when is_integer(value), do: value
+  def encode_publication_date(_), do: {:error, "Unexpected type when encoding View.publication_date"}
+
+  def decode_publication_group(value) when is_integer(value), do: value
+  def decode_publication_group(_), do: {:error, "Unexpected type when decoding View.publication_group"}
+
+  def encode_publication_group(value) when is_integer(value), do: value
+  def encode_publication_group(_), do: {:error, "Unexpected type when encoding View.publication_group"}
+
+  def decode_publication_stage(value) when is_binary(value), do: value
+  def decode_publication_stage(_), do: {:error, "Unexpected type when decoding View.publication_stage"}
+
+  def encode_publication_stage(value) when is_binary(value), do: value
+  def encode_publication_stage(_), do: {:error, "Unexpected type when encoding View.publication_stage"}
+
+  def decode_rights(value) when is_list(value), do: value
+  def decode_rights(_), do: {:error, "Unexpected type when decoding View.rights"}
+
+  def encode_rights(value) when is_list(value), do: value
+  def encode_rights(_), do: {:error, "Unexpected type when encoding View.rights"}
+
+  def decode_row_class(value) when is_binary(value), do: value
+  def decode_row_class(_), do: {:error, "Unexpected type when decoding View.row_class"}
+
+  def encode_row_class(value) when is_binary(value), do: value
+  def encode_row_class(_), do: {:error, "Unexpected type when encoding View.row_class"}
+
+  def decode_rows_updated_at(value) when is_integer(value), do: value
+  def decode_rows_updated_at(_), do: {:error, "Unexpected type when decoding View.rows_updated_at"}
+
+  def encode_rows_updated_at(value) when is_integer(value), do: value
+  def encode_rows_updated_at(_), do: {:error, "Unexpected type when encoding View.rows_updated_at"}
+
+  def decode_rows_updated_by(value) when is_binary(value), do: value
+  def decode_rows_updated_by(_), do: {:error, "Unexpected type when decoding View.rows_updated_by"}
+
+  def encode_rows_updated_by(value) when is_binary(value), do: value
+  def encode_rows_updated_by(_), do: {:error, "Unexpected type when encoding View.rows_updated_by"}
+
+  def decode_table_id(value) when is_integer(value), do: value
+  def decode_table_id(_), do: {:error, "Unexpected type when decoding View.table_id"}
+
+  def encode_table_id(value) when is_integer(value), do: value
+  def encode_table_id(_), do: {:error, "Unexpected type when encoding View.table_id"}
+
+  def decode_tags(value) when is_list(value), do: value
+  def decode_tags(_), do: {:error, "Unexpected type when decoding View.tags"}
+
+  def encode_tags(value) when is_list(value), do: value
+  def encode_tags(_), do: {:error, "Unexpected type when encoding View.tags"}
+
+  def decode_total_times_rated(value) when is_integer(value), do: value
+  def decode_total_times_rated(_), do: {:error, "Unexpected type when decoding View.total_times_rated"}
+
+  def encode_total_times_rated(value) when is_integer(value), do: value
+  def encode_total_times_rated(_), do: {:error, "Unexpected type when encoding View.total_times_rated"}
+
+  def decode_view_count(value) when is_integer(value), do: value
+  def decode_view_count(_), do: {:error, "Unexpected type when decoding View.view_count"}
+
+  def encode_view_count(value) when is_integer(value), do: value
+  def encode_view_count(_), do: {:error, "Unexpected type when encoding View.view_count"}
+
+  def decode_view_last_modified(value) when is_integer(value), do: value
+  def decode_view_last_modified(_), do: {:error, "Unexpected type when decoding View.view_last_modified"}
+
+  def encode_view_last_modified(value) when is_integer(value), do: value
+  def encode_view_last_modified(_), do: {:error, "Unexpected type when encoding View.view_last_modified"}
+
+  def decode_view_type(value) when is_binary(value), do: value
+  def decode_view_type(_), do: {:error, "Unexpected type when decoding View.view_type"}
+
+  def encode_view_type(value) when is_binary(value), do: value
+  def encode_view_type(_), do: {:error, "Unexpected type when encoding View.view_type"}
+
   def from_map(m) do
     %View{
-      attribution: m["attribution"],
-      average_rating: m["averageRating"],
-      category: m["category"],
+      attribution: decode_attribution(m["attribution"]),
+      average_rating: decode_average_rating(m["averageRating"]),
+      category: decode_category(m["category"]),
       columns: Enum.map(m["columns"], &Column.from_map/1),
-      created_at: m["createdAt"],
-      description: m["description"],
-      display_type: m["displayType"],
-      download_count: m["downloadCount"],
-      flags: m["flags"],
+      created_at: decode_created_at(m["createdAt"]),
+      description: decode_description(m["description"]),
+      display_type: decode_display_type(m["displayType"]),
+      download_count: decode_download_count(m["downloadCount"]),
+      flags: decode_flags(m["flags"]),
       grants: Enum.map(m["grants"], &Grant.from_map/1),
-      hide_from_catalog: m["hideFromCatalog"],
-      hide_from_data_json: m["hideFromDataJson"],
-      id: m["id"],
-      index_updated_at: m["indexUpdatedAt"],
+      hide_from_catalog: decode_hide_from_catalog(m["hideFromCatalog"]),
+      hide_from_data_json: decode_hide_from_data_json(m["hideFromDataJson"]),
+      id: decode_id(m["id"]),
+      index_updated_at: decode_index_updated_at(m["indexUpdatedAt"]),
       license: License.from_map(m["license"]),
-      license_id: m["licenseId"],
-      locale: m["locale"],
+      license_id: decode_license_id(m["licenseId"]),
+      locale: decode_locale(m["locale"]),
       metadata: Metadata.from_map(m["metadata"]),
-      name: m["name"],
-      new_backend: m["newBackend"],
-      number_of_comments: m["numberOfComments"],
-      oid: m["oid"],
+      name: decode_name(m["name"]),
+      new_backend: decode_new_backend(m["newBackend"]),
+      number_of_comments: decode_number_of_comments(m["numberOfComments"]),
+      oid: decode_oid(m["oid"]),
       owner: Owner.from_map(m["owner"]),
-      provenance: m["provenance"],
-      publication_append_enabled: m["publicationAppendEnabled"],
-      publication_date: m["publicationDate"],
-      publication_group: m["publicationGroup"],
-      publication_stage: m["publicationStage"],
+      provenance: decode_provenance(m["provenance"]),
+      publication_append_enabled: decode_publication_append_enabled(m["publicationAppendEnabled"]),
+      publication_date: decode_publication_date(m["publicationDate"]),
+      publication_group: decode_publication_group(m["publicationGroup"]),
+      publication_stage: decode_publication_stage(m["publicationStage"]),
       query: Query.from_map(m["query"]),
-      rights: m["rights"],
-      row_class: m["rowClass"],
-      rows_updated_at: m["rowsUpdatedAt"],
-      rows_updated_by: m["rowsUpdatedBy"],
+      rights: decode_rights(m["rights"]),
+      row_class: decode_row_class(m["rowClass"]),
+      rows_updated_at: decode_rows_updated_at(m["rowsUpdatedAt"]),
+      rows_updated_by: decode_rows_updated_by(m["rowsUpdatedBy"]),
       table_author: Owner.from_map(m["tableAuthor"]),
-      table_id: m["tableId"],
-      tags: m["tags"],
-      total_times_rated: m["totalTimesRated"],
-      view_count: m["viewCount"],
-      view_last_modified: m["viewLastModified"],
-      view_type: m["viewType"],
+      table_id: decode_table_id(m["tableId"]),
+      tags: decode_tags(m["tags"]),
+      total_times_rated: decode_total_times_rated(m["totalTimesRated"]),
+      view_count: decode_view_count(m["viewCount"]),
+      view_last_modified: decode_view_last_modified(m["viewLastModified"]),
+      view_type: decode_view_type(m["viewType"]),
     }
   end
 
@@ -598,9 +940,15 @@ defmodule TopLevel do
           meta: Meta.t()
         }
 
+  def decode_data(value) when is_list(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data(value) when is_list(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
   def from_map(m) do
     %TopLevel{
-      data: m["data"],
+      data: decode_data(m["data"]),
       meta: Meta.from_map(m["meta"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/437e7.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/437e7.json/default/QuickType.ex
index 98b8953..bfd9dd6 100644
--- a/base/elixir/test/inputs/json/misc/437e7.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/437e7.json/default/QuickType.ex
@@ -16,12 +16,30 @@ defmodule Downsized do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Downsized.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Downsized.height"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Downsized.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Downsized.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Downsized.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Downsized.width"}
+
   def from_map(m) do
     %Downsized{
-      height: m["height"],
+      height: decode_height(m["height"]),
       size: m["size"],
-      url: m["url"],
-      width: m["width"],
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -58,12 +76,36 @@ defmodule DownsizedSmall do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding DownsizedSmall.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding DownsizedSmall.height"}
+
+  def decode_mp4(value) when is_binary(value), do: value
+  def decode_mp4(_), do: {:error, "Unexpected type when decoding DownsizedSmall.mp4"}
+
+  def encode_mp4(value) when is_binary(value), do: value
+  def encode_mp4(_), do: {:error, "Unexpected type when encoding DownsizedSmall.mp4"}
+
+  def decode_mp4_size(value) when is_binary(value), do: value
+  def decode_mp4_size(_), do: {:error, "Unexpected type when decoding DownsizedSmall.mp4_size"}
+
+  def encode_mp4_size(value) when is_binary(value), do: value
+  def encode_mp4_size(_), do: {:error, "Unexpected type when encoding DownsizedSmall.mp4_size"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding DownsizedSmall.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding DownsizedSmall.width"}
+
   def from_map(m) do
     %DownsizedSmall{
-      height: m["height"],
-      mp4: m["mp4"],
-      mp4_size: m["mp4_size"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      mp4: decode_mp4(m["mp4"]),
+      mp4_size: decode_mp4_size(m["mp4_size"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -105,17 +147,53 @@ defmodule FixedHeight do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding FixedHeight.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding FixedHeight.height"}
+
+  def decode_size(value) when is_binary(value), do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding FixedHeight.size"}
+
+  def encode_size(value) when is_binary(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding FixedHeight.size"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding FixedHeight.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding FixedHeight.url"}
+
+  def decode_webp(value) when is_binary(value), do: value
+  def decode_webp(_), do: {:error, "Unexpected type when decoding FixedHeight.webp"}
+
+  def encode_webp(value) when is_binary(value), do: value
+  def encode_webp(_), do: {:error, "Unexpected type when encoding FixedHeight.webp"}
+
+  def decode_webp_size(value) when is_binary(value), do: value
+  def decode_webp_size(_), do: {:error, "Unexpected type when decoding FixedHeight.webp_size"}
+
+  def encode_webp_size(value) when is_binary(value), do: value
+  def encode_webp_size(_), do: {:error, "Unexpected type when encoding FixedHeight.webp_size"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding FixedHeight.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding FixedHeight.width"}
+
   def from_map(m) do
     %FixedHeight{
       frames: m["frames"],
-      height: m["height"],
+      height: decode_height(m["height"]),
       mp4: m["mp4"],
       mp4_size: m["mp4_size"],
-      size: m["size"],
-      url: m["url"],
-      webp: m["webp"],
-      webp_size: m["webp_size"],
-      width: m["width"],
+      size: decode_size(m["size"]),
+      url: decode_url(m["url"]),
+      webp: decode_webp(m["webp"]),
+      webp_size: decode_webp_size(m["webp_size"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -155,10 +233,22 @@ defmodule Looping do
           mp4_size: String.t()
         }
 
+  def decode_mp4(value) when is_binary(value), do: value
+  def decode_mp4(_), do: {:error, "Unexpected type when decoding Looping.mp4"}
+
+  def encode_mp4(value) when is_binary(value), do: value
+  def encode_mp4(_), do: {:error, "Unexpected type when encoding Looping.mp4"}
+
+  def decode_mp4_size(value) when is_binary(value), do: value
+  def decode_mp4_size(_), do: {:error, "Unexpected type when decoding Looping.mp4_size"}
+
+  def encode_mp4_size(value) when is_binary(value), do: value
+  def encode_mp4_size(_), do: {:error, "Unexpected type when encoding Looping.mp4_size"}
+
   def from_map(m) do
     %Looping{
-      mp4: m["mp4"],
-      mp4_size: m["mp4_size"],
+      mp4: decode_mp4(m["mp4"]),
+      mp4_size: decode_mp4_size(m["mp4_size"]),
     }
   end
 
@@ -384,14 +474,50 @@ defmodule User do
           username: String.t()
         }
 
+  def decode_avatar_url(value) when is_binary(value), do: value
+  def decode_avatar_url(_), do: {:error, "Unexpected type when decoding User.avatar_url"}
+
+  def encode_avatar_url(value) when is_binary(value), do: value
+  def encode_avatar_url(_), do: {:error, "Unexpected type when encoding User.avatar_url"}
+
+  def decode_banner_url(value) when is_binary(value), do: value
+  def decode_banner_url(_), do: {:error, "Unexpected type when decoding User.banner_url"}
+
+  def encode_banner_url(value) when is_binary(value), do: value
+  def encode_banner_url(_), do: {:error, "Unexpected type when encoding User.banner_url"}
+
+  def decode_display_name(value) when is_binary(value), do: value
+  def decode_display_name(_), do: {:error, "Unexpected type when decoding User.display_name"}
+
+  def encode_display_name(value) when is_binary(value), do: value
+  def encode_display_name(_), do: {:error, "Unexpected type when encoding User.display_name"}
+
+  def decode_profile_url(value) when is_binary(value), do: value
+  def decode_profile_url(_), do: {:error, "Unexpected type when decoding User.profile_url"}
+
+  def encode_profile_url(value) when is_binary(value), do: value
+  def encode_profile_url(_), do: {:error, "Unexpected type when encoding User.profile_url"}
+
+  def decode_twitter(value) when is_binary(value), do: value
+  def decode_twitter(_), do: {:error, "Unexpected type when decoding User.twitter"}
+
+  def encode_twitter(value) when is_binary(value), do: value
+  def encode_twitter(_), do: {:error, "Unexpected type when encoding User.twitter"}
+
+  def decode_username(value) when is_binary(value), do: value
+  def decode_username(_), do: {:error, "Unexpected type when decoding User.username"}
+
+  def encode_username(value) when is_binary(value), do: value
+  def encode_username(_), do: {:error, "Unexpected type when encoding User.username"}
+
   def from_map(m) do
     %User{
-      avatar_url: m["avatar_url"],
-      banner_url: m["banner_url"],
-      display_name: m["display_name"],
-      profile_url: m["profile_url"],
-      twitter: m["twitter"],
-      username: m["username"],
+      avatar_url: decode_avatar_url(m["avatar_url"]),
+      banner_url: decode_banner_url(m["banner_url"]),
+      display_name: decode_display_name(m["display_name"]),
+      profile_url: decode_profile_url(m["profile_url"]),
+      twitter: decode_twitter(m["twitter"]),
+      username: decode_username(m["username"]),
     }
   end
 
@@ -444,26 +570,110 @@ defmodule Datum do
           username: String.t()
         }
 
+  def decode_bitly_gif_url(value) when is_binary(value), do: value
+  def decode_bitly_gif_url(_), do: {:error, "Unexpected type when decoding Datum.bitly_gif_url"}
+
+  def encode_bitly_gif_url(value) when is_binary(value), do: value
+  def encode_bitly_gif_url(_), do: {:error, "Unexpected type when encoding Datum.bitly_gif_url"}
+
+  def decode_bitly_url(value) when is_binary(value), do: value
+  def decode_bitly_url(_), do: {:error, "Unexpected type when decoding Datum.bitly_url"}
+
+  def encode_bitly_url(value) when is_binary(value), do: value
+  def encode_bitly_url(_), do: {:error, "Unexpected type when encoding Datum.bitly_url"}
+
+  def decode_content_url(value) when is_binary(value), do: value
+  def decode_content_url(_), do: {:error, "Unexpected type when decoding Datum.content_url"}
+
+  def encode_content_url(value) when is_binary(value), do: value
+  def encode_content_url(_), do: {:error, "Unexpected type when encoding Datum.content_url"}
+
+  def decode_embed_url(value) when is_binary(value), do: value
+  def decode_embed_url(_), do: {:error, "Unexpected type when decoding Datum.embed_url"}
+
+  def encode_embed_url(value) when is_binary(value), do: value
+  def encode_embed_url(_), do: {:error, "Unexpected type when encoding Datum.embed_url"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Datum.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Datum.id"}
+
+  def decode_import_datetime(value) when is_binary(value), do: value
+  def decode_import_datetime(_), do: {:error, "Unexpected type when decoding Datum.import_datetime"}
+
+  def encode_import_datetime(value) when is_binary(value), do: value
+  def encode_import_datetime(_), do: {:error, "Unexpected type when encoding Datum.import_datetime"}
+
+  def decode_is_indexable(value) when is_integer(value), do: value
+  def decode_is_indexable(_), do: {:error, "Unexpected type when decoding Datum.is_indexable"}
+
+  def encode_is_indexable(value) when is_integer(value), do: value
+  def encode_is_indexable(_), do: {:error, "Unexpected type when encoding Datum.is_indexable"}
+
+  def decode_slug(value) when is_binary(value), do: value
+  def decode_slug(_), do: {:error, "Unexpected type when decoding Datum.slug"}
+
+  def encode_slug(value) when is_binary(value), do: value
+  def encode_slug(_), do: {:error, "Unexpected type when encoding Datum.slug"}
+
+  def decode_source(value) when is_binary(value), do: value
+  def decode_source(_), do: {:error, "Unexpected type when decoding Datum.source"}
+
+  def encode_source(value) when is_binary(value), do: value
+  def encode_source(_), do: {:error, "Unexpected type when encoding Datum.source"}
+
+  def decode_source_post_url(value) when is_binary(value), do: value
+  def decode_source_post_url(_), do: {:error, "Unexpected type when decoding Datum.source_post_url"}
+
+  def encode_source_post_url(value) when is_binary(value), do: value
+  def encode_source_post_url(_), do: {:error, "Unexpected type when encoding Datum.source_post_url"}
+
+  def decode_source_tld(value) when is_binary(value), do: value
+  def decode_source_tld(_), do: {:error, "Unexpected type when decoding Datum.source_tld"}
+
+  def encode_source_tld(value) when is_binary(value), do: value
+  def encode_source_tld(_), do: {:error, "Unexpected type when encoding Datum.source_tld"}
+
+  def decode_trending_datetime(value) when is_binary(value), do: value
+  def decode_trending_datetime(_), do: {:error, "Unexpected type when decoding Datum.trending_datetime"}
+
+  def encode_trending_datetime(value) when is_binary(value), do: value
+  def encode_trending_datetime(_), do: {:error, "Unexpected type when encoding Datum.trending_datetime"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Datum.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Datum.url"}
+
+  def decode_username(value) when is_binary(value), do: value
+  def decode_username(_), do: {:error, "Unexpected type when decoding Datum.username"}
+
+  def encode_username(value) when is_binary(value), do: value
+  def encode_username(_), do: {:error, "Unexpected type when encoding Datum.username"}
+
   def from_map(m) do
     %Datum{
-      bitly_gif_url: m["bitly_gif_url"],
-      bitly_url: m["bitly_url"],
-      content_url: m["content_url"],
-      embed_url: m["embed_url"],
-      id: m["id"],
+      bitly_gif_url: decode_bitly_gif_url(m["bitly_gif_url"]),
+      bitly_url: decode_bitly_url(m["bitly_url"]),
+      content_url: decode_content_url(m["content_url"]),
+      embed_url: decode_embed_url(m["embed_url"]),
+      id: decode_id(m["id"]),
       images: Images.from_map(m["images"]),
-      import_datetime: m["import_datetime"],
-      is_indexable: m["is_indexable"],
+      import_datetime: decode_import_datetime(m["import_datetime"]),
+      is_indexable: decode_is_indexable(m["is_indexable"]),
       rating: Rating.decode(m["rating"]),
-      slug: m["slug"],
-      source: m["source"],
-      source_post_url: m["source_post_url"],
-      source_tld: m["source_tld"],
-      trending_datetime: m["trending_datetime"],
+      slug: decode_slug(m["slug"]),
+      source: decode_source(m["source"]),
+      source_post_url: decode_source_post_url(m["source_post_url"]),
+      source_tld: decode_source_tld(m["source_tld"]),
+      trending_datetime: decode_trending_datetime(m["trending_datetime"]),
       type: Type.decode(m["type"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
       user: m["user"] && User.from_map(m["user"]),
-      username: m["username"],
+      username: decode_username(m["username"]),
     }
   end
 
@@ -513,11 +723,29 @@ defmodule Meta do
           status: integer()
         }
 
+  def decode_msg(value) when is_binary(value), do: value
+  def decode_msg(_), do: {:error, "Unexpected type when decoding Meta.msg"}
+
+  def encode_msg(value) when is_binary(value), do: value
+  def encode_msg(_), do: {:error, "Unexpected type when encoding Meta.msg"}
+
+  def decode_response_id(value) when is_binary(value), do: value
+  def decode_response_id(_), do: {:error, "Unexpected type when decoding Meta.response_id"}
+
+  def encode_response_id(value) when is_binary(value), do: value
+  def encode_response_id(_), do: {:error, "Unexpected type when encoding Meta.response_id"}
+
+  def decode_status(value) when is_integer(value), do: value
+  def decode_status(_), do: {:error, "Unexpected type when decoding Meta.status"}
+
+  def encode_status(value) when is_integer(value), do: value
+  def encode_status(_), do: {:error, "Unexpected type when encoding Meta.status"}
+
   def from_map(m) do
     %Meta{
-      msg: m["msg"],
-      response_id: m["response_id"],
-      status: m["status"],
+      msg: decode_msg(m["msg"]),
+      response_id: decode_response_id(m["response_id"]),
+      status: decode_status(m["status"]),
     }
   end
 
@@ -552,11 +780,29 @@ defmodule Pagination do
           total_count: integer()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Pagination.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Pagination.count"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding Pagination.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding Pagination.offset"}
+
+  def decode_total_count(value) when is_integer(value), do: value
+  def decode_total_count(_), do: {:error, "Unexpected type when decoding Pagination.total_count"}
+
+  def encode_total_count(value) when is_integer(value), do: value
+  def encode_total_count(_), do: {:error, "Unexpected type when encoding Pagination.total_count"}
+
   def from_map(m) do
     %Pagination{
-      count: m["count"],
-      offset: m["offset"],
-      total_count: m["total_count"],
+      count: decode_count(m["count"]),
+      offset: decode_offset(m["offset"]),
+      total_count: decode_total_count(m["total_count"]),
     }
   end
 
@@ -591,6 +837,12 @@ defmodule TopLevel do
           pagination: Pagination.t()
         }
 
+  def decode_data(value) when is_list(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data(value) when is_list(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
   def from_map(m) do
     %TopLevel{
       data: Enum.map(m["data"], &Datum.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/43970.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/43970.json/default/QuickType.ex
index e0f1a16..ac79d3d 100644
--- a/base/elixir/test/inputs/json/misc/43970.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/43970.json/default/QuickType.ex
@@ -15,11 +15,29 @@ defmodule TopLevelElement do
           notes: String.t()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.name"}
+
+  def decode_notes(value) when is_binary(value), do: value
+  def decode_notes(_), do: {:error, "Unexpected type when decoding TopLevelElement.notes"}
+
+  def encode_notes(value) when is_binary(value), do: value
+  def encode_notes(_), do: {:error, "Unexpected type when encoding TopLevelElement.notes"}
+
   def from_map(m) do
     %TopLevelElement{
-      id: m["ID"],
-      name: m["Name"],
-      notes: m["Notes"],
+      id: decode_id(m["ID"]),
+      name: decode_name(m["Name"]),
+      notes: decode_notes(m["Notes"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/43eaf.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/43eaf.json/default/QuickType.ex
index 8937606..db497b1 100644
--- a/base/elixir/test/inputs/json/misc/43eaf.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/43eaf.json/default/QuickType.ex
@@ -15,11 +15,32 @@ defmodule TopLevel do
           rates: %{String.t() => float()}
         }
 
+  def decode_base(value) when is_binary(value), do: value
+  def decode_base(_), do: {:error, "Unexpected type when decoding TopLevel.base"}
+
+  def encode_base(value) when is_binary(value), do: value
+  def encode_base(_), do: {:error, "Unexpected type when encoding TopLevel.base"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel.date"}
+
+  def decode_rates_value(value) when is_float(value), do: value
+  def decode_rates_value(value) when is_integer(value), do: value
+  def decode_rates_value(_), do: {:error, "Unexpected type when decoding TopLevel.rates"}
+
+  def encode_rates_value(value) when is_float(value), do: value
+  def encode_rates_value(value) when is_integer(value), do: value
+  def encode_rates_value(_), do: {:error, "Unexpected type when encoding TopLevel.rates"}
+
   def from_map(m) do
     %TopLevel{
-      base: m["base"],
-      date: m["date"],
-      rates: m["rates"],
+      base: decode_base(m["base"]),
+      date: decode_date(m["date"]),
+      rates: m["rates"]
+      |> Map.new(fn {key, value} -> {key, decode_rates_value(value)} end),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/458db.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/458db.json/default/QuickType.ex
index 914ab1e..ad40e53 100644
--- a/base/elixir/test/inputs/json/misc/458db.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/458db.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule ResponseInfo do
           status: integer()
         }
 
+  def decode_developer_message(value) when is_binary(value), do: value
+  def decode_developer_message(_), do: {:error, "Unexpected type when decoding ResponseInfo.developer_message"}
+
+  def encode_developer_message(value) when is_binary(value), do: value
+  def encode_developer_message(_), do: {:error, "Unexpected type when encoding ResponseInfo.developer_message"}
+
+  def decode_status(value) when is_integer(value), do: value
+  def decode_status(_), do: {:error, "Unexpected type when decoding ResponseInfo.status"}
+
+  def encode_status(value) when is_integer(value), do: value
+  def encode_status(_), do: {:error, "Unexpected type when encoding ResponseInfo.status"}
+
   def from_map(m) do
     %ResponseInfo{
-      developer_message: m["developerMessage"],
-      status: m["status"],
+      developer_message: decode_developer_message(m["developerMessage"]),
+      status: decode_status(m["status"]),
     }
   end
 
@@ -51,11 +63,29 @@ defmodule Resultset do
           pagesize: integer()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Resultset.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Resultset.count"}
+
+  def decode_page(value) when is_integer(value), do: value
+  def decode_page(_), do: {:error, "Unexpected type when decoding Resultset.page"}
+
+  def encode_page(value) when is_integer(value), do: value
+  def encode_page(_), do: {:error, "Unexpected type when encoding Resultset.page"}
+
+  def decode_pagesize(value) when is_integer(value), do: value
+  def decode_pagesize(_), do: {:error, "Unexpected type when decoding Resultset.pagesize"}
+
+  def encode_pagesize(value) when is_integer(value), do: value
+  def encode_pagesize(_), do: {:error, "Unexpected type when encoding Resultset.pagesize"}
+
   def from_map(m) do
     %Resultset{
-      count: m["count"],
-      page: m["page"],
-      pagesize: m["pagesize"],
+      count: decode_count(m["count"]),
+      page: decode_page(m["page"]),
+      pagesize: decode_pagesize(m["pagesize"]),
     }
   end
 
@@ -90,9 +120,17 @@ defmodule Metadata do
           resultset: Resultset.t()
         }
 
+  def decode_execution_time(value) when is_float(value), do: value
+  def decode_execution_time(value) when is_integer(value), do: value
+  def decode_execution_time(_), do: {:error, "Unexpected type when decoding Metadata.execution_time"}
+
+  def encode_execution_time(value) when is_float(value), do: value
+  def encode_execution_time(value) when is_integer(value), do: value
+  def encode_execution_time(_), do: {:error, "Unexpected type when encoding Metadata.execution_time"}
+
   def from_map(m) do
     %Metadata{
-      execution_time: m["executionTime"],
+      execution_time: decode_execution_time(m["executionTime"]),
       response_info: ResponseInfo.from_map(m["responseInfo"]),
       resultset: Resultset.from_map(m["resultset"]),
     }
@@ -173,10 +211,16 @@ defmodule Component do
           uuid: String.t()
         }
 
+  def decode_uuid(value) when is_binary(value), do: value
+  def decode_uuid(_), do: {:error, "Unexpected type when decoding Component.uuid"}
+
+  def encode_uuid(value) when is_binary(value), do: value
+  def encode_uuid(_), do: {:error, "Unexpected type when encoding Component.uuid"}
+
   def from_map(m) do
     %Component{
       name: Name.decode(m["name"]),
-      uuid: m["uuid"],
+      uuid: decode_uuid(m["uuid"]),
     }
   end
 
@@ -220,21 +264,99 @@ defmodule Result do
           vuuid: String.t()
         }
 
+  def decode_attachments(value) when is_list(value), do: value
+  def decode_attachments(_), do: {:error, "Unexpected type when decoding Result.attachments"}
+
+  def encode_attachments(value) when is_list(value), do: value
+  def encode_attachments(_), do: {:error, "Unexpected type when encoding Result.attachments"}
+
+  def decode_body(value) when is_binary(value), do: value
+  def decode_body(_), do: {:error, "Unexpected type when decoding Result.body"}
+
+  def encode_body(value) when is_binary(value), do: value
+  def encode_body(_), do: {:error, "Unexpected type when encoding Result.body"}
+
+  def decode_changed(value) when is_binary(value), do: value
+  def decode_changed(_), do: {:error, "Unexpected type when decoding Result.changed"}
+
+  def encode_changed(value) when is_binary(value), do: value
+  def encode_changed(_), do: {:error, "Unexpected type when encoding Result.changed"}
+
+  def decode_component(value) when is_list(value), do: value
+  def decode_component(_), do: {:error, "Unexpected type when decoding Result.component"}
+
+  def encode_component(value) when is_list(value), do: value
+  def encode_component(_), do: {:error, "Unexpected type when encoding Result.component"}
+
+  def decode_created(value) when is_binary(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding Result.created"}
+
+  def encode_created(value) when is_binary(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding Result.created"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Result.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Result.date"}
+
+  def decode_image(value) when is_list(value), do: value
+  def decode_image(_), do: {:error, "Unexpected type when decoding Result.image"}
+
+  def encode_image(value) when is_list(value), do: value
+  def encode_image(_), do: {:error, "Unexpected type when encoding Result.image"}
+
+  def decode_teaser(value) when is_list(value), do: value
+  def decode_teaser(_), do: {:error, "Unexpected type when decoding Result.teaser"}
+
+  def encode_teaser(value) when is_list(value), do: value
+  def encode_teaser(_), do: {:error, "Unexpected type when encoding Result.teaser"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Result.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Result.title"}
+
+  def decode_topic(value) when is_list(value), do: value
+  def decode_topic(_), do: {:error, "Unexpected type when decoding Result.topic"}
+
+  def encode_topic(value) when is_list(value), do: value
+  def encode_topic(_), do: {:error, "Unexpected type when encoding Result.topic"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Result.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Result.url"}
+
+  def decode_uuid(value) when is_binary(value), do: value
+  def decode_uuid(_), do: {:error, "Unexpected type when decoding Result.uuid"}
+
+  def encode_uuid(value) when is_binary(value), do: value
+  def encode_uuid(_), do: {:error, "Unexpected type when encoding Result.uuid"}
+
+  def decode_vuuid(value) when is_binary(value), do: value
+  def decode_vuuid(_), do: {:error, "Unexpected type when decoding Result.vuuid"}
+
+  def encode_vuuid(value) when is_binary(value), do: value
+  def encode_vuuid(_), do: {:error, "Unexpected type when encoding Result.vuuid"}
+
   def from_map(m) do
     %Result{
-      attachments: m["attachments"],
-      body: m["body"],
-      changed: m["changed"],
+      attachments: decode_attachments(m["attachments"]),
+      body: decode_body(m["body"]),
+      changed: decode_changed(m["changed"]),
       component: Enum.map(m["component"], &Component.from_map/1),
-      created: m["created"],
-      date: m["date"],
-      image: m["image"],
-      teaser: m["teaser"],
-      title: m["title"],
-      topic: m["topic"],
-      url: m["url"],
-      uuid: m["uuid"],
-      vuuid: m["vuuid"],
+      created: decode_created(m["created"]),
+      date: decode_date(m["date"]),
+      image: decode_image(m["image"]),
+      teaser: decode_teaser(m["teaser"]),
+      title: decode_title(m["title"]),
+      topic: decode_topic(m["topic"]),
+      url: decode_url(m["url"]),
+      uuid: decode_uuid(m["uuid"]),
+      vuuid: decode_vuuid(m["vuuid"]),
     }
   end
 
@@ -278,6 +400,12 @@ defmodule TopLevel do
           results: [Result.t()]
         }
 
+  def decode_results(value) when is_list(value), do: value
+  def decode_results(_), do: {:error, "Unexpected type when decoding TopLevel.results"}
+
+  def encode_results(value) when is_list(value), do: value
+  def encode_results(_), do: {:error, "Unexpected type when encoding TopLevel.results"}
+
   def from_map(m) do
     %TopLevel{
       metadata: Metadata.from_map(m["metadata"]),
diff --git a/base/elixir/test/inputs/json/misc/4961a.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/4961a.json/default/QuickType.ex
index bf47bf0..b805b08 100644
--- a/base/elixir/test/inputs/json/misc/4961a.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/4961a.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule TotalPopulation do
           population: integer()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TotalPopulation.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TotalPopulation.date"}
+
+  def decode_population(value) when is_integer(value), do: value
+  def decode_population(_), do: {:error, "Unexpected type when decoding TotalPopulation.population"}
+
+  def encode_population(value) when is_integer(value), do: value
+  def encode_population(_), do: {:error, "Unexpected type when encoding TotalPopulation.population"}
+
   def from_map(m) do
     %TotalPopulation{
-      date: m["date"],
-      population: m["population"],
+      date: decode_date(m["date"]),
+      population: decode_population(m["population"]),
     }
   end
 
@@ -49,6 +61,12 @@ defmodule TopLevel do
           total_population: [TotalPopulation.t()]
         }
 
+  def decode_total_population(value) when is_list(value), do: value
+  def decode_total_population(_), do: {:error, "Unexpected type when decoding TopLevel.total_population"}
+
+  def encode_total_population(value) when is_list(value), do: value
+  def encode_total_population(_), do: {:error, "Unexpected type when encoding TopLevel.total_population"}
+
   def from_map(m) do
     %TopLevel{
       total_population: Enum.map(m["total_population"], &TotalPopulation.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/4a0d7.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/4a0d7.json/default/QuickType.ex
index bf47bf0..b805b08 100644
--- a/base/elixir/test/inputs/json/misc/4a0d7.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/4a0d7.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule TotalPopulation do
           population: integer()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TotalPopulation.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TotalPopulation.date"}
+
+  def decode_population(value) when is_integer(value), do: value
+  def decode_population(_), do: {:error, "Unexpected type when decoding TotalPopulation.population"}
+
+  def encode_population(value) when is_integer(value), do: value
+  def encode_population(_), do: {:error, "Unexpected type when encoding TotalPopulation.population"}
+
   def from_map(m) do
     %TotalPopulation{
-      date: m["date"],
-      population: m["population"],
+      date: decode_date(m["date"]),
+      population: decode_population(m["population"]),
     }
   end
 
@@ -49,6 +61,12 @@ defmodule TopLevel do
           total_population: [TotalPopulation.t()]
         }
 
+  def decode_total_population(value) when is_list(value), do: value
+  def decode_total_population(_), do: {:error, "Unexpected type when decoding TopLevel.total_population"}
+
+  def encode_total_population(value) when is_list(value), do: value
+  def encode_total_population(_), do: {:error, "Unexpected type when encoding TopLevel.total_population"}
+
   def from_map(m) do
     %TopLevel{
       total_population: Enum.map(m["total_population"], &TotalPopulation.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/4a455.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/4a455.json/default/QuickType.ex
index 1de83cb..0ce9208 100644
--- a/base/elixir/test/inputs/json/misc/4a455.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/4a455.json/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule CRSProperties do
           name: String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding CRSProperties.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding CRSProperties.name"}
+
   def from_map(m) do
     %CRSProperties{
-      name: m["name"],
+      name: decode_name(m["name"]),
     }
   end
 
@@ -47,10 +53,16 @@ defmodule CRS do
           type: String.t()
         }
 
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding CRS.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding CRS.type"}
+
   def from_map(m) do
     %CRS{
       properties: CRSProperties.from_map(m["properties"]),
-      type: m["type"],
+      type: decode_type(m["type"]),
     }
   end
 
@@ -128,9 +140,15 @@ defmodule Geometry do
           type: GeometryType.t()
         }
 
+  def decode_coordinates(value) when is_list(value), do: value
+  def decode_coordinates(_), do: {:error, "Unexpected type when decoding Geometry.coordinates"}
+
+  def encode_coordinates(value) when is_list(value), do: value
+  def encode_coordinates(_), do: {:error, "Unexpected type when encoding Geometry.coordinates"}
+
   def from_map(m) do
     %Geometry{
-      coordinates: m["coordinates"],
+      coordinates: decode_coordinates(m["coordinates"]),
       type: GeometryType.decode(m["type"]),
     }
   end
@@ -213,14 +231,50 @@ defmodule FeatureProperties do
           twitteraccount: String.t()
         }
 
+  def decode_facebookaccount(value) when is_binary(value), do: value
+  def decode_facebookaccount(_), do: {:error, "Unexpected type when decoding FeatureProperties.facebookaccount"}
+
+  def encode_facebookaccount(value) when is_binary(value), do: value
+  def encode_facebookaccount(_), do: {:error, "Unexpected type when encoding FeatureProperties.facebookaccount"}
+
+  def decode_frequencyfinderurl(value) when is_binary(value), do: value
+  def decode_frequencyfinderurl(_), do: {:error, "Unexpected type when decoding FeatureProperties.frequencyfinderurl"}
+
+  def encode_frequencyfinderurl(value) when is_binary(value), do: value
+  def encode_frequencyfinderurl(_), do: {:error, "Unexpected type when encoding FeatureProperties.frequencyfinderurl"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding FeatureProperties.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding FeatureProperties.name"}
+
+  def decode_siteurl(value) when is_binary(value), do: value
+  def decode_siteurl(_), do: {:error, "Unexpected type when decoding FeatureProperties.siteurl"}
+
+  def encode_siteurl(value) when is_binary(value), do: value
+  def encode_siteurl(_), do: {:error, "Unexpected type when encoding FeatureProperties.siteurl"}
+
+  def decode_streetaddress(value) when is_binary(value), do: value
+  def decode_streetaddress(_), do: {:error, "Unexpected type when decoding FeatureProperties.streetaddress"}
+
+  def encode_streetaddress(value) when is_binary(value), do: value
+  def encode_streetaddress(_), do: {:error, "Unexpected type when encoding FeatureProperties.streetaddress"}
+
+  def decode_twitteraccount(value) when is_binary(value), do: value
+  def decode_twitteraccount(_), do: {:error, "Unexpected type when decoding FeatureProperties.twitteraccount"}
+
+  def encode_twitteraccount(value) when is_binary(value), do: value
+  def encode_twitteraccount(_), do: {:error, "Unexpected type when encoding FeatureProperties.twitteraccount"}
+
   def from_map(m) do
     %FeatureProperties{
-      facebookaccount: m["facebookaccount"],
-      frequencyfinderurl: m["frequencyfinderurl"],
-      name: m["name"],
-      siteurl: m["siteurl"],
-      streetaddress: m["streetaddress"],
-      twitteraccount: m["twitteraccount"],
+      facebookaccount: decode_facebookaccount(m["facebookaccount"]),
+      frequencyfinderurl: decode_frequencyfinderurl(m["frequencyfinderurl"]),
+      name: decode_name(m["name"]),
+      siteurl: decode_siteurl(m["siteurl"]),
+      streetaddress: decode_streetaddress(m["streetaddress"]),
+      twitteraccount: decode_twitteraccount(m["twitteraccount"]),
     }
   end
 
@@ -305,11 +359,17 @@ defmodule Feature do
           type: FeatureType.t()
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Feature.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Feature.id"}
+
   def from_map(m) do
     %Feature{
       geometry: Geometry.from_map(m["geometry"]),
       geometry_name: GeometryName.decode(m["geometry_name"]),
-      id: m["id"],
+      id: decode_id(m["id"]),
       properties: FeatureProperties.from_map(m["properties"]),
       type: FeatureType.decode(m["type"]),
     }
@@ -349,12 +409,30 @@ defmodule TopLevel do
           type: String.t()
         }
 
+  def decode_features(value) when is_list(value), do: value
+  def decode_features(_), do: {:error, "Unexpected type when decoding TopLevel.features"}
+
+  def encode_features(value) when is_list(value), do: value
+  def encode_features(_), do: {:error, "Unexpected type when encoding TopLevel.features"}
+
+  def decode_total_features(value) when is_integer(value), do: value
+  def decode_total_features(_), do: {:error, "Unexpected type when decoding TopLevel.total_features"}
+
+  def encode_total_features(value) when is_integer(value), do: value
+  def encode_total_features(_), do: {:error, "Unexpected type when encoding TopLevel.total_features"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding TopLevel.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding TopLevel.type"}
+
   def from_map(m) do
     %TopLevel{
       crs: CRS.from_map(m["crs"]),
       features: Enum.map(m["features"], &Feature.from_map/1),
-      total_features: m["totalFeatures"],
-      type: m["type"],
+      total_features: decode_total_features(m["totalFeatures"]),
+      type: decode_type(m["type"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/4c547.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/4c547.json/default/QuickType.ex
index ee06b77..98852a1 100644
--- a/base/elixir/test/inputs/json/misc/4c547.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/4c547.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Astronomy do
           sunset: String.t()
         }
 
+  def decode_sunrise(value) when is_binary(value), do: value
+  def decode_sunrise(_), do: {:error, "Unexpected type when decoding Astronomy.sunrise"}
+
+  def encode_sunrise(value) when is_binary(value), do: value
+  def encode_sunrise(_), do: {:error, "Unexpected type when encoding Astronomy.sunrise"}
+
+  def decode_sunset(value) when is_binary(value), do: value
+  def decode_sunset(_), do: {:error, "Unexpected type when decoding Astronomy.sunset"}
+
+  def encode_sunset(value) when is_binary(value), do: value
+  def encode_sunset(_), do: {:error, "Unexpected type when encoding Astronomy.sunset"}
+
   def from_map(m) do
     %Astronomy{
-      sunrise: m["sunrise"],
-      sunset: m["sunset"],
+      sunrise: decode_sunrise(m["sunrise"]),
+      sunset: decode_sunset(m["sunset"]),
     }
   end
 
@@ -52,12 +64,36 @@ defmodule Atmosphere do
           visibility: String.t()
         }
 
+  def decode_humidity(value) when is_binary(value), do: value
+  def decode_humidity(_), do: {:error, "Unexpected type when decoding Atmosphere.humidity"}
+
+  def encode_humidity(value) when is_binary(value), do: value
+  def encode_humidity(_), do: {:error, "Unexpected type when encoding Atmosphere.humidity"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Atmosphere.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Atmosphere.pressure"}
+
+  def decode_rising(value) when is_binary(value), do: value
+  def decode_rising(_), do: {:error, "Unexpected type when decoding Atmosphere.rising"}
+
+  def encode_rising(value) when is_binary(value), do: value
+  def encode_rising(_), do: {:error, "Unexpected type when encoding Atmosphere.rising"}
+
+  def decode_visibility(value) when is_binary(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Atmosphere.visibility"}
+
+  def encode_visibility(value) when is_binary(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Atmosphere.visibility"}
+
   def from_map(m) do
     %Atmosphere{
-      humidity: m["humidity"],
-      pressure: m["pressure"],
-      rising: m["rising"],
-      visibility: m["visibility"],
+      humidity: decode_humidity(m["humidity"]),
+      pressure: decode_pressure(m["pressure"]),
+      rising: decode_rising(m["rising"]),
+      visibility: decode_visibility(m["visibility"]),
     }
   end
 
@@ -95,13 +131,43 @@ defmodule Image do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Image.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Image.height"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Image.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Image.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Image.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Image.title"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Image.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Image.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Image.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Image.width"}
+
   def from_map(m) do
     %Image{
-      height: m["height"],
-      link: m["link"],
-      title: m["title"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      link: decode_link(m["link"]),
+      title: decode_title(m["title"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -139,12 +205,36 @@ defmodule Condition do
           text: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Condition.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Condition.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Condition.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Condition.date"}
+
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Condition.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Condition.temp"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Condition.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Condition.text"}
+
   def from_map(m) do
     %Condition{
-      code: m["code"],
-      date: m["date"],
-      temp: m["temp"],
-      text: m["text"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      temp: decode_temp(m["temp"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -183,14 +273,50 @@ defmodule Forecast do
           text: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Forecast.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Forecast.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Forecast.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Forecast.date"}
+
+  def decode_day(value) when is_binary(value), do: value
+  def decode_day(_), do: {:error, "Unexpected type when decoding Forecast.day"}
+
+  def encode_day(value) when is_binary(value), do: value
+  def encode_day(_), do: {:error, "Unexpected type when encoding Forecast.day"}
+
+  def decode_high(value) when is_binary(value), do: value
+  def decode_high(_), do: {:error, "Unexpected type when decoding Forecast.high"}
+
+  def encode_high(value) when is_binary(value), do: value
+  def encode_high(_), do: {:error, "Unexpected type when encoding Forecast.high"}
+
+  def decode_low(value) when is_binary(value), do: value
+  def decode_low(_), do: {:error, "Unexpected type when decoding Forecast.low"}
+
+  def encode_low(value) when is_binary(value), do: value
+  def encode_low(_), do: {:error, "Unexpected type when encoding Forecast.low"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Forecast.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Forecast.text"}
+
   def from_map(m) do
     %Forecast{
-      code: m["code"],
-      date: m["date"],
-      day: m["day"],
-      high: m["high"],
-      low: m["low"],
-      text: m["text"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      day: decode_day(m["day"]),
+      high: decode_high(m["high"]),
+      low: decode_low(m["low"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -226,9 +352,15 @@ defmodule GUID do
           is_perma_link: String.t()
         }
 
+  def decode_is_perma_link(value) when is_binary(value), do: value
+  def decode_is_perma_link(_), do: {:error, "Unexpected type when decoding GUID.is_perma_link"}
+
+  def encode_is_perma_link(value) when is_binary(value), do: value
+  def encode_is_perma_link(_), do: {:error, "Unexpected type when encoding GUID.is_perma_link"}
+
   def from_map(m) do
     %GUID{
-      is_perma_link: m["isPermaLink"],
+      is_perma_link: decode_is_perma_link(m["isPermaLink"]),
     }
   end
 
@@ -267,17 +399,59 @@ defmodule Item do
           title: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Item.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Item.description"}
+
+  def decode_forecast(value) when is_list(value), do: value
+  def decode_forecast(_), do: {:error, "Unexpected type when decoding Item.forecast"}
+
+  def encode_forecast(value) when is_list(value), do: value
+  def encode_forecast(_), do: {:error, "Unexpected type when encoding Item.forecast"}
+
+  def decode_lat(value) when is_binary(value), do: value
+  def decode_lat(_), do: {:error, "Unexpected type when decoding Item.lat"}
+
+  def encode_lat(value) when is_binary(value), do: value
+  def encode_lat(_), do: {:error, "Unexpected type when encoding Item.lat"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Item.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Item.link"}
+
+  def decode_long(value) when is_binary(value), do: value
+  def decode_long(_), do: {:error, "Unexpected type when decoding Item.long"}
+
+  def encode_long(value) when is_binary(value), do: value
+  def encode_long(_), do: {:error, "Unexpected type when encoding Item.long"}
+
+  def decode_pub_date(value) when is_binary(value), do: value
+  def decode_pub_date(_), do: {:error, "Unexpected type when decoding Item.pub_date"}
+
+  def encode_pub_date(value) when is_binary(value), do: value
+  def encode_pub_date(_), do: {:error, "Unexpected type when encoding Item.pub_date"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Item.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Item.title"}
+
   def from_map(m) do
     %Item{
       condition: Condition.from_map(m["condition"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       forecast: Enum.map(m["forecast"], &Forecast.from_map/1),
       guid: GUID.from_map(m["guid"]),
-      lat: m["lat"],
-      link: m["link"],
-      long: m["long"],
-      pub_date: m["pubDate"],
-      title: m["title"],
+      lat: decode_lat(m["lat"]),
+      link: decode_link(m["link"]),
+      long: decode_long(m["long"]),
+      pub_date: decode_pub_date(m["pubDate"]),
+      title: decode_title(m["title"]),
     }
   end
 
@@ -318,11 +492,29 @@ defmodule Location do
           region: String.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding Location.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding Location.city"}
+
+  def decode_country(value) when is_binary(value), do: value
+  def decode_country(_), do: {:error, "Unexpected type when decoding Location.country"}
+
+  def encode_country(value) when is_binary(value), do: value
+  def encode_country(_), do: {:error, "Unexpected type when encoding Location.country"}
+
+  def decode_region(value) when is_binary(value), do: value
+  def decode_region(_), do: {:error, "Unexpected type when decoding Location.region"}
+
+  def encode_region(value) when is_binary(value), do: value
+  def encode_region(_), do: {:error, "Unexpected type when encoding Location.region"}
+
   def from_map(m) do
     %Location{
-      city: m["city"],
-      country: m["country"],
-      region: m["region"],
+      city: decode_city(m["city"]),
+      country: decode_country(m["country"]),
+      region: decode_region(m["region"]),
     }
   end
 
@@ -358,12 +550,36 @@ defmodule Units do
           temperature: String.t()
         }
 
+  def decode_distance(value) when is_binary(value), do: value
+  def decode_distance(_), do: {:error, "Unexpected type when decoding Units.distance"}
+
+  def encode_distance(value) when is_binary(value), do: value
+  def encode_distance(_), do: {:error, "Unexpected type when encoding Units.distance"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Units.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Units.pressure"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Units.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Units.speed"}
+
+  def decode_temperature(value) when is_binary(value), do: value
+  def decode_temperature(_), do: {:error, "Unexpected type when decoding Units.temperature"}
+
+  def encode_temperature(value) when is_binary(value), do: value
+  def encode_temperature(_), do: {:error, "Unexpected type when encoding Units.temperature"}
+
   def from_map(m) do
     %Units{
-      distance: m["distance"],
-      pressure: m["pressure"],
-      speed: m["speed"],
-      temperature: m["temperature"],
+      distance: decode_distance(m["distance"]),
+      pressure: decode_pressure(m["pressure"]),
+      speed: decode_speed(m["speed"]),
+      temperature: decode_temperature(m["temperature"]),
     }
   end
 
@@ -399,11 +615,29 @@ defmodule Wind do
           speed: String.t()
         }
 
+  def decode_chill(value) when is_binary(value), do: value
+  def decode_chill(_), do: {:error, "Unexpected type when decoding Wind.chill"}
+
+  def encode_chill(value) when is_binary(value), do: value
+  def encode_chill(_), do: {:error, "Unexpected type when encoding Wind.chill"}
+
+  def decode_direction(value) when is_binary(value), do: value
+  def decode_direction(_), do: {:error, "Unexpected type when decoding Wind.direction"}
+
+  def encode_direction(value) when is_binary(value), do: value
+  def encode_direction(_), do: {:error, "Unexpected type when encoding Wind.direction"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Wind.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Wind.speed"}
+
   def from_map(m) do
     %Wind{
-      chill: m["chill"],
-      direction: m["direction"],
-      speed: m["speed"],
+      chill: decode_chill(m["chill"]),
+      direction: decode_direction(m["direction"]),
+      speed: decode_speed(m["speed"]),
     }
   end
 
@@ -448,19 +682,55 @@ defmodule Channel do
           wind: Wind.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Channel.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Channel.description"}
+
+  def decode_language(value) when is_binary(value), do: value
+  def decode_language(_), do: {:error, "Unexpected type when decoding Channel.language"}
+
+  def encode_language(value) when is_binary(value), do: value
+  def encode_language(_), do: {:error, "Unexpected type when encoding Channel.language"}
+
+  def decode_last_build_date(value) when is_binary(value), do: value
+  def decode_last_build_date(_), do: {:error, "Unexpected type when decoding Channel.last_build_date"}
+
+  def encode_last_build_date(value) when is_binary(value), do: value
+  def encode_last_build_date(_), do: {:error, "Unexpected type when encoding Channel.last_build_date"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Channel.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Channel.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Channel.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Channel.title"}
+
+  def decode_ttl(value) when is_binary(value), do: value
+  def decode_ttl(_), do: {:error, "Unexpected type when decoding Channel.ttl"}
+
+  def encode_ttl(value) when is_binary(value), do: value
+  def encode_ttl(_), do: {:error, "Unexpected type when encoding Channel.ttl"}
+
   def from_map(m) do
     %Channel{
       astronomy: Astronomy.from_map(m["astronomy"]),
       atmosphere: Atmosphere.from_map(m["atmosphere"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       image: Image.from_map(m["image"]),
       item: Item.from_map(m["item"]),
-      language: m["language"],
-      last_build_date: m["lastBuildDate"],
-      link: m["link"],
+      language: decode_language(m["language"]),
+      last_build_date: decode_last_build_date(m["lastBuildDate"]),
+      link: decode_link(m["link"]),
       location: Location.from_map(m["location"]),
-      title: m["title"],
-      ttl: m["ttl"],
+      title: decode_title(m["title"]),
+      ttl: decode_ttl(m["ttl"]),
       units: Units.from_map(m["units"]),
       wind: Wind.from_map(m["wind"]),
     }
@@ -541,11 +811,29 @@ defmodule Query do
           results: Results.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Query.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Query.count"}
+
+  def decode_created(value) when is_binary(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding Query.created"}
+
+  def encode_created(value) when is_binary(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding Query.created"}
+
+  def decode_lang(value) when is_binary(value), do: value
+  def decode_lang(_), do: {:error, "Unexpected type when decoding Query.lang"}
+
+  def encode_lang(value) when is_binary(value), do: value
+  def encode_lang(_), do: {:error, "Unexpected type when encoding Query.lang"}
+
   def from_map(m) do
     %Query{
-      count: m["count"],
-      created: m["created"],
-      lang: m["lang"],
+      count: decode_count(m["count"]),
+      created: decode_created(m["created"]),
+      lang: decode_lang(m["lang"]),
       results: Results.from_map(m["results"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/4d6fb.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/4d6fb.json/default/QuickType.ex
index 5991113..6e328b8 100644
--- a/base/elixir/test/inputs/json/misc/4d6fb.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/4d6fb.json/default/QuickType.ex
@@ -25,21 +25,99 @@ defmodule Oembed do
           width: integer()
         }
 
+  def decode_author_name(value) when is_binary(value), do: value
+  def decode_author_name(_), do: {:error, "Unexpected type when decoding Oembed.author_name"}
+
+  def encode_author_name(value) when is_binary(value), do: value
+  def encode_author_name(_), do: {:error, "Unexpected type when encoding Oembed.author_name"}
+
+  def decode_author_url(value) when is_binary(value), do: value
+  def decode_author_url(_), do: {:error, "Unexpected type when decoding Oembed.author_url"}
+
+  def encode_author_url(value) when is_binary(value), do: value
+  def encode_author_url(_), do: {:error, "Unexpected type when encoding Oembed.author_url"}
+
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Oembed.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Oembed.height"}
+
+  def decode_html(value) when is_binary(value), do: value
+  def decode_html(_), do: {:error, "Unexpected type when decoding Oembed.html"}
+
+  def encode_html(value) when is_binary(value), do: value
+  def encode_html(_), do: {:error, "Unexpected type when encoding Oembed.html"}
+
+  def decode_provider_name(value) when is_binary(value), do: value
+  def decode_provider_name(_), do: {:error, "Unexpected type when decoding Oembed.provider_name"}
+
+  def encode_provider_name(value) when is_binary(value), do: value
+  def encode_provider_name(_), do: {:error, "Unexpected type when encoding Oembed.provider_name"}
+
+  def decode_provider_url(value) when is_binary(value), do: value
+  def decode_provider_url(_), do: {:error, "Unexpected type when decoding Oembed.provider_url"}
+
+  def encode_provider_url(value) when is_binary(value), do: value
+  def encode_provider_url(_), do: {:error, "Unexpected type when encoding Oembed.provider_url"}
+
+  def decode_thumbnail_height(value) when is_integer(value), do: value
+  def decode_thumbnail_height(_), do: {:error, "Unexpected type when decoding Oembed.thumbnail_height"}
+
+  def encode_thumbnail_height(value) when is_integer(value), do: value
+  def encode_thumbnail_height(_), do: {:error, "Unexpected type when encoding Oembed.thumbnail_height"}
+
+  def decode_thumbnail_url(value) when is_binary(value), do: value
+  def decode_thumbnail_url(_), do: {:error, "Unexpected type when decoding Oembed.thumbnail_url"}
+
+  def encode_thumbnail_url(value) when is_binary(value), do: value
+  def encode_thumbnail_url(_), do: {:error, "Unexpected type when encoding Oembed.thumbnail_url"}
+
+  def decode_thumbnail_width(value) when is_integer(value), do: value
+  def decode_thumbnail_width(_), do: {:error, "Unexpected type when decoding Oembed.thumbnail_width"}
+
+  def encode_thumbnail_width(value) when is_integer(value), do: value
+  def encode_thumbnail_width(_), do: {:error, "Unexpected type when encoding Oembed.thumbnail_width"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Oembed.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Oembed.title"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Oembed.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Oembed.type"}
+
+  def decode_version(value) when is_binary(value), do: value
+  def decode_version(_), do: {:error, "Unexpected type when decoding Oembed.version"}
+
+  def encode_version(value) when is_binary(value), do: value
+  def encode_version(_), do: {:error, "Unexpected type when encoding Oembed.version"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Oembed.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Oembed.width"}
+
   def from_map(m) do
     %Oembed{
-      author_name: m["author_name"],
-      author_url: m["author_url"],
-      height: m["height"],
-      html: m["html"],
-      provider_name: m["provider_name"],
-      provider_url: m["provider_url"],
-      thumbnail_height: m["thumbnail_height"],
-      thumbnail_url: m["thumbnail_url"],
-      thumbnail_width: m["thumbnail_width"],
-      title: m["title"],
-      type: m["type"],
-      version: m["version"],
-      width: m["width"],
+      author_name: decode_author_name(m["author_name"]),
+      author_url: decode_author_url(m["author_url"]),
+      height: decode_height(m["height"]),
+      html: decode_html(m["html"]),
+      provider_name: decode_provider_name(m["provider_name"]),
+      provider_url: decode_provider_url(m["provider_url"]),
+      thumbnail_height: decode_thumbnail_height(m["thumbnail_height"]),
+      thumbnail_url: decode_thumbnail_url(m["thumbnail_url"]),
+      thumbnail_width: decode_thumbnail_width(m["thumbnail_width"]),
+      title: decode_title(m["title"]),
+      type: decode_type(m["type"]),
+      version: decode_version(m["version"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -83,10 +161,16 @@ defmodule Media do
           type: String.t()
         }
 
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Media.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Media.type"}
+
   def from_map(m) do
     %Media{
       oembed: Oembed.from_map(m["oembed"]),
-      type: m["type"],
+      type: decode_type(m["type"]),
     }
   end
 
@@ -207,11 +291,29 @@ defmodule Source do
           width: integer()
         }
 
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Source.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Source.height"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Source.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Source.url"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Source.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Source.width"}
+
   def from_map(m) do
     %Source{
-      height: m["height"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -276,9 +378,21 @@ defmodule Image do
           variants: Variants.t()
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Image.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Image.id"}
+
+  def decode_resolutions(value) when is_list(value), do: value
+  def decode_resolutions(_), do: {:error, "Unexpected type when decoding Image.resolutions"}
+
+  def encode_resolutions(value) when is_list(value), do: value
+  def encode_resolutions(_), do: {:error, "Unexpected type when encoding Image.resolutions"}
+
   def from_map(m) do
     %Image{
-      id: m["id"],
+      id: decode_id(m["id"]),
       resolutions: Enum.map(m["resolutions"], &Source.from_map/1),
       source: Source.from_map(m["source"]),
       variants: Variants.from_map(m["variants"]),
@@ -316,9 +430,21 @@ defmodule Preview do
           images: [Image.t()]
         }
 
+  def decode_enabled(value) when is_boolean(value), do: value
+  def decode_enabled(_), do: {:error, "Unexpected type when decoding Preview.enabled"}
+
+  def encode_enabled(value) when is_boolean(value), do: value
+  def encode_enabled(_), do: {:error, "Unexpected type when encoding Preview.enabled"}
+
+  def decode_images(value) when is_list(value), do: value
+  def decode_images(_), do: {:error, "Unexpected type when decoding Preview.images"}
+
+  def encode_images(value) when is_list(value), do: value
+  def encode_images(_), do: {:error, "Unexpected type when encoding Preview.images"}
+
   def from_map(m) do
     %Preview{
-      enabled: m["enabled"],
+      enabled: decode_enabled(m["enabled"]),
       images: Enum.map(m["images"], &Image.from_map/1),
     }
   end
@@ -594,72 +720,388 @@ defmodule ChildData do
           visited: boolean()
         }
 
+  def decode_approved_at_utc(value) when is_nil(value), do: value
+  def decode_approved_at_utc(_), do: {:error, "Unexpected type when decoding ChildData.approved_at_utc"}
+
+  def encode_approved_at_utc(value) when is_nil(value), do: value
+  def encode_approved_at_utc(_), do: {:error, "Unexpected type when encoding ChildData.approved_at_utc"}
+
+  def decode_approved_by(value) when is_nil(value), do: value
+  def decode_approved_by(_), do: {:error, "Unexpected type when decoding ChildData.approved_by"}
+
+  def encode_approved_by(value) when is_nil(value), do: value
+  def encode_approved_by(_), do: {:error, "Unexpected type when encoding ChildData.approved_by"}
+
+  def decode_archived(value) when is_boolean(value), do: value
+  def decode_archived(_), do: {:error, "Unexpected type when decoding ChildData.archived"}
+
+  def encode_archived(value) when is_boolean(value), do: value
+  def encode_archived(_), do: {:error, "Unexpected type when encoding ChildData.archived"}
+
+  def decode_author(value) when is_binary(value), do: value
+  def decode_author(_), do: {:error, "Unexpected type when decoding ChildData.author"}
+
+  def encode_author(value) when is_binary(value), do: value
+  def encode_author(_), do: {:error, "Unexpected type when encoding ChildData.author"}
+
+  def decode_author_flair_css_class(value) when is_nil(value), do: value
+  def decode_author_flair_css_class(_), do: {:error, "Unexpected type when decoding ChildData.author_flair_css_class"}
+
+  def encode_author_flair_css_class(value) when is_nil(value), do: value
+  def encode_author_flair_css_class(_), do: {:error, "Unexpected type when encoding ChildData.author_flair_css_class"}
+
+  def decode_author_flair_text(value) when is_nil(value), do: value
+  def decode_author_flair_text(_), do: {:error, "Unexpected type when decoding ChildData.author_flair_text"}
+
+  def encode_author_flair_text(value) when is_nil(value), do: value
+  def encode_author_flair_text(_), do: {:error, "Unexpected type when encoding ChildData.author_flair_text"}
+
+  def decode_banned_at_utc(value) when is_nil(value), do: value
+  def decode_banned_at_utc(_), do: {:error, "Unexpected type when decoding ChildData.banned_at_utc"}
+
+  def encode_banned_at_utc(value) when is_nil(value), do: value
+  def encode_banned_at_utc(_), do: {:error, "Unexpected type when encoding ChildData.banned_at_utc"}
+
+  def decode_banned_by(value) when is_nil(value), do: value
+  def decode_banned_by(_), do: {:error, "Unexpected type when decoding ChildData.banned_by"}
+
+  def encode_banned_by(value) when is_nil(value), do: value
+  def encode_banned_by(_), do: {:error, "Unexpected type when encoding ChildData.banned_by"}
+
+  def decode_brand_safe(value) when is_boolean(value), do: value
+  def decode_brand_safe(_), do: {:error, "Unexpected type when decoding ChildData.brand_safe"}
+
+  def encode_brand_safe(value) when is_boolean(value), do: value
+  def encode_brand_safe(_), do: {:error, "Unexpected type when encoding ChildData.brand_safe"}
+
+  def decode_can_gild(value) when is_boolean(value), do: value
+  def decode_can_gild(_), do: {:error, "Unexpected type when decoding ChildData.can_gild"}
+
+  def encode_can_gild(value) when is_boolean(value), do: value
+  def encode_can_gild(_), do: {:error, "Unexpected type when encoding ChildData.can_gild"}
+
+  def decode_can_mod_post(value) when is_boolean(value), do: value
+  def decode_can_mod_post(_), do: {:error, "Unexpected type when decoding ChildData.can_mod_post"}
+
+  def encode_can_mod_post(value) when is_boolean(value), do: value
+  def encode_can_mod_post(_), do: {:error, "Unexpected type when encoding ChildData.can_mod_post"}
+
+  def decode_clicked(value) when is_boolean(value), do: value
+  def decode_clicked(_), do: {:error, "Unexpected type when decoding ChildData.clicked"}
+
+  def encode_clicked(value) when is_boolean(value), do: value
+  def encode_clicked(_), do: {:error, "Unexpected type when encoding ChildData.clicked"}
+
+  def decode_contest_mode(value) when is_boolean(value), do: value
+  def decode_contest_mode(_), do: {:error, "Unexpected type when decoding ChildData.contest_mode"}
+
+  def encode_contest_mode(value) when is_boolean(value), do: value
+  def encode_contest_mode(_), do: {:error, "Unexpected type when encoding ChildData.contest_mode"}
+
+  def decode_created(value) when is_float(value), do: value
+  def decode_created(value) when is_integer(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding ChildData.created"}
+
+  def encode_created(value) when is_float(value), do: value
+  def encode_created(value) when is_integer(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding ChildData.created"}
+
+  def decode_created_utc(value) when is_float(value), do: value
+  def decode_created_utc(value) when is_integer(value), do: value
+  def decode_created_utc(_), do: {:error, "Unexpected type when decoding ChildData.created_utc"}
+
+  def encode_created_utc(value) when is_float(value), do: value
+  def encode_created_utc(value) when is_integer(value), do: value
+  def encode_created_utc(_), do: {:error, "Unexpected type when encoding ChildData.created_utc"}
+
+  def decode_distinguished(value) when is_nil(value), do: value
+  def decode_distinguished(_), do: {:error, "Unexpected type when decoding ChildData.distinguished"}
+
+  def encode_distinguished(value) when is_nil(value), do: value
+  def encode_distinguished(_), do: {:error, "Unexpected type when encoding ChildData.distinguished"}
+
+  def decode_domain(value) when is_binary(value), do: value
+  def decode_domain(_), do: {:error, "Unexpected type when decoding ChildData.domain"}
+
+  def encode_domain(value) when is_binary(value), do: value
+  def encode_domain(_), do: {:error, "Unexpected type when encoding ChildData.domain"}
+
+  def decode_downs(value) when is_integer(value), do: value
+  def decode_downs(_), do: {:error, "Unexpected type when decoding ChildData.downs"}
+
+  def encode_downs(value) when is_integer(value), do: value
+  def encode_downs(_), do: {:error, "Unexpected type when encoding ChildData.downs"}
+
+  def decode_edited(value) when is_boolean(value), do: value
+  def decode_edited(_), do: {:error, "Unexpected type when decoding ChildData.edited"}
+
+  def encode_edited(value) when is_boolean(value), do: value
+  def encode_edited(_), do: {:error, "Unexpected type when encoding ChildData.edited"}
+
+  def decode_gilded(value) when is_integer(value), do: value
+  def decode_gilded(_), do: {:error, "Unexpected type when decoding ChildData.gilded"}
+
+  def encode_gilded(value) when is_integer(value), do: value
+  def encode_gilded(_), do: {:error, "Unexpected type when encoding ChildData.gilded"}
+
+  def decode_hidden(value) when is_boolean(value), do: value
+  def decode_hidden(_), do: {:error, "Unexpected type when decoding ChildData.hidden"}
+
+  def encode_hidden(value) when is_boolean(value), do: value
+  def encode_hidden(_), do: {:error, "Unexpected type when encoding ChildData.hidden"}
+
+  def decode_hide_score(value) when is_boolean(value), do: value
+  def decode_hide_score(_), do: {:error, "Unexpected type when decoding ChildData.hide_score"}
+
+  def encode_hide_score(value) when is_boolean(value), do: value
+  def encode_hide_score(_), do: {:error, "Unexpected type when encoding ChildData.hide_score"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding ChildData.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding ChildData.id"}
+
+  def decode_is_self(value) when is_boolean(value), do: value
+  def decode_is_self(_), do: {:error, "Unexpected type when decoding ChildData.is_self"}
+
+  def encode_is_self(value) when is_boolean(value), do: value
+  def encode_is_self(_), do: {:error, "Unexpected type when encoding ChildData.is_self"}
+
+  def decode_is_video(value) when is_boolean(value), do: value
+  def decode_is_video(_), do: {:error, "Unexpected type when decoding ChildData.is_video"}
+
+  def encode_is_video(value) when is_boolean(value), do: value
+  def encode_is_video(_), do: {:error, "Unexpected type when encoding ChildData.is_video"}
+
+  def decode_likes(value) when is_nil(value), do: value
+  def decode_likes(_), do: {:error, "Unexpected type when decoding ChildData.likes"}
+
+  def encode_likes(value) when is_nil(value), do: value
+  def encode_likes(_), do: {:error, "Unexpected type when encoding ChildData.likes"}
+
+  def decode_link_flair_css_class(value) when is_nil(value), do: value
+  def decode_link_flair_css_class(_), do: {:error, "Unexpected type when decoding ChildData.link_flair_css_class"}
+
+  def encode_link_flair_css_class(value) when is_nil(value), do: value
+  def encode_link_flair_css_class(_), do: {:error, "Unexpected type when encoding ChildData.link_flair_css_class"}
+
+  def decode_link_flair_text(value) when is_nil(value), do: value
+  def decode_link_flair_text(_), do: {:error, "Unexpected type when decoding ChildData.link_flair_text"}
+
+  def encode_link_flair_text(value) when is_nil(value), do: value
+  def encode_link_flair_text(_), do: {:error, "Unexpected type when encoding ChildData.link_flair_text"}
+
+  def decode_locked(value) when is_boolean(value), do: value
+  def decode_locked(_), do: {:error, "Unexpected type when decoding ChildData.locked"}
+
+  def encode_locked(value) when is_boolean(value), do: value
+  def encode_locked(_), do: {:error, "Unexpected type when encoding ChildData.locked"}
+
+  def decode_mod_reports(value) when is_list(value), do: value
+  def decode_mod_reports(_), do: {:error, "Unexpected type when decoding ChildData.mod_reports"}
+
+  def encode_mod_reports(value) when is_list(value), do: value
+  def encode_mod_reports(_), do: {:error, "Unexpected type when encoding ChildData.mod_reports"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding ChildData.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding ChildData.name"}
+
+  def decode_num_comments(value) when is_integer(value), do: value
+  def decode_num_comments(_), do: {:error, "Unexpected type when decoding ChildData.num_comments"}
+
+  def encode_num_comments(value) when is_integer(value), do: value
+  def encode_num_comments(_), do: {:error, "Unexpected type when encoding ChildData.num_comments"}
+
+  def decode_num_reports(value) when is_nil(value), do: value
+  def decode_num_reports(_), do: {:error, "Unexpected type when decoding ChildData.num_reports"}
+
+  def encode_num_reports(value) when is_nil(value), do: value
+  def encode_num_reports(_), do: {:error, "Unexpected type when encoding ChildData.num_reports"}
+
+  def decode_over_18(value) when is_boolean(value), do: value
+  def decode_over_18(_), do: {:error, "Unexpected type when decoding ChildData.over_18"}
+
+  def encode_over_18(value) when is_boolean(value), do: value
+  def encode_over_18(_), do: {:error, "Unexpected type when encoding ChildData.over_18"}
+
+  def decode_permalink(value) when is_binary(value), do: value
+  def decode_permalink(_), do: {:error, "Unexpected type when decoding ChildData.permalink"}
+
+  def encode_permalink(value) when is_binary(value), do: value
+  def encode_permalink(_), do: {:error, "Unexpected type when encoding ChildData.permalink"}
+
+  def decode_quarantine(value) when is_boolean(value), do: value
+  def decode_quarantine(_), do: {:error, "Unexpected type when decoding ChildData.quarantine"}
+
+  def encode_quarantine(value) when is_boolean(value), do: value
+  def encode_quarantine(_), do: {:error, "Unexpected type when encoding ChildData.quarantine"}
+
+  def decode_removal_reason(value) when is_nil(value), do: value
+  def decode_removal_reason(_), do: {:error, "Unexpected type when decoding ChildData.removal_reason"}
+
+  def encode_removal_reason(value) when is_nil(value), do: value
+  def encode_removal_reason(_), do: {:error, "Unexpected type when encoding ChildData.removal_reason"}
+
+  def decode_report_reasons(value) when is_nil(value), do: value
+  def decode_report_reasons(_), do: {:error, "Unexpected type when decoding ChildData.report_reasons"}
+
+  def encode_report_reasons(value) when is_nil(value), do: value
+  def encode_report_reasons(_), do: {:error, "Unexpected type when encoding ChildData.report_reasons"}
+
+  def decode_saved(value) when is_boolean(value), do: value
+  def decode_saved(_), do: {:error, "Unexpected type when decoding ChildData.saved"}
+
+  def encode_saved(value) when is_boolean(value), do: value
+  def encode_saved(_), do: {:error, "Unexpected type when encoding ChildData.saved"}
+
+  def decode_score(value) when is_integer(value), do: value
+  def decode_score(_), do: {:error, "Unexpected type when decoding ChildData.score"}
+
+  def encode_score(value) when is_integer(value), do: value
+  def encode_score(_), do: {:error, "Unexpected type when encoding ChildData.score"}
+
+  def decode_selftext(value) when is_binary(value), do: value
+  def decode_selftext(_), do: {:error, "Unexpected type when decoding ChildData.selftext"}
+
+  def encode_selftext(value) when is_binary(value), do: value
+  def encode_selftext(_), do: {:error, "Unexpected type when encoding ChildData.selftext"}
+
+  def decode_selftext_html(value) when is_nil(value), do: value
+  def decode_selftext_html(_), do: {:error, "Unexpected type when decoding ChildData.selftext_html"}
+
+  def encode_selftext_html(value) when is_nil(value), do: value
+  def encode_selftext_html(_), do: {:error, "Unexpected type when encoding ChildData.selftext_html"}
+
+  def decode_spoiler(value) when is_boolean(value), do: value
+  def decode_spoiler(_), do: {:error, "Unexpected type when decoding ChildData.spoiler"}
+
+  def encode_spoiler(value) when is_boolean(value), do: value
+  def encode_spoiler(_), do: {:error, "Unexpected type when encoding ChildData.spoiler"}
+
+  def decode_stickied(value) when is_boolean(value), do: value
+  def decode_stickied(_), do: {:error, "Unexpected type when decoding ChildData.stickied"}
+
+  def encode_stickied(value) when is_boolean(value), do: value
+  def encode_stickied(_), do: {:error, "Unexpected type when encoding ChildData.stickied"}
+
+  def decode_suggested_sort(value) when is_nil(value), do: value
+  def decode_suggested_sort(_), do: {:error, "Unexpected type when decoding ChildData.suggested_sort"}
+
+  def encode_suggested_sort(value) when is_nil(value), do: value
+  def encode_suggested_sort(_), do: {:error, "Unexpected type when encoding ChildData.suggested_sort"}
+
+  def decode_thumbnail(value) when is_binary(value), do: value
+  def decode_thumbnail(_), do: {:error, "Unexpected type when decoding ChildData.thumbnail"}
+
+  def encode_thumbnail(value) when is_binary(value), do: value
+  def encode_thumbnail(_), do: {:error, "Unexpected type when encoding ChildData.thumbnail"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding ChildData.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding ChildData.title"}
+
+  def decode_ups(value) when is_integer(value), do: value
+  def decode_ups(_), do: {:error, "Unexpected type when decoding ChildData.ups"}
+
+  def encode_ups(value) when is_integer(value), do: value
+  def encode_ups(_), do: {:error, "Unexpected type when encoding ChildData.ups"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding ChildData.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding ChildData.url"}
+
+  def decode_user_reports(value) when is_list(value), do: value
+  def decode_user_reports(_), do: {:error, "Unexpected type when decoding ChildData.user_reports"}
+
+  def encode_user_reports(value) when is_list(value), do: value
+  def encode_user_reports(_), do: {:error, "Unexpected type when encoding ChildData.user_reports"}
+
+  def decode_view_count(value) when is_nil(value), do: value
+  def decode_view_count(_), do: {:error, "Unexpected type when decoding ChildData.view_count"}
+
+  def encode_view_count(value) when is_nil(value), do: value
+  def encode_view_count(_), do: {:error, "Unexpected type when encoding ChildData.view_count"}
+
+  def decode_visited(value) when is_boolean(value), do: value
+  def decode_visited(_), do: {:error, "Unexpected type when decoding ChildData.visited"}
+
+  def encode_visited(value) when is_boolean(value), do: value
+  def encode_visited(_), do: {:error, "Unexpected type when encoding ChildData.visited"}
+
   def from_map(m) do
     %ChildData{
-      approved_at_utc: m["approved_at_utc"],
-      approved_by: m["approved_by"],
-      archived: m["archived"],
-      author: m["author"],
-      author_flair_css_class: m["author_flair_css_class"],
-      author_flair_text: m["author_flair_text"],
-      banned_at_utc: m["banned_at_utc"],
-      banned_by: m["banned_by"],
-      brand_safe: m["brand_safe"],
-      can_gild: m["can_gild"],
-      can_mod_post: m["can_mod_post"],
-      clicked: m["clicked"],
-      contest_mode: m["contest_mode"],
-      created: m["created"],
-      created_utc: m["created_utc"],
-      distinguished: m["distinguished"],
-      domain: m["domain"],
-      downs: m["downs"],
-      edited: m["edited"],
-      gilded: m["gilded"],
-      hidden: m["hidden"],
-      hide_score: m["hide_score"],
-      id: m["id"],
-      is_self: m["is_self"],
-      is_video: m["is_video"],
-      likes: m["likes"],
-      link_flair_css_class: m["link_flair_css_class"],
-      link_flair_text: m["link_flair_text"],
-      locked: m["locked"],
+      approved_at_utc: decode_approved_at_utc(m["approved_at_utc"]),
+      approved_by: decode_approved_by(m["approved_by"]),
+      archived: decode_archived(m["archived"]),
+      author: decode_author(m["author"]),
+      author_flair_css_class: decode_author_flair_css_class(m["author_flair_css_class"]),
+      author_flair_text: decode_author_flair_text(m["author_flair_text"]),
+      banned_at_utc: decode_banned_at_utc(m["banned_at_utc"]),
+      banned_by: decode_banned_by(m["banned_by"]),
+      brand_safe: decode_brand_safe(m["brand_safe"]),
+      can_gild: decode_can_gild(m["can_gild"]),
+      can_mod_post: decode_can_mod_post(m["can_mod_post"]),
+      clicked: decode_clicked(m["clicked"]),
+      contest_mode: decode_contest_mode(m["contest_mode"]),
+      created: decode_created(m["created"]),
+      created_utc: decode_created_utc(m["created_utc"]),
+      distinguished: decode_distinguished(m["distinguished"]),
+      domain: decode_domain(m["domain"]),
+      downs: decode_downs(m["downs"]),
+      edited: decode_edited(m["edited"]),
+      gilded: decode_gilded(m["gilded"]),
+      hidden: decode_hidden(m["hidden"]),
+      hide_score: decode_hide_score(m["hide_score"]),
+      id: decode_id(m["id"]),
+      is_self: decode_is_self(m["is_self"]),
+      is_video: decode_is_video(m["is_video"]),
+      likes: decode_likes(m["likes"]),
+      link_flair_css_class: decode_link_flair_css_class(m["link_flair_css_class"]),
+      link_flair_text: decode_link_flair_text(m["link_flair_text"]),
+      locked: decode_locked(m["locked"]),
       media: m["media"] && Media.from_map(m["media"]),
       media_embed: MediaEmbed.from_map(m["media_embed"]),
-      mod_reports: m["mod_reports"],
-      name: m["name"],
-      num_comments: m["num_comments"],
-      num_reports: m["num_reports"],
-      over_18: m["over_18"],
-      permalink: m["permalink"],
+      mod_reports: decode_mod_reports(m["mod_reports"]),
+      name: decode_name(m["name"]),
+      num_comments: decode_num_comments(m["num_comments"]),
+      num_reports: decode_num_reports(m["num_reports"]),
+      over_18: decode_over_18(m["over_18"]),
+      permalink: decode_permalink(m["permalink"]),
       post_hint: m["post_hint"] && PostHint.decode(m["post_hint"]),
       preview: m["preview"] && Preview.from_map(m["preview"]),
-      quarantine: m["quarantine"],
-      removal_reason: m["removal_reason"],
-      report_reasons: m["report_reasons"],
-      saved: m["saved"],
-      score: m["score"],
+      quarantine: decode_quarantine(m["quarantine"]),
+      removal_reason: decode_removal_reason(m["removal_reason"]),
+      report_reasons: decode_report_reasons(m["report_reasons"]),
+      saved: decode_saved(m["saved"]),
+      score: decode_score(m["score"]),
       secure_media: m["secure_media"] && Media.from_map(m["secure_media"]),
       secure_media_embed: MediaEmbed.from_map(m["secure_media_embed"]),
-      selftext: m["selftext"],
-      selftext_html: m["selftext_html"],
-      spoiler: m["spoiler"],
-      stickied: m["stickied"],
+      selftext: decode_selftext(m["selftext"]),
+      selftext_html: decode_selftext_html(m["selftext_html"]),
+      spoiler: decode_spoiler(m["spoiler"]),
+      stickied: decode_stickied(m["stickied"]),
       subreddit: Subreddit.decode(m["subreddit"]),
       subreddit_id: SubredditID.decode(m["subreddit_id"]),
       subreddit_name_prefixed: SubredditNamePrefixed.decode(m["subreddit_name_prefixed"]),
       subreddit_type: SubredditType.decode(m["subreddit_type"]),
-      suggested_sort: m["suggested_sort"],
-      thumbnail: m["thumbnail"],
+      suggested_sort: decode_suggested_sort(m["suggested_sort"]),
+      thumbnail: decode_thumbnail(m["thumbnail"]),
       thumbnail_height: m["thumbnail_height"],
       thumbnail_width: m["thumbnail_width"],
-      title: m["title"],
-      ups: m["ups"],
-      url: m["url"],
-      user_reports: m["user_reports"],
-      view_count: m["view_count"],
-      visited: m["visited"],
+      title: decode_title(m["title"]),
+      ups: decode_ups(m["ups"]),
+      url: decode_url(m["url"]),
+      user_reports: decode_user_reports(m["user_reports"]),
+      view_count: decode_view_count(m["view_count"]),
+      visited: decode_visited(m["visited"]),
     }
   end
 
@@ -837,12 +1279,36 @@ defmodule TopLevelData do
           modhash: String.t()
         }
 
+  def decode_before(value) when is_nil(value), do: value
+  def decode_before(_), do: {:error, "Unexpected type when decoding TopLevelData.before"}
+
+  def encode_before(value) when is_nil(value), do: value
+  def encode_before(_), do: {:error, "Unexpected type when encoding TopLevelData.before"}
+
+  def decode_children(value) when is_list(value), do: value
+  def decode_children(_), do: {:error, "Unexpected type when decoding TopLevelData.children"}
+
+  def encode_children(value) when is_list(value), do: value
+  def encode_children(_), do: {:error, "Unexpected type when encoding TopLevelData.children"}
+
+  def decode_data_after(value) when is_binary(value), do: value
+  def decode_data_after(_), do: {:error, "Unexpected type when decoding TopLevelData.data_after"}
+
+  def encode_data_after(value) when is_binary(value), do: value
+  def encode_data_after(_), do: {:error, "Unexpected type when encoding TopLevelData.data_after"}
+
+  def decode_modhash(value) when is_binary(value), do: value
+  def decode_modhash(_), do: {:error, "Unexpected type when decoding TopLevelData.modhash"}
+
+  def encode_modhash(value) when is_binary(value), do: value
+  def encode_modhash(_), do: {:error, "Unexpected type when encoding TopLevelData.modhash"}
+
   def from_map(m) do
     %TopLevelData{
-      before: m["before"],
+      before: decode_before(m["before"]),
       children: Enum.map(m["children"], &Child.from_map/1),
-      data_after: m["after"],
-      modhash: m["modhash"],
+      data_after: decode_data_after(m["after"]),
+      modhash: decode_modhash(m["modhash"]),
     }
   end
 
@@ -877,10 +1343,16 @@ defmodule TopLevel do
           kind: String.t()
         }
 
+  def decode_kind(value) when is_binary(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding TopLevel.kind"}
+
+  def encode_kind(value) when is_binary(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding TopLevel.kind"}
+
   def from_map(m) do
     %TopLevel{
       data: TopLevelData.from_map(m["data"]),
-      kind: m["kind"],
+      kind: decode_kind(m["kind"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/4e336.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/4e336.json/default/QuickType.ex
index bf47bf0..b805b08 100644
--- a/base/elixir/test/inputs/json/misc/4e336.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/4e336.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule TotalPopulation do
           population: integer()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TotalPopulation.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TotalPopulation.date"}
+
+  def decode_population(value) when is_integer(value), do: value
+  def decode_population(_), do: {:error, "Unexpected type when decoding TotalPopulation.population"}
+
+  def encode_population(value) when is_integer(value), do: value
+  def encode_population(_), do: {:error, "Unexpected type when encoding TotalPopulation.population"}
+
   def from_map(m) do
     %TotalPopulation{
-      date: m["date"],
-      population: m["population"],
+      date: decode_date(m["date"]),
+      population: decode_population(m["population"]),
     }
   end
 
@@ -49,6 +61,12 @@ defmodule TopLevel do
           total_population: [TotalPopulation.t()]
         }
 
+  def decode_total_population(value) when is_list(value), do: value
+  def decode_total_population(_), do: {:error, "Unexpected type when decoding TopLevel.total_population"}
+
+  def encode_total_population(value) when is_list(value), do: value
+  def encode_total_population(_), do: {:error, "Unexpected type when encoding TopLevel.total_population"}
+
   def from_map(m) do
     %TopLevel{
       total_population: Enum.map(m["total_population"], &TotalPopulation.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/54147.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/54147.json/default/QuickType.ex
index 84311c7..d9156cb 100644
--- a/base/elixir/test/inputs/json/misc/54147.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/54147.json/default/QuickType.ex
@@ -45,12 +45,36 @@ defmodule Headers do
           user_agent: String.t()
         }
 
+  def decode_accept_encoding(value) when is_binary(value), do: value
+  def decode_accept_encoding(_), do: {:error, "Unexpected type when decoding Headers.accept_encoding"}
+
+  def encode_accept_encoding(value) when is_binary(value), do: value
+  def encode_accept_encoding(_), do: {:error, "Unexpected type when encoding Headers.accept_encoding"}
+
+  def decode_connection(value) when is_binary(value), do: value
+  def decode_connection(_), do: {:error, "Unexpected type when decoding Headers.connection"}
+
+  def encode_connection(value) when is_binary(value), do: value
+  def encode_connection(_), do: {:error, "Unexpected type when encoding Headers.connection"}
+
+  def decode_host(value) when is_binary(value), do: value
+  def decode_host(_), do: {:error, "Unexpected type when decoding Headers.host"}
+
+  def encode_host(value) when is_binary(value), do: value
+  def encode_host(_), do: {:error, "Unexpected type when encoding Headers.host"}
+
+  def decode_user_agent(value) when is_binary(value), do: value
+  def decode_user_agent(_), do: {:error, "Unexpected type when decoding Headers.user_agent"}
+
+  def encode_user_agent(value) when is_binary(value), do: value
+  def encode_user_agent(_), do: {:error, "Unexpected type when encoding Headers.user_agent"}
+
   def from_map(m) do
     %Headers{
-      accept_encoding: m["Accept-Encoding"],
-      connection: m["Connection"],
-      host: m["Host"],
-      user_agent: m["User-Agent"],
+      accept_encoding: decode_accept_encoding(m["Accept-Encoding"]),
+      connection: decode_connection(m["Connection"]),
+      host: decode_host(m["Host"]),
+      user_agent: decode_user_agent(m["User-Agent"]),
     }
   end
 
@@ -90,15 +114,33 @@ defmodule TopLevel do
           url: String.t()
         }
 
+  def decode_data(value) when is_binary(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data(value) when is_binary(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
+  def decode_origin(value) when is_binary(value), do: value
+  def decode_origin(_), do: {:error, "Unexpected type when decoding TopLevel.origin"}
+
+  def encode_origin(value) when is_binary(value), do: value
+  def encode_origin(_), do: {:error, "Unexpected type when encoding TopLevel.origin"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding TopLevel.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding TopLevel.url"}
+
   def from_map(m) do
     %TopLevel{
       args: Args.from_map(m["args"]),
-      data: m["data"],
+      data: decode_data(m["data"]),
       files: Args.from_map(m["files"]),
       form: Args.from_map(m["form"]),
       headers: Headers.from_map(m["headers"]),
-      origin: m["origin"],
-      url: m["url"],
+      origin: decode_origin(m["origin"]),
+      url: decode_url(m["url"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/54d32.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/54d32.json/default/QuickType.ex
index 06812a6..392f50a 100644
--- a/base/elixir/test/inputs/json/misc/54d32.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/54d32.json/default/QuickType.ex
@@ -93,14 +93,44 @@ defmodule Result do
           updated_at: String.t()
         }
 
+  def decode_created_at(value) when is_binary(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding Result.created_at"}
+
+  def encode_created_at(value) when is_binary(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding Result.created_at"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Result.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Result.id"}
+
+  def decode_person_id(value) when is_binary(value), do: value
+  def decode_person_id(_), do: {:error, "Unexpected type when decoding Result.person_id"}
+
+  def encode_person_id(value) when is_binary(value), do: value
+  def encode_person_id(_), do: {:error, "Unexpected type when encoding Result.person_id"}
+
+  def decode_representative_id(value) when is_binary(value), do: value
+  def decode_representative_id(_), do: {:error, "Unexpected type when decoding Result.representative_id"}
+
+  def encode_representative_id(value) when is_binary(value), do: value
+  def encode_representative_id(_), do: {:error, "Unexpected type when encoding Result.representative_id"}
+
+  def decode_updated_at(value) when is_binary(value), do: value
+  def decode_updated_at(_), do: {:error, "Unexpected type when decoding Result.updated_at"}
+
+  def encode_updated_at(value) when is_binary(value), do: value
+  def encode_updated_at(_), do: {:error, "Unexpected type when encoding Result.updated_at"}
+
   def from_map(m) do
     %Result{
-      created_at: m["created_at"],
-      id: m["id"],
-      person_id: m["person_id"],
-      representative_id: m["representative_id"],
+      created_at: decode_created_at(m["created_at"]),
+      id: decode_id(m["id"]),
+      person_id: decode_person_id(m["person_id"]),
+      representative_id: decode_representative_id(m["representative_id"]),
       status: Status.decode(m["status"]),
-      updated_at: m["updated_at"],
+      updated_at: decode_updated_at(m["updated_at"]),
     }
   end
 
@@ -142,14 +172,50 @@ defmodule TopLevel do
           results: [Result.t()]
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding TopLevel.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding TopLevel.count"}
+
+  def decode_limit(value) when is_integer(value), do: value
+  def decode_limit(_), do: {:error, "Unexpected type when decoding TopLevel.limit"}
+
+  def encode_limit(value) when is_integer(value), do: value
+  def encode_limit(_), do: {:error, "Unexpected type when encoding TopLevel.limit"}
+
+  def decode_next(value) when is_binary(value), do: value
+  def decode_next(_), do: {:error, "Unexpected type when decoding TopLevel.next"}
+
+  def encode_next(value) when is_binary(value), do: value
+  def encode_next(_), do: {:error, "Unexpected type when encoding TopLevel.next"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding TopLevel.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding TopLevel.offset"}
+
+  def decode_previous(value) when is_boolean(value), do: value
+  def decode_previous(_), do: {:error, "Unexpected type when decoding TopLevel.previous"}
+
+  def encode_previous(value) when is_boolean(value), do: value
+  def encode_previous(_), do: {:error, "Unexpected type when encoding TopLevel.previous"}
+
+  def decode_results(value) when is_list(value), do: value
+  def decode_results(_), do: {:error, "Unexpected type when decoding TopLevel.results"}
+
+  def encode_results(value) when is_list(value), do: value
+  def encode_results(_), do: {:error, "Unexpected type when encoding TopLevel.results"}
+
   def from_map(m) do
     %TopLevel{
-      count: m["count"],
+      count: decode_count(m["count"]),
       facets: Facets.from_map(m["facets"]),
-      limit: m["limit"],
-      next: m["next"],
-      offset: m["offset"],
-      previous: m["previous"],
+      limit: decode_limit(m["limit"]),
+      next: decode_next(m["next"]),
+      offset: decode_offset(m["offset"]),
+      previous: decode_previous(m["previous"]),
       results: Enum.map(m["results"], &Result.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/570ec.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/570ec.json/default/QuickType.ex
index 6cabfc4..6c0ad6d 100644
--- a/base/elixir/test/inputs/json/misc/570ec.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/570ec.json/default/QuickType.ex
@@ -61,9 +61,15 @@ defmodule Identifier do
           scheme: Scheme.t()
         }
 
+  def decode_identifier(value) when is_binary(value), do: value
+  def decode_identifier(_), do: {:error, "Unexpected type when decoding Identifier.identifier"}
+
+  def encode_identifier(value) when is_binary(value), do: value
+  def encode_identifier(_), do: {:error, "Unexpected type when encoding Identifier.identifier"}
+
   def from_map(m) do
     %Identifier{
-      identifier: m["identifier"],
+      identifier: decode_identifier(m["identifier"]),
       scheme: Scheme.decode(m["scheme"]),
     }
   end
@@ -97,10 +103,22 @@ defmodule Link do
           url: String.t()
         }
 
+  def decode_note(value) when is_binary(value), do: value
+  def decode_note(_), do: {:error, "Unexpected type when decoding Link.note"}
+
+  def encode_note(value) when is_binary(value), do: value
+  def encode_note(_), do: {:error, "Unexpected type when encoding Link.note"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Link.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Link.url"}
+
   def from_map(m) do
     %Link{
-      note: m["note"],
-      url: m["url"],
+      note: decode_note(m["note"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -133,9 +151,15 @@ defmodule OtherName do
           note: nil | String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding OtherName.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding OtherName.name"}
+
   def from_map(m) do
     %OtherName{
-      name: m["name"],
+      name: decode_name(m["name"]),
       note: m["note"],
     }
   end
@@ -170,11 +194,29 @@ defmodule Text do
           url: String.t()
         }
 
+  def decode_media_type(value) when is_binary(value), do: value
+  def decode_media_type(_), do: {:error, "Unexpected type when decoding Text.media_type"}
+
+  def encode_media_type(value) when is_binary(value), do: value
+  def encode_media_type(_), do: {:error, "Unexpected type when encoding Text.media_type"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Text.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Text.title"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Text.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Text.url"}
+
   def from_map(m) do
     %Text{
-      media_type: m["media_type"],
-      title: m["title"],
-      url: m["url"],
+      media_type: decode_media_type(m["media_type"]),
+      title: decode_title(m["title"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -214,15 +256,63 @@ defmodule TopLevelElement do
           text: [Text.t()]
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_identifiers(value) when is_list(value), do: value
+  def decode_identifiers(_), do: {:error, "Unexpected type when decoding TopLevelElement.identifiers"}
+
+  def encode_identifiers(value) when is_list(value), do: value
+  def encode_identifiers(_), do: {:error, "Unexpected type when encoding TopLevelElement.identifiers"}
+
+  def decode_keywords(value) when is_list(value), do: value
+  def decode_keywords(_), do: {:error, "Unexpected type when decoding TopLevelElement.keywords"}
+
+  def encode_keywords(value) when is_list(value), do: value
+  def encode_keywords(_), do: {:error, "Unexpected type when encoding TopLevelElement.keywords"}
+
+  def decode_links(value) when is_list(value), do: value
+  def decode_links(_), do: {:error, "Unexpected type when decoding TopLevelElement.links"}
+
+  def encode_links(value) when is_list(value), do: value
+  def encode_links(_), do: {:error, "Unexpected type when encoding TopLevelElement.links"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.name"}
+
+  def decode_other_names(value) when is_list(value), do: value
+  def decode_other_names(_), do: {:error, "Unexpected type when decoding TopLevelElement.other_names"}
+
+  def encode_other_names(value) when is_list(value), do: value
+  def encode_other_names(_), do: {:error, "Unexpected type when encoding TopLevelElement.other_names"}
+
+  def decode_superseded_by(value) when is_nil(value), do: value
+  def decode_superseded_by(_), do: {:error, "Unexpected type when decoding TopLevelElement.superseded_by"}
+
+  def encode_superseded_by(value) when is_nil(value), do: value
+  def encode_superseded_by(_), do: {:error, "Unexpected type when encoding TopLevelElement.superseded_by"}
+
+  def decode_text(value) when is_list(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding TopLevelElement.text"}
+
+  def encode_text(value) when is_list(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding TopLevelElement.text"}
+
   def from_map(m) do
     %TopLevelElement{
-      id: m["id"],
+      id: decode_id(m["id"]),
       identifiers: Enum.map(m["identifiers"], &Identifier.from_map/1),
-      keywords: m["keywords"],
+      keywords: decode_keywords(m["keywords"]),
       links: Enum.map(m["links"], &Link.from_map/1),
-      name: m["name"],
+      name: decode_name(m["name"]),
       other_names: Enum.map(m["other_names"], &OtherName.from_map/1),
-      superseded_by: m["superseded_by"],
+      superseded_by: decode_superseded_by(m["superseded_by"]),
       text: Enum.map(m["text"], &Text.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/5dd0d.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/5dd0d.json/default/QuickType.ex
index b9f86f4..e9a4777 100644
--- a/base/elixir/test/inputs/json/misc/5dd0d.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/5dd0d.json/default/QuickType.ex
@@ -21,17 +21,71 @@ defmodule Status do
           type: String.t()
         }
 
+  def decode_avg_delay(value) when is_binary(value), do: value
+  def decode_avg_delay(_), do: {:error, "Unexpected type when decoding Status.avg_delay"}
+
+  def encode_avg_delay(value) when is_binary(value), do: value
+  def encode_avg_delay(_), do: {:error, "Unexpected type when encoding Status.avg_delay"}
+
+  def decode_closure_begin(value) when is_binary(value), do: value
+  def decode_closure_begin(_), do: {:error, "Unexpected type when decoding Status.closure_begin"}
+
+  def encode_closure_begin(value) when is_binary(value), do: value
+  def encode_closure_begin(_), do: {:error, "Unexpected type when encoding Status.closure_begin"}
+
+  def decode_closure_end(value) when is_binary(value), do: value
+  def decode_closure_end(_), do: {:error, "Unexpected type when decoding Status.closure_end"}
+
+  def encode_closure_end(value) when is_binary(value), do: value
+  def encode_closure_end(_), do: {:error, "Unexpected type when encoding Status.closure_end"}
+
+  def decode_end_time(value) when is_binary(value), do: value
+  def decode_end_time(_), do: {:error, "Unexpected type when decoding Status.end_time"}
+
+  def encode_end_time(value) when is_binary(value), do: value
+  def encode_end_time(_), do: {:error, "Unexpected type when encoding Status.end_time"}
+
+  def decode_max_delay(value) when is_binary(value), do: value
+  def decode_max_delay(_), do: {:error, "Unexpected type when decoding Status.max_delay"}
+
+  def encode_max_delay(value) when is_binary(value), do: value
+  def encode_max_delay(_), do: {:error, "Unexpected type when encoding Status.max_delay"}
+
+  def decode_min_delay(value) when is_binary(value), do: value
+  def decode_min_delay(_), do: {:error, "Unexpected type when decoding Status.min_delay"}
+
+  def encode_min_delay(value) when is_binary(value), do: value
+  def encode_min_delay(_), do: {:error, "Unexpected type when encoding Status.min_delay"}
+
+  def decode_reason(value) when is_binary(value), do: value
+  def decode_reason(_), do: {:error, "Unexpected type when decoding Status.reason"}
+
+  def encode_reason(value) when is_binary(value), do: value
+  def encode_reason(_), do: {:error, "Unexpected type when encoding Status.reason"}
+
+  def decode_trend(value) when is_binary(value), do: value
+  def decode_trend(_), do: {:error, "Unexpected type when decoding Status.trend"}
+
+  def encode_trend(value) when is_binary(value), do: value
+  def encode_trend(_), do: {:error, "Unexpected type when encoding Status.trend"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Status.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Status.type"}
+
   def from_map(m) do
     %Status{
-      avg_delay: m["avgDelay"],
-      closure_begin: m["closureBegin"],
-      closure_end: m["closureEnd"],
-      end_time: m["endTime"],
-      max_delay: m["maxDelay"],
-      min_delay: m["minDelay"],
-      reason: m["reason"],
-      trend: m["trend"],
-      type: m["type"],
+      avg_delay: decode_avg_delay(m["avgDelay"]),
+      closure_begin: decode_closure_begin(m["closureBegin"]),
+      closure_end: decode_closure_end(m["closureEnd"]),
+      end_time: decode_end_time(m["endTime"]),
+      max_delay: decode_max_delay(m["maxDelay"]),
+      min_delay: decode_min_delay(m["minDelay"]),
+      reason: decode_reason(m["reason"]),
+      trend: decode_trend(m["trend"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -72,11 +126,29 @@ defmodule Meta do
           url: String.t()
         }
 
+  def decode_credit(value) when is_binary(value), do: value
+  def decode_credit(_), do: {:error, "Unexpected type when decoding Meta.credit"}
+
+  def encode_credit(value) when is_binary(value), do: value
+  def encode_credit(_), do: {:error, "Unexpected type when encoding Meta.credit"}
+
+  def decode_updated(value) when is_binary(value), do: value
+  def decode_updated(_), do: {:error, "Unexpected type when decoding Meta.updated"}
+
+  def encode_updated(value) when is_binary(value), do: value
+  def encode_updated(_), do: {:error, "Unexpected type when encoding Meta.updated"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Meta.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Meta.url"}
+
   def from_map(m) do
     %Meta{
-      credit: m["credit"],
-      updated: m["updated"],
-      url: m["url"],
+      credit: decode_credit(m["credit"]),
+      updated: decode_updated(m["updated"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -113,13 +185,39 @@ defmodule Weather do
           wind: String.t()
         }
 
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Weather.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Weather.temp"}
+
+  def decode_visibility(value) when is_float(value), do: value
+  def decode_visibility(value) when is_integer(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Weather.visibility"}
+
+  def encode_visibility(value) when is_float(value), do: value
+  def encode_visibility(value) when is_integer(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Weather.visibility"}
+
+  def decode_weather(value) when is_binary(value), do: value
+  def decode_weather(_), do: {:error, "Unexpected type when decoding Weather.weather"}
+
+  def encode_weather(value) when is_binary(value), do: value
+  def encode_weather(_), do: {:error, "Unexpected type when encoding Weather.weather"}
+
+  def decode_wind(value) when is_binary(value), do: value
+  def decode_wind(_), do: {:error, "Unexpected type when decoding Weather.wind"}
+
+  def encode_wind(value) when is_binary(value), do: value
+  def encode_wind(_), do: {:error, "Unexpected type when encoding Weather.wind"}
+
   def from_map(m) do
     %Weather{
       meta: Meta.from_map(m["meta"]),
-      temp: m["temp"],
-      visibility: m["visibility"],
-      weather: m["weather"],
-      wind: m["wind"],
+      temp: decode_temp(m["temp"]),
+      visibility: decode_visibility(m["visibility"]),
+      weather: decode_weather(m["weather"]),
+      wind: decode_wind(m["wind"]),
     }
   end
 
@@ -161,14 +259,50 @@ defmodule TopLevel do
           weather: Weather.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding TopLevel.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding TopLevel.city"}
+
+  def decode_delay(value) when is_binary(value), do: value
+  def decode_delay(_), do: {:error, "Unexpected type when decoding TopLevel.delay"}
+
+  def encode_delay(value) when is_binary(value), do: value
+  def encode_delay(_), do: {:error, "Unexpected type when encoding TopLevel.delay"}
+
+  def decode_iata(value) when is_binary(value), do: value
+  def decode_iata(_), do: {:error, "Unexpected type when decoding TopLevel.iata"}
+
+  def encode_iata(value) when is_binary(value), do: value
+  def encode_iata(_), do: {:error, "Unexpected type when encoding TopLevel.iata"}
+
+  def decode_icao(value) when is_binary(value), do: value
+  def decode_icao(_), do: {:error, "Unexpected type when decoding TopLevel.icao"}
+
+  def encode_icao(value) when is_binary(value), do: value
+  def encode_icao(_), do: {:error, "Unexpected type when encoding TopLevel.icao"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding TopLevel.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding TopLevel.state"}
+
   def from_map(m) do
     %TopLevel{
-      city: m["city"],
-      delay: m["delay"],
-      iata: m["IATA"],
-      icao: m["ICAO"],
-      name: m["name"],
-      state: m["state"],
+      city: decode_city(m["city"]),
+      delay: decode_delay(m["delay"]),
+      iata: decode_iata(m["IATA"]),
+      icao: decode_icao(m["ICAO"]),
+      name: decode_name(m["name"]),
+      state: decode_state(m["state"]),
       status: Status.from_map(m["status"]),
       weather: Weather.from_map(m["weather"]),
     }
diff --git a/base/elixir/test/inputs/json/misc/5eae5.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/5eae5.json/default/QuickType.ex
index 7616508..a816b7c 100644
--- a/base/elixir/test/inputs/json/misc/5eae5.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/5eae5.json/default/QuickType.ex
@@ -16,12 +16,36 @@ defmodule TopLevelElement do
           title: String.t()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevelElement.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevelElement.date"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_sponsor(value) when is_binary(value), do: value
+  def decode_sponsor(_), do: {:error, "Unexpected type when decoding TopLevelElement.sponsor"}
+
+  def encode_sponsor(value) when is_binary(value), do: value
+  def encode_sponsor(_), do: {:error, "Unexpected type when encoding TopLevelElement.sponsor"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding TopLevelElement.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding TopLevelElement.title"}
+
   def from_map(m) do
     %TopLevelElement{
-      date: m["Date"],
-      id: m["ID"],
-      sponsor: m["Sponsor"],
-      title: m["Title"],
+      date: decode_date(m["Date"]),
+      id: decode_id(m["ID"]),
+      sponsor: decode_sponsor(m["Sponsor"]),
+      title: decode_title(m["Title"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/5eb20.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/5eb20.json/default/QuickType.ex
index b9f86f4..e9a4777 100644
--- a/base/elixir/test/inputs/json/misc/5eb20.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/5eb20.json/default/QuickType.ex
@@ -21,17 +21,71 @@ defmodule Status do
           type: String.t()
         }
 
+  def decode_avg_delay(value) when is_binary(value), do: value
+  def decode_avg_delay(_), do: {:error, "Unexpected type when decoding Status.avg_delay"}
+
+  def encode_avg_delay(value) when is_binary(value), do: value
+  def encode_avg_delay(_), do: {:error, "Unexpected type when encoding Status.avg_delay"}
+
+  def decode_closure_begin(value) when is_binary(value), do: value
+  def decode_closure_begin(_), do: {:error, "Unexpected type when decoding Status.closure_begin"}
+
+  def encode_closure_begin(value) when is_binary(value), do: value
+  def encode_closure_begin(_), do: {:error, "Unexpected type when encoding Status.closure_begin"}
+
+  def decode_closure_end(value) when is_binary(value), do: value
+  def decode_closure_end(_), do: {:error, "Unexpected type when decoding Status.closure_end"}
+
+  def encode_closure_end(value) when is_binary(value), do: value
+  def encode_closure_end(_), do: {:error, "Unexpected type when encoding Status.closure_end"}
+
+  def decode_end_time(value) when is_binary(value), do: value
+  def decode_end_time(_), do: {:error, "Unexpected type when decoding Status.end_time"}
+
+  def encode_end_time(value) when is_binary(value), do: value
+  def encode_end_time(_), do: {:error, "Unexpected type when encoding Status.end_time"}
+
+  def decode_max_delay(value) when is_binary(value), do: value
+  def decode_max_delay(_), do: {:error, "Unexpected type when decoding Status.max_delay"}
+
+  def encode_max_delay(value) when is_binary(value), do: value
+  def encode_max_delay(_), do: {:error, "Unexpected type when encoding Status.max_delay"}
+
+  def decode_min_delay(value) when is_binary(value), do: value
+  def decode_min_delay(_), do: {:error, "Unexpected type when decoding Status.min_delay"}
+
+  def encode_min_delay(value) when is_binary(value), do: value
+  def encode_min_delay(_), do: {:error, "Unexpected type when encoding Status.min_delay"}
+
+  def decode_reason(value) when is_binary(value), do: value
+  def decode_reason(_), do: {:error, "Unexpected type when decoding Status.reason"}
+
+  def encode_reason(value) when is_binary(value), do: value
+  def encode_reason(_), do: {:error, "Unexpected type when encoding Status.reason"}
+
+  def decode_trend(value) when is_binary(value), do: value
+  def decode_trend(_), do: {:error, "Unexpected type when decoding Status.trend"}
+
+  def encode_trend(value) when is_binary(value), do: value
+  def encode_trend(_), do: {:error, "Unexpected type when encoding Status.trend"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Status.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Status.type"}
+
   def from_map(m) do
     %Status{
-      avg_delay: m["avgDelay"],
-      closure_begin: m["closureBegin"],
-      closure_end: m["closureEnd"],
-      end_time: m["endTime"],
-      max_delay: m["maxDelay"],
-      min_delay: m["minDelay"],
-      reason: m["reason"],
-      trend: m["trend"],
-      type: m["type"],
+      avg_delay: decode_avg_delay(m["avgDelay"]),
+      closure_begin: decode_closure_begin(m["closureBegin"]),
+      closure_end: decode_closure_end(m["closureEnd"]),
+      end_time: decode_end_time(m["endTime"]),
+      max_delay: decode_max_delay(m["maxDelay"]),
+      min_delay: decode_min_delay(m["minDelay"]),
+      reason: decode_reason(m["reason"]),
+      trend: decode_trend(m["trend"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -72,11 +126,29 @@ defmodule Meta do
           url: String.t()
         }
 
+  def decode_credit(value) when is_binary(value), do: value
+  def decode_credit(_), do: {:error, "Unexpected type when decoding Meta.credit"}
+
+  def encode_credit(value) when is_binary(value), do: value
+  def encode_credit(_), do: {:error, "Unexpected type when encoding Meta.credit"}
+
+  def decode_updated(value) when is_binary(value), do: value
+  def decode_updated(_), do: {:error, "Unexpected type when decoding Meta.updated"}
+
+  def encode_updated(value) when is_binary(value), do: value
+  def encode_updated(_), do: {:error, "Unexpected type when encoding Meta.updated"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Meta.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Meta.url"}
+
   def from_map(m) do
     %Meta{
-      credit: m["credit"],
-      updated: m["updated"],
-      url: m["url"],
+      credit: decode_credit(m["credit"]),
+      updated: decode_updated(m["updated"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -113,13 +185,39 @@ defmodule Weather do
           wind: String.t()
         }
 
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Weather.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Weather.temp"}
+
+  def decode_visibility(value) when is_float(value), do: value
+  def decode_visibility(value) when is_integer(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Weather.visibility"}
+
+  def encode_visibility(value) when is_float(value), do: value
+  def encode_visibility(value) when is_integer(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Weather.visibility"}
+
+  def decode_weather(value) when is_binary(value), do: value
+  def decode_weather(_), do: {:error, "Unexpected type when decoding Weather.weather"}
+
+  def encode_weather(value) when is_binary(value), do: value
+  def encode_weather(_), do: {:error, "Unexpected type when encoding Weather.weather"}
+
+  def decode_wind(value) when is_binary(value), do: value
+  def decode_wind(_), do: {:error, "Unexpected type when decoding Weather.wind"}
+
+  def encode_wind(value) when is_binary(value), do: value
+  def encode_wind(_), do: {:error, "Unexpected type when encoding Weather.wind"}
+
   def from_map(m) do
     %Weather{
       meta: Meta.from_map(m["meta"]),
-      temp: m["temp"],
-      visibility: m["visibility"],
-      weather: m["weather"],
-      wind: m["wind"],
+      temp: decode_temp(m["temp"]),
+      visibility: decode_visibility(m["visibility"]),
+      weather: decode_weather(m["weather"]),
+      wind: decode_wind(m["wind"]),
     }
   end
 
@@ -161,14 +259,50 @@ defmodule TopLevel do
           weather: Weather.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding TopLevel.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding TopLevel.city"}
+
+  def decode_delay(value) when is_binary(value), do: value
+  def decode_delay(_), do: {:error, "Unexpected type when decoding TopLevel.delay"}
+
+  def encode_delay(value) when is_binary(value), do: value
+  def encode_delay(_), do: {:error, "Unexpected type when encoding TopLevel.delay"}
+
+  def decode_iata(value) when is_binary(value), do: value
+  def decode_iata(_), do: {:error, "Unexpected type when decoding TopLevel.iata"}
+
+  def encode_iata(value) when is_binary(value), do: value
+  def encode_iata(_), do: {:error, "Unexpected type when encoding TopLevel.iata"}
+
+  def decode_icao(value) when is_binary(value), do: value
+  def decode_icao(_), do: {:error, "Unexpected type when decoding TopLevel.icao"}
+
+  def encode_icao(value) when is_binary(value), do: value
+  def encode_icao(_), do: {:error, "Unexpected type when encoding TopLevel.icao"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding TopLevel.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding TopLevel.state"}
+
   def from_map(m) do
     %TopLevel{
-      city: m["city"],
-      delay: m["delay"],
-      iata: m["IATA"],
-      icao: m["ICAO"],
-      name: m["name"],
-      state: m["state"],
+      city: decode_city(m["city"]),
+      delay: decode_delay(m["delay"]),
+      iata: decode_iata(m["IATA"]),
+      icao: decode_icao(m["ICAO"]),
+      name: decode_name(m["name"]),
+      state: decode_state(m["state"]),
       status: Status.from_map(m["status"]),
       weather: Weather.from_map(m["weather"]),
     }
diff --git a/base/elixir/test/inputs/json/misc/5f3a1.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/5f3a1.json/default/QuickType.ex
index 8937606..db497b1 100644
--- a/base/elixir/test/inputs/json/misc/5f3a1.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/5f3a1.json/default/QuickType.ex
@@ -15,11 +15,32 @@ defmodule TopLevel do
           rates: %{String.t() => float()}
         }
 
+  def decode_base(value) when is_binary(value), do: value
+  def decode_base(_), do: {:error, "Unexpected type when decoding TopLevel.base"}
+
+  def encode_base(value) when is_binary(value), do: value
+  def encode_base(_), do: {:error, "Unexpected type when encoding TopLevel.base"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel.date"}
+
+  def decode_rates_value(value) when is_float(value), do: value
+  def decode_rates_value(value) when is_integer(value), do: value
+  def decode_rates_value(_), do: {:error, "Unexpected type when decoding TopLevel.rates"}
+
+  def encode_rates_value(value) when is_float(value), do: value
+  def encode_rates_value(value) when is_integer(value), do: value
+  def encode_rates_value(_), do: {:error, "Unexpected type when encoding TopLevel.rates"}
+
   def from_map(m) do
     %TopLevel{
-      base: m["base"],
-      date: m["date"],
-      rates: m["rates"],
+      base: decode_base(m["base"]),
+      date: decode_date(m["date"]),
+      rates: m["rates"]
+      |> Map.new(fn {key, value} -> {key, decode_rates_value(value)} end),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/5f7fe.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/5f7fe.json/default/QuickType.ex
index c2de8dc..1e4bd0d 100644
--- a/base/elixir/test/inputs/json/misc/5f7fe.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/5f7fe.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Top do
           item: String.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Top.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Top.count"}
+
+  def decode_item(value) when is_binary(value), do: value
+  def decode_item(_), do: {:error, "Unexpected type when decoding Top.item"}
+
+  def encode_item(value) when is_binary(value), do: value
+  def encode_item(_), do: {:error, "Unexpected type when encoding Top.item"}
+
   def from_map(m) do
     %Top{
-      count: m["count"],
-      item: m["item"],
+      count: decode_count(m["count"]),
+      item: decode_item(m["item"]),
     }
   end
 
@@ -53,12 +65,42 @@ defmodule CachedContents do
           top: [Top.t()]
         }
 
+  def decode_largest(value) when is_binary(value), do: value
+  def decode_largest(_), do: {:error, "Unexpected type when decoding CachedContents.largest"}
+
+  def encode_largest(value) when is_binary(value), do: value
+  def encode_largest(_), do: {:error, "Unexpected type when encoding CachedContents.largest"}
+
+  def decode_non_null(value) when is_integer(value), do: value
+  def decode_non_null(_), do: {:error, "Unexpected type when decoding CachedContents.non_null"}
+
+  def encode_non_null(value) when is_integer(value), do: value
+  def encode_non_null(_), do: {:error, "Unexpected type when encoding CachedContents.non_null"}
+
+  def decode_null(value) when is_integer(value), do: value
+  def decode_null(_), do: {:error, "Unexpected type when decoding CachedContents.null"}
+
+  def encode_null(value) when is_integer(value), do: value
+  def encode_null(_), do: {:error, "Unexpected type when encoding CachedContents.null"}
+
+  def decode_smallest(value) when is_binary(value), do: value
+  def decode_smallest(_), do: {:error, "Unexpected type when decoding CachedContents.smallest"}
+
+  def encode_smallest(value) when is_binary(value), do: value
+  def encode_smallest(_), do: {:error, "Unexpected type when encoding CachedContents.smallest"}
+
+  def decode_top(value) when is_list(value), do: value
+  def decode_top(_), do: {:error, "Unexpected type when decoding CachedContents.top"}
+
+  def encode_top(value) when is_list(value), do: value
+  def encode_top(_), do: {:error, "Unexpected type when encoding CachedContents.top"}
+
   def from_map(m) do
     %CachedContents{
-      largest: m["largest"],
-      non_null: m["non_null"],
-      null: m["null"],
-      smallest: m["smallest"],
+      largest: decode_largest(m["largest"]),
+      non_null: decode_non_null(m["non_null"]),
+      null: decode_null(m["null"]),
+      smallest: decode_smallest(m["smallest"]),
       top: Enum.map(m["top"], &Top.from_map/1),
     }
   end
@@ -186,16 +228,40 @@ defmodule Column do
           width: integer() | nil
         }
 
+  def decode_field_name(value) when is_binary(value), do: value
+  def decode_field_name(_), do: {:error, "Unexpected type when decoding Column.field_name"}
+
+  def encode_field_name(value) when is_binary(value), do: value
+  def encode_field_name(_), do: {:error, "Unexpected type when encoding Column.field_name"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Column.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Column.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Column.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Column.name"}
+
+  def decode_position(value) when is_integer(value), do: value
+  def decode_position(_), do: {:error, "Unexpected type when decoding Column.position"}
+
+  def encode_position(value) when is_integer(value), do: value
+  def encode_position(_), do: {:error, "Unexpected type when encoding Column.position"}
+
   def from_map(m) do
     %Column{
       cached_contents: m["cachedContents"] && CachedContents.from_map(m["cachedContents"]),
       data_type_name: TypeName.decode(m["dataTypeName"]),
-      field_name: m["fieldName"],
+      field_name: decode_field_name(m["fieldName"]),
       flags: m["flags"],
       format: Format.from_map(m["format"]),
-      id: m["id"],
-      name: m["name"],
-      position: m["position"],
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
+      position: decode_position(m["position"]),
       render_type_name: TypeName.decode(m["renderTypeName"]),
       table_column_id: m["tableColumnId"],
       width: m["width"],
@@ -241,11 +307,29 @@ defmodule Grant do
           type: String.t()
         }
 
+  def decode_flags(value) when is_list(value), do: value
+  def decode_flags(_), do: {:error, "Unexpected type when decoding Grant.flags"}
+
+  def encode_flags(value) when is_list(value), do: value
+  def encode_flags(_), do: {:error, "Unexpected type when encoding Grant.flags"}
+
+  def decode_inherited(value) when is_boolean(value), do: value
+  def decode_inherited(_), do: {:error, "Unexpected type when decoding Grant.inherited"}
+
+  def encode_inherited(value) when is_boolean(value), do: value
+  def encode_inherited(_), do: {:error, "Unexpected type when encoding Grant.inherited"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Grant.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Grant.type"}
+
   def from_map(m) do
     %Grant{
-      flags: m["flags"],
-      inherited: m["inherited"],
-      type: m["type"],
+      flags: decode_flags(m["flags"]),
+      inherited: decode_inherited(m["inherited"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -281,12 +365,36 @@ defmodule Attachment do
           name: String.t()
         }
 
+  def decode_asset_id(value) when is_binary(value), do: value
+  def decode_asset_id(_), do: {:error, "Unexpected type when decoding Attachment.asset_id"}
+
+  def encode_asset_id(value) when is_binary(value), do: value
+  def encode_asset_id(_), do: {:error, "Unexpected type when encoding Attachment.asset_id"}
+
+  def decode_blob_id(value) when is_binary(value), do: value
+  def decode_blob_id(_), do: {:error, "Unexpected type when decoding Attachment.blob_id"}
+
+  def encode_blob_id(value) when is_binary(value), do: value
+  def encode_blob_id(_), do: {:error, "Unexpected type when encoding Attachment.blob_id"}
+
+  def decode_filename(value) when is_binary(value), do: value
+  def decode_filename(_), do: {:error, "Unexpected type when decoding Attachment.filename"}
+
+  def encode_filename(value) when is_binary(value), do: value
+  def encode_filename(_), do: {:error, "Unexpected type when encoding Attachment.filename"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Attachment.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Attachment.name"}
+
   def from_map(m) do
     %Attachment{
-      asset_id: m["assetId"],
-      blob_id: m["blobId"],
-      filename: m["filename"],
-      name: m["name"],
+      asset_id: decode_asset_id(m["assetId"]),
+      blob_id: decode_blob_id(m["blobId"]),
+      filename: decode_filename(m["filename"]),
+      name: decode_name(m["name"]),
     }
   end
 
@@ -321,10 +429,22 @@ defmodule AdditionalResources do
           see_also: String.t()
         }
 
+  def decode_additional_resources_see_also(value) when is_binary(value), do: value
+  def decode_additional_resources_see_also(_), do: {:error, "Unexpected type when decoding AdditionalResources.additional_resources_see_also"}
+
+  def encode_additional_resources_see_also(value) when is_binary(value), do: value
+  def encode_additional_resources_see_also(_), do: {:error, "Unexpected type when encoding AdditionalResources.additional_resources_see_also"}
+
+  def decode_see_also(value) when is_binary(value), do: value
+  def decode_see_also(_), do: {:error, "Unexpected type when decoding AdditionalResources.see_also"}
+
+  def encode_see_also(value) when is_binary(value), do: value
+  def encode_see_also(_), do: {:error, "Unexpected type when encoding AdditionalResources.see_also"}
+
   def from_map(m) do
     %AdditionalResources{
-      additional_resources_see_also: m["See Also "],
-      see_also: m["See Also"],
+      additional_resources_see_also: decode_additional_resources_see_also(m["See Also "]),
+      see_also: decode_see_also(m["See Also"]),
     }
   end
 
@@ -358,11 +478,29 @@ defmodule CommonCore do
           publisher: String.t()
         }
 
+  def decode_contact_email(value) when is_binary(value), do: value
+  def decode_contact_email(_), do: {:error, "Unexpected type when decoding CommonCore.contact_email"}
+
+  def encode_contact_email(value) when is_binary(value), do: value
+  def encode_contact_email(_), do: {:error, "Unexpected type when encoding CommonCore.contact_email"}
+
+  def decode_contact_name(value) when is_binary(value), do: value
+  def decode_contact_name(_), do: {:error, "Unexpected type when decoding CommonCore.contact_name"}
+
+  def encode_contact_name(value) when is_binary(value), do: value
+  def encode_contact_name(_), do: {:error, "Unexpected type when encoding CommonCore.contact_name"}
+
+  def decode_publisher(value) when is_binary(value), do: value
+  def decode_publisher(_), do: {:error, "Unexpected type when decoding CommonCore.publisher"}
+
+  def encode_publisher(value) when is_binary(value), do: value
+  def encode_publisher(_), do: {:error, "Unexpected type when encoding CommonCore.publisher"}
+
   def from_map(m) do
     %CommonCore{
-      contact_email: m["Contact Email"],
-      contact_name: m["Contact Name"],
-      publisher: m["Publisher"],
+      contact_email: decode_contact_email(m["Contact Email"]),
+      contact_name: decode_contact_name(m["Contact Name"]),
+      publisher: decode_publisher(m["Publisher"]),
     }
   end
 
@@ -395,9 +533,15 @@ defmodule DatasetInformation do
           agency: String.t()
         }
 
+  def decode_agency(value) when is_binary(value), do: value
+  def decode_agency(_), do: {:error, "Unexpected type when decoding DatasetInformation.agency"}
+
+  def encode_agency(value) when is_binary(value), do: value
+  def encode_agency(_), do: {:error, "Unexpected type when encoding DatasetInformation.agency"}
+
   def from_map(m) do
     %DatasetInformation{
-      agency: m["Agency"],
+      agency: decode_agency(m["Agency"]),
     }
   end
 
@@ -436,17 +580,71 @@ defmodule DatasetSummary do
           units: String.t()
         }
 
+  def decode_contact_information(value) when is_binary(value), do: value
+  def decode_contact_information(_), do: {:error, "Unexpected type when decoding DatasetSummary.contact_information"}
+
+  def encode_contact_information(value) when is_binary(value), do: value
+  def encode_contact_information(_), do: {:error, "Unexpected type when encoding DatasetSummary.contact_information"}
+
+  def decode_coverage(value) when is_binary(value), do: value
+  def decode_coverage(_), do: {:error, "Unexpected type when decoding DatasetSummary.coverage"}
+
+  def encode_coverage(value) when is_binary(value), do: value
+  def encode_coverage(_), do: {:error, "Unexpected type when encoding DatasetSummary.coverage"}
+
+  def decode_data_frequency(value) when is_binary(value), do: value
+  def decode_data_frequency(_), do: {:error, "Unexpected type when decoding DatasetSummary.data_frequency"}
+
+  def encode_data_frequency(value) when is_binary(value), do: value
+  def encode_data_frequency(_), do: {:error, "Unexpected type when encoding DatasetSummary.data_frequency"}
+
+  def decode_dataset_owner(value) when is_binary(value), do: value
+  def decode_dataset_owner(_), do: {:error, "Unexpected type when decoding DatasetSummary.dataset_owner"}
+
+  def encode_dataset_owner(value) when is_binary(value), do: value
+  def encode_dataset_owner(_), do: {:error, "Unexpected type when encoding DatasetSummary.dataset_owner"}
+
+  def decode_granularity(value) when is_binary(value), do: value
+  def decode_granularity(_), do: {:error, "Unexpected type when decoding DatasetSummary.granularity"}
+
+  def encode_granularity(value) when is_binary(value), do: value
+  def encode_granularity(_), do: {:error, "Unexpected type when encoding DatasetSummary.granularity"}
+
+  def decode_organization(value) when is_binary(value), do: value
+  def decode_organization(_), do: {:error, "Unexpected type when decoding DatasetSummary.organization"}
+
+  def encode_organization(value) when is_binary(value), do: value
+  def encode_organization(_), do: {:error, "Unexpected type when encoding DatasetSummary.organization"}
+
+  def decode_posting_frequency(value) when is_binary(value), do: value
+  def decode_posting_frequency(_), do: {:error, "Unexpected type when decoding DatasetSummary.posting_frequency"}
+
+  def encode_posting_frequency(value) when is_binary(value), do: value
+  def encode_posting_frequency(_), do: {:error, "Unexpected type when encoding DatasetSummary.posting_frequency"}
+
+  def decode_time_period(value) when is_binary(value), do: value
+  def decode_time_period(_), do: {:error, "Unexpected type when decoding DatasetSummary.time_period"}
+
+  def encode_time_period(value) when is_binary(value), do: value
+  def encode_time_period(_), do: {:error, "Unexpected type when encoding DatasetSummary.time_period"}
+
+  def decode_units(value) when is_binary(value), do: value
+  def decode_units(_), do: {:error, "Unexpected type when decoding DatasetSummary.units"}
+
+  def encode_units(value) when is_binary(value), do: value
+  def encode_units(_), do: {:error, "Unexpected type when encoding DatasetSummary.units"}
+
   def from_map(m) do
     %DatasetSummary{
-      contact_information: m["Contact Information"],
-      coverage: m["Coverage"],
-      data_frequency: m["Data Frequency"],
-      dataset_owner: m["Dataset Owner"],
-      granularity: m["Granularity"],
-      organization: m["Organization"],
-      posting_frequency: m["Posting Frequency"],
-      time_period: m["Time Period"],
-      units: m["Units"],
+      contact_information: decode_contact_information(m["Contact Information"]),
+      coverage: decode_coverage(m["Coverage"]),
+      data_frequency: decode_data_frequency(m["Data Frequency"]),
+      dataset_owner: decode_dataset_owner(m["Dataset Owner"]),
+      granularity: decode_granularity(m["Granularity"]),
+      organization: decode_organization(m["Organization"]),
+      posting_frequency: decode_posting_frequency(m["Posting Frequency"]),
+      time_period: decode_time_period(m["Time Period"]),
+      units: decode_units(m["Units"]),
     }
   end
 
@@ -485,9 +683,15 @@ defmodule Notes do
           notes: String.t()
         }
 
+  def decode_notes(value) when is_binary(value), do: value
+  def decode_notes(_), do: {:error, "Unexpected type when decoding Notes.notes"}
+
+  def encode_notes(value) when is_binary(value), do: value
+  def encode_notes(_), do: {:error, "Unexpected type when encoding Notes.notes"}
+
   def from_map(m) do
     %Notes{
-      notes: m["Notes"],
+      notes: decode_notes(m["Notes"]),
     }
   end
 
@@ -564,10 +768,22 @@ defmodule Order do
           column_field_name: String.t()
         }
 
+  def decode_ascending(value) when is_boolean(value), do: value
+  def decode_ascending(_), do: {:error, "Unexpected type when decoding Order.ascending"}
+
+  def encode_ascending(value) when is_boolean(value), do: value
+  def encode_ascending(_), do: {:error, "Unexpected type when encoding Order.ascending"}
+
+  def decode_column_field_name(value) when is_binary(value), do: value
+  def decode_column_field_name(_), do: {:error, "Unexpected type when decoding Order.column_field_name"}
+
+  def encode_column_field_name(value) when is_binary(value), do: value
+  def encode_column_field_name(_), do: {:error, "Unexpected type when encoding Order.column_field_name"}
+
   def from_map(m) do
     %Order{
-      ascending: m["ascending"],
-      column_field_name: m["columnFieldName"],
+      ascending: decode_ascending(m["ascending"]),
+      column_field_name: decode_column_field_name(m["columnFieldName"]),
     }
   end
 
@@ -599,6 +815,12 @@ defmodule JSONQuery do
           order: [Order.t()]
         }
 
+  def decode_order(value) when is_list(value), do: value
+  def decode_order(_), do: {:error, "Unexpected type when decoding JSONQuery.order"}
+
+  def encode_order(value) when is_list(value), do: value
+  def encode_order(_), do: {:error, "Unexpected type when encoding JSONQuery.order"}
+
   def from_map(m) do
     %JSONQuery{
       order: Enum.map(m["order"], &Order.from_map/1),
@@ -632,9 +854,15 @@ defmodule Visible do
           table: boolean()
         }
 
+  def decode_table(value) when is_boolean(value), do: value
+  def decode_table(_), do: {:error, "Unexpected type when decoding Visible.table"}
+
+  def encode_table(value) when is_boolean(value), do: value
+  def encode_table(_), do: {:error, "Unexpected type when encoding Visible.table"}
+
   def from_map(m) do
     %Visible{
-      table: m["table"],
+      table: decode_table(m["table"]),
     }
   end
 
@@ -703,13 +931,31 @@ defmodule Metadata do
           render_type_config: RenderTypeConfig.t()
         }
 
+  def decode_attachments(value) when is_list(value), do: value
+  def decode_attachments(_), do: {:error, "Unexpected type when decoding Metadata.attachments"}
+
+  def encode_attachments(value) when is_list(value), do: value
+  def encode_attachments(_), do: {:error, "Unexpected type when encoding Metadata.attachments"}
+
+  def decode_available_display_types(value) when is_list(value), do: value
+  def decode_available_display_types(_), do: {:error, "Unexpected type when decoding Metadata.available_display_types"}
+
+  def encode_available_display_types(value) when is_list(value), do: value
+  def encode_available_display_types(_), do: {:error, "Unexpected type when encoding Metadata.available_display_types"}
+
+  def decode_rdf_subject(value) when is_binary(value), do: value
+  def decode_rdf_subject(_), do: {:error, "Unexpected type when decoding Metadata.rdf_subject"}
+
+  def encode_rdf_subject(value) when is_binary(value), do: value
+  def encode_rdf_subject(_), do: {:error, "Unexpected type when encoding Metadata.rdf_subject"}
+
   def from_map(m) do
     %Metadata{
       attachments: Enum.map(m["attachments"], &Attachment.from_map/1),
-      available_display_types: m["availableDisplayTypes"],
+      available_display_types: decode_available_display_types(m["availableDisplayTypes"]),
       custom_fields: CustomFields.from_map(m["custom_fields"]),
       json_query: JSONQuery.from_map(m["jsonQuery"]),
-      rdf_subject: m["rdfSubject"],
+      rdf_subject: decode_rdf_subject(m["rdfSubject"]),
       render_type_config: RenderTypeConfig.from_map(m["renderTypeConfig"]),
     }
   end
@@ -753,16 +999,64 @@ defmodule Owner do
           screen_name: String.t()
         }
 
+  def decode_display_name(value) when is_binary(value), do: value
+  def decode_display_name(_), do: {:error, "Unexpected type when decoding Owner.display_name"}
+
+  def encode_display_name(value) when is_binary(value), do: value
+  def encode_display_name(_), do: {:error, "Unexpected type when encoding Owner.display_name"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Owner.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Owner.id"}
+
+  def decode_profile_image_url_large(value) when is_binary(value), do: value
+  def decode_profile_image_url_large(_), do: {:error, "Unexpected type when decoding Owner.profile_image_url_large"}
+
+  def encode_profile_image_url_large(value) when is_binary(value), do: value
+  def encode_profile_image_url_large(_), do: {:error, "Unexpected type when encoding Owner.profile_image_url_large"}
+
+  def decode_profile_image_url_medium(value) when is_binary(value), do: value
+  def decode_profile_image_url_medium(_), do: {:error, "Unexpected type when decoding Owner.profile_image_url_medium"}
+
+  def encode_profile_image_url_medium(value) when is_binary(value), do: value
+  def encode_profile_image_url_medium(_), do: {:error, "Unexpected type when encoding Owner.profile_image_url_medium"}
+
+  def decode_profile_image_url_small(value) when is_binary(value), do: value
+  def decode_profile_image_url_small(_), do: {:error, "Unexpected type when decoding Owner.profile_image_url_small"}
+
+  def encode_profile_image_url_small(value) when is_binary(value), do: value
+  def encode_profile_image_url_small(_), do: {:error, "Unexpected type when encoding Owner.profile_image_url_small"}
+
+  def decode_rights(value) when is_list(value), do: value
+  def decode_rights(_), do: {:error, "Unexpected type when decoding Owner.rights"}
+
+  def encode_rights(value) when is_list(value), do: value
+  def encode_rights(_), do: {:error, "Unexpected type when encoding Owner.rights"}
+
+  def decode_role_name(value) when is_binary(value), do: value
+  def decode_role_name(_), do: {:error, "Unexpected type when decoding Owner.role_name"}
+
+  def encode_role_name(value) when is_binary(value), do: value
+  def encode_role_name(_), do: {:error, "Unexpected type when encoding Owner.role_name"}
+
+  def decode_screen_name(value) when is_binary(value), do: value
+  def decode_screen_name(_), do: {:error, "Unexpected type when decoding Owner.screen_name"}
+
+  def encode_screen_name(value) when is_binary(value), do: value
+  def encode_screen_name(_), do: {:error, "Unexpected type when encoding Owner.screen_name"}
+
   def from_map(m) do
     %Owner{
-      display_name: m["displayName"],
-      id: m["id"],
-      profile_image_url_large: m["profileImageUrlLarge"],
-      profile_image_url_medium: m["profileImageUrlMedium"],
-      profile_image_url_small: m["profileImageUrlSmall"],
-      rights: m["rights"],
-      role_name: m["roleName"],
-      screen_name: m["screenName"],
+      display_name: decode_display_name(m["displayName"]),
+      id: decode_id(m["id"]),
+      profile_image_url_large: decode_profile_image_url_large(m["profileImageUrlLarge"]),
+      profile_image_url_medium: decode_profile_image_url_medium(m["profileImageUrlMedium"]),
+      profile_image_url_small: decode_profile_image_url_small(m["profileImageUrlSmall"]),
+      rights: decode_rights(m["rights"]),
+      role_name: decode_role_name(m["roleName"]),
+      screen_name: decode_screen_name(m["screenName"]),
     }
   end
 
@@ -801,10 +1095,22 @@ defmodule Expression do
           type: String.t()
         }
 
+  def decode_column_id(value) when is_integer(value), do: value
+  def decode_column_id(_), do: {:error, "Unexpected type when decoding Expression.column_id"}
+
+  def encode_column_id(value) when is_integer(value), do: value
+  def encode_column_id(_), do: {:error, "Unexpected type when encoding Expression.column_id"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Expression.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Expression.type"}
+
   def from_map(m) do
     %Expression{
-      column_id: m["columnId"],
-      type: m["type"],
+      column_id: decode_column_id(m["columnId"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -837,9 +1143,15 @@ defmodule OrderBy do
           expression: Expression.t()
         }
 
+  def decode_ascending(value) when is_boolean(value), do: value
+  def decode_ascending(_), do: {:error, "Unexpected type when decoding OrderBy.ascending"}
+
+  def encode_ascending(value) when is_boolean(value), do: value
+  def encode_ascending(_), do: {:error, "Unexpected type when encoding OrderBy.ascending"}
+
   def from_map(m) do
     %OrderBy{
-      ascending: m["ascending"],
+      ascending: decode_ascending(m["ascending"]),
       expression: Expression.from_map(m["expression"]),
     }
   end
@@ -872,6 +1184,12 @@ defmodule Query do
           order_bys: [OrderBy.t()]
         }
 
+  def decode_order_bys(value) when is_list(value), do: value
+  def decode_order_bys(_), do: {:error, "Unexpected type when decoding Query.order_bys"}
+
+  def encode_order_bys(value) when is_list(value), do: value
+  def encode_order_bys(_), do: {:error, "Unexpected type when encoding Query.order_bys"}
+
   def from_map(m) do
     %Query{
       order_bys: Enum.map(m["orderBys"], &OrderBy.from_map/1),
@@ -942,46 +1260,250 @@ defmodule View do
           view_type: String.t()
         }
 
+  def decode_attribution(value) when is_binary(value), do: value
+  def decode_attribution(_), do: {:error, "Unexpected type when decoding View.attribution"}
+
+  def encode_attribution(value) when is_binary(value), do: value
+  def encode_attribution(_), do: {:error, "Unexpected type when encoding View.attribution"}
+
+  def decode_attribution_link(value) when is_binary(value), do: value
+  def decode_attribution_link(_), do: {:error, "Unexpected type when decoding View.attribution_link"}
+
+  def encode_attribution_link(value) when is_binary(value), do: value
+  def encode_attribution_link(_), do: {:error, "Unexpected type when encoding View.attribution_link"}
+
+  def decode_average_rating(value) when is_integer(value), do: value
+  def decode_average_rating(_), do: {:error, "Unexpected type when decoding View.average_rating"}
+
+  def encode_average_rating(value) when is_integer(value), do: value
+  def encode_average_rating(_), do: {:error, "Unexpected type when encoding View.average_rating"}
+
+  def decode_category(value) when is_binary(value), do: value
+  def decode_category(_), do: {:error, "Unexpected type when decoding View.category"}
+
+  def encode_category(value) when is_binary(value), do: value
+  def encode_category(_), do: {:error, "Unexpected type when encoding View.category"}
+
+  def decode_columns(value) when is_list(value), do: value
+  def decode_columns(_), do: {:error, "Unexpected type when decoding View.columns"}
+
+  def encode_columns(value) when is_list(value), do: value
+  def encode_columns(_), do: {:error, "Unexpected type when encoding View.columns"}
+
+  def decode_created_at(value) when is_integer(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding View.created_at"}
+
+  def encode_created_at(value) when is_integer(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding View.created_at"}
+
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding View.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding View.description"}
+
+  def decode_display_type(value) when is_binary(value), do: value
+  def decode_display_type(_), do: {:error, "Unexpected type when decoding View.display_type"}
+
+  def encode_display_type(value) when is_binary(value), do: value
+  def encode_display_type(_), do: {:error, "Unexpected type when encoding View.display_type"}
+
+  def decode_download_count(value) when is_integer(value), do: value
+  def decode_download_count(_), do: {:error, "Unexpected type when decoding View.download_count"}
+
+  def encode_download_count(value) when is_integer(value), do: value
+  def encode_download_count(_), do: {:error, "Unexpected type when encoding View.download_count"}
+
+  def decode_flags(value) when is_list(value), do: value
+  def decode_flags(_), do: {:error, "Unexpected type when decoding View.flags"}
+
+  def encode_flags(value) when is_list(value), do: value
+  def encode_flags(_), do: {:error, "Unexpected type when encoding View.flags"}
+
+  def decode_grants(value) when is_list(value), do: value
+  def decode_grants(_), do: {:error, "Unexpected type when decoding View.grants"}
+
+  def encode_grants(value) when is_list(value), do: value
+  def encode_grants(_), do: {:error, "Unexpected type when encoding View.grants"}
+
+  def decode_hide_from_catalog(value) when is_boolean(value), do: value
+  def decode_hide_from_catalog(_), do: {:error, "Unexpected type when decoding View.hide_from_catalog"}
+
+  def encode_hide_from_catalog(value) when is_boolean(value), do: value
+  def encode_hide_from_catalog(_), do: {:error, "Unexpected type when encoding View.hide_from_catalog"}
+
+  def decode_hide_from_data_json(value) when is_boolean(value), do: value
+  def decode_hide_from_data_json(_), do: {:error, "Unexpected type when decoding View.hide_from_data_json"}
+
+  def encode_hide_from_data_json(value) when is_boolean(value), do: value
+  def encode_hide_from_data_json(_), do: {:error, "Unexpected type when encoding View.hide_from_data_json"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding View.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding View.id"}
+
+  def decode_index_updated_at(value) when is_integer(value), do: value
+  def decode_index_updated_at(_), do: {:error, "Unexpected type when decoding View.index_updated_at"}
+
+  def encode_index_updated_at(value) when is_integer(value), do: value
+  def encode_index_updated_at(_), do: {:error, "Unexpected type when encoding View.index_updated_at"}
+
+  def decode_locale(value) when is_binary(value), do: value
+  def decode_locale(_), do: {:error, "Unexpected type when decoding View.locale"}
+
+  def encode_locale(value) when is_binary(value), do: value
+  def encode_locale(_), do: {:error, "Unexpected type when encoding View.locale"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding View.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding View.name"}
+
+  def decode_new_backend(value) when is_boolean(value), do: value
+  def decode_new_backend(_), do: {:error, "Unexpected type when decoding View.new_backend"}
+
+  def encode_new_backend(value) when is_boolean(value), do: value
+  def encode_new_backend(_), do: {:error, "Unexpected type when encoding View.new_backend"}
+
+  def decode_number_of_comments(value) when is_integer(value), do: value
+  def decode_number_of_comments(_), do: {:error, "Unexpected type when decoding View.number_of_comments"}
+
+  def encode_number_of_comments(value) when is_integer(value), do: value
+  def encode_number_of_comments(_), do: {:error, "Unexpected type when encoding View.number_of_comments"}
+
+  def decode_oid(value) when is_integer(value), do: value
+  def decode_oid(_), do: {:error, "Unexpected type when decoding View.oid"}
+
+  def encode_oid(value) when is_integer(value), do: value
+  def encode_oid(_), do: {:error, "Unexpected type when encoding View.oid"}
+
+  def decode_provenance(value) when is_binary(value), do: value
+  def decode_provenance(_), do: {:error, "Unexpected type when decoding View.provenance"}
+
+  def encode_provenance(value) when is_binary(value), do: value
+  def encode_provenance(_), do: {:error, "Unexpected type when encoding View.provenance"}
+
+  def decode_publication_append_enabled(value) when is_boolean(value), do: value
+  def decode_publication_append_enabled(_), do: {:error, "Unexpected type when decoding View.publication_append_enabled"}
+
+  def encode_publication_append_enabled(value) when is_boolean(value), do: value
+  def encode_publication_append_enabled(_), do: {:error, "Unexpected type when encoding View.publication_append_enabled"}
+
+  def decode_publication_date(value) when is_integer(value), do: value
+  def decode_publication_date(_), do: {:error, "Unexpected type when decoding View.publication_date"}
+
+  def encode_publication_date(value) when is_integer(value), do: value
+  def encode_publication_date(_), do: {:error, "Unexpected type when encoding View.publication_date"}
+
+  def decode_publication_group(value) when is_integer(value), do: value
+  def decode_publication_group(_), do: {:error, "Unexpected type when decoding View.publication_group"}
+
+  def encode_publication_group(value) when is_integer(value), do: value
+  def encode_publication_group(_), do: {:error, "Unexpected type when encoding View.publication_group"}
+
+  def decode_publication_stage(value) when is_binary(value), do: value
+  def decode_publication_stage(_), do: {:error, "Unexpected type when decoding View.publication_stage"}
+
+  def encode_publication_stage(value) when is_binary(value), do: value
+  def encode_publication_stage(_), do: {:error, "Unexpected type when encoding View.publication_stage"}
+
+  def decode_rights(value) when is_list(value), do: value
+  def decode_rights(_), do: {:error, "Unexpected type when decoding View.rights"}
+
+  def encode_rights(value) when is_list(value), do: value
+  def encode_rights(_), do: {:error, "Unexpected type when encoding View.rights"}
+
+  def decode_rows_updated_at(value) when is_integer(value), do: value
+  def decode_rows_updated_at(_), do: {:error, "Unexpected type when decoding View.rows_updated_at"}
+
+  def encode_rows_updated_at(value) when is_integer(value), do: value
+  def encode_rows_updated_at(_), do: {:error, "Unexpected type when encoding View.rows_updated_at"}
+
+  def decode_rows_updated_by(value) when is_binary(value), do: value
+  def decode_rows_updated_by(_), do: {:error, "Unexpected type when decoding View.rows_updated_by"}
+
+  def encode_rows_updated_by(value) when is_binary(value), do: value
+  def encode_rows_updated_by(_), do: {:error, "Unexpected type when encoding View.rows_updated_by"}
+
+  def decode_table_id(value) when is_integer(value), do: value
+  def decode_table_id(_), do: {:error, "Unexpected type when decoding View.table_id"}
+
+  def encode_table_id(value) when is_integer(value), do: value
+  def encode_table_id(_), do: {:error, "Unexpected type when encoding View.table_id"}
+
+  def decode_tags(value) when is_list(value), do: value
+  def decode_tags(_), do: {:error, "Unexpected type when decoding View.tags"}
+
+  def encode_tags(value) when is_list(value), do: value
+  def encode_tags(_), do: {:error, "Unexpected type when encoding View.tags"}
+
+  def decode_total_times_rated(value) when is_integer(value), do: value
+  def decode_total_times_rated(_), do: {:error, "Unexpected type when decoding View.total_times_rated"}
+
+  def encode_total_times_rated(value) when is_integer(value), do: value
+  def encode_total_times_rated(_), do: {:error, "Unexpected type when encoding View.total_times_rated"}
+
+  def decode_view_count(value) when is_integer(value), do: value
+  def decode_view_count(_), do: {:error, "Unexpected type when decoding View.view_count"}
+
+  def encode_view_count(value) when is_integer(value), do: value
+  def encode_view_count(_), do: {:error, "Unexpected type when encoding View.view_count"}
+
+  def decode_view_last_modified(value) when is_integer(value), do: value
+  def decode_view_last_modified(_), do: {:error, "Unexpected type when decoding View.view_last_modified"}
+
+  def encode_view_last_modified(value) when is_integer(value), do: value
+  def encode_view_last_modified(_), do: {:error, "Unexpected type when encoding View.view_last_modified"}
+
+  def decode_view_type(value) when is_binary(value), do: value
+  def decode_view_type(_), do: {:error, "Unexpected type when decoding View.view_type"}
+
+  def encode_view_type(value) when is_binary(value), do: value
+  def encode_view_type(_), do: {:error, "Unexpected type when encoding View.view_type"}
+
   def from_map(m) do
     %View{
-      attribution: m["attribution"],
-      attribution_link: m["attributionLink"],
-      average_rating: m["averageRating"],
-      category: m["category"],
+      attribution: decode_attribution(m["attribution"]),
+      attribution_link: decode_attribution_link(m["attributionLink"]),
+      average_rating: decode_average_rating(m["averageRating"]),
+      category: decode_category(m["category"]),
       columns: Enum.map(m["columns"], &Column.from_map/1),
-      created_at: m["createdAt"],
-      description: m["description"],
-      display_type: m["displayType"],
-      download_count: m["downloadCount"],
-      flags: m["flags"],
+      created_at: decode_created_at(m["createdAt"]),
+      description: decode_description(m["description"]),
+      display_type: decode_display_type(m["displayType"]),
+      download_count: decode_download_count(m["downloadCount"]),
+      flags: decode_flags(m["flags"]),
       grants: Enum.map(m["grants"], &Grant.from_map/1),
-      hide_from_catalog: m["hideFromCatalog"],
-      hide_from_data_json: m["hideFromDataJson"],
-      id: m["id"],
-      index_updated_at: m["indexUpdatedAt"],
-      locale: m["locale"],
+      hide_from_catalog: decode_hide_from_catalog(m["hideFromCatalog"]),
+      hide_from_data_json: decode_hide_from_data_json(m["hideFromDataJson"]),
+      id: decode_id(m["id"]),
+      index_updated_at: decode_index_updated_at(m["indexUpdatedAt"]),
+      locale: decode_locale(m["locale"]),
       metadata: Metadata.from_map(m["metadata"]),
-      name: m["name"],
-      new_backend: m["newBackend"],
-      number_of_comments: m["numberOfComments"],
-      oid: m["oid"],
+      name: decode_name(m["name"]),
+      new_backend: decode_new_backend(m["newBackend"]),
+      number_of_comments: decode_number_of_comments(m["numberOfComments"]),
+      oid: decode_oid(m["oid"]),
       owner: Owner.from_map(m["owner"]),
-      provenance: m["provenance"],
-      publication_append_enabled: m["publicationAppendEnabled"],
-      publication_date: m["publicationDate"],
-      publication_group: m["publicationGroup"],
-      publication_stage: m["publicationStage"],
+      provenance: decode_provenance(m["provenance"]),
+      publication_append_enabled: decode_publication_append_enabled(m["publicationAppendEnabled"]),
+      publication_date: decode_publication_date(m["publicationDate"]),
+      publication_group: decode_publication_group(m["publicationGroup"]),
+      publication_stage: decode_publication_stage(m["publicationStage"]),
       query: Query.from_map(m["query"]),
-      rights: m["rights"],
-      rows_updated_at: m["rowsUpdatedAt"],
-      rows_updated_by: m["rowsUpdatedBy"],
+      rights: decode_rights(m["rights"]),
+      rows_updated_at: decode_rows_updated_at(m["rowsUpdatedAt"]),
+      rows_updated_by: decode_rows_updated_by(m["rowsUpdatedBy"]),
       table_author: Owner.from_map(m["tableAuthor"]),
-      table_id: m["tableId"],
-      tags: m["tags"],
-      total_times_rated: m["totalTimesRated"],
-      view_count: m["viewCount"],
-      view_last_modified: m["viewLastModified"],
-      view_type: m["viewType"],
+      table_id: decode_table_id(m["tableId"]),
+      tags: decode_tags(m["tags"]),
+      total_times_rated: decode_total_times_rated(m["totalTimesRated"]),
+      view_count: decode_view_count(m["viewCount"]),
+      view_last_modified: decode_view_last_modified(m["viewLastModified"]),
+      view_type: decode_view_type(m["viewType"]),
     }
   end
 
@@ -1083,9 +1605,15 @@ defmodule TopLevel do
           meta: Meta.t()
         }
 
+  def decode_data(value) when is_list(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data(value) when is_list(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
   def from_map(m) do
     %TopLevel{
-      data: m["data"],
+      data: decode_data(m["data"]),
       meta: Meta.from_map(m["meta"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/617e8.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/617e8.json/default/QuickType.ex
index 9d3162d..40ef26c 100644
--- a/base/elixir/test/inputs/json/misc/617e8.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/617e8.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Top do
           item: String.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Top.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Top.count"}
+
+  def decode_item(value) when is_binary(value), do: value
+  def decode_item(_), do: {:error, "Unexpected type when decoding Top.item"}
+
+  def encode_item(value) when is_binary(value), do: value
+  def encode_item(_), do: {:error, "Unexpected type when encoding Top.item"}
+
   def from_map(m) do
     %Top{
-      count: m["count"],
-      item: m["item"],
+      count: decode_count(m["count"]),
+      item: decode_item(m["item"]),
     }
   end
 
@@ -53,12 +65,42 @@ defmodule CachedContents do
           top: [Top.t()]
         }
 
+  def decode_largest(value) when is_binary(value), do: value
+  def decode_largest(_), do: {:error, "Unexpected type when decoding CachedContents.largest"}
+
+  def encode_largest(value) when is_binary(value), do: value
+  def encode_largest(_), do: {:error, "Unexpected type when encoding CachedContents.largest"}
+
+  def decode_non_null(value) when is_integer(value), do: value
+  def decode_non_null(_), do: {:error, "Unexpected type when decoding CachedContents.non_null"}
+
+  def encode_non_null(value) when is_integer(value), do: value
+  def encode_non_null(_), do: {:error, "Unexpected type when encoding CachedContents.non_null"}
+
+  def decode_null(value) when is_integer(value), do: value
+  def decode_null(_), do: {:error, "Unexpected type when decoding CachedContents.null"}
+
+  def encode_null(value) when is_integer(value), do: value
+  def encode_null(_), do: {:error, "Unexpected type when encoding CachedContents.null"}
+
+  def decode_smallest(value) when is_binary(value), do: value
+  def decode_smallest(_), do: {:error, "Unexpected type when decoding CachedContents.smallest"}
+
+  def encode_smallest(value) when is_binary(value), do: value
+  def encode_smallest(_), do: {:error, "Unexpected type when encoding CachedContents.smallest"}
+
+  def decode_top(value) when is_list(value), do: value
+  def decode_top(_), do: {:error, "Unexpected type when decoding CachedContents.top"}
+
+  def encode_top(value) when is_list(value), do: value
+  def encode_top(_), do: {:error, "Unexpected type when encoding CachedContents.top"}
+
   def from_map(m) do
     %CachedContents{
-      largest: m["largest"],
-      non_null: m["non_null"],
-      null: m["null"],
-      smallest: m["smallest"],
+      largest: decode_largest(m["largest"]),
+      non_null: decode_non_null(m["non_null"]),
+      null: decode_null(m["null"]),
+      smallest: decode_smallest(m["smallest"]),
       top: Enum.map(m["top"], &Top.from_map/1),
     }
   end
@@ -187,17 +229,41 @@ defmodule Column do
           width: integer() | nil
         }
 
+  def decode_field_name(value) when is_binary(value), do: value
+  def decode_field_name(_), do: {:error, "Unexpected type when decoding Column.field_name"}
+
+  def encode_field_name(value) when is_binary(value), do: value
+  def encode_field_name(_), do: {:error, "Unexpected type when encoding Column.field_name"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Column.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Column.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Column.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Column.name"}
+
+  def decode_position(value) when is_integer(value), do: value
+  def decode_position(_), do: {:error, "Unexpected type when decoding Column.position"}
+
+  def encode_position(value) when is_integer(value), do: value
+  def encode_position(_), do: {:error, "Unexpected type when encoding Column.position"}
+
   def from_map(m) do
     %Column{
       cached_contents: m["cachedContents"] && CachedContents.from_map(m["cachedContents"]),
       data_type_name: TypeName.decode(m["dataTypeName"]),
       description: m["description"],
-      field_name: m["fieldName"],
+      field_name: decode_field_name(m["fieldName"]),
       flags: m["flags"],
       format: Format.from_map(m["format"]),
-      id: m["id"],
-      name: m["name"],
-      position: m["position"],
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
+      position: decode_position(m["position"]),
       render_type_name: TypeName.decode(m["renderTypeName"]),
       table_column_id: m["tableColumnId"],
       width: m["width"],
@@ -244,11 +310,29 @@ defmodule Grant do
           type: String.t()
         }
 
+  def decode_flags(value) when is_list(value), do: value
+  def decode_flags(_), do: {:error, "Unexpected type when decoding Grant.flags"}
+
+  def encode_flags(value) when is_list(value), do: value
+  def encode_flags(_), do: {:error, "Unexpected type when encoding Grant.flags"}
+
+  def decode_inherited(value) when is_boolean(value), do: value
+  def decode_inherited(_), do: {:error, "Unexpected type when decoding Grant.inherited"}
+
+  def encode_inherited(value) when is_boolean(value), do: value
+  def encode_inherited(_), do: {:error, "Unexpected type when encoding Grant.inherited"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Grant.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Grant.type"}
+
   def from_map(m) do
     %Grant{
-      flags: m["flags"],
-      inherited: m["inherited"],
-      type: m["type"],
+      flags: decode_flags(m["flags"]),
+      inherited: decode_inherited(m["inherited"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -284,12 +368,36 @@ defmodule Attachment do
           name: String.t()
         }
 
+  def decode_asset_id(value) when is_binary(value), do: value
+  def decode_asset_id(_), do: {:error, "Unexpected type when decoding Attachment.asset_id"}
+
+  def encode_asset_id(value) when is_binary(value), do: value
+  def encode_asset_id(_), do: {:error, "Unexpected type when encoding Attachment.asset_id"}
+
+  def decode_blob_id(value) when is_binary(value), do: value
+  def decode_blob_id(_), do: {:error, "Unexpected type when decoding Attachment.blob_id"}
+
+  def encode_blob_id(value) when is_binary(value), do: value
+  def encode_blob_id(_), do: {:error, "Unexpected type when encoding Attachment.blob_id"}
+
+  def decode_filename(value) when is_binary(value), do: value
+  def decode_filename(_), do: {:error, "Unexpected type when decoding Attachment.filename"}
+
+  def encode_filename(value) when is_binary(value), do: value
+  def encode_filename(_), do: {:error, "Unexpected type when encoding Attachment.filename"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Attachment.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Attachment.name"}
+
   def from_map(m) do
     %Attachment{
-      asset_id: m["assetId"],
-      blob_id: m["blobId"],
-      filename: m["filename"],
-      name: m["name"],
+      asset_id: decode_asset_id(m["assetId"]),
+      blob_id: decode_blob_id(m["blobId"]),
+      filename: decode_filename(m["filename"]),
+      name: decode_name(m["name"]),
     }
   end
 
@@ -323,9 +431,15 @@ defmodule AdditionalResources do
           see_also: String.t()
         }
 
+  def decode_see_also(value) when is_binary(value), do: value
+  def decode_see_also(_), do: {:error, "Unexpected type when decoding AdditionalResources.see_also"}
+
+  def encode_see_also(value) when is_binary(value), do: value
+  def encode_see_also(_), do: {:error, "Unexpected type when encoding AdditionalResources.see_also"}
+
   def from_map(m) do
     %AdditionalResources{
-      see_also: m["See Also"],
+      see_also: decode_see_also(m["See Also"]),
     }
   end
 
@@ -358,11 +472,29 @@ defmodule CommonCore do
           publisher: String.t()
         }
 
+  def decode_contact_email(value) when is_binary(value), do: value
+  def decode_contact_email(_), do: {:error, "Unexpected type when decoding CommonCore.contact_email"}
+
+  def encode_contact_email(value) when is_binary(value), do: value
+  def encode_contact_email(_), do: {:error, "Unexpected type when encoding CommonCore.contact_email"}
+
+  def decode_contact_name(value) when is_binary(value), do: value
+  def decode_contact_name(_), do: {:error, "Unexpected type when decoding CommonCore.contact_name"}
+
+  def encode_contact_name(value) when is_binary(value), do: value
+  def encode_contact_name(_), do: {:error, "Unexpected type when encoding CommonCore.contact_name"}
+
+  def decode_publisher(value) when is_binary(value), do: value
+  def decode_publisher(_), do: {:error, "Unexpected type when decoding CommonCore.publisher"}
+
+  def encode_publisher(value) when is_binary(value), do: value
+  def encode_publisher(_), do: {:error, "Unexpected type when encoding CommonCore.publisher"}
+
   def from_map(m) do
     %CommonCore{
-      contact_email: m["Contact Email"],
-      contact_name: m["Contact Name"],
-      publisher: m["Publisher"],
+      contact_email: decode_contact_email(m["Contact Email"]),
+      contact_name: decode_contact_name(m["Contact Name"]),
+      publisher: decode_publisher(m["Publisher"]),
     }
   end
 
@@ -395,9 +527,15 @@ defmodule DatasetInformation do
           agency: String.t()
         }
 
+  def decode_agency(value) when is_binary(value), do: value
+  def decode_agency(_), do: {:error, "Unexpected type when decoding DatasetInformation.agency"}
+
+  def encode_agency(value) when is_binary(value), do: value
+  def encode_agency(_), do: {:error, "Unexpected type when encoding DatasetInformation.agency"}
+
   def from_map(m) do
     %DatasetInformation{
-      agency: m["Agency"],
+      agency: decode_agency(m["Agency"]),
     }
   end
 
@@ -435,16 +573,64 @@ defmodule DatasetSummary do
           time_period: String.t()
         }
 
+  def decode_contact_information(value) when is_binary(value), do: value
+  def decode_contact_information(_), do: {:error, "Unexpected type when decoding DatasetSummary.contact_information"}
+
+  def encode_contact_information(value) when is_binary(value), do: value
+  def encode_contact_information(_), do: {:error, "Unexpected type when encoding DatasetSummary.contact_information"}
+
+  def decode_coverage(value) when is_binary(value), do: value
+  def decode_coverage(_), do: {:error, "Unexpected type when decoding DatasetSummary.coverage"}
+
+  def encode_coverage(value) when is_binary(value), do: value
+  def encode_coverage(_), do: {:error, "Unexpected type when encoding DatasetSummary.coverage"}
+
+  def decode_data_frequency(value) when is_binary(value), do: value
+  def decode_data_frequency(_), do: {:error, "Unexpected type when decoding DatasetSummary.data_frequency"}
+
+  def encode_data_frequency(value) when is_binary(value), do: value
+  def encode_data_frequency(_), do: {:error, "Unexpected type when encoding DatasetSummary.data_frequency"}
+
+  def decode_dataset_owner(value) when is_binary(value), do: value
+  def decode_dataset_owner(_), do: {:error, "Unexpected type when decoding DatasetSummary.dataset_owner"}
+
+  def encode_dataset_owner(value) when is_binary(value), do: value
+  def encode_dataset_owner(_), do: {:error, "Unexpected type when encoding DatasetSummary.dataset_owner"}
+
+  def decode_granularity(value) when is_binary(value), do: value
+  def decode_granularity(_), do: {:error, "Unexpected type when decoding DatasetSummary.granularity"}
+
+  def encode_granularity(value) when is_binary(value), do: value
+  def encode_granularity(_), do: {:error, "Unexpected type when encoding DatasetSummary.granularity"}
+
+  def decode_organization(value) when is_binary(value), do: value
+  def decode_organization(_), do: {:error, "Unexpected type when decoding DatasetSummary.organization"}
+
+  def encode_organization(value) when is_binary(value), do: value
+  def encode_organization(_), do: {:error, "Unexpected type when encoding DatasetSummary.organization"}
+
+  def decode_posting_frequency(value) when is_binary(value), do: value
+  def decode_posting_frequency(_), do: {:error, "Unexpected type when decoding DatasetSummary.posting_frequency"}
+
+  def encode_posting_frequency(value) when is_binary(value), do: value
+  def encode_posting_frequency(_), do: {:error, "Unexpected type when encoding DatasetSummary.posting_frequency"}
+
+  def decode_time_period(value) when is_binary(value), do: value
+  def decode_time_period(_), do: {:error, "Unexpected type when decoding DatasetSummary.time_period"}
+
+  def encode_time_period(value) when is_binary(value), do: value
+  def encode_time_period(_), do: {:error, "Unexpected type when encoding DatasetSummary.time_period"}
+
   def from_map(m) do
     %DatasetSummary{
-      contact_information: m["Contact Information"],
-      coverage: m["Coverage"],
-      data_frequency: m["Data Frequency"],
-      dataset_owner: m["Dataset Owner"],
-      granularity: m["Granularity"],
-      organization: m["Organization"],
-      posting_frequency: m["Posting Frequency"],
-      time_period: m["Time Period"],
+      contact_information: decode_contact_information(m["Contact Information"]),
+      coverage: decode_coverage(m["Coverage"]),
+      data_frequency: decode_data_frequency(m["Data Frequency"]),
+      dataset_owner: decode_dataset_owner(m["Dataset Owner"]),
+      granularity: decode_granularity(m["Granularity"]),
+      organization: decode_organization(m["Organization"]),
+      posting_frequency: decode_posting_frequency(m["Posting Frequency"]),
+      time_period: decode_time_period(m["Time Period"]),
     }
   end
 
@@ -482,9 +668,15 @@ defmodule Notes do
           notes: String.t()
         }
 
+  def decode_notes(value) when is_binary(value), do: value
+  def decode_notes(_), do: {:error, "Unexpected type when decoding Notes.notes"}
+
+  def encode_notes(value) when is_binary(value), do: value
+  def encode_notes(_), do: {:error, "Unexpected type when encoding Notes.notes"}
+
   def from_map(m) do
     %Notes{
-      notes: m["Notes"],
+      notes: decode_notes(m["Notes"]),
     }
   end
 
@@ -561,10 +753,22 @@ defmodule Order do
           column_field_name: String.t()
         }
 
+  def decode_ascending(value) when is_boolean(value), do: value
+  def decode_ascending(_), do: {:error, "Unexpected type when decoding Order.ascending"}
+
+  def encode_ascending(value) when is_boolean(value), do: value
+  def encode_ascending(_), do: {:error, "Unexpected type when encoding Order.ascending"}
+
+  def decode_column_field_name(value) when is_binary(value), do: value
+  def decode_column_field_name(_), do: {:error, "Unexpected type when decoding Order.column_field_name"}
+
+  def encode_column_field_name(value) when is_binary(value), do: value
+  def encode_column_field_name(_), do: {:error, "Unexpected type when encoding Order.column_field_name"}
+
   def from_map(m) do
     %Order{
-      ascending: m["ascending"],
-      column_field_name: m["columnFieldName"],
+      ascending: decode_ascending(m["ascending"]),
+      column_field_name: decode_column_field_name(m["columnFieldName"]),
     }
   end
 
@@ -596,6 +800,12 @@ defmodule JSONQuery do
           order: [Order.t()]
         }
 
+  def decode_order(value) when is_list(value), do: value
+  def decode_order(_), do: {:error, "Unexpected type when decoding JSONQuery.order"}
+
+  def encode_order(value) when is_list(value), do: value
+  def encode_order(_), do: {:error, "Unexpected type when encoding JSONQuery.order"}
+
   def from_map(m) do
     %JSONQuery{
       order: Enum.map(m["order"], &Order.from_map/1),
@@ -629,9 +839,15 @@ defmodule Visible do
           table: boolean()
         }
 
+  def decode_table(value) when is_boolean(value), do: value
+  def decode_table(_), do: {:error, "Unexpected type when decoding Visible.table"}
+
+  def encode_table(value) when is_boolean(value), do: value
+  def encode_table(_), do: {:error, "Unexpected type when encoding Visible.table"}
+
   def from_map(m) do
     %Visible{
-      table: m["table"],
+      table: decode_table(m["table"]),
     }
   end
 
@@ -700,13 +916,31 @@ defmodule Metadata do
           render_type_config: RenderTypeConfig.t()
         }
 
+  def decode_attachments(value) when is_list(value), do: value
+  def decode_attachments(_), do: {:error, "Unexpected type when decoding Metadata.attachments"}
+
+  def encode_attachments(value) when is_list(value), do: value
+  def encode_attachments(_), do: {:error, "Unexpected type when encoding Metadata.attachments"}
+
+  def decode_available_display_types(value) when is_list(value), do: value
+  def decode_available_display_types(_), do: {:error, "Unexpected type when decoding Metadata.available_display_types"}
+
+  def encode_available_display_types(value) when is_list(value), do: value
+  def encode_available_display_types(_), do: {:error, "Unexpected type when encoding Metadata.available_display_types"}
+
+  def decode_rdf_subject(value) when is_binary(value), do: value
+  def decode_rdf_subject(_), do: {:error, "Unexpected type when decoding Metadata.rdf_subject"}
+
+  def encode_rdf_subject(value) when is_binary(value), do: value
+  def encode_rdf_subject(_), do: {:error, "Unexpected type when encoding Metadata.rdf_subject"}
+
   def from_map(m) do
     %Metadata{
       attachments: Enum.map(m["attachments"], &Attachment.from_map/1),
-      available_display_types: m["availableDisplayTypes"],
+      available_display_types: decode_available_display_types(m["availableDisplayTypes"]),
       custom_fields: CustomFields.from_map(m["custom_fields"]),
       json_query: JSONQuery.from_map(m["jsonQuery"]),
-      rdf_subject: m["rdfSubject"],
+      rdf_subject: decode_rdf_subject(m["rdfSubject"]),
       render_type_config: RenderTypeConfig.from_map(m["renderTypeConfig"]),
     }
   end
@@ -750,16 +984,64 @@ defmodule Owner do
           screen_name: String.t()
         }
 
+  def decode_display_name(value) when is_binary(value), do: value
+  def decode_display_name(_), do: {:error, "Unexpected type when decoding Owner.display_name"}
+
+  def encode_display_name(value) when is_binary(value), do: value
+  def encode_display_name(_), do: {:error, "Unexpected type when encoding Owner.display_name"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Owner.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Owner.id"}
+
+  def decode_profile_image_url_large(value) when is_binary(value), do: value
+  def decode_profile_image_url_large(_), do: {:error, "Unexpected type when decoding Owner.profile_image_url_large"}
+
+  def encode_profile_image_url_large(value) when is_binary(value), do: value
+  def encode_profile_image_url_large(_), do: {:error, "Unexpected type when encoding Owner.profile_image_url_large"}
+
+  def decode_profile_image_url_medium(value) when is_binary(value), do: value
+  def decode_profile_image_url_medium(_), do: {:error, "Unexpected type when decoding Owner.profile_image_url_medium"}
+
+  def encode_profile_image_url_medium(value) when is_binary(value), do: value
+  def encode_profile_image_url_medium(_), do: {:error, "Unexpected type when encoding Owner.profile_image_url_medium"}
+
+  def decode_profile_image_url_small(value) when is_binary(value), do: value
+  def decode_profile_image_url_small(_), do: {:error, "Unexpected type when decoding Owner.profile_image_url_small"}
+
+  def encode_profile_image_url_small(value) when is_binary(value), do: value
+  def encode_profile_image_url_small(_), do: {:error, "Unexpected type when encoding Owner.profile_image_url_small"}
+
+  def decode_rights(value) when is_list(value), do: value
+  def decode_rights(_), do: {:error, "Unexpected type when decoding Owner.rights"}
+
+  def encode_rights(value) when is_list(value), do: value
+  def encode_rights(_), do: {:error, "Unexpected type when encoding Owner.rights"}
+
+  def decode_role_name(value) when is_binary(value), do: value
+  def decode_role_name(_), do: {:error, "Unexpected type when decoding Owner.role_name"}
+
+  def encode_role_name(value) when is_binary(value), do: value
+  def encode_role_name(_), do: {:error, "Unexpected type when encoding Owner.role_name"}
+
+  def decode_screen_name(value) when is_binary(value), do: value
+  def decode_screen_name(_), do: {:error, "Unexpected type when decoding Owner.screen_name"}
+
+  def encode_screen_name(value) when is_binary(value), do: value
+  def encode_screen_name(_), do: {:error, "Unexpected type when encoding Owner.screen_name"}
+
   def from_map(m) do
     %Owner{
-      display_name: m["displayName"],
-      id: m["id"],
-      profile_image_url_large: m["profileImageUrlLarge"],
-      profile_image_url_medium: m["profileImageUrlMedium"],
-      profile_image_url_small: m["profileImageUrlSmall"],
-      rights: m["rights"],
-      role_name: m["roleName"],
-      screen_name: m["screenName"],
+      display_name: decode_display_name(m["displayName"]),
+      id: decode_id(m["id"]),
+      profile_image_url_large: decode_profile_image_url_large(m["profileImageUrlLarge"]),
+      profile_image_url_medium: decode_profile_image_url_medium(m["profileImageUrlMedium"]),
+      profile_image_url_small: decode_profile_image_url_small(m["profileImageUrlSmall"]),
+      rights: decode_rights(m["rights"]),
+      role_name: decode_role_name(m["roleName"]),
+      screen_name: decode_screen_name(m["screenName"]),
     }
   end
 
@@ -798,10 +1080,22 @@ defmodule Expression do
           type: String.t()
         }
 
+  def decode_column_id(value) when is_integer(value), do: value
+  def decode_column_id(_), do: {:error, "Unexpected type when decoding Expression.column_id"}
+
+  def encode_column_id(value) when is_integer(value), do: value
+  def encode_column_id(_), do: {:error, "Unexpected type when encoding Expression.column_id"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Expression.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Expression.type"}
+
   def from_map(m) do
     %Expression{
-      column_id: m["columnId"],
-      type: m["type"],
+      column_id: decode_column_id(m["columnId"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -834,9 +1128,15 @@ defmodule OrderBy do
           expression: Expression.t()
         }
 
+  def decode_ascending(value) when is_boolean(value), do: value
+  def decode_ascending(_), do: {:error, "Unexpected type when decoding OrderBy.ascending"}
+
+  def encode_ascending(value) when is_boolean(value), do: value
+  def encode_ascending(_), do: {:error, "Unexpected type when encoding OrderBy.ascending"}
+
   def from_map(m) do
     %OrderBy{
-      ascending: m["ascending"],
+      ascending: decode_ascending(m["ascending"]),
       expression: Expression.from_map(m["expression"]),
     }
   end
@@ -869,6 +1169,12 @@ defmodule Query do
           order_bys: [OrderBy.t()]
         }
 
+  def decode_order_bys(value) when is_list(value), do: value
+  def decode_order_bys(_), do: {:error, "Unexpected type when decoding Query.order_bys"}
+
+  def encode_order_bys(value) when is_list(value), do: value
+  def encode_order_bys(_), do: {:error, "Unexpected type when encoding Query.order_bys"}
+
   def from_map(m) do
     %Query{
       order_bys: Enum.map(m["orderBys"], &OrderBy.from_map/1),
@@ -939,46 +1245,250 @@ defmodule View do
           view_type: String.t()
         }
 
+  def decode_attribution(value) when is_binary(value), do: value
+  def decode_attribution(_), do: {:error, "Unexpected type when decoding View.attribution"}
+
+  def encode_attribution(value) when is_binary(value), do: value
+  def encode_attribution(_), do: {:error, "Unexpected type when encoding View.attribution"}
+
+  def decode_attribution_link(value) when is_binary(value), do: value
+  def decode_attribution_link(_), do: {:error, "Unexpected type when decoding View.attribution_link"}
+
+  def encode_attribution_link(value) when is_binary(value), do: value
+  def encode_attribution_link(_), do: {:error, "Unexpected type when encoding View.attribution_link"}
+
+  def decode_average_rating(value) when is_integer(value), do: value
+  def decode_average_rating(_), do: {:error, "Unexpected type when decoding View.average_rating"}
+
+  def encode_average_rating(value) when is_integer(value), do: value
+  def encode_average_rating(_), do: {:error, "Unexpected type when encoding View.average_rating"}
+
+  def decode_category(value) when is_binary(value), do: value
+  def decode_category(_), do: {:error, "Unexpected type when decoding View.category"}
+
+  def encode_category(value) when is_binary(value), do: value
+  def encode_category(_), do: {:error, "Unexpected type when encoding View.category"}
+
+  def decode_columns(value) when is_list(value), do: value
+  def decode_columns(_), do: {:error, "Unexpected type when decoding View.columns"}
+
+  def encode_columns(value) when is_list(value), do: value
+  def encode_columns(_), do: {:error, "Unexpected type when encoding View.columns"}
+
+  def decode_created_at(value) when is_integer(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding View.created_at"}
+
+  def encode_created_at(value) when is_integer(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding View.created_at"}
+
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding View.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding View.description"}
+
+  def decode_display_type(value) when is_binary(value), do: value
+  def decode_display_type(_), do: {:error, "Unexpected type when decoding View.display_type"}
+
+  def encode_display_type(value) when is_binary(value), do: value
+  def encode_display_type(_), do: {:error, "Unexpected type when encoding View.display_type"}
+
+  def decode_download_count(value) when is_integer(value), do: value
+  def decode_download_count(_), do: {:error, "Unexpected type when decoding View.download_count"}
+
+  def encode_download_count(value) when is_integer(value), do: value
+  def encode_download_count(_), do: {:error, "Unexpected type when encoding View.download_count"}
+
+  def decode_flags(value) when is_list(value), do: value
+  def decode_flags(_), do: {:error, "Unexpected type when decoding View.flags"}
+
+  def encode_flags(value) when is_list(value), do: value
+  def encode_flags(_), do: {:error, "Unexpected type when encoding View.flags"}
+
+  def decode_grants(value) when is_list(value), do: value
+  def decode_grants(_), do: {:error, "Unexpected type when decoding View.grants"}
+
+  def encode_grants(value) when is_list(value), do: value
+  def encode_grants(_), do: {:error, "Unexpected type when encoding View.grants"}
+
+  def decode_hide_from_catalog(value) when is_boolean(value), do: value
+  def decode_hide_from_catalog(_), do: {:error, "Unexpected type when decoding View.hide_from_catalog"}
+
+  def encode_hide_from_catalog(value) when is_boolean(value), do: value
+  def encode_hide_from_catalog(_), do: {:error, "Unexpected type when encoding View.hide_from_catalog"}
+
+  def decode_hide_from_data_json(value) when is_boolean(value), do: value
+  def decode_hide_from_data_json(_), do: {:error, "Unexpected type when decoding View.hide_from_data_json"}
+
+  def encode_hide_from_data_json(value) when is_boolean(value), do: value
+  def encode_hide_from_data_json(_), do: {:error, "Unexpected type when encoding View.hide_from_data_json"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding View.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding View.id"}
+
+  def decode_index_updated_at(value) when is_integer(value), do: value
+  def decode_index_updated_at(_), do: {:error, "Unexpected type when decoding View.index_updated_at"}
+
+  def encode_index_updated_at(value) when is_integer(value), do: value
+  def encode_index_updated_at(_), do: {:error, "Unexpected type when encoding View.index_updated_at"}
+
+  def decode_locale(value) when is_binary(value), do: value
+  def decode_locale(_), do: {:error, "Unexpected type when decoding View.locale"}
+
+  def encode_locale(value) when is_binary(value), do: value
+  def encode_locale(_), do: {:error, "Unexpected type when encoding View.locale"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding View.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding View.name"}
+
+  def decode_new_backend(value) when is_boolean(value), do: value
+  def decode_new_backend(_), do: {:error, "Unexpected type when decoding View.new_backend"}
+
+  def encode_new_backend(value) when is_boolean(value), do: value
+  def encode_new_backend(_), do: {:error, "Unexpected type when encoding View.new_backend"}
+
+  def decode_number_of_comments(value) when is_integer(value), do: value
+  def decode_number_of_comments(_), do: {:error, "Unexpected type when decoding View.number_of_comments"}
+
+  def encode_number_of_comments(value) when is_integer(value), do: value
+  def encode_number_of_comments(_), do: {:error, "Unexpected type when encoding View.number_of_comments"}
+
+  def decode_oid(value) when is_integer(value), do: value
+  def decode_oid(_), do: {:error, "Unexpected type when decoding View.oid"}
+
+  def encode_oid(value) when is_integer(value), do: value
+  def encode_oid(_), do: {:error, "Unexpected type when encoding View.oid"}
+
+  def decode_provenance(value) when is_binary(value), do: value
+  def decode_provenance(_), do: {:error, "Unexpected type when decoding View.provenance"}
+
+  def encode_provenance(value) when is_binary(value), do: value
+  def encode_provenance(_), do: {:error, "Unexpected type when encoding View.provenance"}
+
+  def decode_publication_append_enabled(value) when is_boolean(value), do: value
+  def decode_publication_append_enabled(_), do: {:error, "Unexpected type when decoding View.publication_append_enabled"}
+
+  def encode_publication_append_enabled(value) when is_boolean(value), do: value
+  def encode_publication_append_enabled(_), do: {:error, "Unexpected type when encoding View.publication_append_enabled"}
+
+  def decode_publication_date(value) when is_integer(value), do: value
+  def decode_publication_date(_), do: {:error, "Unexpected type when decoding View.publication_date"}
+
+  def encode_publication_date(value) when is_integer(value), do: value
+  def encode_publication_date(_), do: {:error, "Unexpected type when encoding View.publication_date"}
+
+  def decode_publication_group(value) when is_integer(value), do: value
+  def decode_publication_group(_), do: {:error, "Unexpected type when decoding View.publication_group"}
+
+  def encode_publication_group(value) when is_integer(value), do: value
+  def encode_publication_group(_), do: {:error, "Unexpected type when encoding View.publication_group"}
+
+  def decode_publication_stage(value) when is_binary(value), do: value
+  def decode_publication_stage(_), do: {:error, "Unexpected type when decoding View.publication_stage"}
+
+  def encode_publication_stage(value) when is_binary(value), do: value
+  def encode_publication_stage(_), do: {:error, "Unexpected type when encoding View.publication_stage"}
+
+  def decode_rights(value) when is_list(value), do: value
+  def decode_rights(_), do: {:error, "Unexpected type when decoding View.rights"}
+
+  def encode_rights(value) when is_list(value), do: value
+  def encode_rights(_), do: {:error, "Unexpected type when encoding View.rights"}
+
+  def decode_rows_updated_at(value) when is_integer(value), do: value
+  def decode_rows_updated_at(_), do: {:error, "Unexpected type when decoding View.rows_updated_at"}
+
+  def encode_rows_updated_at(value) when is_integer(value), do: value
+  def encode_rows_updated_at(_), do: {:error, "Unexpected type when encoding View.rows_updated_at"}
+
+  def decode_rows_updated_by(value) when is_binary(value), do: value
+  def decode_rows_updated_by(_), do: {:error, "Unexpected type when decoding View.rows_updated_by"}
+
+  def encode_rows_updated_by(value) when is_binary(value), do: value
+  def encode_rows_updated_by(_), do: {:error, "Unexpected type when encoding View.rows_updated_by"}
+
+  def decode_table_id(value) when is_integer(value), do: value
+  def decode_table_id(_), do: {:error, "Unexpected type when decoding View.table_id"}
+
+  def encode_table_id(value) when is_integer(value), do: value
+  def encode_table_id(_), do: {:error, "Unexpected type when encoding View.table_id"}
+
+  def decode_tags(value) when is_list(value), do: value
+  def decode_tags(_), do: {:error, "Unexpected type when decoding View.tags"}
+
+  def encode_tags(value) when is_list(value), do: value
+  def encode_tags(_), do: {:error, "Unexpected type when encoding View.tags"}
+
+  def decode_total_times_rated(value) when is_integer(value), do: value
+  def decode_total_times_rated(_), do: {:error, "Unexpected type when decoding View.total_times_rated"}
+
+  def encode_total_times_rated(value) when is_integer(value), do: value
+  def encode_total_times_rated(_), do: {:error, "Unexpected type when encoding View.total_times_rated"}
+
+  def decode_view_count(value) when is_integer(value), do: value
+  def decode_view_count(_), do: {:error, "Unexpected type when decoding View.view_count"}
+
+  def encode_view_count(value) when is_integer(value), do: value
+  def encode_view_count(_), do: {:error, "Unexpected type when encoding View.view_count"}
+
+  def decode_view_last_modified(value) when is_integer(value), do: value
+  def decode_view_last_modified(_), do: {:error, "Unexpected type when decoding View.view_last_modified"}
+
+  def encode_view_last_modified(value) when is_integer(value), do: value
+  def encode_view_last_modified(_), do: {:error, "Unexpected type when encoding View.view_last_modified"}
+
+  def decode_view_type(value) when is_binary(value), do: value
+  def decode_view_type(_), do: {:error, "Unexpected type when decoding View.view_type"}
+
+  def encode_view_type(value) when is_binary(value), do: value
+  def encode_view_type(_), do: {:error, "Unexpected type when encoding View.view_type"}
+
   def from_map(m) do
     %View{
-      attribution: m["attribution"],
-      attribution_link: m["attributionLink"],
-      average_rating: m["averageRating"],
-      category: m["category"],
+      attribution: decode_attribution(m["attribution"]),
+      attribution_link: decode_attribution_link(m["attributionLink"]),
+      average_rating: decode_average_rating(m["averageRating"]),
+      category: decode_category(m["category"]),
       columns: Enum.map(m["columns"], &Column.from_map/1),
-      created_at: m["createdAt"],
-      description: m["description"],
-      display_type: m["displayType"],
-      download_count: m["downloadCount"],
-      flags: m["flags"],
+      created_at: decode_created_at(m["createdAt"]),
+      description: decode_description(m["description"]),
+      display_type: decode_display_type(m["displayType"]),
+      download_count: decode_download_count(m["downloadCount"]),
+      flags: decode_flags(m["flags"]),
       grants: Enum.map(m["grants"], &Grant.from_map/1),
-      hide_from_catalog: m["hideFromCatalog"],
-      hide_from_data_json: m["hideFromDataJson"],
-      id: m["id"],
-      index_updated_at: m["indexUpdatedAt"],
-      locale: m["locale"],
+      hide_from_catalog: decode_hide_from_catalog(m["hideFromCatalog"]),
+      hide_from_data_json: decode_hide_from_data_json(m["hideFromDataJson"]),
+      id: decode_id(m["id"]),
+      index_updated_at: decode_index_updated_at(m["indexUpdatedAt"]),
+      locale: decode_locale(m["locale"]),
       metadata: Metadata.from_map(m["metadata"]),
-      name: m["name"],
-      new_backend: m["newBackend"],
-      number_of_comments: m["numberOfComments"],
-      oid: m["oid"],
+      name: decode_name(m["name"]),
+      new_backend: decode_new_backend(m["newBackend"]),
+      number_of_comments: decode_number_of_comments(m["numberOfComments"]),
+      oid: decode_oid(m["oid"]),
       owner: Owner.from_map(m["owner"]),
-      provenance: m["provenance"],
-      publication_append_enabled: m["publicationAppendEnabled"],
-      publication_date: m["publicationDate"],
-      publication_group: m["publicationGroup"],
-      publication_stage: m["publicationStage"],
+      provenance: decode_provenance(m["provenance"]),
+      publication_append_enabled: decode_publication_append_enabled(m["publicationAppendEnabled"]),
+      publication_date: decode_publication_date(m["publicationDate"]),
+      publication_group: decode_publication_group(m["publicationGroup"]),
+      publication_stage: decode_publication_stage(m["publicationStage"]),
       query: Query.from_map(m["query"]),
-      rights: m["rights"],
-      rows_updated_at: m["rowsUpdatedAt"],
-      rows_updated_by: m["rowsUpdatedBy"],
+      rights: decode_rights(m["rights"]),
+      rows_updated_at: decode_rows_updated_at(m["rowsUpdatedAt"]),
+      rows_updated_by: decode_rows_updated_by(m["rowsUpdatedBy"]),
       table_author: Owner.from_map(m["tableAuthor"]),
-      table_id: m["tableId"],
-      tags: m["tags"],
-      total_times_rated: m["totalTimesRated"],
-      view_count: m["viewCount"],
-      view_last_modified: m["viewLastModified"],
-      view_type: m["viewType"],
+      table_id: decode_table_id(m["tableId"]),
+      tags: decode_tags(m["tags"]),
+      total_times_rated: decode_total_times_rated(m["totalTimesRated"]),
+      view_count: decode_view_count(m["viewCount"]),
+      view_last_modified: decode_view_last_modified(m["viewLastModified"]),
+      view_type: decode_view_type(m["viewType"]),
     }
   end
 
@@ -1080,9 +1590,15 @@ defmodule TopLevel do
           meta: Meta.t()
         }
 
+  def decode_data(value) when is_list(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data(value) when is_list(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
   def from_map(m) do
     %TopLevel{
-      data: m["data"],
+      data: decode_data(m["data"]),
       meta: Meta.from_map(m["meta"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/61b66.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/61b66.json/default/QuickType.ex
index b9f86f4..e9a4777 100644
--- a/base/elixir/test/inputs/json/misc/61b66.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/61b66.json/default/QuickType.ex
@@ -21,17 +21,71 @@ defmodule Status do
           type: String.t()
         }
 
+  def decode_avg_delay(value) when is_binary(value), do: value
+  def decode_avg_delay(_), do: {:error, "Unexpected type when decoding Status.avg_delay"}
+
+  def encode_avg_delay(value) when is_binary(value), do: value
+  def encode_avg_delay(_), do: {:error, "Unexpected type when encoding Status.avg_delay"}
+
+  def decode_closure_begin(value) when is_binary(value), do: value
+  def decode_closure_begin(_), do: {:error, "Unexpected type when decoding Status.closure_begin"}
+
+  def encode_closure_begin(value) when is_binary(value), do: value
+  def encode_closure_begin(_), do: {:error, "Unexpected type when encoding Status.closure_begin"}
+
+  def decode_closure_end(value) when is_binary(value), do: value
+  def decode_closure_end(_), do: {:error, "Unexpected type when decoding Status.closure_end"}
+
+  def encode_closure_end(value) when is_binary(value), do: value
+  def encode_closure_end(_), do: {:error, "Unexpected type when encoding Status.closure_end"}
+
+  def decode_end_time(value) when is_binary(value), do: value
+  def decode_end_time(_), do: {:error, "Unexpected type when decoding Status.end_time"}
+
+  def encode_end_time(value) when is_binary(value), do: value
+  def encode_end_time(_), do: {:error, "Unexpected type when encoding Status.end_time"}
+
+  def decode_max_delay(value) when is_binary(value), do: value
+  def decode_max_delay(_), do: {:error, "Unexpected type when decoding Status.max_delay"}
+
+  def encode_max_delay(value) when is_binary(value), do: value
+  def encode_max_delay(_), do: {:error, "Unexpected type when encoding Status.max_delay"}
+
+  def decode_min_delay(value) when is_binary(value), do: value
+  def decode_min_delay(_), do: {:error, "Unexpected type when decoding Status.min_delay"}
+
+  def encode_min_delay(value) when is_binary(value), do: value
+  def encode_min_delay(_), do: {:error, "Unexpected type when encoding Status.min_delay"}
+
+  def decode_reason(value) when is_binary(value), do: value
+  def decode_reason(_), do: {:error, "Unexpected type when decoding Status.reason"}
+
+  def encode_reason(value) when is_binary(value), do: value
+  def encode_reason(_), do: {:error, "Unexpected type when encoding Status.reason"}
+
+  def decode_trend(value) when is_binary(value), do: value
+  def decode_trend(_), do: {:error, "Unexpected type when decoding Status.trend"}
+
+  def encode_trend(value) when is_binary(value), do: value
+  def encode_trend(_), do: {:error, "Unexpected type when encoding Status.trend"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Status.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Status.type"}
+
   def from_map(m) do
     %Status{
-      avg_delay: m["avgDelay"],
-      closure_begin: m["closureBegin"],
-      closure_end: m["closureEnd"],
-      end_time: m["endTime"],
-      max_delay: m["maxDelay"],
-      min_delay: m["minDelay"],
-      reason: m["reason"],
-      trend: m["trend"],
-      type: m["type"],
+      avg_delay: decode_avg_delay(m["avgDelay"]),
+      closure_begin: decode_closure_begin(m["closureBegin"]),
+      closure_end: decode_closure_end(m["closureEnd"]),
+      end_time: decode_end_time(m["endTime"]),
+      max_delay: decode_max_delay(m["maxDelay"]),
+      min_delay: decode_min_delay(m["minDelay"]),
+      reason: decode_reason(m["reason"]),
+      trend: decode_trend(m["trend"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -72,11 +126,29 @@ defmodule Meta do
           url: String.t()
         }
 
+  def decode_credit(value) when is_binary(value), do: value
+  def decode_credit(_), do: {:error, "Unexpected type when decoding Meta.credit"}
+
+  def encode_credit(value) when is_binary(value), do: value
+  def encode_credit(_), do: {:error, "Unexpected type when encoding Meta.credit"}
+
+  def decode_updated(value) when is_binary(value), do: value
+  def decode_updated(_), do: {:error, "Unexpected type when decoding Meta.updated"}
+
+  def encode_updated(value) when is_binary(value), do: value
+  def encode_updated(_), do: {:error, "Unexpected type when encoding Meta.updated"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Meta.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Meta.url"}
+
   def from_map(m) do
     %Meta{
-      credit: m["credit"],
-      updated: m["updated"],
-      url: m["url"],
+      credit: decode_credit(m["credit"]),
+      updated: decode_updated(m["updated"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -113,13 +185,39 @@ defmodule Weather do
           wind: String.t()
         }
 
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Weather.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Weather.temp"}
+
+  def decode_visibility(value) when is_float(value), do: value
+  def decode_visibility(value) when is_integer(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Weather.visibility"}
+
+  def encode_visibility(value) when is_float(value), do: value
+  def encode_visibility(value) when is_integer(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Weather.visibility"}
+
+  def decode_weather(value) when is_binary(value), do: value
+  def decode_weather(_), do: {:error, "Unexpected type when decoding Weather.weather"}
+
+  def encode_weather(value) when is_binary(value), do: value
+  def encode_weather(_), do: {:error, "Unexpected type when encoding Weather.weather"}
+
+  def decode_wind(value) when is_binary(value), do: value
+  def decode_wind(_), do: {:error, "Unexpected type when decoding Weather.wind"}
+
+  def encode_wind(value) when is_binary(value), do: value
+  def encode_wind(_), do: {:error, "Unexpected type when encoding Weather.wind"}
+
   def from_map(m) do
     %Weather{
       meta: Meta.from_map(m["meta"]),
-      temp: m["temp"],
-      visibility: m["visibility"],
-      weather: m["weather"],
-      wind: m["wind"],
+      temp: decode_temp(m["temp"]),
+      visibility: decode_visibility(m["visibility"]),
+      weather: decode_weather(m["weather"]),
+      wind: decode_wind(m["wind"]),
     }
   end
 
@@ -161,14 +259,50 @@ defmodule TopLevel do
           weather: Weather.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding TopLevel.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding TopLevel.city"}
+
+  def decode_delay(value) when is_binary(value), do: value
+  def decode_delay(_), do: {:error, "Unexpected type when decoding TopLevel.delay"}
+
+  def encode_delay(value) when is_binary(value), do: value
+  def encode_delay(_), do: {:error, "Unexpected type when encoding TopLevel.delay"}
+
+  def decode_iata(value) when is_binary(value), do: value
+  def decode_iata(_), do: {:error, "Unexpected type when decoding TopLevel.iata"}
+
+  def encode_iata(value) when is_binary(value), do: value
+  def encode_iata(_), do: {:error, "Unexpected type when encoding TopLevel.iata"}
+
+  def decode_icao(value) when is_binary(value), do: value
+  def decode_icao(_), do: {:error, "Unexpected type when decoding TopLevel.icao"}
+
+  def encode_icao(value) when is_binary(value), do: value
+  def encode_icao(_), do: {:error, "Unexpected type when encoding TopLevel.icao"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding TopLevel.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding TopLevel.state"}
+
   def from_map(m) do
     %TopLevel{
-      city: m["city"],
-      delay: m["delay"],
-      iata: m["IATA"],
-      icao: m["ICAO"],
-      name: m["name"],
-      state: m["state"],
+      city: decode_city(m["city"]),
+      delay: decode_delay(m["delay"]),
+      iata: decode_iata(m["IATA"]),
+      icao: decode_icao(m["ICAO"]),
+      name: decode_name(m["name"]),
+      state: decode_state(m["state"]),
       status: Status.from_map(m["status"]),
       weather: Weather.from_map(m["weather"]),
     }
diff --git a/base/elixir/test/inputs/json/misc/6260a.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/6260a.json/default/QuickType.ex
index 8937606..db497b1 100644
--- a/base/elixir/test/inputs/json/misc/6260a.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/6260a.json/default/QuickType.ex
@@ -15,11 +15,32 @@ defmodule TopLevel do
           rates: %{String.t() => float()}
         }
 
+  def decode_base(value) when is_binary(value), do: value
+  def decode_base(_), do: {:error, "Unexpected type when decoding TopLevel.base"}
+
+  def encode_base(value) when is_binary(value), do: value
+  def encode_base(_), do: {:error, "Unexpected type when encoding TopLevel.base"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel.date"}
+
+  def decode_rates_value(value) when is_float(value), do: value
+  def decode_rates_value(value) when is_integer(value), do: value
+  def decode_rates_value(_), do: {:error, "Unexpected type when decoding TopLevel.rates"}
+
+  def encode_rates_value(value) when is_float(value), do: value
+  def encode_rates_value(value) when is_integer(value), do: value
+  def encode_rates_value(_), do: {:error, "Unexpected type when encoding TopLevel.rates"}
+
   def from_map(m) do
     %TopLevel{
-      base: m["base"],
-      date: m["date"],
-      rates: m["rates"],
+      base: decode_base(m["base"]),
+      date: decode_date(m["date"]),
+      rates: m["rates"]
+      |> Map.new(fn {key, value} -> {key, decode_rates_value(value)} end),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/65dec.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/65dec.json/default/QuickType.ex
index 7240455..f7f8954 100644
--- a/base/elixir/test/inputs/json/misc/65dec.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/65dec.json/default/QuickType.ex
@@ -204,9 +204,15 @@ defmodule LegalityElement do
           legality: LegalityEnum.t()
         }
 
+  def decode_format(value) when is_binary(value), do: value
+  def decode_format(_), do: {:error, "Unexpected type when decoding LegalityElement.format"}
+
+  def encode_format(value) when is_binary(value), do: value
+  def encode_format(_), do: {:error, "Unexpected type when encoding LegalityElement.format"}
+
   def from_map(m) do
     %LegalityElement{
-      format: m["format"],
+      format: decode_format(m["format"]),
       legality: LegalityEnum.decode(m["legality"]),
     }
   end
@@ -288,10 +294,22 @@ defmodule Ruling do
           text: String.t()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Ruling.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Ruling.date"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Ruling.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Ruling.text"}
+
   def from_map(m) do
     %Ruling{
-      date: m["date"],
-      text: m["text"],
+      date: decode_date(m["date"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -400,25 +418,97 @@ defmodule Card do
           watermark: Watermark.t() | nil
         }
 
+  def decode_artist(value) when is_binary(value), do: value
+  def decode_artist(_), do: {:error, "Unexpected type when decoding Card.artist"}
+
+  def encode_artist(value) when is_binary(value), do: value
+  def encode_artist(_), do: {:error, "Unexpected type when encoding Card.artist"}
+
+  def decode_cmc(value) when is_integer(value), do: value
+  def decode_cmc(_), do: {:error, "Unexpected type when decoding Card.cmc"}
+
+  def encode_cmc(value) when is_integer(value), do: value
+  def encode_cmc(_), do: {:error, "Unexpected type when encoding Card.cmc"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Card.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Card.id"}
+
+  def decode_image_name(value) when is_binary(value), do: value
+  def decode_image_name(_), do: {:error, "Unexpected type when decoding Card.image_name"}
+
+  def encode_image_name(value) when is_binary(value), do: value
+  def encode_image_name(_), do: {:error, "Unexpected type when encoding Card.image_name"}
+
+  def decode_legalities(value) when is_list(value), do: value
+  def decode_legalities(_), do: {:error, "Unexpected type when decoding Card.legalities"}
+
+  def encode_legalities(value) when is_list(value), do: value
+  def encode_legalities(_), do: {:error, "Unexpected type when encoding Card.legalities"}
+
+  def decode_multiverseid(value) when is_integer(value), do: value
+  def decode_multiverseid(_), do: {:error, "Unexpected type when decoding Card.multiverseid"}
+
+  def encode_multiverseid(value) when is_integer(value), do: value
+  def encode_multiverseid(_), do: {:error, "Unexpected type when encoding Card.multiverseid"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Card.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Card.name"}
+
+  def decode_original_text(value) when is_binary(value), do: value
+  def decode_original_text(_), do: {:error, "Unexpected type when decoding Card.original_text"}
+
+  def encode_original_text(value) when is_binary(value), do: value
+  def encode_original_text(_), do: {:error, "Unexpected type when encoding Card.original_text"}
+
+  def decode_original_type(value) when is_binary(value), do: value
+  def decode_original_type(_), do: {:error, "Unexpected type when decoding Card.original_type"}
+
+  def encode_original_type(value) when is_binary(value), do: value
+  def encode_original_type(_), do: {:error, "Unexpected type when encoding Card.original_type"}
+
+  def decode_printings(value) when is_list(value), do: value
+  def decode_printings(_), do: {:error, "Unexpected type when decoding Card.printings"}
+
+  def encode_printings(value) when is_list(value), do: value
+  def encode_printings(_), do: {:error, "Unexpected type when encoding Card.printings"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Card.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Card.type"}
+
+  def decode_types(value) when is_list(value), do: value
+  def decode_types(_), do: {:error, "Unexpected type when decoding Card.types"}
+
+  def encode_types(value) when is_list(value), do: value
+  def encode_types(_), do: {:error, "Unexpected type when encoding Card.types"}
+
   def from_map(m) do
     %Card{
-      artist: m["artist"],
-      cmc: m["cmc"],
+      artist: decode_artist(m["artist"]),
+      cmc: decode_cmc(m["cmc"]),
       color_identity: m["colorIdentity"] && Enum.map(m["colorIdentity"], &ColorIdentity.decode/1),
       colors: m["colors"] && Enum.map(m["colors"], &Watermark.decode/1),
       flavor: m["flavor"],
-      id: m["id"],
-      image_name: m["imageName"],
+      id: decode_id(m["id"]),
+      image_name: decode_image_name(m["imageName"]),
       layout: Layout.decode(m["layout"]),
       legalities: Enum.map(m["legalities"], &LegalityElement.from_map/1),
       mana_cost: m["manaCost"],
       mci_number: m["mciNumber"],
-      multiverseid: m["multiverseid"],
-      name: m["name"],
-      original_text: m["originalText"],
-      original_type: m["originalType"],
+      multiverseid: decode_multiverseid(m["multiverseid"]),
+      name: decode_name(m["name"]),
+      original_text: decode_original_text(m["originalText"]),
+      original_type: decode_original_type(m["originalType"]),
       power: m["power"],
-      printings: m["printings"],
+      printings: decode_printings(m["printings"]),
       rarity: Rarity.decode(m["rarity"]),
       reserved: m["reserved"],
       rulings: m["rulings"] && Enum.map(m["rulings"], &Ruling.from_map/1),
@@ -426,7 +516,7 @@ defmodule Card do
       supertypes: m["supertypes"],
       text: m["text"],
       toughness: m["toughness"],
-      type: m["type"],
+      type: decode_type(m["type"]),
       types: Enum.map(m["types"], &Type.decode/1),
       variations: m["variations"],
       watermark: m["watermark"] && Watermark.decode(m["watermark"]),
@@ -497,19 +587,85 @@ defmodule TopLevel do
           type: String.t()
         }
 
+  def decode_booster(value) when is_list(value), do: value
+  def decode_booster(_), do: {:error, "Unexpected type when decoding TopLevel.booster"}
+
+  def encode_booster(value) when is_list(value), do: value
+  def encode_booster(_), do: {:error, "Unexpected type when encoding TopLevel.booster"}
+
+  def decode_border(value) when is_binary(value), do: value
+  def decode_border(_), do: {:error, "Unexpected type when decoding TopLevel.border"}
+
+  def encode_border(value) when is_binary(value), do: value
+  def encode_border(_), do: {:error, "Unexpected type when encoding TopLevel.border"}
+
+  def decode_cards(value) when is_list(value), do: value
+  def decode_cards(_), do: {:error, "Unexpected type when decoding TopLevel.cards"}
+
+  def encode_cards(value) when is_list(value), do: value
+  def encode_cards(_), do: {:error, "Unexpected type when encoding TopLevel.cards"}
+
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding TopLevel.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding TopLevel.code"}
+
+  def decode_gatherer_code(value) when is_binary(value), do: value
+  def decode_gatherer_code(_), do: {:error, "Unexpected type when decoding TopLevel.gatherer_code"}
+
+  def encode_gatherer_code(value) when is_binary(value), do: value
+  def encode_gatherer_code(_), do: {:error, "Unexpected type when encoding TopLevel.gatherer_code"}
+
+  def decode_magic_cards_info_code(value) when is_binary(value), do: value
+  def decode_magic_cards_info_code(_), do: {:error, "Unexpected type when decoding TopLevel.magic_cards_info_code"}
+
+  def encode_magic_cards_info_code(value) when is_binary(value), do: value
+  def encode_magic_cards_info_code(_), do: {:error, "Unexpected type when encoding TopLevel.magic_cards_info_code"}
+
+  def decode_mkm_id(value) when is_integer(value), do: value
+  def decode_mkm_id(_), do: {:error, "Unexpected type when decoding TopLevel.mkm_id"}
+
+  def encode_mkm_id(value) when is_integer(value), do: value
+  def encode_mkm_id(_), do: {:error, "Unexpected type when encoding TopLevel.mkm_id"}
+
+  def decode_mkm_name(value) when is_binary(value), do: value
+  def decode_mkm_name(_), do: {:error, "Unexpected type when decoding TopLevel.mkm_name"}
+
+  def encode_mkm_name(value) when is_binary(value), do: value
+  def encode_mkm_name(_), do: {:error, "Unexpected type when encoding TopLevel.mkm_name"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_release_date(value) when is_binary(value), do: value
+  def decode_release_date(_), do: {:error, "Unexpected type when decoding TopLevel.release_date"}
+
+  def encode_release_date(value) when is_binary(value), do: value
+  def encode_release_date(_), do: {:error, "Unexpected type when encoding TopLevel.release_date"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding TopLevel.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding TopLevel.type"}
+
   def from_map(m) do
     %TopLevel{
-      booster: m["booster"],
-      border: m["border"],
+      booster: decode_booster(m["booster"]),
+      border: decode_border(m["border"]),
       cards: Enum.map(m["cards"], &Card.from_map/1),
-      code: m["code"],
-      gatherer_code: m["gathererCode"],
-      magic_cards_info_code: m["magicCardsInfoCode"],
-      mkm_id: m["mkm_id"],
-      mkm_name: m["mkm_name"],
-      name: m["name"],
-      release_date: m["releaseDate"],
-      type: m["type"],
+      code: decode_code(m["code"]),
+      gatherer_code: decode_gatherer_code(m["gathererCode"]),
+      magic_cards_info_code: decode_magic_cards_info_code(m["magicCardsInfoCode"]),
+      mkm_id: decode_mkm_id(m["mkm_id"]),
+      mkm_name: decode_mkm_name(m["mkm_name"]),
+      name: decode_name(m["name"]),
+      release_date: decode_release_date(m["releaseDate"]),
+      type: decode_type(m["type"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/66121.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/66121.json/default/QuickType.ex
index 24d4f91..0b60b26 100644
--- a/base/elixir/test/inputs/json/misc/66121.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/66121.json/default/QuickType.ex
@@ -61,9 +61,15 @@ defmodule Identifier do
           scheme: Scheme.t()
         }
 
+  def decode_identifier(value) when is_binary(value), do: value
+  def decode_identifier(_), do: {:error, "Unexpected type when decoding Identifier.identifier"}
+
+  def encode_identifier(value) when is_binary(value), do: value
+  def encode_identifier(_), do: {:error, "Unexpected type when encoding Identifier.identifier"}
+
   def from_map(m) do
     %Identifier{
-      identifier: m["identifier"],
+      identifier: decode_identifier(m["identifier"]),
       scheme: Scheme.decode(m["scheme"]),
     }
   end
@@ -189,10 +195,16 @@ defmodule Link do
           url: String.t()
         }
 
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Link.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Link.url"}
+
   def from_map(m) do
     %Link{
       note: Note.decode(m["note"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
     }
   end
 
@@ -316,11 +328,17 @@ defmodule Text do
           url: String.t()
         }
 
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Text.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Text.url"}
+
   def from_map(m) do
     %Text{
       media_type: MediaType.decode(m["media_type"]),
       title: Title.decode(m["title"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
     }
   end
 
@@ -360,14 +378,56 @@ defmodule TopLevelElement do
           text: [Text.t()]
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_identifiers(value) when is_list(value), do: value
+  def decode_identifiers(_), do: {:error, "Unexpected type when decoding TopLevelElement.identifiers"}
+
+  def encode_identifiers(value) when is_list(value), do: value
+  def encode_identifiers(_), do: {:error, "Unexpected type when encoding TopLevelElement.identifiers"}
+
+  def decode_keywords(value) when is_list(value), do: value
+  def decode_keywords(_), do: {:error, "Unexpected type when decoding TopLevelElement.keywords"}
+
+  def encode_keywords(value) when is_list(value), do: value
+  def encode_keywords(_), do: {:error, "Unexpected type when encoding TopLevelElement.keywords"}
+
+  def decode_links(value) when is_list(value), do: value
+  def decode_links(_), do: {:error, "Unexpected type when decoding TopLevelElement.links"}
+
+  def encode_links(value) when is_list(value), do: value
+  def encode_links(_), do: {:error, "Unexpected type when encoding TopLevelElement.links"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.name"}
+
+  def decode_other_names(value) when is_list(value), do: value
+  def decode_other_names(_), do: {:error, "Unexpected type when decoding TopLevelElement.other_names"}
+
+  def encode_other_names(value) when is_list(value), do: value
+  def encode_other_names(_), do: {:error, "Unexpected type when encoding TopLevelElement.other_names"}
+
+  def decode_text(value) when is_list(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding TopLevelElement.text"}
+
+  def encode_text(value) when is_list(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding TopLevelElement.text"}
+
   def from_map(m) do
     %TopLevelElement{
-      id: m["id"],
+      id: decode_id(m["id"]),
       identifiers: Enum.map(m["identifiers"], &Identifier.from_map/1),
       keywords: Enum.map(m["keywords"], &KeywordElement.decode/1),
       links: Enum.map(m["links"], &Link.from_map/1),
-      name: m["name"],
-      other_names: m["other_names"],
+      name: decode_name(m["name"]),
+      other_names: decode_other_names(m["other_names"]),
       superseded_by: m["superseded_by"],
       text: Enum.map(m["text"], &Text.from_map/1),
     }
diff --git a/base/elixir/test/inputs/json/misc/6617c.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/6617c.json/default/QuickType.ex
index c65d104..8c19215 100644
--- a/base/elixir/test/inputs/json/misc/6617c.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/6617c.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule IssPosition do
           longitude: String.t()
         }
 
+  def decode_latitude(value) when is_binary(value), do: value
+  def decode_latitude(_), do: {:error, "Unexpected type when decoding IssPosition.latitude"}
+
+  def encode_latitude(value) when is_binary(value), do: value
+  def encode_latitude(_), do: {:error, "Unexpected type when encoding IssPosition.latitude"}
+
+  def decode_longitude(value) when is_binary(value), do: value
+  def decode_longitude(_), do: {:error, "Unexpected type when decoding IssPosition.longitude"}
+
+  def encode_longitude(value) when is_binary(value), do: value
+  def encode_longitude(_), do: {:error, "Unexpected type when encoding IssPosition.longitude"}
+
   def from_map(m) do
     %IssPosition{
-      latitude: m["latitude"],
-      longitude: m["longitude"],
+      latitude: decode_latitude(m["latitude"]),
+      longitude: decode_longitude(m["longitude"]),
     }
   end
 
@@ -51,11 +63,23 @@ defmodule TopLevel do
           timestamp: integer()
         }
 
+  def decode_message(value) when is_binary(value), do: value
+  def decode_message(_), do: {:error, "Unexpected type when decoding TopLevel.message"}
+
+  def encode_message(value) when is_binary(value), do: value
+  def encode_message(_), do: {:error, "Unexpected type when encoding TopLevel.message"}
+
+  def decode_timestamp(value) when is_integer(value), do: value
+  def decode_timestamp(_), do: {:error, "Unexpected type when decoding TopLevel.timestamp"}
+
+  def encode_timestamp(value) when is_integer(value), do: value
+  def encode_timestamp(_), do: {:error, "Unexpected type when encoding TopLevel.timestamp"}
+
   def from_map(m) do
     %TopLevel{
       iss_position: IssPosition.from_map(m["iss_position"]),
-      message: m["message"],
-      timestamp: m["timestamp"],
+      message: decode_message(m["message"]),
+      timestamp: decode_timestamp(m["timestamp"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/67c03.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/67c03.json/default/QuickType.ex
index 86a7b9e..49caa57 100644
--- a/base/elixir/test/inputs/json/misc/67c03.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/67c03.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Person do
           name: String.t()
         }
 
+  def decode_craft(value) when is_binary(value), do: value
+  def decode_craft(_), do: {:error, "Unexpected type when decoding Person.craft"}
+
+  def encode_craft(value) when is_binary(value), do: value
+  def encode_craft(_), do: {:error, "Unexpected type when encoding Person.craft"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Person.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Person.name"}
+
   def from_map(m) do
     %Person{
-      craft: m["craft"],
-      name: m["name"],
+      craft: decode_craft(m["craft"]),
+      name: decode_name(m["name"]),
     }
   end
 
@@ -51,10 +63,28 @@ defmodule TopLevel do
           people: [Person.t()]
         }
 
+  def decode_message(value) when is_binary(value), do: value
+  def decode_message(_), do: {:error, "Unexpected type when decoding TopLevel.message"}
+
+  def encode_message(value) when is_binary(value), do: value
+  def encode_message(_), do: {:error, "Unexpected type when encoding TopLevel.message"}
+
+  def decode_number(value) when is_integer(value), do: value
+  def decode_number(_), do: {:error, "Unexpected type when decoding TopLevel.number"}
+
+  def encode_number(value) when is_integer(value), do: value
+  def encode_number(_), do: {:error, "Unexpected type when encoding TopLevel.number"}
+
+  def decode_people(value) when is_list(value), do: value
+  def decode_people(_), do: {:error, "Unexpected type when decoding TopLevel.people"}
+
+  def encode_people(value) when is_list(value), do: value
+  def encode_people(_), do: {:error, "Unexpected type when encoding TopLevel.people"}
+
   def from_map(m) do
     %TopLevel{
-      message: m["message"],
-      number: m["number"],
+      message: decode_message(m["message"]),
+      number: decode_number(m["number"]),
       people: Enum.map(m["people"], &Person.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/68c30.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/68c30.json/default/QuickType.ex
index 5b35e55..46fb8c1 100644
--- a/base/elixir/test/inputs/json/misc/68c30.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/68c30.json/default/QuickType.ex
@@ -19,15 +19,57 @@ defmodule Out do
           value: integer()
         }
 
+  def decode_addr(value) when is_binary(value), do: value
+  def decode_addr(_), do: {:error, "Unexpected type when decoding Out.addr"}
+
+  def encode_addr(value) when is_binary(value), do: value
+  def encode_addr(_), do: {:error, "Unexpected type when encoding Out.addr"}
+
+  def decode_n(value) when is_integer(value), do: value
+  def decode_n(_), do: {:error, "Unexpected type when decoding Out.n"}
+
+  def encode_n(value) when is_integer(value), do: value
+  def encode_n(_), do: {:error, "Unexpected type when encoding Out.n"}
+
+  def decode_script(value) when is_binary(value), do: value
+  def decode_script(_), do: {:error, "Unexpected type when decoding Out.script"}
+
+  def encode_script(value) when is_binary(value), do: value
+  def encode_script(_), do: {:error, "Unexpected type when encoding Out.script"}
+
+  def decode_spent(value) when is_boolean(value), do: value
+  def decode_spent(_), do: {:error, "Unexpected type when decoding Out.spent"}
+
+  def encode_spent(value) when is_boolean(value), do: value
+  def encode_spent(_), do: {:error, "Unexpected type when encoding Out.spent"}
+
+  def decode_tx_index(value) when is_integer(value), do: value
+  def decode_tx_index(_), do: {:error, "Unexpected type when decoding Out.tx_index"}
+
+  def encode_tx_index(value) when is_integer(value), do: value
+  def encode_tx_index(_), do: {:error, "Unexpected type when encoding Out.tx_index"}
+
+  def decode_type(value) when is_integer(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Out.type"}
+
+  def encode_type(value) when is_integer(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Out.type"}
+
+  def decode_value(value) when is_integer(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding Out.value"}
+
+  def encode_value(value) when is_integer(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding Out.value"}
+
   def from_map(m) do
     %Out{
-      addr: m["addr"],
-      n: m["n"],
-      script: m["script"],
-      spent: m["spent"],
-      tx_index: m["tx_index"],
-      type: m["type"],
-      value: m["value"],
+      addr: decode_addr(m["addr"]),
+      n: decode_n(m["n"]),
+      script: decode_script(m["script"]),
+      spent: decode_spent(m["spent"]),
+      tx_index: decode_tx_index(m["tx_index"]),
+      type: decode_type(m["type"]),
+      value: decode_value(m["value"]),
     }
   end
 
@@ -66,11 +108,23 @@ defmodule Input do
           sequence: integer()
         }
 
+  def decode_script(value) when is_binary(value), do: value
+  def decode_script(_), do: {:error, "Unexpected type when decoding Input.script"}
+
+  def encode_script(value) when is_binary(value), do: value
+  def encode_script(_), do: {:error, "Unexpected type when encoding Input.script"}
+
+  def decode_sequence(value) when is_integer(value), do: value
+  def decode_sequence(_), do: {:error, "Unexpected type when decoding Input.sequence"}
+
+  def encode_sequence(value) when is_integer(value), do: value
+  def encode_sequence(_), do: {:error, "Unexpected type when encoding Input.sequence"}
+
   def from_map(m) do
     %Input{
       prev_out: Out.from_map(m["prev_out"]),
-      script: m["script"],
-      sequence: m["sequence"],
+      script: decode_script(m["script"]),
+      sequence: decode_sequence(m["sequence"]),
     }
   end
 
@@ -114,20 +168,92 @@ defmodule Tx do
           vout_sz: integer()
         }
 
+  def decode_double_spend(value) when is_boolean(value), do: value
+  def decode_double_spend(_), do: {:error, "Unexpected type when decoding Tx.double_spend"}
+
+  def encode_double_spend(value) when is_boolean(value), do: value
+  def encode_double_spend(_), do: {:error, "Unexpected type when encoding Tx.double_spend"}
+
+  def decode_hash(value) when is_binary(value), do: value
+  def decode_hash(_), do: {:error, "Unexpected type when decoding Tx.hash"}
+
+  def encode_hash(value) when is_binary(value), do: value
+  def encode_hash(_), do: {:error, "Unexpected type when encoding Tx.hash"}
+
+  def decode_inputs(value) when is_list(value), do: value
+  def decode_inputs(_), do: {:error, "Unexpected type when decoding Tx.inputs"}
+
+  def encode_inputs(value) when is_list(value), do: value
+  def encode_inputs(_), do: {:error, "Unexpected type when encoding Tx.inputs"}
+
+  def decode_lock_time(value) when is_integer(value), do: value
+  def decode_lock_time(_), do: {:error, "Unexpected type when decoding Tx.lock_time"}
+
+  def encode_lock_time(value) when is_integer(value), do: value
+  def encode_lock_time(_), do: {:error, "Unexpected type when encoding Tx.lock_time"}
+
+  def decode_out(value) when is_list(value), do: value
+  def decode_out(_), do: {:error, "Unexpected type when decoding Tx.out"}
+
+  def encode_out(value) when is_list(value), do: value
+  def encode_out(_), do: {:error, "Unexpected type when encoding Tx.out"}
+
+  def decode_relayed_by(value) when is_binary(value), do: value
+  def decode_relayed_by(_), do: {:error, "Unexpected type when decoding Tx.relayed_by"}
+
+  def encode_relayed_by(value) when is_binary(value), do: value
+  def encode_relayed_by(_), do: {:error, "Unexpected type when encoding Tx.relayed_by"}
+
+  def decode_size(value) when is_integer(value), do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding Tx.size"}
+
+  def encode_size(value) when is_integer(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding Tx.size"}
+
+  def decode_time(value) when is_integer(value), do: value
+  def decode_time(_), do: {:error, "Unexpected type when decoding Tx.time"}
+
+  def encode_time(value) when is_integer(value), do: value
+  def encode_time(_), do: {:error, "Unexpected type when encoding Tx.time"}
+
+  def decode_tx_index(value) when is_integer(value), do: value
+  def decode_tx_index(_), do: {:error, "Unexpected type when decoding Tx.tx_index"}
+
+  def encode_tx_index(value) when is_integer(value), do: value
+  def encode_tx_index(_), do: {:error, "Unexpected type when encoding Tx.tx_index"}
+
+  def decode_ver(value) when is_integer(value), do: value
+  def decode_ver(_), do: {:error, "Unexpected type when decoding Tx.ver"}
+
+  def encode_ver(value) when is_integer(value), do: value
+  def encode_ver(_), do: {:error, "Unexpected type when encoding Tx.ver"}
+
+  def decode_vin_sz(value) when is_integer(value), do: value
+  def decode_vin_sz(_), do: {:error, "Unexpected type when decoding Tx.vin_sz"}
+
+  def encode_vin_sz(value) when is_integer(value), do: value
+  def encode_vin_sz(_), do: {:error, "Unexpected type when encoding Tx.vin_sz"}
+
+  def decode_vout_sz(value) when is_integer(value), do: value
+  def decode_vout_sz(_), do: {:error, "Unexpected type when decoding Tx.vout_sz"}
+
+  def encode_vout_sz(value) when is_integer(value), do: value
+  def encode_vout_sz(_), do: {:error, "Unexpected type when encoding Tx.vout_sz"}
+
   def from_map(m) do
     %Tx{
-      double_spend: m["double_spend"],
-      hash: m["hash"],
+      double_spend: decode_double_spend(m["double_spend"]),
+      hash: decode_hash(m["hash"]),
       inputs: Enum.map(m["inputs"], &Input.from_map/1),
-      lock_time: m["lock_time"],
+      lock_time: decode_lock_time(m["lock_time"]),
       out: Enum.map(m["out"], &Out.from_map/1),
-      relayed_by: m["relayed_by"],
-      size: m["size"],
-      time: m["time"],
-      tx_index: m["tx_index"],
-      ver: m["ver"],
-      vin_sz: m["vin_sz"],
-      vout_sz: m["vout_sz"],
+      relayed_by: decode_relayed_by(m["relayed_by"]),
+      size: decode_size(m["size"]),
+      time: decode_time(m["time"]),
+      tx_index: decode_tx_index(m["tx_index"]),
+      ver: decode_ver(m["ver"]),
+      vin_sz: decode_vin_sz(m["vin_sz"]),
+      vout_sz: decode_vout_sz(m["vout_sz"]),
     }
   end
 
@@ -169,6 +295,12 @@ defmodule TopLevel do
           txs: [Tx.t()]
         }
 
+  def decode_txs(value) when is_list(value), do: value
+  def decode_txs(_), do: {:error, "Unexpected type when decoding TopLevel.txs"}
+
+  def encode_txs(value) when is_list(value), do: value
+  def encode_txs(_), do: {:error, "Unexpected type when encoding TopLevel.txs"}
+
   def from_map(m) do
     %TopLevel{
       txs: Enum.map(m["txs"], &Tx.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/6c155.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/6c155.json/default/QuickType.ex
index 43f31f6..919c424 100644
--- a/base/elixir/test/inputs/json/misc/6c155.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/6c155.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule ResponseInfo do
           status: integer()
         }
 
+  def decode_developer_message(value) when is_binary(value), do: value
+  def decode_developer_message(_), do: {:error, "Unexpected type when decoding ResponseInfo.developer_message"}
+
+  def encode_developer_message(value) when is_binary(value), do: value
+  def encode_developer_message(_), do: {:error, "Unexpected type when encoding ResponseInfo.developer_message"}
+
+  def decode_status(value) when is_integer(value), do: value
+  def decode_status(_), do: {:error, "Unexpected type when decoding ResponseInfo.status"}
+
+  def encode_status(value) when is_integer(value), do: value
+  def encode_status(_), do: {:error, "Unexpected type when encoding ResponseInfo.status"}
+
   def from_map(m) do
     %ResponseInfo{
-      developer_message: m["developerMessage"],
-      status: m["status"],
+      developer_message: decode_developer_message(m["developerMessage"]),
+      status: decode_status(m["status"]),
     }
   end
 
@@ -51,11 +63,29 @@ defmodule Resultset do
           pagesize: integer()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Resultset.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Resultset.count"}
+
+  def decode_page(value) when is_integer(value), do: value
+  def decode_page(_), do: {:error, "Unexpected type when decoding Resultset.page"}
+
+  def encode_page(value) when is_integer(value), do: value
+  def encode_page(_), do: {:error, "Unexpected type when encoding Resultset.page"}
+
+  def decode_pagesize(value) when is_integer(value), do: value
+  def decode_pagesize(_), do: {:error, "Unexpected type when decoding Resultset.pagesize"}
+
+  def encode_pagesize(value) when is_integer(value), do: value
+  def encode_pagesize(_), do: {:error, "Unexpected type when encoding Resultset.pagesize"}
+
   def from_map(m) do
     %Resultset{
-      count: m["count"],
-      page: m["page"],
-      pagesize: m["pagesize"],
+      count: decode_count(m["count"]),
+      page: decode_page(m["page"]),
+      pagesize: decode_pagesize(m["pagesize"]),
     }
   end
 
@@ -90,9 +120,17 @@ defmodule Metadata do
           resultset: Resultset.t()
         }
 
+  def decode_execution_time(value) when is_float(value), do: value
+  def decode_execution_time(value) when is_integer(value), do: value
+  def decode_execution_time(_), do: {:error, "Unexpected type when decoding Metadata.execution_time"}
+
+  def encode_execution_time(value) when is_float(value), do: value
+  def encode_execution_time(value) when is_integer(value), do: value
+  def encode_execution_time(_), do: {:error, "Unexpected type when encoding Metadata.execution_time"}
+
   def from_map(m) do
     %Metadata{
-      execution_time: m["executionTime"],
+      execution_time: decode_execution_time(m["executionTime"]),
       response_info: ResponseInfo.from_map(m["responseInfo"]),
       resultset: Resultset.from_map(m["resultset"]),
     }
@@ -128,10 +166,22 @@ defmodule Component do
           uuid: String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Component.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Component.name"}
+
+  def decode_uuid(value) when is_binary(value), do: value
+  def decode_uuid(_), do: {:error, "Unexpected type when decoding Component.uuid"}
+
+  def encode_uuid(value) when is_binary(value), do: value
+  def encode_uuid(_), do: {:error, "Unexpected type when encoding Component.uuid"}
+
   def from_map(m) do
     %Component{
-      name: m["name"],
-      uuid: m["uuid"],
+      name: decode_name(m["name"]),
+      uuid: decode_uuid(m["uuid"]),
     }
   end
 
@@ -172,18 +222,78 @@ defmodule Location do
           thoroughfare: String.t()
         }
 
+  def decode_administrative_area(value) when is_binary(value), do: value
+  def decode_administrative_area(_), do: {:error, "Unexpected type when decoding Location.administrative_area"}
+
+  def encode_administrative_area(value) when is_binary(value), do: value
+  def encode_administrative_area(_), do: {:error, "Unexpected type when encoding Location.administrative_area"}
+
+  def decode_country(value) when is_binary(value), do: value
+  def decode_country(_), do: {:error, "Unexpected type when decoding Location.country"}
+
+  def encode_country(value) when is_binary(value), do: value
+  def encode_country(_), do: {:error, "Unexpected type when encoding Location.country"}
+
+  def decode_fax_number(value) when is_binary(value), do: value
+  def decode_fax_number(_), do: {:error, "Unexpected type when decoding Location.fax_number"}
+
+  def encode_fax_number(value) when is_binary(value), do: value
+  def encode_fax_number(_), do: {:error, "Unexpected type when encoding Location.fax_number"}
+
+  def decode_locality(value) when is_binary(value), do: value
+  def decode_locality(_), do: {:error, "Unexpected type when decoding Location.locality"}
+
+  def encode_locality(value) when is_binary(value), do: value
+  def encode_locality(_), do: {:error, "Unexpected type when encoding Location.locality"}
+
+  def decode_mobile_number(value) when is_binary(value), do: value
+  def decode_mobile_number(_), do: {:error, "Unexpected type when decoding Location.mobile_number"}
+
+  def encode_mobile_number(value) when is_binary(value), do: value
+  def encode_mobile_number(_), do: {:error, "Unexpected type when encoding Location.mobile_number"}
+
+  def decode_phone_number(value) when is_binary(value), do: value
+  def decode_phone_number(_), do: {:error, "Unexpected type when decoding Location.phone_number"}
+
+  def encode_phone_number(value) when is_binary(value), do: value
+  def encode_phone_number(_), do: {:error, "Unexpected type when encoding Location.phone_number"}
+
+  def decode_phone_number_extension(value) when is_binary(value), do: value
+  def decode_phone_number_extension(_), do: {:error, "Unexpected type when decoding Location.phone_number_extension"}
+
+  def encode_phone_number_extension(value) when is_binary(value), do: value
+  def encode_phone_number_extension(_), do: {:error, "Unexpected type when encoding Location.phone_number_extension"}
+
+  def decode_postal_code(value) when is_binary(value), do: value
+  def decode_postal_code(_), do: {:error, "Unexpected type when decoding Location.postal_code"}
+
+  def encode_postal_code(value) when is_binary(value), do: value
+  def encode_postal_code(_), do: {:error, "Unexpected type when encoding Location.postal_code"}
+
+  def decode_sub_premise(value) when is_nil(value), do: value
+  def decode_sub_premise(_), do: {:error, "Unexpected type when decoding Location.sub_premise"}
+
+  def encode_sub_premise(value) when is_nil(value), do: value
+  def encode_sub_premise(_), do: {:error, "Unexpected type when encoding Location.sub_premise"}
+
+  def decode_thoroughfare(value) when is_binary(value), do: value
+  def decode_thoroughfare(_), do: {:error, "Unexpected type when decoding Location.thoroughfare"}
+
+  def encode_thoroughfare(value) when is_binary(value), do: value
+  def encode_thoroughfare(_), do: {:error, "Unexpected type when encoding Location.thoroughfare"}
+
   def from_map(m) do
     %Location{
-      administrative_area: m["administrative_area"],
-      country: m["country"],
-      fax_number: m["fax_number"],
-      locality: m["locality"],
-      mobile_number: m["mobile_number"],
-      phone_number: m["phone_number"],
-      phone_number_extension: m["phone_number_extension"],
-      postal_code: m["postal_code"],
-      sub_premise: m["sub_premise"],
-      thoroughfare: m["thoroughfare"],
+      administrative_area: decode_administrative_area(m["administrative_area"]),
+      country: decode_country(m["country"]),
+      fax_number: decode_fax_number(m["fax_number"]),
+      locality: decode_locality(m["locality"]),
+      mobile_number: decode_mobile_number(m["mobile_number"]),
+      phone_number: decode_phone_number(m["phone_number"]),
+      phone_number_extension: decode_phone_number_extension(m["phone_number_extension"]),
+      postal_code: decode_postal_code(m["postal_code"]),
+      sub_premise: decode_sub_premise(m["sub_premise"]),
+      thoroughfare: decode_thoroughfare(m["thoroughfare"]),
     }
   end
 
@@ -236,22 +346,100 @@ defmodule Result do
           vuuid: String.t()
         }
 
+  def decode_attachment(value) when is_list(value), do: value
+  def decode_attachment(_), do: {:error, "Unexpected type when decoding Result.attachment"}
+
+  def encode_attachment(value) when is_list(value), do: value
+  def encode_attachment(_), do: {:error, "Unexpected type when encoding Result.attachment"}
+
+  def decode_body(value) when is_binary(value), do: value
+  def decode_body(_), do: {:error, "Unexpected type when decoding Result.body"}
+
+  def encode_body(value) when is_binary(value), do: value
+  def encode_body(_), do: {:error, "Unexpected type when encoding Result.body"}
+
+  def decode_changed(value) when is_binary(value), do: value
+  def decode_changed(_), do: {:error, "Unexpected type when decoding Result.changed"}
+
+  def encode_changed(value) when is_binary(value), do: value
+  def encode_changed(_), do: {:error, "Unexpected type when encoding Result.changed"}
+
+  def decode_component(value) when is_list(value), do: value
+  def decode_component(_), do: {:error, "Unexpected type when decoding Result.component"}
+
+  def encode_component(value) when is_list(value), do: value
+  def encode_component(_), do: {:error, "Unexpected type when encoding Result.component"}
+
+  def decode_created(value) when is_binary(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding Result.created"}
+
+  def encode_created(value) when is_binary(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding Result.created"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Result.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Result.date"}
+
+  def decode_image(value) when is_list(value), do: value
+  def decode_image(_), do: {:error, "Unexpected type when decoding Result.image"}
+
+  def encode_image(value) when is_list(value), do: value
+  def encode_image(_), do: {:error, "Unexpected type when encoding Result.image"}
+
+  def decode_teaser(value) when is_nil(value), do: value
+  def decode_teaser(_), do: {:error, "Unexpected type when decoding Result.teaser"}
+
+  def encode_teaser(value) when is_nil(value), do: value
+  def encode_teaser(_), do: {:error, "Unexpected type when encoding Result.teaser"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Result.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Result.title"}
+
+  def decode_topic(value) when is_list(value), do: value
+  def decode_topic(_), do: {:error, "Unexpected type when decoding Result.topic"}
+
+  def encode_topic(value) when is_list(value), do: value
+  def encode_topic(_), do: {:error, "Unexpected type when encoding Result.topic"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Result.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Result.url"}
+
+  def decode_uuid(value) when is_binary(value), do: value
+  def decode_uuid(_), do: {:error, "Unexpected type when decoding Result.uuid"}
+
+  def encode_uuid(value) when is_binary(value), do: value
+  def encode_uuid(_), do: {:error, "Unexpected type when encoding Result.uuid"}
+
+  def decode_vuuid(value) when is_binary(value), do: value
+  def decode_vuuid(_), do: {:error, "Unexpected type when decoding Result.vuuid"}
+
+  def encode_vuuid(value) when is_binary(value), do: value
+  def encode_vuuid(_), do: {:error, "Unexpected type when encoding Result.vuuid"}
+
   def from_map(m) do
     %Result{
-      attachment: m["attachment"],
-      body: m["body"],
-      changed: m["changed"],
+      attachment: decode_attachment(m["attachment"]),
+      body: decode_body(m["body"]),
+      changed: decode_changed(m["changed"]),
       component: Enum.map(m["component"], &Component.from_map/1),
-      created: m["created"],
-      date: m["date"],
-      image: m["image"],
+      created: decode_created(m["created"]),
+      date: decode_date(m["date"]),
+      image: decode_image(m["image"]),
       location: Location.from_map(m["location"]),
-      teaser: m["teaser"],
-      title: m["title"],
-      topic: m["topic"],
-      url: m["url"],
-      uuid: m["uuid"],
-      vuuid: m["vuuid"],
+      teaser: decode_teaser(m["teaser"]),
+      title: decode_title(m["title"]),
+      topic: decode_topic(m["topic"]),
+      url: decode_url(m["url"]),
+      uuid: decode_uuid(m["uuid"]),
+      vuuid: decode_vuuid(m["vuuid"]),
     }
   end
 
@@ -296,6 +484,12 @@ defmodule TopLevel do
           results: [Result.t()]
         }
 
+  def decode_results(value) when is_list(value), do: value
+  def decode_results(_), do: {:error, "Unexpected type when decoding TopLevel.results"}
+
+  def encode_results(value) when is_list(value), do: value
+  def encode_results(_), do: {:error, "Unexpected type when encoding TopLevel.results"}
+
   def from_map(m) do
     %TopLevel{
       metadata: Metadata.from_map(m["metadata"]),
diff --git a/base/elixir/test/inputs/json/misc/6de06.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/6de06.json/default/QuickType.ex
index 3ff80b5..56c1965 100644
--- a/base/elixir/test/inputs/json/misc/6de06.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/6de06.json/default/QuickType.ex
@@ -24,20 +24,92 @@ defmodule Oembed do
           width: integer()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Oembed.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Oembed.description"}
+
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Oembed.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Oembed.height"}
+
+  def decode_html(value) when is_binary(value), do: value
+  def decode_html(_), do: {:error, "Unexpected type when decoding Oembed.html"}
+
+  def encode_html(value) when is_binary(value), do: value
+  def encode_html(_), do: {:error, "Unexpected type when encoding Oembed.html"}
+
+  def decode_provider_name(value) when is_binary(value), do: value
+  def decode_provider_name(_), do: {:error, "Unexpected type when decoding Oembed.provider_name"}
+
+  def encode_provider_name(value) when is_binary(value), do: value
+  def encode_provider_name(_), do: {:error, "Unexpected type when encoding Oembed.provider_name"}
+
+  def decode_provider_url(value) when is_binary(value), do: value
+  def decode_provider_url(_), do: {:error, "Unexpected type when decoding Oembed.provider_url"}
+
+  def encode_provider_url(value) when is_binary(value), do: value
+  def encode_provider_url(_), do: {:error, "Unexpected type when encoding Oembed.provider_url"}
+
+  def decode_thumbnail_height(value) when is_integer(value), do: value
+  def decode_thumbnail_height(_), do: {:error, "Unexpected type when decoding Oembed.thumbnail_height"}
+
+  def encode_thumbnail_height(value) when is_integer(value), do: value
+  def encode_thumbnail_height(_), do: {:error, "Unexpected type when encoding Oembed.thumbnail_height"}
+
+  def decode_thumbnail_url(value) when is_binary(value), do: value
+  def decode_thumbnail_url(_), do: {:error, "Unexpected type when decoding Oembed.thumbnail_url"}
+
+  def encode_thumbnail_url(value) when is_binary(value), do: value
+  def encode_thumbnail_url(_), do: {:error, "Unexpected type when encoding Oembed.thumbnail_url"}
+
+  def decode_thumbnail_width(value) when is_integer(value), do: value
+  def decode_thumbnail_width(_), do: {:error, "Unexpected type when decoding Oembed.thumbnail_width"}
+
+  def encode_thumbnail_width(value) when is_integer(value), do: value
+  def encode_thumbnail_width(_), do: {:error, "Unexpected type when encoding Oembed.thumbnail_width"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Oembed.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Oembed.title"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Oembed.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Oembed.type"}
+
+  def decode_version(value) when is_binary(value), do: value
+  def decode_version(_), do: {:error, "Unexpected type when decoding Oembed.version"}
+
+  def encode_version(value) when is_binary(value), do: value
+  def encode_version(_), do: {:error, "Unexpected type when encoding Oembed.version"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Oembed.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Oembed.width"}
+
   def from_map(m) do
     %Oembed{
-      description: m["description"],
-      height: m["height"],
-      html: m["html"],
-      provider_name: m["provider_name"],
-      provider_url: m["provider_url"],
-      thumbnail_height: m["thumbnail_height"],
-      thumbnail_url: m["thumbnail_url"],
-      thumbnail_width: m["thumbnail_width"],
-      title: m["title"],
-      type: m["type"],
-      version: m["version"],
-      width: m["width"],
+      description: decode_description(m["description"]),
+      height: decode_height(m["height"]),
+      html: decode_html(m["html"]),
+      provider_name: decode_provider_name(m["provider_name"]),
+      provider_url: decode_provider_url(m["provider_url"]),
+      thumbnail_height: decode_thumbnail_height(m["thumbnail_height"]),
+      thumbnail_url: decode_thumbnail_url(m["thumbnail_url"]),
+      thumbnail_width: decode_thumbnail_width(m["thumbnail_width"]),
+      title: decode_title(m["title"]),
+      type: decode_type(m["type"]),
+      version: decode_version(m["version"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -80,10 +152,16 @@ defmodule Media do
           type: String.t()
         }
 
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Media.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Media.type"}
+
   def from_map(m) do
     %Media{
       oembed: Oembed.from_map(m["oembed"]),
-      type: m["type"],
+      type: decode_type(m["type"]),
     }
   end
 
@@ -205,11 +283,29 @@ defmodule Source do
           width: integer()
         }
 
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Source.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Source.height"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Source.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Source.url"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Source.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Source.width"}
+
   def from_map(m) do
     %Source{
-      height: m["height"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -243,6 +339,12 @@ defmodule GIF do
           source: Source.t()
         }
 
+  def decode_resolutions(value) when is_list(value), do: value
+  def decode_resolutions(_), do: {:error, "Unexpected type when decoding GIF.resolutions"}
+
+  def encode_resolutions(value) when is_list(value), do: value
+  def encode_resolutions(_), do: {:error, "Unexpected type when encoding GIF.resolutions"}
+
   def from_map(m) do
     %GIF{
       resolutions: Enum.map(m["resolutions"], &Source.from_map/1),
@@ -322,9 +424,21 @@ defmodule Image do
           variants: Variants.t()
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Image.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Image.id"}
+
+  def decode_resolutions(value) when is_list(value), do: value
+  def decode_resolutions(_), do: {:error, "Unexpected type when decoding Image.resolutions"}
+
+  def encode_resolutions(value) when is_list(value), do: value
+  def encode_resolutions(_), do: {:error, "Unexpected type when encoding Image.resolutions"}
+
   def from_map(m) do
     %Image{
-      id: m["id"],
+      id: decode_id(m["id"]),
       resolutions: Enum.map(m["resolutions"], &Source.from_map/1),
       source: Source.from_map(m["source"]),
       variants: Variants.from_map(m["variants"]),
@@ -362,9 +476,21 @@ defmodule Preview do
           images: [Image.t()]
         }
 
+  def decode_enabled(value) when is_boolean(value), do: value
+  def decode_enabled(_), do: {:error, "Unexpected type when decoding Preview.enabled"}
+
+  def encode_enabled(value) when is_boolean(value), do: value
+  def encode_enabled(_), do: {:error, "Unexpected type when encoding Preview.enabled"}
+
+  def decode_images(value) when is_list(value), do: value
+  def decode_images(_), do: {:error, "Unexpected type when decoding Preview.images"}
+
+  def encode_images(value) when is_list(value), do: value
+  def encode_images(_), do: {:error, "Unexpected type when encoding Preview.images"}
+
   def from_map(m) do
     %Preview{
-      enabled: m["enabled"],
+      enabled: decode_enabled(m["enabled"]),
       images: Enum.map(m["images"], &Image.from_map/1),
     }
   end
@@ -505,72 +631,370 @@ defmodule ChildData do
           visited: boolean()
         }
 
+  def decode_approved_at_utc(value) when is_nil(value), do: value
+  def decode_approved_at_utc(_), do: {:error, "Unexpected type when decoding ChildData.approved_at_utc"}
+
+  def encode_approved_at_utc(value) when is_nil(value), do: value
+  def encode_approved_at_utc(_), do: {:error, "Unexpected type when encoding ChildData.approved_at_utc"}
+
+  def decode_approved_by(value) when is_nil(value), do: value
+  def decode_approved_by(_), do: {:error, "Unexpected type when decoding ChildData.approved_by"}
+
+  def encode_approved_by(value) when is_nil(value), do: value
+  def encode_approved_by(_), do: {:error, "Unexpected type when encoding ChildData.approved_by"}
+
+  def decode_archived(value) when is_boolean(value), do: value
+  def decode_archived(_), do: {:error, "Unexpected type when decoding ChildData.archived"}
+
+  def encode_archived(value) when is_boolean(value), do: value
+  def encode_archived(_), do: {:error, "Unexpected type when encoding ChildData.archived"}
+
+  def decode_author(value) when is_binary(value), do: value
+  def decode_author(_), do: {:error, "Unexpected type when decoding ChildData.author"}
+
+  def encode_author(value) when is_binary(value), do: value
+  def encode_author(_), do: {:error, "Unexpected type when encoding ChildData.author"}
+
+  def decode_banned_at_utc(value) when is_nil(value), do: value
+  def decode_banned_at_utc(_), do: {:error, "Unexpected type when decoding ChildData.banned_at_utc"}
+
+  def encode_banned_at_utc(value) when is_nil(value), do: value
+  def encode_banned_at_utc(_), do: {:error, "Unexpected type when encoding ChildData.banned_at_utc"}
+
+  def decode_banned_by(value) when is_nil(value), do: value
+  def decode_banned_by(_), do: {:error, "Unexpected type when decoding ChildData.banned_by"}
+
+  def encode_banned_by(value) when is_nil(value), do: value
+  def encode_banned_by(_), do: {:error, "Unexpected type when encoding ChildData.banned_by"}
+
+  def decode_brand_safe(value) when is_boolean(value), do: value
+  def decode_brand_safe(_), do: {:error, "Unexpected type when decoding ChildData.brand_safe"}
+
+  def encode_brand_safe(value) when is_boolean(value), do: value
+  def encode_brand_safe(_), do: {:error, "Unexpected type when encoding ChildData.brand_safe"}
+
+  def decode_can_gild(value) when is_boolean(value), do: value
+  def decode_can_gild(_), do: {:error, "Unexpected type when decoding ChildData.can_gild"}
+
+  def encode_can_gild(value) when is_boolean(value), do: value
+  def encode_can_gild(_), do: {:error, "Unexpected type when encoding ChildData.can_gild"}
+
+  def decode_can_mod_post(value) when is_boolean(value), do: value
+  def decode_can_mod_post(_), do: {:error, "Unexpected type when decoding ChildData.can_mod_post"}
+
+  def encode_can_mod_post(value) when is_boolean(value), do: value
+  def encode_can_mod_post(_), do: {:error, "Unexpected type when encoding ChildData.can_mod_post"}
+
+  def decode_clicked(value) when is_boolean(value), do: value
+  def decode_clicked(_), do: {:error, "Unexpected type when decoding ChildData.clicked"}
+
+  def encode_clicked(value) when is_boolean(value), do: value
+  def encode_clicked(_), do: {:error, "Unexpected type when encoding ChildData.clicked"}
+
+  def decode_contest_mode(value) when is_boolean(value), do: value
+  def decode_contest_mode(_), do: {:error, "Unexpected type when decoding ChildData.contest_mode"}
+
+  def encode_contest_mode(value) when is_boolean(value), do: value
+  def encode_contest_mode(_), do: {:error, "Unexpected type when encoding ChildData.contest_mode"}
+
+  def decode_created(value) when is_float(value), do: value
+  def decode_created(value) when is_integer(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding ChildData.created"}
+
+  def encode_created(value) when is_float(value), do: value
+  def encode_created(value) when is_integer(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding ChildData.created"}
+
+  def decode_created_utc(value) when is_float(value), do: value
+  def decode_created_utc(value) when is_integer(value), do: value
+  def decode_created_utc(_), do: {:error, "Unexpected type when decoding ChildData.created_utc"}
+
+  def encode_created_utc(value) when is_float(value), do: value
+  def encode_created_utc(value) when is_integer(value), do: value
+  def encode_created_utc(_), do: {:error, "Unexpected type when encoding ChildData.created_utc"}
+
+  def decode_distinguished(value) when is_nil(value), do: value
+  def decode_distinguished(_), do: {:error, "Unexpected type when decoding ChildData.distinguished"}
+
+  def encode_distinguished(value) when is_nil(value), do: value
+  def encode_distinguished(_), do: {:error, "Unexpected type when encoding ChildData.distinguished"}
+
+  def decode_domain(value) when is_binary(value), do: value
+  def decode_domain(_), do: {:error, "Unexpected type when decoding ChildData.domain"}
+
+  def encode_domain(value) when is_binary(value), do: value
+  def encode_domain(_), do: {:error, "Unexpected type when encoding ChildData.domain"}
+
+  def decode_downs(value) when is_integer(value), do: value
+  def decode_downs(_), do: {:error, "Unexpected type when decoding ChildData.downs"}
+
+  def encode_downs(value) when is_integer(value), do: value
+  def encode_downs(_), do: {:error, "Unexpected type when encoding ChildData.downs"}
+
+  def decode_edited(value) when is_boolean(value), do: value
+  def decode_edited(_), do: {:error, "Unexpected type when decoding ChildData.edited"}
+
+  def encode_edited(value) when is_boolean(value), do: value
+  def encode_edited(_), do: {:error, "Unexpected type when encoding ChildData.edited"}
+
+  def decode_gilded(value) when is_integer(value), do: value
+  def decode_gilded(_), do: {:error, "Unexpected type when decoding ChildData.gilded"}
+
+  def encode_gilded(value) when is_integer(value), do: value
+  def encode_gilded(_), do: {:error, "Unexpected type when encoding ChildData.gilded"}
+
+  def decode_hidden(value) when is_boolean(value), do: value
+  def decode_hidden(_), do: {:error, "Unexpected type when decoding ChildData.hidden"}
+
+  def encode_hidden(value) when is_boolean(value), do: value
+  def encode_hidden(_), do: {:error, "Unexpected type when encoding ChildData.hidden"}
+
+  def decode_hide_score(value) when is_boolean(value), do: value
+  def decode_hide_score(_), do: {:error, "Unexpected type when decoding ChildData.hide_score"}
+
+  def encode_hide_score(value) when is_boolean(value), do: value
+  def encode_hide_score(_), do: {:error, "Unexpected type when encoding ChildData.hide_score"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding ChildData.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding ChildData.id"}
+
+  def decode_is_self(value) when is_boolean(value), do: value
+  def decode_is_self(_), do: {:error, "Unexpected type when decoding ChildData.is_self"}
+
+  def encode_is_self(value) when is_boolean(value), do: value
+  def encode_is_self(_), do: {:error, "Unexpected type when encoding ChildData.is_self"}
+
+  def decode_is_video(value) when is_boolean(value), do: value
+  def decode_is_video(_), do: {:error, "Unexpected type when decoding ChildData.is_video"}
+
+  def encode_is_video(value) when is_boolean(value), do: value
+  def encode_is_video(_), do: {:error, "Unexpected type when encoding ChildData.is_video"}
+
+  def decode_likes(value) when is_nil(value), do: value
+  def decode_likes(_), do: {:error, "Unexpected type when decoding ChildData.likes"}
+
+  def encode_likes(value) when is_nil(value), do: value
+  def encode_likes(_), do: {:error, "Unexpected type when encoding ChildData.likes"}
+
+  def decode_locked(value) when is_boolean(value), do: value
+  def decode_locked(_), do: {:error, "Unexpected type when decoding ChildData.locked"}
+
+  def encode_locked(value) when is_boolean(value), do: value
+  def encode_locked(_), do: {:error, "Unexpected type when encoding ChildData.locked"}
+
+  def decode_mod_reports(value) when is_list(value), do: value
+  def decode_mod_reports(_), do: {:error, "Unexpected type when decoding ChildData.mod_reports"}
+
+  def encode_mod_reports(value) when is_list(value), do: value
+  def encode_mod_reports(_), do: {:error, "Unexpected type when encoding ChildData.mod_reports"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding ChildData.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding ChildData.name"}
+
+  def decode_num_comments(value) when is_integer(value), do: value
+  def decode_num_comments(_), do: {:error, "Unexpected type when decoding ChildData.num_comments"}
+
+  def encode_num_comments(value) when is_integer(value), do: value
+  def encode_num_comments(_), do: {:error, "Unexpected type when encoding ChildData.num_comments"}
+
+  def decode_num_reports(value) when is_nil(value), do: value
+  def decode_num_reports(_), do: {:error, "Unexpected type when decoding ChildData.num_reports"}
+
+  def encode_num_reports(value) when is_nil(value), do: value
+  def encode_num_reports(_), do: {:error, "Unexpected type when encoding ChildData.num_reports"}
+
+  def decode_over_18(value) when is_boolean(value), do: value
+  def decode_over_18(_), do: {:error, "Unexpected type when decoding ChildData.over_18"}
+
+  def encode_over_18(value) when is_boolean(value), do: value
+  def encode_over_18(_), do: {:error, "Unexpected type when encoding ChildData.over_18"}
+
+  def decode_permalink(value) when is_binary(value), do: value
+  def decode_permalink(_), do: {:error, "Unexpected type when decoding ChildData.permalink"}
+
+  def encode_permalink(value) when is_binary(value), do: value
+  def encode_permalink(_), do: {:error, "Unexpected type when encoding ChildData.permalink"}
+
+  def decode_quarantine(value) when is_boolean(value), do: value
+  def decode_quarantine(_), do: {:error, "Unexpected type when decoding ChildData.quarantine"}
+
+  def encode_quarantine(value) when is_boolean(value), do: value
+  def encode_quarantine(_), do: {:error, "Unexpected type when encoding ChildData.quarantine"}
+
+  def decode_removal_reason(value) when is_nil(value), do: value
+  def decode_removal_reason(_), do: {:error, "Unexpected type when decoding ChildData.removal_reason"}
+
+  def encode_removal_reason(value) when is_nil(value), do: value
+  def encode_removal_reason(_), do: {:error, "Unexpected type when encoding ChildData.removal_reason"}
+
+  def decode_report_reasons(value) when is_nil(value), do: value
+  def decode_report_reasons(_), do: {:error, "Unexpected type when decoding ChildData.report_reasons"}
+
+  def encode_report_reasons(value) when is_nil(value), do: value
+  def encode_report_reasons(_), do: {:error, "Unexpected type when encoding ChildData.report_reasons"}
+
+  def decode_saved(value) when is_boolean(value), do: value
+  def decode_saved(_), do: {:error, "Unexpected type when decoding ChildData.saved"}
+
+  def encode_saved(value) when is_boolean(value), do: value
+  def encode_saved(_), do: {:error, "Unexpected type when encoding ChildData.saved"}
+
+  def decode_score(value) when is_integer(value), do: value
+  def decode_score(_), do: {:error, "Unexpected type when decoding ChildData.score"}
+
+  def encode_score(value) when is_integer(value), do: value
+  def encode_score(_), do: {:error, "Unexpected type when encoding ChildData.score"}
+
+  def decode_selftext(value) when is_binary(value), do: value
+  def decode_selftext(_), do: {:error, "Unexpected type when decoding ChildData.selftext"}
+
+  def encode_selftext(value) when is_binary(value), do: value
+  def encode_selftext(_), do: {:error, "Unexpected type when encoding ChildData.selftext"}
+
+  def decode_spoiler(value) when is_boolean(value), do: value
+  def decode_spoiler(_), do: {:error, "Unexpected type when decoding ChildData.spoiler"}
+
+  def encode_spoiler(value) when is_boolean(value), do: value
+  def encode_spoiler(_), do: {:error, "Unexpected type when encoding ChildData.spoiler"}
+
+  def decode_stickied(value) when is_boolean(value), do: value
+  def decode_stickied(_), do: {:error, "Unexpected type when decoding ChildData.stickied"}
+
+  def encode_stickied(value) when is_boolean(value), do: value
+  def encode_stickied(_), do: {:error, "Unexpected type when encoding ChildData.stickied"}
+
+  def decode_subreddit(value) when is_binary(value), do: value
+  def decode_subreddit(_), do: {:error, "Unexpected type when decoding ChildData.subreddit"}
+
+  def encode_subreddit(value) when is_binary(value), do: value
+  def encode_subreddit(_), do: {:error, "Unexpected type when encoding ChildData.subreddit"}
+
+  def decode_subreddit_id(value) when is_binary(value), do: value
+  def decode_subreddit_id(_), do: {:error, "Unexpected type when decoding ChildData.subreddit_id"}
+
+  def encode_subreddit_id(value) when is_binary(value), do: value
+  def encode_subreddit_id(_), do: {:error, "Unexpected type when encoding ChildData.subreddit_id"}
+
+  def decode_subreddit_name_prefixed(value) when is_binary(value), do: value
+  def decode_subreddit_name_prefixed(_), do: {:error, "Unexpected type when decoding ChildData.subreddit_name_prefixed"}
+
+  def encode_subreddit_name_prefixed(value) when is_binary(value), do: value
+  def encode_subreddit_name_prefixed(_), do: {:error, "Unexpected type when encoding ChildData.subreddit_name_prefixed"}
+
+  def decode_thumbnail(value) when is_binary(value), do: value
+  def decode_thumbnail(_), do: {:error, "Unexpected type when decoding ChildData.thumbnail"}
+
+  def encode_thumbnail(value) when is_binary(value), do: value
+  def encode_thumbnail(_), do: {:error, "Unexpected type when encoding ChildData.thumbnail"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding ChildData.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding ChildData.title"}
+
+  def decode_ups(value) when is_integer(value), do: value
+  def decode_ups(_), do: {:error, "Unexpected type when decoding ChildData.ups"}
+
+  def encode_ups(value) when is_integer(value), do: value
+  def encode_ups(_), do: {:error, "Unexpected type when encoding ChildData.ups"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding ChildData.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding ChildData.url"}
+
+  def decode_user_reports(value) when is_list(value), do: value
+  def decode_user_reports(_), do: {:error, "Unexpected type when decoding ChildData.user_reports"}
+
+  def encode_user_reports(value) when is_list(value), do: value
+  def encode_user_reports(_), do: {:error, "Unexpected type when encoding ChildData.user_reports"}
+
+  def decode_view_count(value) when is_nil(value), do: value
+  def decode_view_count(_), do: {:error, "Unexpected type when decoding ChildData.view_count"}
+
+  def encode_view_count(value) when is_nil(value), do: value
+  def encode_view_count(_), do: {:error, "Unexpected type when encoding ChildData.view_count"}
+
+  def decode_visited(value) when is_boolean(value), do: value
+  def decode_visited(_), do: {:error, "Unexpected type when decoding ChildData.visited"}
+
+  def encode_visited(value) when is_boolean(value), do: value
+  def encode_visited(_), do: {:error, "Unexpected type when encoding ChildData.visited"}
+
   def from_map(m) do
     %ChildData{
-      approved_at_utc: m["approved_at_utc"],
-      approved_by: m["approved_by"],
-      archived: m["archived"],
-      author: m["author"],
+      approved_at_utc: decode_approved_at_utc(m["approved_at_utc"]),
+      approved_by: decode_approved_by(m["approved_by"]),
+      archived: decode_archived(m["archived"]),
+      author: decode_author(m["author"]),
       author_flair_css_class: m["author_flair_css_class"],
       author_flair_text: m["author_flair_text"],
-      banned_at_utc: m["banned_at_utc"],
-      banned_by: m["banned_by"],
-      brand_safe: m["brand_safe"],
-      can_gild: m["can_gild"],
-      can_mod_post: m["can_mod_post"],
-      clicked: m["clicked"],
-      contest_mode: m["contest_mode"],
-      created: m["created"],
-      created_utc: m["created_utc"],
-      distinguished: m["distinguished"],
-      domain: m["domain"],
-      downs: m["downs"],
-      edited: m["edited"],
-      gilded: m["gilded"],
-      hidden: m["hidden"],
-      hide_score: m["hide_score"],
-      id: m["id"],
-      is_self: m["is_self"],
-      is_video: m["is_video"],
-      likes: m["likes"],
+      banned_at_utc: decode_banned_at_utc(m["banned_at_utc"]),
+      banned_by: decode_banned_by(m["banned_by"]),
+      brand_safe: decode_brand_safe(m["brand_safe"]),
+      can_gild: decode_can_gild(m["can_gild"]),
+      can_mod_post: decode_can_mod_post(m["can_mod_post"]),
+      clicked: decode_clicked(m["clicked"]),
+      contest_mode: decode_contest_mode(m["contest_mode"]),
+      created: decode_created(m["created"]),
+      created_utc: decode_created_utc(m["created_utc"]),
+      distinguished: decode_distinguished(m["distinguished"]),
+      domain: decode_domain(m["domain"]),
+      downs: decode_downs(m["downs"]),
+      edited: decode_edited(m["edited"]),
+      gilded: decode_gilded(m["gilded"]),
+      hidden: decode_hidden(m["hidden"]),
+      hide_score: decode_hide_score(m["hide_score"]),
+      id: decode_id(m["id"]),
+      is_self: decode_is_self(m["is_self"]),
+      is_video: decode_is_video(m["is_video"]),
+      likes: decode_likes(m["likes"]),
       link_flair_css_class: m["link_flair_css_class"],
       link_flair_text: m["link_flair_text"],
-      locked: m["locked"],
+      locked: decode_locked(m["locked"]),
       media: m["media"] && Media.from_map(m["media"]),
       media_embed: MediaEmbed.from_map(m["media_embed"]),
-      mod_reports: m["mod_reports"],
-      name: m["name"],
-      num_comments: m["num_comments"],
-      num_reports: m["num_reports"],
-      over_18: m["over_18"],
-      permalink: m["permalink"],
+      mod_reports: decode_mod_reports(m["mod_reports"]),
+      name: decode_name(m["name"]),
+      num_comments: decode_num_comments(m["num_comments"]),
+      num_reports: decode_num_reports(m["num_reports"]),
+      over_18: decode_over_18(m["over_18"]),
+      permalink: decode_permalink(m["permalink"]),
       post_hint: m["post_hint"] && PostHint.decode(m["post_hint"]),
       preview: m["preview"] && Preview.from_map(m["preview"]),
-      quarantine: m["quarantine"],
-      removal_reason: m["removal_reason"],
-      report_reasons: m["report_reasons"],
-      saved: m["saved"],
-      score: m["score"],
+      quarantine: decode_quarantine(m["quarantine"]),
+      removal_reason: decode_removal_reason(m["removal_reason"]),
+      report_reasons: decode_report_reasons(m["report_reasons"]),
+      saved: decode_saved(m["saved"]),
+      score: decode_score(m["score"]),
       secure_media: m["secure_media"] && Media.from_map(m["secure_media"]),
       secure_media_embed: MediaEmbed.from_map(m["secure_media_embed"]),
-      selftext: m["selftext"],
+      selftext: decode_selftext(m["selftext"]),
       selftext_html: m["selftext_html"],
-      spoiler: m["spoiler"],
-      stickied: m["stickied"],
-      subreddit: m["subreddit"],
-      subreddit_id: m["subreddit_id"],
-      subreddit_name_prefixed: m["subreddit_name_prefixed"],
+      spoiler: decode_spoiler(m["spoiler"]),
+      stickied: decode_stickied(m["stickied"]),
+      subreddit: decode_subreddit(m["subreddit"]),
+      subreddit_id: decode_subreddit_id(m["subreddit_id"]),
+      subreddit_name_prefixed: decode_subreddit_name_prefixed(m["subreddit_name_prefixed"]),
       subreddit_type: SubredditType.decode(m["subreddit_type"]),
       suggested_sort: m["suggested_sort"],
-      thumbnail: m["thumbnail"],
+      thumbnail: decode_thumbnail(m["thumbnail"]),
       thumbnail_height: m["thumbnail_height"],
       thumbnail_width: m["thumbnail_width"],
-      title: m["title"],
-      ups: m["ups"],
-      url: m["url"],
-      user_reports: m["user_reports"],
-      view_count: m["view_count"],
-      visited: m["visited"],
+      title: decode_title(m["title"]),
+      ups: decode_ups(m["ups"]),
+      url: decode_url(m["url"]),
+      user_reports: decode_user_reports(m["user_reports"]),
+      view_count: decode_view_count(m["view_count"]),
+      visited: decode_visited(m["visited"]),
     }
   end
 
@@ -748,12 +1172,36 @@ defmodule TopLevelData do
           modhash: String.t()
         }
 
+  def decode_before(value) when is_nil(value), do: value
+  def decode_before(_), do: {:error, "Unexpected type when decoding TopLevelData.before"}
+
+  def encode_before(value) when is_nil(value), do: value
+  def encode_before(_), do: {:error, "Unexpected type when encoding TopLevelData.before"}
+
+  def decode_children(value) when is_list(value), do: value
+  def decode_children(_), do: {:error, "Unexpected type when decoding TopLevelData.children"}
+
+  def encode_children(value) when is_list(value), do: value
+  def encode_children(_), do: {:error, "Unexpected type when encoding TopLevelData.children"}
+
+  def decode_data_after(value) when is_binary(value), do: value
+  def decode_data_after(_), do: {:error, "Unexpected type when decoding TopLevelData.data_after"}
+
+  def encode_data_after(value) when is_binary(value), do: value
+  def encode_data_after(_), do: {:error, "Unexpected type when encoding TopLevelData.data_after"}
+
+  def decode_modhash(value) when is_binary(value), do: value
+  def decode_modhash(_), do: {:error, "Unexpected type when decoding TopLevelData.modhash"}
+
+  def encode_modhash(value) when is_binary(value), do: value
+  def encode_modhash(_), do: {:error, "Unexpected type when encoding TopLevelData.modhash"}
+
   def from_map(m) do
     %TopLevelData{
-      before: m["before"],
+      before: decode_before(m["before"]),
       children: Enum.map(m["children"], &Child.from_map/1),
-      data_after: m["after"],
-      modhash: m["modhash"],
+      data_after: decode_data_after(m["after"]),
+      modhash: decode_modhash(m["modhash"]),
     }
   end
 
@@ -788,10 +1236,16 @@ defmodule TopLevel do
           kind: String.t()
         }
 
+  def decode_kind(value) when is_binary(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding TopLevel.kind"}
+
+  def encode_kind(value) when is_binary(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding TopLevel.kind"}
+
   def from_map(m) do
     %TopLevel{
       data: TopLevelData.from_map(m["data"]),
-      kind: m["kind"],
+      kind: decode_kind(m["kind"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/6dec6.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/6dec6.json/default/QuickType.ex
index 70a9891..7f2ae22 100644
--- a/base/elixir/test/inputs/json/misc/6dec6.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/6dec6.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Astronomy do
           sunset: String.t()
         }
 
+  def decode_sunrise(value) when is_binary(value), do: value
+  def decode_sunrise(_), do: {:error, "Unexpected type when decoding Astronomy.sunrise"}
+
+  def encode_sunrise(value) when is_binary(value), do: value
+  def encode_sunrise(_), do: {:error, "Unexpected type when encoding Astronomy.sunrise"}
+
+  def decode_sunset(value) when is_binary(value), do: value
+  def decode_sunset(_), do: {:error, "Unexpected type when decoding Astronomy.sunset"}
+
+  def encode_sunset(value) when is_binary(value), do: value
+  def encode_sunset(_), do: {:error, "Unexpected type when encoding Astronomy.sunset"}
+
   def from_map(m) do
     %Astronomy{
-      sunrise: m["sunrise"],
-      sunset: m["sunset"],
+      sunrise: decode_sunrise(m["sunrise"]),
+      sunset: decode_sunset(m["sunset"]),
     }
   end
 
@@ -52,12 +64,36 @@ defmodule Atmosphere do
           visibility: String.t()
         }
 
+  def decode_humidity(value) when is_binary(value), do: value
+  def decode_humidity(_), do: {:error, "Unexpected type when decoding Atmosphere.humidity"}
+
+  def encode_humidity(value) when is_binary(value), do: value
+  def encode_humidity(_), do: {:error, "Unexpected type when encoding Atmosphere.humidity"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Atmosphere.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Atmosphere.pressure"}
+
+  def decode_rising(value) when is_binary(value), do: value
+  def decode_rising(_), do: {:error, "Unexpected type when decoding Atmosphere.rising"}
+
+  def encode_rising(value) when is_binary(value), do: value
+  def encode_rising(_), do: {:error, "Unexpected type when encoding Atmosphere.rising"}
+
+  def decode_visibility(value) when is_binary(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Atmosphere.visibility"}
+
+  def encode_visibility(value) when is_binary(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Atmosphere.visibility"}
+
   def from_map(m) do
     %Atmosphere{
-      humidity: m["humidity"],
-      pressure: m["pressure"],
-      rising: m["rising"],
-      visibility: m["visibility"],
+      humidity: decode_humidity(m["humidity"]),
+      pressure: decode_pressure(m["pressure"]),
+      rising: decode_rising(m["rising"]),
+      visibility: decode_visibility(m["visibility"]),
     }
   end
 
@@ -95,13 +131,43 @@ defmodule Image do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Image.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Image.height"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Image.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Image.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Image.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Image.title"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Image.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Image.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Image.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Image.width"}
+
   def from_map(m) do
     %Image{
-      height: m["height"],
-      link: m["link"],
-      title: m["title"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      link: decode_link(m["link"]),
+      title: decode_title(m["title"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -139,12 +205,36 @@ defmodule Condition do
           text: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Condition.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Condition.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Condition.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Condition.date"}
+
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Condition.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Condition.temp"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Condition.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Condition.text"}
+
   def from_map(m) do
     %Condition{
-      code: m["code"],
-      date: m["date"],
-      temp: m["temp"],
-      text: m["text"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      temp: decode_temp(m["temp"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -230,13 +320,43 @@ defmodule Forecast do
           text: Text.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Forecast.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Forecast.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Forecast.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Forecast.date"}
+
+  def decode_day(value) when is_binary(value), do: value
+  def decode_day(_), do: {:error, "Unexpected type when decoding Forecast.day"}
+
+  def encode_day(value) when is_binary(value), do: value
+  def encode_day(_), do: {:error, "Unexpected type when encoding Forecast.day"}
+
+  def decode_high(value) when is_binary(value), do: value
+  def decode_high(_), do: {:error, "Unexpected type when decoding Forecast.high"}
+
+  def encode_high(value) when is_binary(value), do: value
+  def encode_high(_), do: {:error, "Unexpected type when encoding Forecast.high"}
+
+  def decode_low(value) when is_binary(value), do: value
+  def decode_low(_), do: {:error, "Unexpected type when decoding Forecast.low"}
+
+  def encode_low(value) when is_binary(value), do: value
+  def encode_low(_), do: {:error, "Unexpected type when encoding Forecast.low"}
+
   def from_map(m) do
     %Forecast{
-      code: m["code"],
-      date: m["date"],
-      day: m["day"],
-      high: m["high"],
-      low: m["low"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      day: decode_day(m["day"]),
+      high: decode_high(m["high"]),
+      low: decode_low(m["low"]),
       text: Text.decode(m["text"]),
     }
   end
@@ -273,9 +393,15 @@ defmodule GUID do
           is_perma_link: String.t()
         }
 
+  def decode_is_perma_link(value) when is_binary(value), do: value
+  def decode_is_perma_link(_), do: {:error, "Unexpected type when decoding GUID.is_perma_link"}
+
+  def encode_is_perma_link(value) when is_binary(value), do: value
+  def encode_is_perma_link(_), do: {:error, "Unexpected type when encoding GUID.is_perma_link"}
+
   def from_map(m) do
     %GUID{
-      is_perma_link: m["isPermaLink"],
+      is_perma_link: decode_is_perma_link(m["isPermaLink"]),
     }
   end
 
@@ -314,17 +440,59 @@ defmodule Item do
           title: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Item.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Item.description"}
+
+  def decode_forecast(value) when is_list(value), do: value
+  def decode_forecast(_), do: {:error, "Unexpected type when decoding Item.forecast"}
+
+  def encode_forecast(value) when is_list(value), do: value
+  def encode_forecast(_), do: {:error, "Unexpected type when encoding Item.forecast"}
+
+  def decode_lat(value) when is_binary(value), do: value
+  def decode_lat(_), do: {:error, "Unexpected type when decoding Item.lat"}
+
+  def encode_lat(value) when is_binary(value), do: value
+  def encode_lat(_), do: {:error, "Unexpected type when encoding Item.lat"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Item.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Item.link"}
+
+  def decode_long(value) when is_binary(value), do: value
+  def decode_long(_), do: {:error, "Unexpected type when decoding Item.long"}
+
+  def encode_long(value) when is_binary(value), do: value
+  def encode_long(_), do: {:error, "Unexpected type when encoding Item.long"}
+
+  def decode_pub_date(value) when is_binary(value), do: value
+  def decode_pub_date(_), do: {:error, "Unexpected type when decoding Item.pub_date"}
+
+  def encode_pub_date(value) when is_binary(value), do: value
+  def encode_pub_date(_), do: {:error, "Unexpected type when encoding Item.pub_date"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Item.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Item.title"}
+
   def from_map(m) do
     %Item{
       condition: Condition.from_map(m["condition"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       forecast: Enum.map(m["forecast"], &Forecast.from_map/1),
       guid: GUID.from_map(m["guid"]),
-      lat: m["lat"],
-      link: m["link"],
-      long: m["long"],
-      pub_date: m["pubDate"],
-      title: m["title"],
+      lat: decode_lat(m["lat"]),
+      link: decode_link(m["link"]),
+      long: decode_long(m["long"]),
+      pub_date: decode_pub_date(m["pubDate"]),
+      title: decode_title(m["title"]),
     }
   end
 
@@ -365,11 +533,29 @@ defmodule Location do
           region: String.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding Location.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding Location.city"}
+
+  def decode_country(value) when is_binary(value), do: value
+  def decode_country(_), do: {:error, "Unexpected type when decoding Location.country"}
+
+  def encode_country(value) when is_binary(value), do: value
+  def encode_country(_), do: {:error, "Unexpected type when encoding Location.country"}
+
+  def decode_region(value) when is_binary(value), do: value
+  def decode_region(_), do: {:error, "Unexpected type when decoding Location.region"}
+
+  def encode_region(value) when is_binary(value), do: value
+  def encode_region(_), do: {:error, "Unexpected type when encoding Location.region"}
+
   def from_map(m) do
     %Location{
-      city: m["city"],
-      country: m["country"],
-      region: m["region"],
+      city: decode_city(m["city"]),
+      country: decode_country(m["country"]),
+      region: decode_region(m["region"]),
     }
   end
 
@@ -405,12 +591,36 @@ defmodule Units do
           temperature: String.t()
         }
 
+  def decode_distance(value) when is_binary(value), do: value
+  def decode_distance(_), do: {:error, "Unexpected type when decoding Units.distance"}
+
+  def encode_distance(value) when is_binary(value), do: value
+  def encode_distance(_), do: {:error, "Unexpected type when encoding Units.distance"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Units.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Units.pressure"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Units.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Units.speed"}
+
+  def decode_temperature(value) when is_binary(value), do: value
+  def decode_temperature(_), do: {:error, "Unexpected type when decoding Units.temperature"}
+
+  def encode_temperature(value) when is_binary(value), do: value
+  def encode_temperature(_), do: {:error, "Unexpected type when encoding Units.temperature"}
+
   def from_map(m) do
     %Units{
-      distance: m["distance"],
-      pressure: m["pressure"],
-      speed: m["speed"],
-      temperature: m["temperature"],
+      distance: decode_distance(m["distance"]),
+      pressure: decode_pressure(m["pressure"]),
+      speed: decode_speed(m["speed"]),
+      temperature: decode_temperature(m["temperature"]),
     }
   end
 
@@ -446,11 +656,29 @@ defmodule Wind do
           speed: String.t()
         }
 
+  def decode_chill(value) when is_binary(value), do: value
+  def decode_chill(_), do: {:error, "Unexpected type when decoding Wind.chill"}
+
+  def encode_chill(value) when is_binary(value), do: value
+  def encode_chill(_), do: {:error, "Unexpected type when encoding Wind.chill"}
+
+  def decode_direction(value) when is_binary(value), do: value
+  def decode_direction(_), do: {:error, "Unexpected type when decoding Wind.direction"}
+
+  def encode_direction(value) when is_binary(value), do: value
+  def encode_direction(_), do: {:error, "Unexpected type when encoding Wind.direction"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Wind.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Wind.speed"}
+
   def from_map(m) do
     %Wind{
-      chill: m["chill"],
-      direction: m["direction"],
-      speed: m["speed"],
+      chill: decode_chill(m["chill"]),
+      direction: decode_direction(m["direction"]),
+      speed: decode_speed(m["speed"]),
     }
   end
 
@@ -495,19 +723,55 @@ defmodule Channel do
           wind: Wind.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Channel.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Channel.description"}
+
+  def decode_language(value) when is_binary(value), do: value
+  def decode_language(_), do: {:error, "Unexpected type when decoding Channel.language"}
+
+  def encode_language(value) when is_binary(value), do: value
+  def encode_language(_), do: {:error, "Unexpected type when encoding Channel.language"}
+
+  def decode_last_build_date(value) when is_binary(value), do: value
+  def decode_last_build_date(_), do: {:error, "Unexpected type when decoding Channel.last_build_date"}
+
+  def encode_last_build_date(value) when is_binary(value), do: value
+  def encode_last_build_date(_), do: {:error, "Unexpected type when encoding Channel.last_build_date"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Channel.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Channel.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Channel.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Channel.title"}
+
+  def decode_ttl(value) when is_binary(value), do: value
+  def decode_ttl(_), do: {:error, "Unexpected type when decoding Channel.ttl"}
+
+  def encode_ttl(value) when is_binary(value), do: value
+  def encode_ttl(_), do: {:error, "Unexpected type when encoding Channel.ttl"}
+
   def from_map(m) do
     %Channel{
       astronomy: Astronomy.from_map(m["astronomy"]),
       atmosphere: Atmosphere.from_map(m["atmosphere"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       image: Image.from_map(m["image"]),
       item: Item.from_map(m["item"]),
-      language: m["language"],
-      last_build_date: m["lastBuildDate"],
-      link: m["link"],
+      language: decode_language(m["language"]),
+      last_build_date: decode_last_build_date(m["lastBuildDate"]),
+      link: decode_link(m["link"]),
       location: Location.from_map(m["location"]),
-      title: m["title"],
-      ttl: m["ttl"],
+      title: decode_title(m["title"]),
+      ttl: decode_ttl(m["ttl"]),
       units: Units.from_map(m["units"]),
       wind: Wind.from_map(m["wind"]),
     }
@@ -588,11 +852,29 @@ defmodule Query do
           results: Results.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Query.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Query.count"}
+
+  def decode_created(value) when is_binary(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding Query.created"}
+
+  def encode_created(value) when is_binary(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding Query.created"}
+
+  def decode_lang(value) when is_binary(value), do: value
+  def decode_lang(_), do: {:error, "Unexpected type when decoding Query.lang"}
+
+  def encode_lang(value) when is_binary(value), do: value
+  def encode_lang(_), do: {:error, "Unexpected type when encoding Query.lang"}
+
   def from_map(m) do
     %Query{
-      count: m["count"],
-      created: m["created"],
-      lang: m["lang"],
+      count: decode_count(m["count"]),
+      created: decode_created(m["created"]),
+      lang: decode_lang(m["lang"]),
       results: Results.from_map(m["results"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/6eb00.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/6eb00.json/default/QuickType.ex
index dc36dc5..e9814c9 100644
--- a/base/elixir/test/inputs/json/misc/6eb00.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/6eb00.json/default/QuickType.ex
@@ -15,11 +15,29 @@ defmodule TopLevelElement do
           name: String.t()
         }
 
+  def decode_directorate_id(value) when is_integer(value), do: value
+  def decode_directorate_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.directorate_id"}
+
+  def encode_directorate_id(value) when is_integer(value), do: value
+  def encode_directorate_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.directorate_id"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.name"}
+
   def from_map(m) do
     %TopLevelElement{
-      directorate_id: m["DirectorateID"],
-      id: m["Id"],
-      name: m["Name"],
+      directorate_id: decode_directorate_id(m["DirectorateID"]),
+      id: decode_id(m["Id"]),
+      name: decode_name(m["Name"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/70c77.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/70c77.json/default/QuickType.ex
index 8937606..db497b1 100644
--- a/base/elixir/test/inputs/json/misc/70c77.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/70c77.json/default/QuickType.ex
@@ -15,11 +15,32 @@ defmodule TopLevel do
           rates: %{String.t() => float()}
         }
 
+  def decode_base(value) when is_binary(value), do: value
+  def decode_base(_), do: {:error, "Unexpected type when decoding TopLevel.base"}
+
+  def encode_base(value) when is_binary(value), do: value
+  def encode_base(_), do: {:error, "Unexpected type when encoding TopLevel.base"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel.date"}
+
+  def decode_rates_value(value) when is_float(value), do: value
+  def decode_rates_value(value) when is_integer(value), do: value
+  def decode_rates_value(_), do: {:error, "Unexpected type when decoding TopLevel.rates"}
+
+  def encode_rates_value(value) when is_float(value), do: value
+  def encode_rates_value(value) when is_integer(value), do: value
+  def encode_rates_value(_), do: {:error, "Unexpected type when encoding TopLevel.rates"}
+
   def from_map(m) do
     %TopLevel{
-      base: m["base"],
-      date: m["date"],
-      rates: m["rates"],
+      base: decode_base(m["base"]),
+      date: decode_date(m["date"]),
+      rates: m["rates"]
+      |> Map.new(fn {key, value} -> {key, decode_rates_value(value)} end),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/734ad.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/734ad.json/default/QuickType.ex
index 36b96cc..bc66766 100644
--- a/base/elixir/test/inputs/json/misc/734ad.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/734ad.json/default/QuickType.ex
@@ -145,17 +145,229 @@ defmodule Result do
           web_site_url: nil | String.t()
         }
 
+  def decode_activity_consult_committees(value) when is_binary(value), do: value
+  def decode_activity_consult_committees(_), do: {:error, "Unexpected type when decoding Result.activity_consult_committees"}
+
+  def encode_activity_consult_committees(value) when is_binary(value), do: value
+  def encode_activity_consult_committees(_), do: {:error, "Unexpected type when encoding Result.activity_consult_committees"}
+
+  def decode_activity_eu_legislative(value) when is_binary(value), do: value
+  def decode_activity_eu_legislative(_), do: {:error, "Unexpected type when decoding Result.activity_eu_legislative"}
+
+  def encode_activity_eu_legislative(value) when is_binary(value), do: value
+  def encode_activity_eu_legislative(_), do: {:error, "Unexpected type when encoding Result.activity_eu_legislative"}
+
+  def decode_activity_expert_groups(value) when is_binary(value), do: value
+  def decode_activity_expert_groups(_), do: {:error, "Unexpected type when decoding Result.activity_expert_groups"}
+
+  def encode_activity_expert_groups(value) when is_binary(value), do: value
+  def encode_activity_expert_groups(_), do: {:error, "Unexpected type when encoding Result.activity_expert_groups"}
+
+  def decode_activity_high_level_groups(value) when is_binary(value), do: value
+  def decode_activity_high_level_groups(_), do: {:error, "Unexpected type when decoding Result.activity_high_level_groups"}
+
+  def encode_activity_high_level_groups(value) when is_binary(value), do: value
+  def encode_activity_high_level_groups(_), do: {:error, "Unexpected type when encoding Result.activity_high_level_groups"}
+
+  def decode_activity_industry_forums(value) when is_binary(value), do: value
+  def decode_activity_industry_forums(_), do: {:error, "Unexpected type when decoding Result.activity_industry_forums"}
+
+  def encode_activity_industry_forums(value) when is_binary(value), do: value
+  def encode_activity_industry_forums(_), do: {:error, "Unexpected type when encoding Result.activity_industry_forums"}
+
+  def decode_activity_inter_groups(value) when is_binary(value), do: value
+  def decode_activity_inter_groups(_), do: {:error, "Unexpected type when decoding Result.activity_inter_groups"}
+
+  def encode_activity_inter_groups(value) when is_binary(value), do: value
+  def encode_activity_inter_groups(_), do: {:error, "Unexpected type when encoding Result.activity_inter_groups"}
+
+  def decode_activity_relevant_comm(value) when is_binary(value), do: value
+  def decode_activity_relevant_comm(_), do: {:error, "Unexpected type when decoding Result.activity_relevant_comm"}
+
+  def encode_activity_relevant_comm(value) when is_binary(value), do: value
+  def encode_activity_relevant_comm(_), do: {:error, "Unexpected type when encoding Result.activity_relevant_comm"}
+
+  def decode_code_of_conduct(value) when is_binary(value), do: value
+  def decode_code_of_conduct(_), do: {:error, "Unexpected type when decoding Result.code_of_conduct"}
+
+  def encode_code_of_conduct(value) when is_binary(value), do: value
+  def encode_code_of_conduct(_), do: {:error, "Unexpected type when encoding Result.code_of_conduct"}
+
+  def decode_contact_country(value) when is_integer(value), do: value
+  def decode_contact_country(_), do: {:error, "Unexpected type when decoding Result.contact_country"}
+
+  def encode_contact_country(value) when is_integer(value), do: value
+  def encode_contact_country(_), do: {:error, "Unexpected type when encoding Result.contact_country"}
+
+  def decode_created_at(value) when is_binary(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding Result.created_at"}
+
+  def encode_created_at(value) when is_binary(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding Result.created_at"}
+
+  def decode_entity(value) when is_binary(value), do: value
+  def decode_entity(_), do: {:error, "Unexpected type when decoding Result.entity"}
+
+  def encode_entity(value) when is_binary(value), do: value
+  def encode_entity(_), do: {:error, "Unexpected type when encoding Result.entity"}
+
+  def decode_goals(value) when is_binary(value), do: value
+  def decode_goals(_), do: {:error, "Unexpected type when decoding Result.goals"}
+
+  def encode_goals(value) when is_binary(value), do: value
+  def encode_goals(_), do: {:error, "Unexpected type when encoding Result.goals"}
+
+  def decode_head(value) when is_binary(value), do: value
+  def decode_head(_), do: {:error, "Unexpected type when decoding Result.head"}
+
+  def encode_head(value) when is_binary(value), do: value
+  def encode_head(_), do: {:error, "Unexpected type when encoding Result.head"}
+
+  def decode_head_office_country(value) when is_binary(value), do: value
+  def decode_head_office_country(_), do: {:error, "Unexpected type when decoding Result.head_office_country"}
+
+  def encode_head_office_country(value) when is_binary(value), do: value
+  def encode_head_office_country(_), do: {:error, "Unexpected type when encoding Result.head_office_country"}
+
+  def decode_head_office_phone(value) when is_binary(value), do: value
+  def decode_head_office_phone(_), do: {:error, "Unexpected type when decoding Result.head_office_phone"}
+
+  def encode_head_office_phone(value) when is_binary(value), do: value
+  def encode_head_office_phone(_), do: {:error, "Unexpected type when encoding Result.head_office_phone"}
+
+  def decode_head_office_street(value) when is_binary(value), do: value
+  def decode_head_office_street(_), do: {:error, "Unexpected type when decoding Result.head_office_street"}
+
+  def encode_head_office_street(value) when is_binary(value), do: value
+  def encode_head_office_street(_), do: {:error, "Unexpected type when encoding Result.head_office_street"}
+
+  def decode_head_office_town(value) when is_binary(value), do: value
+  def decode_head_office_town(_), do: {:error, "Unexpected type when decoding Result.head_office_town"}
+
+  def encode_head_office_town(value) when is_binary(value), do: value
+  def encode_head_office_town(_), do: {:error, "Unexpected type when encoding Result.head_office_town"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Result.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Result.id"}
+
+  def decode_identification_code(value) when is_binary(value), do: value
+  def decode_identification_code(_), do: {:error, "Unexpected type when decoding Result.identification_code"}
+
+  def encode_identification_code(value) when is_binary(value), do: value
+  def encode_identification_code(_), do: {:error, "Unexpected type when encoding Result.identification_code"}
+
+  def decode_info_members(value) when is_binary(value), do: value
+  def decode_info_members(_), do: {:error, "Unexpected type when decoding Result.info_members"}
+
+  def encode_info_members(value) when is_binary(value), do: value
+  def encode_info_members(_), do: {:error, "Unexpected type when encoding Result.info_members"}
+
+  def decode_last_update_date(value) when is_binary(value), do: value
+  def decode_last_update_date(_), do: {:error, "Unexpected type when decoding Result.last_update_date"}
+
+  def encode_last_update_date(value) when is_binary(value), do: value
+  def encode_last_update_date(_), do: {:error, "Unexpected type when encoding Result.last_update_date"}
+
+  def decode_legal(value) when is_binary(value), do: value
+  def decode_legal(_), do: {:error, "Unexpected type when decoding Result.legal"}
+
+  def encode_legal(value) when is_binary(value), do: value
+  def encode_legal(_), do: {:error, "Unexpected type when encoding Result.legal"}
+
+  def decode_legal_status(value) when is_binary(value), do: value
+  def decode_legal_status(_), do: {:error, "Unexpected type when decoding Result.legal_status"}
+
+  def encode_legal_status(value) when is_binary(value), do: value
+  def encode_legal_status(_), do: {:error, "Unexpected type when encoding Result.legal_status"}
+
+  def decode_main_category(value) when is_integer(value), do: value
+  def decode_main_category(_), do: {:error, "Unexpected type when decoding Result.main_category"}
+
+  def encode_main_category(value) when is_integer(value), do: value
+  def encode_main_category(_), do: {:error, "Unexpected type when encoding Result.main_category"}
+
+  def decode_main_category_title(value) when is_binary(value), do: value
+  def decode_main_category_title(_), do: {:error, "Unexpected type when decoding Result.main_category_title"}
+
+  def encode_main_category_title(value) when is_binary(value), do: value
+  def encode_main_category_title(_), do: {:error, "Unexpected type when encoding Result.main_category_title"}
+
+  def decode_members(value) when is_integer(value), do: value
+  def decode_members(_), do: {:error, "Unexpected type when decoding Result.members"}
+
+  def encode_members(value) when is_integer(value), do: value
+  def encode_members(_), do: {:error, "Unexpected type when encoding Result.members"}
+
+  def decode_members_fte(value) when is_float(value), do: value
+  def decode_members_fte(value) when is_integer(value), do: value
+  def decode_members_fte(_), do: {:error, "Unexpected type when decoding Result.members_fte"}
+
+  def encode_members_fte(value) when is_float(value), do: value
+  def encode_members_fte(value) when is_integer(value), do: value
+  def encode_members_fte(_), do: {:error, "Unexpected type when encoding Result.members_fte"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Result.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Result.name"}
+
+  def decode_native_name(value) when is_nil(value), do: value
+  def decode_native_name(_), do: {:error, "Unexpected type when decoding Result.native_name"}
+
+  def encode_native_name(value) when is_nil(value), do: value
+  def encode_native_name(_), do: {:error, "Unexpected type when encoding Result.native_name"}
+
+  def decode_registration_date(value) when is_binary(value), do: value
+  def decode_registration_date(_), do: {:error, "Unexpected type when decoding Result.registration_date"}
+
+  def encode_registration_date(value) when is_binary(value), do: value
+  def encode_registration_date(_), do: {:error, "Unexpected type when encoding Result.registration_date"}
+
+  def decode_structure_members(value) when is_binary(value), do: value
+  def decode_structure_members(_), do: {:error, "Unexpected type when decoding Result.structure_members"}
+
+  def encode_structure_members(value) when is_binary(value), do: value
+  def encode_structure_members(_), do: {:error, "Unexpected type when encoding Result.structure_members"}
+
+  def decode_sub_category(value) when is_integer(value), do: value
+  def decode_sub_category(_), do: {:error, "Unexpected type when decoding Result.sub_category"}
+
+  def encode_sub_category(value) when is_integer(value), do: value
+  def encode_sub_category(_), do: {:error, "Unexpected type when encoding Result.sub_category"}
+
+  def decode_sub_category_title(value) when is_binary(value), do: value
+  def decode_sub_category_title(_), do: {:error, "Unexpected type when decoding Result.sub_category_title"}
+
+  def encode_sub_category_title(value) when is_binary(value), do: value
+  def encode_sub_category_title(_), do: {:error, "Unexpected type when encoding Result.sub_category_title"}
+
+  def decode_updated_at(value) when is_binary(value), do: value
+  def decode_updated_at(_), do: {:error, "Unexpected type when decoding Result.updated_at"}
+
+  def encode_updated_at(value) when is_binary(value), do: value
+  def encode_updated_at(_), do: {:error, "Unexpected type when encoding Result.updated_at"}
+
+  def decode_uri(value) when is_binary(value), do: value
+  def decode_uri(_), do: {:error, "Unexpected type when decoding Result.uri"}
+
+  def encode_uri(value) when is_binary(value), do: value
+  def encode_uri(_), do: {:error, "Unexpected type when encoding Result.uri"}
+
   def from_map(m) do
     %Result{
       acronym: m["acronym"],
-      activity_consult_committees: m["activity_consult_committees"],
-      activity_eu_legislative: m["activity_eu_legislative"],
-      activity_expert_groups: m["activity_expert_groups"],
-      activity_high_level_groups: m["activity_high_level_groups"],
-      activity_industry_forums: m["activity_industry_forums"],
-      activity_inter_groups: m["activity_inter_groups"],
+      activity_consult_committees: decode_activity_consult_committees(m["activity_consult_committees"]),
+      activity_eu_legislative: decode_activity_eu_legislative(m["activity_eu_legislative"]),
+      activity_expert_groups: decode_activity_expert_groups(m["activity_expert_groups"]),
+      activity_high_level_groups: decode_activity_high_level_groups(m["activity_high_level_groups"]),
+      activity_industry_forums: decode_activity_industry_forums(m["activity_industry_forums"]),
+      activity_inter_groups: decode_activity_inter_groups(m["activity_inter_groups"]),
       activity_other: m["activity_other"],
-      activity_relevant_comm: m["activity_relevant_comm"],
+      activity_relevant_comm: decode_activity_relevant_comm(m["activity_relevant_comm"]),
       be_office_country: m["be_office_country"],
       be_office_lat: m["be_office_lat"],
       be_office_lon: m["be_office_lon"],
@@ -164,46 +376,46 @@ defmodule Result do
       be_office_postbox: m["be_office_postbox"],
       be_office_street: m["be_office_street"],
       be_office_town: m["be_office_town"],
-      code_of_conduct: m["code_of_conduct"],
-      contact_country: m["contact_country"],
-      created_at: m["created_at"],
-      entity: m["entity"],
-      goals: m["goals"],
-      head: m["head"],
-      head_office_country: m["head_office_country"],
+      code_of_conduct: decode_code_of_conduct(m["code_of_conduct"]),
+      contact_country: decode_contact_country(m["contact_country"]),
+      created_at: decode_created_at(m["created_at"]),
+      entity: decode_entity(m["entity"]),
+      goals: decode_goals(m["goals"]),
+      head: decode_head(m["head"]),
+      head_office_country: decode_head_office_country(m["head_office_country"]),
       head_office_lat: m["head_office_lat"],
       head_office_lon: m["head_office_lon"],
-      head_office_phone: m["head_office_phone"],
+      head_office_phone: decode_head_office_phone(m["head_office_phone"]),
       head_office_post_code: m["head_office_post_code"],
       head_office_postbox: m["head_office_postbox"],
-      head_office_street: m["head_office_street"],
-      head_office_town: m["head_office_town"],
-      id: m["id"],
-      identification_code: m["identification_code"],
-      info_members: m["info_members"],
-      last_update_date: m["last_update_date"],
-      legal: m["legal"],
-      legal_status: m["legal_status"],
-      main_category: m["main_category"],
-      main_category_title: m["main_category_title"],
-      members: m["members"],
+      head_office_street: decode_head_office_street(m["head_office_street"]),
+      head_office_town: decode_head_office_town(m["head_office_town"]),
+      id: decode_id(m["id"]),
+      identification_code: decode_identification_code(m["identification_code"]),
+      info_members: decode_info_members(m["info_members"]),
+      last_update_date: decode_last_update_date(m["last_update_date"]),
+      legal: decode_legal(m["legal"]),
+      legal_status: decode_legal_status(m["legal_status"]),
+      main_category: decode_main_category(m["main_category"]),
+      main_category_title: decode_main_category_title(m["main_category_title"]),
+      members: decode_members(m["members"]),
       members_100: m["members_100"],
       members_25: m["members_25"],
       members_50: m["members_50"],
       members_75: m["members_75"],
-      members_fte: m["members_fte"],
-      name: m["name"],
-      native_name: m["native_name"],
+      members_fte: decode_members_fte(m["members_fte"]),
+      name: decode_name(m["name"]),
+      native_name: decode_native_name(m["native_name"]),
       networking: m["networking"],
       number_of_natural_persons: m["number_of_natural_persons"],
       other_code_of_conduct: m["other_code_of_conduct"],
-      registration_date: m["registration_date"],
+      registration_date: decode_registration_date(m["registration_date"]),
       status: Status.decode(m["status"]),
-      structure_members: m["structure_members"],
-      sub_category: m["sub_category"],
-      sub_category_title: m["sub_category_title"],
-      updated_at: m["updated_at"],
-      uri: m["uri"],
+      structure_members: decode_structure_members(m["structure_members"]),
+      sub_category: decode_sub_category(m["sub_category"]),
+      sub_category_title: decode_sub_category_title(m["sub_category_title"]),
+      updated_at: decode_updated_at(m["updated_at"]),
+      uri: decode_uri(m["uri"]),
       web_site_url: m["web_site_url"],
     }
   end
@@ -298,14 +510,50 @@ defmodule TopLevel do
           results: [Result.t()]
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding TopLevel.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding TopLevel.count"}
+
+  def decode_limit(value) when is_integer(value), do: value
+  def decode_limit(_), do: {:error, "Unexpected type when decoding TopLevel.limit"}
+
+  def encode_limit(value) when is_integer(value), do: value
+  def encode_limit(_), do: {:error, "Unexpected type when encoding TopLevel.limit"}
+
+  def decode_next(value) when is_binary(value), do: value
+  def decode_next(_), do: {:error, "Unexpected type when decoding TopLevel.next"}
+
+  def encode_next(value) when is_binary(value), do: value
+  def encode_next(_), do: {:error, "Unexpected type when encoding TopLevel.next"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding TopLevel.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding TopLevel.offset"}
+
+  def decode_previous(value) when is_boolean(value), do: value
+  def decode_previous(_), do: {:error, "Unexpected type when decoding TopLevel.previous"}
+
+  def encode_previous(value) when is_boolean(value), do: value
+  def encode_previous(_), do: {:error, "Unexpected type when encoding TopLevel.previous"}
+
+  def decode_results(value) when is_list(value), do: value
+  def decode_results(_), do: {:error, "Unexpected type when decoding TopLevel.results"}
+
+  def encode_results(value) when is_list(value), do: value
+  def encode_results(_), do: {:error, "Unexpected type when encoding TopLevel.results"}
+
   def from_map(m) do
     %TopLevel{
-      count: m["count"],
+      count: decode_count(m["count"]),
       facets: Facets.from_map(m["facets"]),
-      limit: m["limit"],
-      next: m["next"],
-      offset: m["offset"],
-      previous: m["previous"],
+      limit: decode_limit(m["limit"]),
+      next: decode_next(m["next"]),
+      offset: decode_offset(m["offset"]),
+      previous: decode_previous(m["previous"]),
       results: Enum.map(m["results"], &Result.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/75912.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/75912.json/default/QuickType.ex
index 8937606..db497b1 100644
--- a/base/elixir/test/inputs/json/misc/75912.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/75912.json/default/QuickType.ex
@@ -15,11 +15,32 @@ defmodule TopLevel do
           rates: %{String.t() => float()}
         }
 
+  def decode_base(value) when is_binary(value), do: value
+  def decode_base(_), do: {:error, "Unexpected type when decoding TopLevel.base"}
+
+  def encode_base(value) when is_binary(value), do: value
+  def encode_base(_), do: {:error, "Unexpected type when encoding TopLevel.base"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel.date"}
+
+  def decode_rates_value(value) when is_float(value), do: value
+  def decode_rates_value(value) when is_integer(value), do: value
+  def decode_rates_value(_), do: {:error, "Unexpected type when decoding TopLevel.rates"}
+
+  def encode_rates_value(value) when is_float(value), do: value
+  def encode_rates_value(value) when is_integer(value), do: value
+  def encode_rates_value(_), do: {:error, "Unexpected type when encoding TopLevel.rates"}
+
   def from_map(m) do
     %TopLevel{
-      base: m["base"],
-      date: m["date"],
-      rates: m["rates"],
+      base: decode_base(m["base"]),
+      date: decode_date(m["date"]),
+      rates: m["rates"]
+      |> Map.new(fn {key, value} -> {key, decode_rates_value(value)} end),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/7681c.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/7681c.json/default/QuickType.ex
index 5357d9d..e6dde27 100644
--- a/base/elixir/test/inputs/json/misc/7681c.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/7681c.json/default/QuickType.ex
@@ -16,12 +16,30 @@ defmodule The480_WStill do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding The480_WStill.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding The480_WStill.height"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding The480_WStill.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding The480_WStill.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding The480_WStill.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding The480_WStill.width"}
+
   def from_map(m) do
     %The480_WStill{
-      height: m["height"],
+      height: decode_height(m["height"]),
       size: m["size"],
-      url: m["url"],
-      width: m["width"],
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -58,12 +76,36 @@ defmodule DownsizedSmall do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding DownsizedSmall.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding DownsizedSmall.height"}
+
+  def decode_mp4(value) when is_binary(value), do: value
+  def decode_mp4(_), do: {:error, "Unexpected type when decoding DownsizedSmall.mp4"}
+
+  def encode_mp4(value) when is_binary(value), do: value
+  def encode_mp4(_), do: {:error, "Unexpected type when encoding DownsizedSmall.mp4"}
+
+  def decode_mp4_size(value) when is_binary(value), do: value
+  def decode_mp4_size(_), do: {:error, "Unexpected type when decoding DownsizedSmall.mp4_size"}
+
+  def encode_mp4_size(value) when is_binary(value), do: value
+  def encode_mp4_size(_), do: {:error, "Unexpected type when encoding DownsizedSmall.mp4_size"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding DownsizedSmall.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding DownsizedSmall.width"}
+
   def from_map(m) do
     %DownsizedSmall{
-      height: m["height"],
-      mp4: m["mp4"],
-      mp4_size: m["mp4_size"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      mp4: decode_mp4(m["mp4"]),
+      mp4_size: decode_mp4_size(m["mp4_size"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -106,18 +148,54 @@ defmodule FixedHeight do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding FixedHeight.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding FixedHeight.height"}
+
+  def decode_size(value) when is_binary(value), do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding FixedHeight.size"}
+
+  def encode_size(value) when is_binary(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding FixedHeight.size"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding FixedHeight.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding FixedHeight.url"}
+
+  def decode_webp(value) when is_binary(value), do: value
+  def decode_webp(_), do: {:error, "Unexpected type when decoding FixedHeight.webp"}
+
+  def encode_webp(value) when is_binary(value), do: value
+  def encode_webp(_), do: {:error, "Unexpected type when encoding FixedHeight.webp"}
+
+  def decode_webp_size(value) when is_binary(value), do: value
+  def decode_webp_size(_), do: {:error, "Unexpected type when decoding FixedHeight.webp_size"}
+
+  def encode_webp_size(value) when is_binary(value), do: value
+  def encode_webp_size(_), do: {:error, "Unexpected type when encoding FixedHeight.webp_size"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding FixedHeight.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding FixedHeight.width"}
+
   def from_map(m) do
     %FixedHeight{
       frames: m["frames"],
       hash: m["hash"],
-      height: m["height"],
+      height: decode_height(m["height"]),
       mp4: m["mp4"],
       mp4_size: m["mp4_size"],
-      size: m["size"],
-      url: m["url"],
-      webp: m["webp"],
-      webp_size: m["webp_size"],
-      width: m["width"],
+      size: decode_size(m["size"]),
+      url: decode_url(m["url"]),
+      webp: decode_webp(m["webp"]),
+      webp_size: decode_webp_size(m["webp_size"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -158,10 +236,22 @@ defmodule Looping do
           mp4_size: String.t()
         }
 
+  def decode_mp4(value) when is_binary(value), do: value
+  def decode_mp4(_), do: {:error, "Unexpected type when decoding Looping.mp4"}
+
+  def encode_mp4(value) when is_binary(value), do: value
+  def encode_mp4(_), do: {:error, "Unexpected type when encoding Looping.mp4"}
+
+  def decode_mp4_size(value) when is_binary(value), do: value
+  def decode_mp4_size(_), do: {:error, "Unexpected type when decoding Looping.mp4_size"}
+
+  def encode_mp4_size(value) when is_binary(value), do: value
+  def encode_mp4_size(_), do: {:error, "Unexpected type when encoding Looping.mp4_size"}
+
   def from_map(m) do
     %Looping{
-      mp4: m["mp4"],
-      mp4_size: m["mp4_size"],
+      mp4: decode_mp4(m["mp4"]),
+      mp4_size: decode_mp4_size(m["mp4_size"]),
     }
   end
 
@@ -389,14 +479,44 @@ defmodule User do
           username: String.t()
         }
 
+  def decode_avatar_url(value) when is_binary(value), do: value
+  def decode_avatar_url(_), do: {:error, "Unexpected type when decoding User.avatar_url"}
+
+  def encode_avatar_url(value) when is_binary(value), do: value
+  def encode_avatar_url(_), do: {:error, "Unexpected type when encoding User.avatar_url"}
+
+  def decode_banner_url(value) when is_binary(value), do: value
+  def decode_banner_url(_), do: {:error, "Unexpected type when decoding User.banner_url"}
+
+  def encode_banner_url(value) when is_binary(value), do: value
+  def encode_banner_url(_), do: {:error, "Unexpected type when encoding User.banner_url"}
+
+  def decode_display_name(value) when is_binary(value), do: value
+  def decode_display_name(_), do: {:error, "Unexpected type when decoding User.display_name"}
+
+  def encode_display_name(value) when is_binary(value), do: value
+  def encode_display_name(_), do: {:error, "Unexpected type when encoding User.display_name"}
+
+  def decode_profile_url(value) when is_binary(value), do: value
+  def decode_profile_url(_), do: {:error, "Unexpected type when decoding User.profile_url"}
+
+  def encode_profile_url(value) when is_binary(value), do: value
+  def encode_profile_url(_), do: {:error, "Unexpected type when encoding User.profile_url"}
+
+  def decode_username(value) when is_binary(value), do: value
+  def decode_username(_), do: {:error, "Unexpected type when decoding User.username"}
+
+  def encode_username(value) when is_binary(value), do: value
+  def encode_username(_), do: {:error, "Unexpected type when encoding User.username"}
+
   def from_map(m) do
     %User{
-      avatar_url: m["avatar_url"],
-      banner_url: m["banner_url"],
-      display_name: m["display_name"],
-      profile_url: m["profile_url"],
+      avatar_url: decode_avatar_url(m["avatar_url"]),
+      banner_url: decode_banner_url(m["banner_url"]),
+      display_name: decode_display_name(m["display_name"]),
+      profile_url: decode_profile_url(m["profile_url"]),
       twitter: m["twitter"],
-      username: m["username"],
+      username: decode_username(m["username"]),
     }
   end
 
@@ -497,24 +617,102 @@ defmodule Datum do
           username: Username.t()
         }
 
+  def decode_bitly_gif_url(value) when is_binary(value), do: value
+  def decode_bitly_gif_url(_), do: {:error, "Unexpected type when decoding Datum.bitly_gif_url"}
+
+  def encode_bitly_gif_url(value) when is_binary(value), do: value
+  def encode_bitly_gif_url(_), do: {:error, "Unexpected type when encoding Datum.bitly_gif_url"}
+
+  def decode_bitly_url(value) when is_binary(value), do: value
+  def decode_bitly_url(_), do: {:error, "Unexpected type when decoding Datum.bitly_url"}
+
+  def encode_bitly_url(value) when is_binary(value), do: value
+  def encode_bitly_url(_), do: {:error, "Unexpected type when encoding Datum.bitly_url"}
+
+  def decode_content_url(value) when is_binary(value), do: value
+  def decode_content_url(_), do: {:error, "Unexpected type when decoding Datum.content_url"}
+
+  def encode_content_url(value) when is_binary(value), do: value
+  def encode_content_url(_), do: {:error, "Unexpected type when encoding Datum.content_url"}
+
+  def decode_embed_url(value) when is_binary(value), do: value
+  def decode_embed_url(_), do: {:error, "Unexpected type when decoding Datum.embed_url"}
+
+  def encode_embed_url(value) when is_binary(value), do: value
+  def encode_embed_url(_), do: {:error, "Unexpected type when encoding Datum.embed_url"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Datum.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Datum.id"}
+
+  def decode_import_datetime(value) when is_binary(value), do: value
+  def decode_import_datetime(_), do: {:error, "Unexpected type when decoding Datum.import_datetime"}
+
+  def encode_import_datetime(value) when is_binary(value), do: value
+  def encode_import_datetime(_), do: {:error, "Unexpected type when encoding Datum.import_datetime"}
+
+  def decode_is_indexable(value) when is_integer(value), do: value
+  def decode_is_indexable(_), do: {:error, "Unexpected type when decoding Datum.is_indexable"}
+
+  def encode_is_indexable(value) when is_integer(value), do: value
+  def encode_is_indexable(_), do: {:error, "Unexpected type when encoding Datum.is_indexable"}
+
+  def decode_slug(value) when is_binary(value), do: value
+  def decode_slug(_), do: {:error, "Unexpected type when decoding Datum.slug"}
+
+  def encode_slug(value) when is_binary(value), do: value
+  def encode_slug(_), do: {:error, "Unexpected type when encoding Datum.slug"}
+
+  def decode_source(value) when is_binary(value), do: value
+  def decode_source(_), do: {:error, "Unexpected type when decoding Datum.source"}
+
+  def encode_source(value) when is_binary(value), do: value
+  def encode_source(_), do: {:error, "Unexpected type when encoding Datum.source"}
+
+  def decode_source_post_url(value) when is_binary(value), do: value
+  def decode_source_post_url(_), do: {:error, "Unexpected type when decoding Datum.source_post_url"}
+
+  def encode_source_post_url(value) when is_binary(value), do: value
+  def encode_source_post_url(_), do: {:error, "Unexpected type when encoding Datum.source_post_url"}
+
+  def decode_source_tld(value) when is_binary(value), do: value
+  def decode_source_tld(_), do: {:error, "Unexpected type when decoding Datum.source_tld"}
+
+  def encode_source_tld(value) when is_binary(value), do: value
+  def encode_source_tld(_), do: {:error, "Unexpected type when encoding Datum.source_tld"}
+
+  def decode_trending_datetime(value) when is_binary(value), do: value
+  def decode_trending_datetime(_), do: {:error, "Unexpected type when decoding Datum.trending_datetime"}
+
+  def encode_trending_datetime(value) when is_binary(value), do: value
+  def encode_trending_datetime(_), do: {:error, "Unexpected type when encoding Datum.trending_datetime"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Datum.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Datum.url"}
+
   def from_map(m) do
     %Datum{
-      bitly_gif_url: m["bitly_gif_url"],
-      bitly_url: m["bitly_url"],
-      content_url: m["content_url"],
-      embed_url: m["embed_url"],
-      id: m["id"],
+      bitly_gif_url: decode_bitly_gif_url(m["bitly_gif_url"]),
+      bitly_url: decode_bitly_url(m["bitly_url"]),
+      content_url: decode_content_url(m["content_url"]),
+      embed_url: decode_embed_url(m["embed_url"]),
+      id: decode_id(m["id"]),
       images: Images.from_map(m["images"]),
-      import_datetime: m["import_datetime"],
-      is_indexable: m["is_indexable"],
+      import_datetime: decode_import_datetime(m["import_datetime"]),
+      is_indexable: decode_is_indexable(m["is_indexable"]),
       rating: Rating.decode(m["rating"]),
-      slug: m["slug"],
-      source: m["source"],
-      source_post_url: m["source_post_url"],
-      source_tld: m["source_tld"],
-      trending_datetime: m["trending_datetime"],
+      slug: decode_slug(m["slug"]),
+      source: decode_source(m["source"]),
+      source_post_url: decode_source_post_url(m["source_post_url"]),
+      source_tld: decode_source_tld(m["source_tld"]),
+      trending_datetime: decode_trending_datetime(m["trending_datetime"]),
       type: Type.decode(m["type"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
       user: m["user"] && User.from_map(m["user"]),
       username: Username.decode(m["username"]),
     }
@@ -566,11 +764,29 @@ defmodule Meta do
           status: integer()
         }
 
+  def decode_msg(value) when is_binary(value), do: value
+  def decode_msg(_), do: {:error, "Unexpected type when decoding Meta.msg"}
+
+  def encode_msg(value) when is_binary(value), do: value
+  def encode_msg(_), do: {:error, "Unexpected type when encoding Meta.msg"}
+
+  def decode_response_id(value) when is_binary(value), do: value
+  def decode_response_id(_), do: {:error, "Unexpected type when decoding Meta.response_id"}
+
+  def encode_response_id(value) when is_binary(value), do: value
+  def encode_response_id(_), do: {:error, "Unexpected type when encoding Meta.response_id"}
+
+  def decode_status(value) when is_integer(value), do: value
+  def decode_status(_), do: {:error, "Unexpected type when decoding Meta.status"}
+
+  def encode_status(value) when is_integer(value), do: value
+  def encode_status(_), do: {:error, "Unexpected type when encoding Meta.status"}
+
   def from_map(m) do
     %Meta{
-      msg: m["msg"],
-      response_id: m["response_id"],
-      status: m["status"],
+      msg: decode_msg(m["msg"]),
+      response_id: decode_response_id(m["response_id"]),
+      status: decode_status(m["status"]),
     }
   end
 
@@ -605,11 +821,29 @@ defmodule Pagination do
           total_count: integer()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Pagination.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Pagination.count"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding Pagination.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding Pagination.offset"}
+
+  def decode_total_count(value) when is_integer(value), do: value
+  def decode_total_count(_), do: {:error, "Unexpected type when decoding Pagination.total_count"}
+
+  def encode_total_count(value) when is_integer(value), do: value
+  def encode_total_count(_), do: {:error, "Unexpected type when encoding Pagination.total_count"}
+
   def from_map(m) do
     %Pagination{
-      count: m["count"],
-      offset: m["offset"],
-      total_count: m["total_count"],
+      count: decode_count(m["count"]),
+      offset: decode_offset(m["offset"]),
+      total_count: decode_total_count(m["total_count"]),
     }
   end
 
@@ -644,6 +878,12 @@ defmodule TopLevel do
           pagination: Pagination.t()
         }
 
+  def decode_data(value) when is_list(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data(value) when is_list(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
   def from_map(m) do
     %TopLevel{
       data: Enum.map(m["data"], &Datum.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/76ae1.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/76ae1.json/default/QuickType.ex
index 96ccaba..9aa8f51 100644
--- a/base/elixir/test/inputs/json/misc/76ae1.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/76ae1.json/default/QuickType.ex
@@ -59,9 +59,15 @@ defmodule Property do
           type: FormatEnum.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Property.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Property.description"}
+
   def from_map(m) do
     %Property{
-      description: m["description"],
+      description: decode_description(m["description"]),
       type: FormatEnum.decode(m["type"]),
     }
   end
@@ -551,11 +557,29 @@ defmodule Info do
           version: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Info.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Info.description"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Info.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Info.title"}
+
+  def decode_version(value) when is_binary(value), do: value
+  def decode_version(_), do: {:error, "Unexpected type when decoding Info.version"}
+
+  def encode_version(value) when is_binary(value), do: value
+  def encode_version(_), do: {:error, "Unexpected type when encoding Info.version"}
+
   def from_map(m) do
     %Info{
-      description: m["description"],
-      title: m["title"],
-      version: m["version"],
+      description: decode_description(m["description"]),
+      title: decode_title(m["title"]),
+      version: decode_version(m["version"]),
     }
   end
 
@@ -638,13 +662,31 @@ defmodule Parameter do
           type: FormatEnum.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Parameter.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Parameter.description"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Parameter.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Parameter.name"}
+
+  def decode_required(value) when is_boolean(value), do: value
+  def decode_required(_), do: {:error, "Unexpected type when decoding Parameter.required"}
+
+  def encode_required(value) when is_boolean(value), do: value
+  def encode_required(_), do: {:error, "Unexpected type when encoding Parameter.required"}
+
   def from_map(m) do
     %Parameter{
-      description: m["description"],
+      description: decode_description(m["description"]),
       format: FormatEnum.decode(m["format"]),
-      name: m["name"],
+      name: decode_name(m["name"]),
       parameter_in: InEnum.decode(m["in"]),
-      required: m["required"],
+      required: decode_required(m["required"]),
       type: FormatEnum.decode(m["type"]),
     }
   end
@@ -681,9 +723,15 @@ defmodule ItemsClass do
           ref: String.t()
         }
 
+  def decode_ref(value) when is_binary(value), do: value
+  def decode_ref(_), do: {:error, "Unexpected type when decoding ItemsClass.ref"}
+
+  def encode_ref(value) when is_binary(value), do: value
+  def encode_ref(_), do: {:error, "Unexpected type when encoding ItemsClass.ref"}
+
   def from_map(m) do
     %ItemsClass{
-      ref: m["$ref"],
+      ref: decode_ref(m["$ref"]),
     }
   end
 
@@ -715,9 +763,15 @@ defmodule The200_1 do
           schema: ItemsClass.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding The200_1.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding The200_1.description"}
+
   def from_map(m) do
     %The200_1{
-      description: m["description"],
+      description: decode_description(m["description"]),
       schema: ItemsClass.from_map(m["schema"]),
     }
   end
@@ -787,13 +841,37 @@ defmodule BusinessServiceProvidersSearchGet do
           tags: [String.t()]
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding BusinessServiceProvidersSearchGet.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding BusinessServiceProvidersSearchGet.description"}
+
+  def decode_parameters(value) when is_list(value), do: value
+  def decode_parameters(_), do: {:error, "Unexpected type when decoding BusinessServiceProvidersSearchGet.parameters"}
+
+  def encode_parameters(value) when is_list(value), do: value
+  def encode_parameters(_), do: {:error, "Unexpected type when encoding BusinessServiceProvidersSearchGet.parameters"}
+
+  def decode_summary(value) when is_binary(value), do: value
+  def decode_summary(_), do: {:error, "Unexpected type when decoding BusinessServiceProvidersSearchGet.summary"}
+
+  def encode_summary(value) when is_binary(value), do: value
+  def encode_summary(_), do: {:error, "Unexpected type when encoding BusinessServiceProvidersSearchGet.summary"}
+
+  def decode_tags(value) when is_list(value), do: value
+  def decode_tags(_), do: {:error, "Unexpected type when decoding BusinessServiceProvidersSearchGet.tags"}
+
+  def encode_tags(value) when is_list(value), do: value
+  def encode_tags(_), do: {:error, "Unexpected type when encoding BusinessServiceProvidersSearchGet.tags"}
+
   def from_map(m) do
     %BusinessServiceProvidersSearchGet{
-      description: m["description"],
+      description: decode_description(m["description"]),
       parameters: Enum.map(m["parameters"], &Parameter.from_map/1),
       responses: Responses1.from_map(m["responses"]),
-      summary: m["summary"],
-      tags: m["tags"],
+      summary: decode_summary(m["summary"]),
+      tags: decode_tags(m["tags"]),
     }
   end
 
@@ -943,9 +1021,15 @@ defmodule The200_2 do
           schema: Schema1.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding The200_2.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding The200_2.description"}
+
   def from_map(m) do
     %The200_2{
-      description: m["description"],
+      description: decode_description(m["description"]),
       schema: Schema1.from_map(m["schema"]),
     }
   end
@@ -1015,13 +1099,37 @@ defmodule ConsolidatedScreeningListSearchGet do
           tags: [String.t()]
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding ConsolidatedScreeningListSearchGet.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding ConsolidatedScreeningListSearchGet.description"}
+
+  def decode_parameters(value) when is_list(value), do: value
+  def decode_parameters(_), do: {:error, "Unexpected type when decoding ConsolidatedScreeningListSearchGet.parameters"}
+
+  def encode_parameters(value) when is_list(value), do: value
+  def encode_parameters(_), do: {:error, "Unexpected type when encoding ConsolidatedScreeningListSearchGet.parameters"}
+
+  def decode_summary(value) when is_binary(value), do: value
+  def decode_summary(_), do: {:error, "Unexpected type when decoding ConsolidatedScreeningListSearchGet.summary"}
+
+  def encode_summary(value) when is_binary(value), do: value
+  def encode_summary(_), do: {:error, "Unexpected type when encoding ConsolidatedScreeningListSearchGet.summary"}
+
+  def decode_tags(value) when is_list(value), do: value
+  def decode_tags(_), do: {:error, "Unexpected type when decoding ConsolidatedScreeningListSearchGet.tags"}
+
+  def encode_tags(value) when is_list(value), do: value
+  def encode_tags(_), do: {:error, "Unexpected type when encoding ConsolidatedScreeningListSearchGet.tags"}
+
   def from_map(m) do
     %ConsolidatedScreeningListSearchGet{
-      description: m["description"],
+      description: decode_description(m["description"]),
       parameters: Enum.map(m["parameters"], &Parameter.from_map/1),
       responses: Responses2.from_map(m["responses"]),
-      summary: m["summary"],
-      tags: m["tags"],
+      summary: decode_summary(m["summary"]),
+      tags: decode_tags(m["tags"]),
     }
   end
 
@@ -1165,16 +1273,46 @@ defmodule TopLevel do
           swagger: String.t()
         }
 
+  def decode_base_path(value) when is_binary(value), do: value
+  def decode_base_path(_), do: {:error, "Unexpected type when decoding TopLevel.base_path"}
+
+  def encode_base_path(value) when is_binary(value), do: value
+  def encode_base_path(_), do: {:error, "Unexpected type when encoding TopLevel.base_path"}
+
+  def decode_host(value) when is_binary(value), do: value
+  def decode_host(_), do: {:error, "Unexpected type when decoding TopLevel.host"}
+
+  def encode_host(value) when is_binary(value), do: value
+  def encode_host(_), do: {:error, "Unexpected type when encoding TopLevel.host"}
+
+  def decode_produces(value) when is_list(value), do: value
+  def decode_produces(_), do: {:error, "Unexpected type when decoding TopLevel.produces"}
+
+  def encode_produces(value) when is_list(value), do: value
+  def encode_produces(_), do: {:error, "Unexpected type when encoding TopLevel.produces"}
+
+  def decode_schemes(value) when is_list(value), do: value
+  def decode_schemes(_), do: {:error, "Unexpected type when decoding TopLevel.schemes"}
+
+  def encode_schemes(value) when is_list(value), do: value
+  def encode_schemes(_), do: {:error, "Unexpected type when encoding TopLevel.schemes"}
+
+  def decode_swagger(value) when is_binary(value), do: value
+  def decode_swagger(_), do: {:error, "Unexpected type when decoding TopLevel.swagger"}
+
+  def encode_swagger(value) when is_binary(value), do: value
+  def encode_swagger(_), do: {:error, "Unexpected type when encoding TopLevel.swagger"}
+
   def from_map(m) do
     %TopLevel{
-      base_path: m["basePath"],
+      base_path: decode_base_path(m["basePath"]),
       definitions: Definitions.from_map(m["definitions"]),
-      host: m["host"],
+      host: decode_host(m["host"]),
       info: Info.from_map(m["info"]),
       paths: Paths.from_map(m["paths"]),
-      produces: m["produces"],
-      schemes: m["schemes"],
-      swagger: m["swagger"],
+      produces: decode_produces(m["produces"]),
+      schemes: decode_schemes(m["schemes"]),
+      swagger: decode_swagger(m["swagger"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/77392.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/77392.json/default/QuickType.ex
index 9a9fa15..3d5dfa7 100644
--- a/base/elixir/test/inputs/json/misc/77392.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/77392.json/default/QuickType.ex
@@ -122,17 +122,47 @@ defmodule TopLevelElement do
           q_au_2: String.t() | nil
         }
 
+  def decode_designation(value) when is_binary(value), do: value
+  def decode_designation(_), do: {:error, "Unexpected type when decoding TopLevelElement.designation"}
+
+  def encode_designation(value) when is_binary(value), do: value
+  def encode_designation(_), do: {:error, "Unexpected type when encoding TopLevelElement.designation"}
+
+  def decode_discovery_date(value) when is_binary(value), do: value
+  def decode_discovery_date(_), do: {:error, "Unexpected type when decoding TopLevelElement.discovery_date"}
+
+  def encode_discovery_date(value) when is_binary(value), do: value
+  def encode_discovery_date(_), do: {:error, "Unexpected type when encoding TopLevelElement.discovery_date"}
+
+  def decode_i_deg(value) when is_binary(value), do: value
+  def decode_i_deg(_), do: {:error, "Unexpected type when decoding TopLevelElement.i_deg"}
+
+  def encode_i_deg(value) when is_binary(value), do: value
+  def encode_i_deg(_), do: {:error, "Unexpected type when encoding TopLevelElement.i_deg"}
+
+  def decode_moid_au(value) when is_binary(value), do: value
+  def decode_moid_au(_), do: {:error, "Unexpected type when decoding TopLevelElement.moid_au"}
+
+  def encode_moid_au(value) when is_binary(value), do: value
+  def encode_moid_au(_), do: {:error, "Unexpected type when encoding TopLevelElement.moid_au"}
+
+  def decode_q_au_1(value) when is_binary(value), do: value
+  def decode_q_au_1(_), do: {:error, "Unexpected type when decoding TopLevelElement.q_au_1"}
+
+  def encode_q_au_1(value) when is_binary(value), do: value
+  def encode_q_au_1(_), do: {:error, "Unexpected type when encoding TopLevelElement.q_au_1"}
+
   def from_map(m) do
     %TopLevelElement{
-      designation: m["designation"],
-      discovery_date: m["discovery_date"],
+      designation: decode_designation(m["designation"]),
+      discovery_date: decode_discovery_date(m["discovery_date"]),
       h_mag: m["h_mag"],
-      i_deg: m["i_deg"],
-      moid_au: m["moid_au"],
+      i_deg: decode_i_deg(m["i_deg"]),
+      moid_au: decode_moid_au(m["moid_au"]),
       orbit_class: OrbitClass.decode(m["orbit_class"]),
       period_yr: m["period_yr"],
       pha: Pha.decode(m["pha"]),
-      q_au_1: m["q_au_1"],
+      q_au_1: decode_q_au_1(m["q_au_1"]),
       q_au_2: m["q_au_2"],
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/7d397.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/7d397.json/default/QuickType.ex
index c4c4710..65f1657 100644
--- a/base/elixir/test/inputs/json/misc/7d397.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/7d397.json/default/QuickType.ex
@@ -59,9 +59,15 @@ defmodule Property do
           type: Type.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Property.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Property.description"}
+
   def from_map(m) do
     %Property{
-      description: m["description"],
+      description: decode_description(m["description"]),
       type: Type.decode(m["type"]),
     }
   end
@@ -164,11 +170,29 @@ defmodule Info do
           version: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Info.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Info.description"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Info.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Info.title"}
+
+  def decode_version(value) when is_binary(value), do: value
+  def decode_version(_), do: {:error, "Unexpected type when decoding Info.version"}
+
+  def encode_version(value) when is_binary(value), do: value
+  def encode_version(_), do: {:error, "Unexpected type when encoding Info.version"}
+
   def from_map(m) do
     %Info{
-      description: m["description"],
-      title: m["title"],
-      version: m["version"],
+      description: decode_description(m["description"]),
+      title: decode_title(m["title"]),
+      version: decode_version(m["version"]),
     }
   end
 
@@ -251,13 +275,31 @@ defmodule Parameter do
           type: Type.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Parameter.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Parameter.description"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Parameter.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Parameter.name"}
+
+  def decode_required(value) when is_boolean(value), do: value
+  def decode_required(_), do: {:error, "Unexpected type when decoding Parameter.required"}
+
+  def encode_required(value) when is_boolean(value), do: value
+  def encode_required(_), do: {:error, "Unexpected type when encoding Parameter.required"}
+
   def from_map(m) do
     %Parameter{
-      description: m["description"],
+      description: decode_description(m["description"]),
       format: Type.decode(m["format"]),
-      name: m["name"],
+      name: decode_name(m["name"]),
       parameter_in: InEnum.decode(m["in"]),
-      required: m["required"],
+      required: decode_required(m["required"]),
       type: Type.decode(m["type"]),
     }
   end
@@ -294,9 +336,15 @@ defmodule Items do
           ref: String.t()
         }
 
+  def decode_ref(value) when is_binary(value), do: value
+  def decode_ref(_), do: {:error, "Unexpected type when decoding Items.ref"}
+
+  def encode_ref(value) when is_binary(value), do: value
+  def encode_ref(_), do: {:error, "Unexpected type when encoding Items.ref"}
+
   def from_map(m) do
     %Items{
-      ref: m["$ref"],
+      ref: decode_ref(m["$ref"]),
     }
   end
 
@@ -328,10 +376,16 @@ defmodule Schema do
           type: String.t()
         }
 
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Schema.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Schema.type"}
+
   def from_map(m) do
     %Schema{
       items: Items.from_map(m["items"]),
-      type: m["type"],
+      type: decode_type(m["type"]),
     }
   end
 
@@ -364,9 +418,15 @@ defmodule The200N do
           schema: Schema.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding The200N.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding The200N.description"}
+
   def from_map(m) do
     %The200N{
-      description: m["description"],
+      description: decode_description(m["description"]),
       schema: Schema.from_map(m["schema"]),
     }
   end
@@ -436,13 +496,37 @@ defmodule Get do
           tags: [String.t()]
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Get.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Get.description"}
+
+  def decode_parameters(value) when is_list(value), do: value
+  def decode_parameters(_), do: {:error, "Unexpected type when decoding Get.parameters"}
+
+  def encode_parameters(value) when is_list(value), do: value
+  def encode_parameters(_), do: {:error, "Unexpected type when encoding Get.parameters"}
+
+  def decode_summary(value) when is_binary(value), do: value
+  def decode_summary(_), do: {:error, "Unexpected type when decoding Get.summary"}
+
+  def encode_summary(value) when is_binary(value), do: value
+  def encode_summary(_), do: {:error, "Unexpected type when encoding Get.summary"}
+
+  def decode_tags(value) when is_list(value), do: value
+  def decode_tags(_), do: {:error, "Unexpected type when decoding Get.tags"}
+
+  def encode_tags(value) when is_list(value), do: value
+  def encode_tags(_), do: {:error, "Unexpected type when encoding Get.tags"}
+
   def from_map(m) do
     %Get{
-      description: m["description"],
+      description: decode_description(m["description"]),
       parameters: Enum.map(m["parameters"], &Parameter.from_map/1),
       responses: Responses.from_map(m["responses"]),
-      summary: m["summary"],
-      tags: m["tags"],
+      summary: decode_summary(m["summary"]),
+      tags: decode_tags(m["tags"]),
     }
   end
 
@@ -550,16 +634,46 @@ defmodule TopLevel do
           swagger: String.t()
         }
 
+  def decode_base_path(value) when is_binary(value), do: value
+  def decode_base_path(_), do: {:error, "Unexpected type when decoding TopLevel.base_path"}
+
+  def encode_base_path(value) when is_binary(value), do: value
+  def encode_base_path(_), do: {:error, "Unexpected type when encoding TopLevel.base_path"}
+
+  def decode_host(value) when is_binary(value), do: value
+  def decode_host(_), do: {:error, "Unexpected type when decoding TopLevel.host"}
+
+  def encode_host(value) when is_binary(value), do: value
+  def encode_host(_), do: {:error, "Unexpected type when encoding TopLevel.host"}
+
+  def decode_produces(value) when is_list(value), do: value
+  def decode_produces(_), do: {:error, "Unexpected type when decoding TopLevel.produces"}
+
+  def encode_produces(value) when is_list(value), do: value
+  def encode_produces(_), do: {:error, "Unexpected type when encoding TopLevel.produces"}
+
+  def decode_schemes(value) when is_list(value), do: value
+  def decode_schemes(_), do: {:error, "Unexpected type when decoding TopLevel.schemes"}
+
+  def encode_schemes(value) when is_list(value), do: value
+  def encode_schemes(_), do: {:error, "Unexpected type when encoding TopLevel.schemes"}
+
+  def decode_swagger(value) when is_binary(value), do: value
+  def decode_swagger(_), do: {:error, "Unexpected type when decoding TopLevel.swagger"}
+
+  def encode_swagger(value) when is_binary(value), do: value
+  def encode_swagger(_), do: {:error, "Unexpected type when encoding TopLevel.swagger"}
+
   def from_map(m) do
     %TopLevel{
-      base_path: m["basePath"],
+      base_path: decode_base_path(m["basePath"]),
       definitions: Definitions.from_map(m["definitions"]),
-      host: m["host"],
+      host: decode_host(m["host"]),
       info: Info.from_map(m["info"]),
       paths: Paths.from_map(m["paths"]),
-      produces: m["produces"],
-      schemes: m["schemes"],
-      swagger: m["swagger"],
+      produces: decode_produces(m["produces"]),
+      schemes: decode_schemes(m["schemes"]),
+      swagger: decode_swagger(m["swagger"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/7d722.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/7d722.json/default/QuickType.ex
index b9f86f4..e9a4777 100644
--- a/base/elixir/test/inputs/json/misc/7d722.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/7d722.json/default/QuickType.ex
@@ -21,17 +21,71 @@ defmodule Status do
           type: String.t()
         }
 
+  def decode_avg_delay(value) when is_binary(value), do: value
+  def decode_avg_delay(_), do: {:error, "Unexpected type when decoding Status.avg_delay"}
+
+  def encode_avg_delay(value) when is_binary(value), do: value
+  def encode_avg_delay(_), do: {:error, "Unexpected type when encoding Status.avg_delay"}
+
+  def decode_closure_begin(value) when is_binary(value), do: value
+  def decode_closure_begin(_), do: {:error, "Unexpected type when decoding Status.closure_begin"}
+
+  def encode_closure_begin(value) when is_binary(value), do: value
+  def encode_closure_begin(_), do: {:error, "Unexpected type when encoding Status.closure_begin"}
+
+  def decode_closure_end(value) when is_binary(value), do: value
+  def decode_closure_end(_), do: {:error, "Unexpected type when decoding Status.closure_end"}
+
+  def encode_closure_end(value) when is_binary(value), do: value
+  def encode_closure_end(_), do: {:error, "Unexpected type when encoding Status.closure_end"}
+
+  def decode_end_time(value) when is_binary(value), do: value
+  def decode_end_time(_), do: {:error, "Unexpected type when decoding Status.end_time"}
+
+  def encode_end_time(value) when is_binary(value), do: value
+  def encode_end_time(_), do: {:error, "Unexpected type when encoding Status.end_time"}
+
+  def decode_max_delay(value) when is_binary(value), do: value
+  def decode_max_delay(_), do: {:error, "Unexpected type when decoding Status.max_delay"}
+
+  def encode_max_delay(value) when is_binary(value), do: value
+  def encode_max_delay(_), do: {:error, "Unexpected type when encoding Status.max_delay"}
+
+  def decode_min_delay(value) when is_binary(value), do: value
+  def decode_min_delay(_), do: {:error, "Unexpected type when decoding Status.min_delay"}
+
+  def encode_min_delay(value) when is_binary(value), do: value
+  def encode_min_delay(_), do: {:error, "Unexpected type when encoding Status.min_delay"}
+
+  def decode_reason(value) when is_binary(value), do: value
+  def decode_reason(_), do: {:error, "Unexpected type when decoding Status.reason"}
+
+  def encode_reason(value) when is_binary(value), do: value
+  def encode_reason(_), do: {:error, "Unexpected type when encoding Status.reason"}
+
+  def decode_trend(value) when is_binary(value), do: value
+  def decode_trend(_), do: {:error, "Unexpected type when decoding Status.trend"}
+
+  def encode_trend(value) when is_binary(value), do: value
+  def encode_trend(_), do: {:error, "Unexpected type when encoding Status.trend"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Status.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Status.type"}
+
   def from_map(m) do
     %Status{
-      avg_delay: m["avgDelay"],
-      closure_begin: m["closureBegin"],
-      closure_end: m["closureEnd"],
-      end_time: m["endTime"],
-      max_delay: m["maxDelay"],
-      min_delay: m["minDelay"],
-      reason: m["reason"],
-      trend: m["trend"],
-      type: m["type"],
+      avg_delay: decode_avg_delay(m["avgDelay"]),
+      closure_begin: decode_closure_begin(m["closureBegin"]),
+      closure_end: decode_closure_end(m["closureEnd"]),
+      end_time: decode_end_time(m["endTime"]),
+      max_delay: decode_max_delay(m["maxDelay"]),
+      min_delay: decode_min_delay(m["minDelay"]),
+      reason: decode_reason(m["reason"]),
+      trend: decode_trend(m["trend"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -72,11 +126,29 @@ defmodule Meta do
           url: String.t()
         }
 
+  def decode_credit(value) when is_binary(value), do: value
+  def decode_credit(_), do: {:error, "Unexpected type when decoding Meta.credit"}
+
+  def encode_credit(value) when is_binary(value), do: value
+  def encode_credit(_), do: {:error, "Unexpected type when encoding Meta.credit"}
+
+  def decode_updated(value) when is_binary(value), do: value
+  def decode_updated(_), do: {:error, "Unexpected type when decoding Meta.updated"}
+
+  def encode_updated(value) when is_binary(value), do: value
+  def encode_updated(_), do: {:error, "Unexpected type when encoding Meta.updated"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Meta.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Meta.url"}
+
   def from_map(m) do
     %Meta{
-      credit: m["credit"],
-      updated: m["updated"],
-      url: m["url"],
+      credit: decode_credit(m["credit"]),
+      updated: decode_updated(m["updated"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -113,13 +185,39 @@ defmodule Weather do
           wind: String.t()
         }
 
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Weather.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Weather.temp"}
+
+  def decode_visibility(value) when is_float(value), do: value
+  def decode_visibility(value) when is_integer(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Weather.visibility"}
+
+  def encode_visibility(value) when is_float(value), do: value
+  def encode_visibility(value) when is_integer(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Weather.visibility"}
+
+  def decode_weather(value) when is_binary(value), do: value
+  def decode_weather(_), do: {:error, "Unexpected type when decoding Weather.weather"}
+
+  def encode_weather(value) when is_binary(value), do: value
+  def encode_weather(_), do: {:error, "Unexpected type when encoding Weather.weather"}
+
+  def decode_wind(value) when is_binary(value), do: value
+  def decode_wind(_), do: {:error, "Unexpected type when decoding Weather.wind"}
+
+  def encode_wind(value) when is_binary(value), do: value
+  def encode_wind(_), do: {:error, "Unexpected type when encoding Weather.wind"}
+
   def from_map(m) do
     %Weather{
       meta: Meta.from_map(m["meta"]),
-      temp: m["temp"],
-      visibility: m["visibility"],
-      weather: m["weather"],
-      wind: m["wind"],
+      temp: decode_temp(m["temp"]),
+      visibility: decode_visibility(m["visibility"]),
+      weather: decode_weather(m["weather"]),
+      wind: decode_wind(m["wind"]),
     }
   end
 
@@ -161,14 +259,50 @@ defmodule TopLevel do
           weather: Weather.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding TopLevel.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding TopLevel.city"}
+
+  def decode_delay(value) when is_binary(value), do: value
+  def decode_delay(_), do: {:error, "Unexpected type when decoding TopLevel.delay"}
+
+  def encode_delay(value) when is_binary(value), do: value
+  def encode_delay(_), do: {:error, "Unexpected type when encoding TopLevel.delay"}
+
+  def decode_iata(value) when is_binary(value), do: value
+  def decode_iata(_), do: {:error, "Unexpected type when decoding TopLevel.iata"}
+
+  def encode_iata(value) when is_binary(value), do: value
+  def encode_iata(_), do: {:error, "Unexpected type when encoding TopLevel.iata"}
+
+  def decode_icao(value) when is_binary(value), do: value
+  def decode_icao(_), do: {:error, "Unexpected type when decoding TopLevel.icao"}
+
+  def encode_icao(value) when is_binary(value), do: value
+  def encode_icao(_), do: {:error, "Unexpected type when encoding TopLevel.icao"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding TopLevel.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding TopLevel.state"}
+
   def from_map(m) do
     %TopLevel{
-      city: m["city"],
-      delay: m["delay"],
-      iata: m["IATA"],
-      icao: m["ICAO"],
-      name: m["name"],
-      state: m["state"],
+      city: decode_city(m["city"]),
+      delay: decode_delay(m["delay"]),
+      iata: decode_iata(m["IATA"]),
+      icao: decode_icao(m["ICAO"]),
+      name: decode_name(m["name"]),
+      state: decode_state(m["state"]),
       status: Status.from_map(m["status"]),
       weather: Weather.from_map(m["weather"]),
     }
diff --git a/base/elixir/test/inputs/json/misc/7df41.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/7df41.json/default/QuickType.ex
index c0a8678..d083c09 100644
--- a/base/elixir/test/inputs/json/misc/7df41.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/7df41.json/default/QuickType.ex
@@ -15,11 +15,29 @@ defmodule PC do
           peak24: integer()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding PC.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding PC.count"}
+
+  def decode_label(value) when is_binary(value), do: value
+  def decode_label(_), do: {:error, "Unexpected type when decoding PC.label"}
+
+  def encode_label(value) when is_binary(value), do: value
+  def encode_label(_), do: {:error, "Unexpected type when encoding PC.label"}
+
+  def decode_peak24(value) when is_integer(value), do: value
+  def decode_peak24(_), do: {:error, "Unexpected type when decoding PC.peak24"}
+
+  def encode_peak24(value) when is_integer(value), do: value
+  def encode_peak24(_), do: {:error, "Unexpected type when encoding PC.peak24"}
+
   def from_map(m) do
     %PC{
-      count: m["count"],
-      label: m["label"],
-      peak24: m["peak24"],
+      count: decode_count(m["count"]),
+      label: decode_label(m["label"]),
+      peak24: decode_peak24(m["peak24"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/7dfa6.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/7dfa6.json/default/QuickType.ex
index bf47bf0..b805b08 100644
--- a/base/elixir/test/inputs/json/misc/7dfa6.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/7dfa6.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule TotalPopulation do
           population: integer()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TotalPopulation.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TotalPopulation.date"}
+
+  def decode_population(value) when is_integer(value), do: value
+  def decode_population(_), do: {:error, "Unexpected type when decoding TotalPopulation.population"}
+
+  def encode_population(value) when is_integer(value), do: value
+  def encode_population(_), do: {:error, "Unexpected type when encoding TotalPopulation.population"}
+
   def from_map(m) do
     %TotalPopulation{
-      date: m["date"],
-      population: m["population"],
+      date: decode_date(m["date"]),
+      population: decode_population(m["population"]),
     }
   end
 
@@ -49,6 +61,12 @@ defmodule TopLevel do
           total_population: [TotalPopulation.t()]
         }
 
+  def decode_total_population(value) when is_list(value), do: value
+  def decode_total_population(_), do: {:error, "Unexpected type when decoding TopLevel.total_population"}
+
+  def encode_total_population(value) when is_list(value), do: value
+  def encode_total_population(_), do: {:error, "Unexpected type when encoding TopLevel.total_population"}
+
   def from_map(m) do
     %TopLevel{
       total_population: Enum.map(m["total_population"], &TotalPopulation.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/7eb30.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/7eb30.json/default/QuickType.ex
index 63821e6..2dfda00 100644
--- a/base/elixir/test/inputs/json/misc/7eb30.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/7eb30.json/default/QuickType.ex
@@ -151,12 +151,18 @@ defmodule Group do
           website: String.t()
         }
 
+  def decode_website(value) when is_binary(value), do: value
+  def decode_website(_), do: {:error, "Unexpected type when decoding Group.website"}
+
+  def encode_website(value) when is_binary(value), do: value
+  def encode_website(_), do: {:error, "Unexpected type when encoding Group.website"}
+
   def from_map(m) do
     %Group{
       code: CodeEnum.decode(m["code"]),
       english: English.decode(m["english"]),
       thai: Thai.decode(m["thai"]),
-      website: m["website"],
+      website: decode_website(m["website"]),
     }
   end
 
@@ -295,22 +301,88 @@ defmodule Result do
           website: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Result.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Result.code"}
+
+  def decode_english(value) when is_binary(value), do: value
+  def decode_english(_), do: {:error, "Unexpected type when decoding Result.english"}
+
+  def encode_english(value) when is_binary(value), do: value
+  def encode_english(_), do: {:error, "Unexpected type when encoding Result.english"}
+
+  def decode_fav(value) when is_boolean(value), do: value
+  def decode_fav(_), do: {:error, "Unexpected type when decoding Result.fav"}
+
+  def encode_fav(value) when is_boolean(value), do: value
+  def encode_fav(_), do: {:error, "Unexpected type when encoding Result.fav"}
+
+  def decode_min_screens(value) when is_integer(value), do: value
+  def decode_min_screens(_), do: {:error, "Unexpected type when decoding Result.min_screens"}
+
+  def encode_min_screens(value) when is_integer(value), do: value
+  def encode_min_screens(_), do: {:error, "Unexpected type when encoding Result.min_screens"}
+
+  def decode_num_views(value) when is_integer(value), do: value
+  def decode_num_views(_), do: {:error, "Unexpected type when decoding Result.num_views"}
+
+  def encode_num_views(value) when is_integer(value), do: value
+  def encode_num_views(_), do: {:error, "Unexpected type when encoding Result.num_views"}
+
+  def decode_showtimes(value) when is_binary(value), do: value
+  def decode_showtimes(_), do: {:error, "Unexpected type when decoding Result.showtimes"}
+
+  def encode_showtimes(value) when is_binary(value), do: value
+  def encode_showtimes(_), do: {:error, "Unexpected type when encoding Result.showtimes"}
+
+  def decode_stars(value) when is_integer(value), do: value
+  def decode_stars(_), do: {:error, "Unexpected type when decoding Result.stars"}
+
+  def encode_stars(value) when is_integer(value), do: value
+  def encode_stars(_), do: {:error, "Unexpected type when encoding Result.stars"}
+
+  def decode_thai(value) when is_binary(value), do: value
+  def decode_thai(_), do: {:error, "Unexpected type when decoding Result.thai"}
+
+  def encode_thai(value) when is_binary(value), do: value
+  def encode_thai(_), do: {:error, "Unexpected type when encoding Result.thai"}
+
+  def decode_today_screens(value) when is_integer(value), do: value
+  def decode_today_screens(_), do: {:error, "Unexpected type when decoding Result.today_screens"}
+
+  def encode_today_screens(value) when is_integer(value), do: value
+  def encode_today_screens(_), do: {:error, "Unexpected type when encoding Result.today_screens"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Result.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Result.url"}
+
+  def decode_website(value) when is_binary(value), do: value
+  def decode_website(_), do: {:error, "Unexpected type when decoding Result.website"}
+
+  def encode_website(value) when is_binary(value), do: value
+  def encode_website(_), do: {:error, "Unexpected type when encoding Result.website"}
+
   def from_map(m) do
     %Result{
-      code: m["code"],
-      english: m["english"],
-      fav: m["fav"],
+      code: decode_code(m["code"]),
+      english: decode_english(m["english"]),
+      fav: decode_fav(m["fav"]),
       group: Group.from_map(m["group"]),
       location: Location.decode(m["location"]),
-      min_screens: m["min_screens"],
-      num_views: m["num_views"],
-      showtimes: m["showtimes"],
-      stars: m["stars"],
+      min_screens: decode_min_screens(m["min_screens"]),
+      num_views: decode_num_views(m["num_views"]),
+      showtimes: decode_showtimes(m["showtimes"]),
+      stars: decode_stars(m["stars"]),
       tel: Tel.decode(m["tel"]),
-      thai: m["thai"],
-      today_screens: m["today_screens"],
-      url: m["url"],
-      website: m["website"],
+      thai: decode_thai(m["thai"]),
+      today_screens: decode_today_screens(m["today_screens"]),
+      url: decode_url(m["url"]),
+      website: decode_website(m["website"]),
     }
   end
 
@@ -357,11 +429,35 @@ defmodule TopLevel do
           results: [Result.t()]
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding TopLevel.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding TopLevel.count"}
+
+  def decode_next(value) when is_binary(value), do: value
+  def decode_next(_), do: {:error, "Unexpected type when decoding TopLevel.next"}
+
+  def encode_next(value) when is_binary(value), do: value
+  def encode_next(_), do: {:error, "Unexpected type when encoding TopLevel.next"}
+
+  def decode_previous(value) when is_nil(value), do: value
+  def decode_previous(_), do: {:error, "Unexpected type when decoding TopLevel.previous"}
+
+  def encode_previous(value) when is_nil(value), do: value
+  def encode_previous(_), do: {:error, "Unexpected type when encoding TopLevel.previous"}
+
+  def decode_results(value) when is_list(value), do: value
+  def decode_results(_), do: {:error, "Unexpected type when decoding TopLevel.results"}
+
+  def encode_results(value) when is_list(value), do: value
+  def encode_results(_), do: {:error, "Unexpected type when encoding TopLevel.results"}
+
   def from_map(m) do
     %TopLevel{
-      count: m["count"],
-      next: m["next"],
-      previous: m["previous"],
+      count: decode_count(m["count"]),
+      next: decode_next(m["next"]),
+      previous: decode_previous(m["previous"]),
       results: Enum.map(m["results"], &Result.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/7f568.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/7f568.json/default/QuickType.ex
index 5eeef7c..c998159 100644
--- a/base/elixir/test/inputs/json/misc/7f568.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/7f568.json/default/QuickType.ex
@@ -107,12 +107,30 @@ defmodule FileValue do
           type: Type.t()
         }
 
+  def decode_filename(value) when is_binary(value), do: value
+  def decode_filename(_), do: {:error, "Unexpected type when decoding FileValue.filename"}
+
+  def encode_filename(value) when is_binary(value), do: value
+  def encode_filename(_), do: {:error, "Unexpected type when encoding FileValue.filename"}
+
+  def decode_raw_url(value) when is_binary(value), do: value
+  def decode_raw_url(_), do: {:error, "Unexpected type when decoding FileValue.raw_url"}
+
+  def encode_raw_url(value) when is_binary(value), do: value
+  def encode_raw_url(_), do: {:error, "Unexpected type when encoding FileValue.raw_url"}
+
+  def decode_size(value) when is_integer(value), do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding FileValue.size"}
+
+  def encode_size(value) when is_integer(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding FileValue.size"}
+
   def from_map(m) do
     %FileValue{
-      filename: m["filename"],
+      filename: decode_filename(m["filename"]),
       language: m["language"] && Language.decode(m["language"]),
-      raw_url: m["raw_url"],
-      size: m["size"],
+      raw_url: decode_raw_url(m["raw_url"]),
+      size: decode_size(m["size"]),
       type: Type.decode(m["type"]),
     }
   end
@@ -163,25 +181,109 @@ defmodule TopLevelElement do
           user: nil
         }
 
+  def decode_comments(value) when is_integer(value), do: value
+  def decode_comments(_), do: {:error, "Unexpected type when decoding TopLevelElement.comments"}
+
+  def encode_comments(value) when is_integer(value), do: value
+  def encode_comments(_), do: {:error, "Unexpected type when encoding TopLevelElement.comments"}
+
+  def decode_comments_url(value) when is_binary(value), do: value
+  def decode_comments_url(_), do: {:error, "Unexpected type when decoding TopLevelElement.comments_url"}
+
+  def encode_comments_url(value) when is_binary(value), do: value
+  def encode_comments_url(_), do: {:error, "Unexpected type when encoding TopLevelElement.comments_url"}
+
+  def decode_commits_url(value) when is_binary(value), do: value
+  def decode_commits_url(_), do: {:error, "Unexpected type when decoding TopLevelElement.commits_url"}
+
+  def encode_commits_url(value) when is_binary(value), do: value
+  def encode_commits_url(_), do: {:error, "Unexpected type when encoding TopLevelElement.commits_url"}
+
+  def decode_created_at(value) when is_binary(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding TopLevelElement.created_at"}
+
+  def encode_created_at(value) when is_binary(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding TopLevelElement.created_at"}
+
+  def decode_forks_url(value) when is_binary(value), do: value
+  def decode_forks_url(_), do: {:error, "Unexpected type when decoding TopLevelElement.forks_url"}
+
+  def encode_forks_url(value) when is_binary(value), do: value
+  def encode_forks_url(_), do: {:error, "Unexpected type when encoding TopLevelElement.forks_url"}
+
+  def decode_git_pull_url(value) when is_binary(value), do: value
+  def decode_git_pull_url(_), do: {:error, "Unexpected type when decoding TopLevelElement.git_pull_url"}
+
+  def encode_git_pull_url(value) when is_binary(value), do: value
+  def encode_git_pull_url(_), do: {:error, "Unexpected type when encoding TopLevelElement.git_pull_url"}
+
+  def decode_git_push_url(value) when is_binary(value), do: value
+  def decode_git_push_url(_), do: {:error, "Unexpected type when decoding TopLevelElement.git_push_url"}
+
+  def encode_git_push_url(value) when is_binary(value), do: value
+  def encode_git_push_url(_), do: {:error, "Unexpected type when encoding TopLevelElement.git_push_url"}
+
+  def decode_html_url(value) when is_binary(value), do: value
+  def decode_html_url(_), do: {:error, "Unexpected type when decoding TopLevelElement.html_url"}
+
+  def encode_html_url(value) when is_binary(value), do: value
+  def encode_html_url(_), do: {:error, "Unexpected type when encoding TopLevelElement.html_url"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_public(value) when is_boolean(value), do: value
+  def decode_public(_), do: {:error, "Unexpected type when decoding TopLevelElement.public"}
+
+  def encode_public(value) when is_boolean(value), do: value
+  def encode_public(_), do: {:error, "Unexpected type when encoding TopLevelElement.public"}
+
+  def decode_truncated(value) when is_boolean(value), do: value
+  def decode_truncated(_), do: {:error, "Unexpected type when decoding TopLevelElement.truncated"}
+
+  def encode_truncated(value) when is_boolean(value), do: value
+  def encode_truncated(_), do: {:error, "Unexpected type when encoding TopLevelElement.truncated"}
+
+  def decode_updated_at(value) when is_binary(value), do: value
+  def decode_updated_at(_), do: {:error, "Unexpected type when decoding TopLevelElement.updated_at"}
+
+  def encode_updated_at(value) when is_binary(value), do: value
+  def encode_updated_at(_), do: {:error, "Unexpected type when encoding TopLevelElement.updated_at"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding TopLevelElement.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding TopLevelElement.url"}
+
+  def decode_user(value) when is_nil(value), do: value
+  def decode_user(_), do: {:error, "Unexpected type when decoding TopLevelElement.user"}
+
+  def encode_user(value) when is_nil(value), do: value
+  def encode_user(_), do: {:error, "Unexpected type when encoding TopLevelElement.user"}
+
   def from_map(m) do
     %TopLevelElement{
-      comments: m["comments"],
-      comments_url: m["comments_url"],
-      commits_url: m["commits_url"],
-      created_at: m["created_at"],
+      comments: decode_comments(m["comments"]),
+      comments_url: decode_comments_url(m["comments_url"]),
+      commits_url: decode_commits_url(m["commits_url"]),
+      created_at: decode_created_at(m["created_at"]),
       description: m["description"],
       files: m["files"]
       |> Map.new(fn {key, value} -> {key, FileValue.from_map(value)} end),
-      forks_url: m["forks_url"],
-      git_pull_url: m["git_pull_url"],
-      git_push_url: m["git_push_url"],
-      html_url: m["html_url"],
-      id: m["id"],
-      public: m["public"],
-      truncated: m["truncated"],
-      updated_at: m["updated_at"],
-      url: m["url"],
-      user: m["user"],
+      forks_url: decode_forks_url(m["forks_url"]),
+      git_pull_url: decode_git_pull_url(m["git_pull_url"]),
+      git_push_url: decode_git_push_url(m["git_push_url"]),
+      html_url: decode_html_url(m["html_url"]),
+      id: decode_id(m["id"]),
+      public: decode_public(m["public"]),
+      truncated: decode_truncated(m["truncated"]),
+      updated_at: decode_updated_at(m["updated_at"]),
+      url: decode_url(m["url"]),
+      user: decode_user(m["user"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/7fbfb.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/7fbfb.json/default/QuickType.ex
index 7f7044b..21ec414 100644
--- a/base/elixir/test/inputs/json/misc/7fbfb.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/7fbfb.json/default/QuickType.ex
@@ -145,13 +145,31 @@ defmodule TopLevel1 do
           value: String.t()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel1.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel1.date"}
+
+  def decode_decimal(value) when is_binary(value), do: value
+  def decode_decimal(_), do: {:error, "Unexpected type when decoding TopLevel1.decimal"}
+
+  def encode_decimal(value) when is_binary(value), do: value
+  def encode_decimal(_), do: {:error, "Unexpected type when encoding TopLevel1.decimal"}
+
+  def decode_value(value) when is_binary(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding TopLevel1.value"}
+
+  def encode_value(value) when is_binary(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding TopLevel1.value"}
+
   def from_map(m) do
     %TopLevel1{
       country: Country.from_map(m["country"]),
-      date: m["date"],
-      decimal: m["decimal"],
+      date: decode_date(m["date"]),
+      decimal: decode_decimal(m["decimal"]),
       indicator: Country.from_map(m["indicator"]),
-      value: m["value"],
+      value: decode_value(m["value"]),
     }
   end
 
@@ -189,12 +207,36 @@ defmodule TopLevel2 do
           total: integer()
         }
 
+  def decode_page(value) when is_integer(value), do: value
+  def decode_page(_), do: {:error, "Unexpected type when decoding TopLevel2.page"}
+
+  def encode_page(value) when is_integer(value), do: value
+  def encode_page(_), do: {:error, "Unexpected type when encoding TopLevel2.page"}
+
+  def decode_pages(value) when is_integer(value), do: value
+  def decode_pages(_), do: {:error, "Unexpected type when decoding TopLevel2.pages"}
+
+  def encode_pages(value) when is_integer(value), do: value
+  def encode_pages(_), do: {:error, "Unexpected type when encoding TopLevel2.pages"}
+
+  def decode_per_page(value) when is_binary(value), do: value
+  def decode_per_page(_), do: {:error, "Unexpected type when decoding TopLevel2.per_page"}
+
+  def encode_per_page(value) when is_binary(value), do: value
+  def encode_per_page(_), do: {:error, "Unexpected type when encoding TopLevel2.per_page"}
+
+  def decode_total(value) when is_integer(value), do: value
+  def decode_total(_), do: {:error, "Unexpected type when decoding TopLevel2.total"}
+
+  def encode_total(value) when is_integer(value), do: value
+  def encode_total(_), do: {:error, "Unexpected type when encoding TopLevel2.total"}
+
   def from_map(m) do
     %TopLevel2{
-      page: m["page"],
-      pages: m["pages"],
-      per_page: m["per_page"],
-      total: m["total"],
+      page: decode_page(m["page"]),
+      pages: decode_pages(m["pages"]),
+      per_page: decode_per_page(m["per_page"]),
+      total: decode_total(m["total"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/80aff.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/80aff.json/default/QuickType.ex
index 323580f..0beb749 100644
--- a/base/elixir/test/inputs/json/misc/80aff.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/80aff.json/default/QuickType.ex
@@ -48,15 +48,51 @@ defmodule Result do
           uri: String.t()
         }
 
+  def decode_created_at(value) when is_binary(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding Result.created_at"}
+
+  def encode_created_at(value) when is_binary(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding Result.created_at"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Result.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Result.id"}
+
+  def decode_items(value) when is_integer(value), do: value
+  def decode_items(_), do: {:error, "Unexpected type when decoding Result.items"}
+
+  def encode_items(value) when is_integer(value), do: value
+  def encode_items(_), do: {:error, "Unexpected type when encoding Result.items"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Result.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Result.name"}
+
+  def decode_updated_at(value) when is_binary(value), do: value
+  def decode_updated_at(_), do: {:error, "Unexpected type when decoding Result.updated_at"}
+
+  def encode_updated_at(value) when is_binary(value), do: value
+  def encode_updated_at(_), do: {:error, "Unexpected type when encoding Result.updated_at"}
+
+  def decode_uri(value) when is_binary(value), do: value
+  def decode_uri(_), do: {:error, "Unexpected type when decoding Result.uri"}
+
+  def encode_uri(value) when is_binary(value), do: value
+  def encode_uri(_), do: {:error, "Unexpected type when encoding Result.uri"}
+
   def from_map(m) do
     %Result{
-      created_at: m["created_at"],
-      id: m["id"],
-      items: m["items"],
-      name: m["name"],
+      created_at: decode_created_at(m["created_at"]),
+      id: decode_id(m["id"]),
+      items: decode_items(m["items"]),
+      name: decode_name(m["name"]),
       parent: m["parent"],
-      updated_at: m["updated_at"],
-      uri: m["uri"],
+      updated_at: decode_updated_at(m["updated_at"]),
+      uri: decode_uri(m["uri"]),
     }
   end
 
@@ -99,14 +135,50 @@ defmodule TopLevel do
           results: [Result.t()]
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding TopLevel.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding TopLevel.count"}
+
+  def decode_limit(value) when is_integer(value), do: value
+  def decode_limit(_), do: {:error, "Unexpected type when decoding TopLevel.limit"}
+
+  def encode_limit(value) when is_integer(value), do: value
+  def encode_limit(_), do: {:error, "Unexpected type when encoding TopLevel.limit"}
+
+  def decode_next(value) when is_boolean(value), do: value
+  def decode_next(_), do: {:error, "Unexpected type when decoding TopLevel.next"}
+
+  def encode_next(value) when is_boolean(value), do: value
+  def encode_next(_), do: {:error, "Unexpected type when encoding TopLevel.next"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding TopLevel.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding TopLevel.offset"}
+
+  def decode_previous(value) when is_boolean(value), do: value
+  def decode_previous(_), do: {:error, "Unexpected type when decoding TopLevel.previous"}
+
+  def encode_previous(value) when is_boolean(value), do: value
+  def encode_previous(_), do: {:error, "Unexpected type when encoding TopLevel.previous"}
+
+  def decode_results(value) when is_list(value), do: value
+  def decode_results(_), do: {:error, "Unexpected type when decoding TopLevel.results"}
+
+  def encode_results(value) when is_list(value), do: value
+  def encode_results(_), do: {:error, "Unexpected type when encoding TopLevel.results"}
+
   def from_map(m) do
     %TopLevel{
-      count: m["count"],
+      count: decode_count(m["count"]),
       facets: Facets.from_map(m["facets"]),
-      limit: m["limit"],
-      next: m["next"],
-      offset: m["offset"],
-      previous: m["previous"],
+      limit: decode_limit(m["limit"]),
+      next: decode_next(m["next"]),
+      offset: decode_offset(m["offset"]),
+      previous: decode_previous(m["previous"]),
       results: Enum.map(m["results"], &Result.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/82509.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/82509.json/default/QuickType.ex
index 8e20bca..f44848a 100644
--- a/base/elixir/test/inputs/json/misc/82509.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/82509.json/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule TopLevel do
           origin: String.t()
         }
 
+  def decode_origin(value) when is_binary(value), do: value
+  def decode_origin(_), do: {:error, "Unexpected type when decoding TopLevel.origin"}
+
+  def encode_origin(value) when is_binary(value), do: value
+  def encode_origin(_), do: {:error, "Unexpected type when encoding TopLevel.origin"}
+
   def from_map(m) do
     %TopLevel{
-      origin: m["origin"],
+      origin: decode_origin(m["origin"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/8592b.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/8592b.json/default/QuickType.ex
index 292c413..00fc947 100644
--- a/base/elixir/test/inputs/json/misc/8592b.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/8592b.json/default/QuickType.ex
@@ -89,11 +89,29 @@ defmodule Source do
           width: integer()
         }
 
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Source.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Source.height"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Source.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Source.url"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Source.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Source.width"}
+
   def from_map(m) do
     %Source{
-      height: m["height"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -129,9 +147,21 @@ defmodule Image do
           variants: MediaEmbed.t()
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Image.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Image.id"}
+
+  def decode_resolutions(value) when is_list(value), do: value
+  def decode_resolutions(_), do: {:error, "Unexpected type when decoding Image.resolutions"}
+
+  def encode_resolutions(value) when is_list(value), do: value
+  def encode_resolutions(_), do: {:error, "Unexpected type when encoding Image.resolutions"}
+
   def from_map(m) do
     %Image{
-      id: m["id"],
+      id: decode_id(m["id"]),
       resolutions: Enum.map(m["resolutions"], &Source.from_map/1),
       source: Source.from_map(m["source"]),
       variants: MediaEmbed.from_map(m["variants"]),
@@ -169,9 +199,21 @@ defmodule Preview do
           images: [Image.t()]
         }
 
+  def decode_enabled(value) when is_boolean(value), do: value
+  def decode_enabled(_), do: {:error, "Unexpected type when decoding Preview.enabled"}
+
+  def encode_enabled(value) when is_boolean(value), do: value
+  def encode_enabled(_), do: {:error, "Unexpected type when encoding Preview.enabled"}
+
+  def decode_images(value) when is_list(value), do: value
+  def decode_images(_), do: {:error, "Unexpected type when decoding Preview.images"}
+
+  def encode_images(value) when is_list(value), do: value
+  def encode_images(_), do: {:error, "Unexpected type when encoding Preview.images"}
+
   def from_map(m) do
     %Preview{
-      enabled: m["enabled"],
+      enabled: decode_enabled(m["enabled"]),
       images: Enum.map(m["images"], &Image.from_map/1),
     }
   end
@@ -493,72 +535,376 @@ defmodule ChildData do
           visited: boolean()
         }
 
+  def decode_approved_at_utc(value) when is_nil(value), do: value
+  def decode_approved_at_utc(_), do: {:error, "Unexpected type when decoding ChildData.approved_at_utc"}
+
+  def encode_approved_at_utc(value) when is_nil(value), do: value
+  def encode_approved_at_utc(_), do: {:error, "Unexpected type when encoding ChildData.approved_at_utc"}
+
+  def decode_approved_by(value) when is_nil(value), do: value
+  def decode_approved_by(_), do: {:error, "Unexpected type when decoding ChildData.approved_by"}
+
+  def encode_approved_by(value) when is_nil(value), do: value
+  def encode_approved_by(_), do: {:error, "Unexpected type when encoding ChildData.approved_by"}
+
+  def decode_archived(value) when is_boolean(value), do: value
+  def decode_archived(_), do: {:error, "Unexpected type when decoding ChildData.archived"}
+
+  def encode_archived(value) when is_boolean(value), do: value
+  def encode_archived(_), do: {:error, "Unexpected type when encoding ChildData.archived"}
+
+  def decode_author(value) when is_binary(value), do: value
+  def decode_author(_), do: {:error, "Unexpected type when decoding ChildData.author"}
+
+  def encode_author(value) when is_binary(value), do: value
+  def encode_author(_), do: {:error, "Unexpected type when encoding ChildData.author"}
+
+  def decode_banned_at_utc(value) when is_nil(value), do: value
+  def decode_banned_at_utc(_), do: {:error, "Unexpected type when decoding ChildData.banned_at_utc"}
+
+  def encode_banned_at_utc(value) when is_nil(value), do: value
+  def encode_banned_at_utc(_), do: {:error, "Unexpected type when encoding ChildData.banned_at_utc"}
+
+  def decode_banned_by(value) when is_nil(value), do: value
+  def decode_banned_by(_), do: {:error, "Unexpected type when decoding ChildData.banned_by"}
+
+  def encode_banned_by(value) when is_nil(value), do: value
+  def encode_banned_by(_), do: {:error, "Unexpected type when encoding ChildData.banned_by"}
+
+  def decode_brand_safe(value) when is_boolean(value), do: value
+  def decode_brand_safe(_), do: {:error, "Unexpected type when decoding ChildData.brand_safe"}
+
+  def encode_brand_safe(value) when is_boolean(value), do: value
+  def encode_brand_safe(_), do: {:error, "Unexpected type when encoding ChildData.brand_safe"}
+
+  def decode_can_gild(value) when is_boolean(value), do: value
+  def decode_can_gild(_), do: {:error, "Unexpected type when decoding ChildData.can_gild"}
+
+  def encode_can_gild(value) when is_boolean(value), do: value
+  def encode_can_gild(_), do: {:error, "Unexpected type when encoding ChildData.can_gild"}
+
+  def decode_can_mod_post(value) when is_boolean(value), do: value
+  def decode_can_mod_post(_), do: {:error, "Unexpected type when decoding ChildData.can_mod_post"}
+
+  def encode_can_mod_post(value) when is_boolean(value), do: value
+  def encode_can_mod_post(_), do: {:error, "Unexpected type when encoding ChildData.can_mod_post"}
+
+  def decode_clicked(value) when is_boolean(value), do: value
+  def decode_clicked(_), do: {:error, "Unexpected type when decoding ChildData.clicked"}
+
+  def encode_clicked(value) when is_boolean(value), do: value
+  def encode_clicked(_), do: {:error, "Unexpected type when encoding ChildData.clicked"}
+
+  def decode_contest_mode(value) when is_boolean(value), do: value
+  def decode_contest_mode(_), do: {:error, "Unexpected type when decoding ChildData.contest_mode"}
+
+  def encode_contest_mode(value) when is_boolean(value), do: value
+  def encode_contest_mode(_), do: {:error, "Unexpected type when encoding ChildData.contest_mode"}
+
+  def decode_created(value) when is_float(value), do: value
+  def decode_created(value) when is_integer(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding ChildData.created"}
+
+  def encode_created(value) when is_float(value), do: value
+  def encode_created(value) when is_integer(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding ChildData.created"}
+
+  def decode_created_utc(value) when is_float(value), do: value
+  def decode_created_utc(value) when is_integer(value), do: value
+  def decode_created_utc(_), do: {:error, "Unexpected type when decoding ChildData.created_utc"}
+
+  def encode_created_utc(value) when is_float(value), do: value
+  def encode_created_utc(value) when is_integer(value), do: value
+  def encode_created_utc(_), do: {:error, "Unexpected type when encoding ChildData.created_utc"}
+
+  def decode_distinguished(value) when is_nil(value), do: value
+  def decode_distinguished(_), do: {:error, "Unexpected type when decoding ChildData.distinguished"}
+
+  def encode_distinguished(value) when is_nil(value), do: value
+  def encode_distinguished(_), do: {:error, "Unexpected type when encoding ChildData.distinguished"}
+
+  def decode_domain(value) when is_binary(value), do: value
+  def decode_domain(_), do: {:error, "Unexpected type when decoding ChildData.domain"}
+
+  def encode_domain(value) when is_binary(value), do: value
+  def encode_domain(_), do: {:error, "Unexpected type when encoding ChildData.domain"}
+
+  def decode_downs(value) when is_integer(value), do: value
+  def decode_downs(_), do: {:error, "Unexpected type when decoding ChildData.downs"}
+
+  def encode_downs(value) when is_integer(value), do: value
+  def encode_downs(_), do: {:error, "Unexpected type when encoding ChildData.downs"}
+
+  def decode_edited(value) when is_boolean(value), do: value
+  def decode_edited(_), do: {:error, "Unexpected type when decoding ChildData.edited"}
+
+  def encode_edited(value) when is_boolean(value), do: value
+  def encode_edited(_), do: {:error, "Unexpected type when encoding ChildData.edited"}
+
+  def decode_gilded(value) when is_integer(value), do: value
+  def decode_gilded(_), do: {:error, "Unexpected type when decoding ChildData.gilded"}
+
+  def encode_gilded(value) when is_integer(value), do: value
+  def encode_gilded(_), do: {:error, "Unexpected type when encoding ChildData.gilded"}
+
+  def decode_hidden(value) when is_boolean(value), do: value
+  def decode_hidden(_), do: {:error, "Unexpected type when decoding ChildData.hidden"}
+
+  def encode_hidden(value) when is_boolean(value), do: value
+  def encode_hidden(_), do: {:error, "Unexpected type when encoding ChildData.hidden"}
+
+  def decode_hide_score(value) when is_boolean(value), do: value
+  def decode_hide_score(_), do: {:error, "Unexpected type when decoding ChildData.hide_score"}
+
+  def encode_hide_score(value) when is_boolean(value), do: value
+  def encode_hide_score(_), do: {:error, "Unexpected type when encoding ChildData.hide_score"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding ChildData.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding ChildData.id"}
+
+  def decode_is_self(value) when is_boolean(value), do: value
+  def decode_is_self(_), do: {:error, "Unexpected type when decoding ChildData.is_self"}
+
+  def encode_is_self(value) when is_boolean(value), do: value
+  def encode_is_self(_), do: {:error, "Unexpected type when encoding ChildData.is_self"}
+
+  def decode_is_video(value) when is_boolean(value), do: value
+  def decode_is_video(_), do: {:error, "Unexpected type when decoding ChildData.is_video"}
+
+  def encode_is_video(value) when is_boolean(value), do: value
+  def encode_is_video(_), do: {:error, "Unexpected type when encoding ChildData.is_video"}
+
+  def decode_likes(value) when is_nil(value), do: value
+  def decode_likes(_), do: {:error, "Unexpected type when decoding ChildData.likes"}
+
+  def encode_likes(value) when is_nil(value), do: value
+  def encode_likes(_), do: {:error, "Unexpected type when encoding ChildData.likes"}
+
+  def decode_link_flair_css_class(value) when is_binary(value), do: value
+  def decode_link_flair_css_class(_), do: {:error, "Unexpected type when decoding ChildData.link_flair_css_class"}
+
+  def encode_link_flair_css_class(value) when is_binary(value), do: value
+  def encode_link_flair_css_class(_), do: {:error, "Unexpected type when encoding ChildData.link_flair_css_class"}
+
+  def decode_link_flair_text(value) when is_binary(value), do: value
+  def decode_link_flair_text(_), do: {:error, "Unexpected type when decoding ChildData.link_flair_text"}
+
+  def encode_link_flair_text(value) when is_binary(value), do: value
+  def encode_link_flair_text(_), do: {:error, "Unexpected type when encoding ChildData.link_flair_text"}
+
+  def decode_locked(value) when is_boolean(value), do: value
+  def decode_locked(_), do: {:error, "Unexpected type when decoding ChildData.locked"}
+
+  def encode_locked(value) when is_boolean(value), do: value
+  def encode_locked(_), do: {:error, "Unexpected type when encoding ChildData.locked"}
+
+  def decode_media(value) when is_nil(value), do: value
+  def decode_media(_), do: {:error, "Unexpected type when decoding ChildData.media"}
+
+  def encode_media(value) when is_nil(value), do: value
+  def encode_media(_), do: {:error, "Unexpected type when encoding ChildData.media"}
+
+  def decode_mod_reports(value) when is_list(value), do: value
+  def decode_mod_reports(_), do: {:error, "Unexpected type when decoding ChildData.mod_reports"}
+
+  def encode_mod_reports(value) when is_list(value), do: value
+  def encode_mod_reports(_), do: {:error, "Unexpected type when encoding ChildData.mod_reports"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding ChildData.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding ChildData.name"}
+
+  def decode_num_comments(value) when is_integer(value), do: value
+  def decode_num_comments(_), do: {:error, "Unexpected type when decoding ChildData.num_comments"}
+
+  def encode_num_comments(value) when is_integer(value), do: value
+  def encode_num_comments(_), do: {:error, "Unexpected type when encoding ChildData.num_comments"}
+
+  def decode_num_reports(value) when is_nil(value), do: value
+  def decode_num_reports(_), do: {:error, "Unexpected type when decoding ChildData.num_reports"}
+
+  def encode_num_reports(value) when is_nil(value), do: value
+  def encode_num_reports(_), do: {:error, "Unexpected type when encoding ChildData.num_reports"}
+
+  def decode_over_18(value) when is_boolean(value), do: value
+  def decode_over_18(_), do: {:error, "Unexpected type when decoding ChildData.over_18"}
+
+  def encode_over_18(value) when is_boolean(value), do: value
+  def encode_over_18(_), do: {:error, "Unexpected type when encoding ChildData.over_18"}
+
+  def decode_permalink(value) when is_binary(value), do: value
+  def decode_permalink(_), do: {:error, "Unexpected type when decoding ChildData.permalink"}
+
+  def encode_permalink(value) when is_binary(value), do: value
+  def encode_permalink(_), do: {:error, "Unexpected type when encoding ChildData.permalink"}
+
+  def decode_quarantine(value) when is_boolean(value), do: value
+  def decode_quarantine(_), do: {:error, "Unexpected type when decoding ChildData.quarantine"}
+
+  def encode_quarantine(value) when is_boolean(value), do: value
+  def encode_quarantine(_), do: {:error, "Unexpected type when encoding ChildData.quarantine"}
+
+  def decode_removal_reason(value) when is_nil(value), do: value
+  def decode_removal_reason(_), do: {:error, "Unexpected type when decoding ChildData.removal_reason"}
+
+  def encode_removal_reason(value) when is_nil(value), do: value
+  def encode_removal_reason(_), do: {:error, "Unexpected type when encoding ChildData.removal_reason"}
+
+  def decode_report_reasons(value) when is_nil(value), do: value
+  def decode_report_reasons(_), do: {:error, "Unexpected type when decoding ChildData.report_reasons"}
+
+  def encode_report_reasons(value) when is_nil(value), do: value
+  def encode_report_reasons(_), do: {:error, "Unexpected type when encoding ChildData.report_reasons"}
+
+  def decode_saved(value) when is_boolean(value), do: value
+  def decode_saved(_), do: {:error, "Unexpected type when decoding ChildData.saved"}
+
+  def encode_saved(value) when is_boolean(value), do: value
+  def encode_saved(_), do: {:error, "Unexpected type when encoding ChildData.saved"}
+
+  def decode_score(value) when is_integer(value), do: value
+  def decode_score(_), do: {:error, "Unexpected type when decoding ChildData.score"}
+
+  def encode_score(value) when is_integer(value), do: value
+  def encode_score(_), do: {:error, "Unexpected type when encoding ChildData.score"}
+
+  def decode_secure_media(value) when is_nil(value), do: value
+  def decode_secure_media(_), do: {:error, "Unexpected type when decoding ChildData.secure_media"}
+
+  def encode_secure_media(value) when is_nil(value), do: value
+  def encode_secure_media(_), do: {:error, "Unexpected type when encoding ChildData.secure_media"}
+
+  def decode_selftext(value) when is_binary(value), do: value
+  def decode_selftext(_), do: {:error, "Unexpected type when decoding ChildData.selftext"}
+
+  def encode_selftext(value) when is_binary(value), do: value
+  def encode_selftext(_), do: {:error, "Unexpected type when encoding ChildData.selftext"}
+
+  def decode_spoiler(value) when is_boolean(value), do: value
+  def decode_spoiler(_), do: {:error, "Unexpected type when decoding ChildData.spoiler"}
+
+  def encode_spoiler(value) when is_boolean(value), do: value
+  def encode_spoiler(_), do: {:error, "Unexpected type when encoding ChildData.spoiler"}
+
+  def decode_stickied(value) when is_boolean(value), do: value
+  def decode_stickied(_), do: {:error, "Unexpected type when decoding ChildData.stickied"}
+
+  def encode_stickied(value) when is_boolean(value), do: value
+  def encode_stickied(_), do: {:error, "Unexpected type when encoding ChildData.stickied"}
+
+  def decode_thumbnail(value) when is_binary(value), do: value
+  def decode_thumbnail(_), do: {:error, "Unexpected type when decoding ChildData.thumbnail"}
+
+  def encode_thumbnail(value) when is_binary(value), do: value
+  def encode_thumbnail(_), do: {:error, "Unexpected type when encoding ChildData.thumbnail"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding ChildData.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding ChildData.title"}
+
+  def decode_ups(value) when is_integer(value), do: value
+  def decode_ups(_), do: {:error, "Unexpected type when decoding ChildData.ups"}
+
+  def encode_ups(value) when is_integer(value), do: value
+  def encode_ups(_), do: {:error, "Unexpected type when encoding ChildData.ups"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding ChildData.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding ChildData.url"}
+
+  def decode_user_reports(value) when is_list(value), do: value
+  def decode_user_reports(_), do: {:error, "Unexpected type when decoding ChildData.user_reports"}
+
+  def encode_user_reports(value) when is_list(value), do: value
+  def encode_user_reports(_), do: {:error, "Unexpected type when encoding ChildData.user_reports"}
+
+  def decode_view_count(value) when is_nil(value), do: value
+  def decode_view_count(_), do: {:error, "Unexpected type when decoding ChildData.view_count"}
+
+  def encode_view_count(value) when is_nil(value), do: value
+  def encode_view_count(_), do: {:error, "Unexpected type when encoding ChildData.view_count"}
+
+  def decode_visited(value) when is_boolean(value), do: value
+  def decode_visited(_), do: {:error, "Unexpected type when decoding ChildData.visited"}
+
+  def encode_visited(value) when is_boolean(value), do: value
+  def encode_visited(_), do: {:error, "Unexpected type when encoding ChildData.visited"}
+
   def from_map(m) do
     %ChildData{
-      approved_at_utc: m["approved_at_utc"],
-      approved_by: m["approved_by"],
-      archived: m["archived"],
-      author: m["author"],
+      approved_at_utc: decode_approved_at_utc(m["approved_at_utc"]),
+      approved_by: decode_approved_by(m["approved_by"]),
+      archived: decode_archived(m["archived"]),
+      author: decode_author(m["author"]),
       author_flair_css_class: m["author_flair_css_class"],
       author_flair_text: m["author_flair_text"],
-      banned_at_utc: m["banned_at_utc"],
-      banned_by: m["banned_by"],
-      brand_safe: m["brand_safe"],
-      can_gild: m["can_gild"],
-      can_mod_post: m["can_mod_post"],
-      clicked: m["clicked"],
-      contest_mode: m["contest_mode"],
-      created: m["created"],
-      created_utc: m["created_utc"],
-      distinguished: m["distinguished"],
-      domain: m["domain"],
-      downs: m["downs"],
-      edited: m["edited"],
-      gilded: m["gilded"],
-      hidden: m["hidden"],
-      hide_score: m["hide_score"],
-      id: m["id"],
-      is_self: m["is_self"],
-      is_video: m["is_video"],
-      likes: m["likes"],
-      link_flair_css_class: m["link_flair_css_class"],
-      link_flair_text: m["link_flair_text"],
-      locked: m["locked"],
-      media: m["media"],
+      banned_at_utc: decode_banned_at_utc(m["banned_at_utc"]),
+      banned_by: decode_banned_by(m["banned_by"]),
+      brand_safe: decode_brand_safe(m["brand_safe"]),
+      can_gild: decode_can_gild(m["can_gild"]),
+      can_mod_post: decode_can_mod_post(m["can_mod_post"]),
+      clicked: decode_clicked(m["clicked"]),
+      contest_mode: decode_contest_mode(m["contest_mode"]),
+      created: decode_created(m["created"]),
+      created_utc: decode_created_utc(m["created_utc"]),
+      distinguished: decode_distinguished(m["distinguished"]),
+      domain: decode_domain(m["domain"]),
+      downs: decode_downs(m["downs"]),
+      edited: decode_edited(m["edited"]),
+      gilded: decode_gilded(m["gilded"]),
+      hidden: decode_hidden(m["hidden"]),
+      hide_score: decode_hide_score(m["hide_score"]),
+      id: decode_id(m["id"]),
+      is_self: decode_is_self(m["is_self"]),
+      is_video: decode_is_video(m["is_video"]),
+      likes: decode_likes(m["likes"]),
+      link_flair_css_class: decode_link_flair_css_class(m["link_flair_css_class"]),
+      link_flair_text: decode_link_flair_text(m["link_flair_text"]),
+      locked: decode_locked(m["locked"]),
+      media: decode_media(m["media"]),
       media_embed: MediaEmbed.from_map(m["media_embed"]),
-      mod_reports: m["mod_reports"],
-      name: m["name"],
-      num_comments: m["num_comments"],
-      num_reports: m["num_reports"],
-      over_18: m["over_18"],
-      permalink: m["permalink"],
+      mod_reports: decode_mod_reports(m["mod_reports"]),
+      name: decode_name(m["name"]),
+      num_comments: decode_num_comments(m["num_comments"]),
+      num_reports: decode_num_reports(m["num_reports"]),
+      over_18: decode_over_18(m["over_18"]),
+      permalink: decode_permalink(m["permalink"]),
       post_hint: m["post_hint"] && PostHint.decode(m["post_hint"]),
       preview: m["preview"] && Preview.from_map(m["preview"]),
-      quarantine: m["quarantine"],
-      removal_reason: m["removal_reason"],
-      report_reasons: m["report_reasons"],
-      saved: m["saved"],
-      score: m["score"],
-      secure_media: m["secure_media"],
+      quarantine: decode_quarantine(m["quarantine"]),
+      removal_reason: decode_removal_reason(m["removal_reason"]),
+      report_reasons: decode_report_reasons(m["report_reasons"]),
+      saved: decode_saved(m["saved"]),
+      score: decode_score(m["score"]),
+      secure_media: decode_secure_media(m["secure_media"]),
       secure_media_embed: MediaEmbed.from_map(m["secure_media_embed"]),
-      selftext: m["selftext"],
+      selftext: decode_selftext(m["selftext"]),
       selftext_html: m["selftext_html"],
-      spoiler: m["spoiler"],
-      stickied: m["stickied"],
+      spoiler: decode_spoiler(m["spoiler"]),
+      stickied: decode_stickied(m["stickied"]),
       subreddit: Subreddit.decode(m["subreddit"]),
       subreddit_id: SubredditID.decode(m["subreddit_id"]),
       subreddit_name_prefixed: SubredditNamePrefixed.decode(m["subreddit_name_prefixed"]),
       subreddit_type: SubredditType.decode(m["subreddit_type"]),
       suggested_sort: SuggestedSort.decode(m["suggested_sort"]),
-      thumbnail: m["thumbnail"],
+      thumbnail: decode_thumbnail(m["thumbnail"]),
       thumbnail_height: m["thumbnail_height"],
       thumbnail_width: m["thumbnail_width"],
-      title: m["title"],
-      ups: m["ups"],
-      url: m["url"],
-      user_reports: m["user_reports"],
-      view_count: m["view_count"],
-      visited: m["visited"],
+      title: decode_title(m["title"]),
+      ups: decode_ups(m["ups"]),
+      url: decode_url(m["url"]),
+      user_reports: decode_user_reports(m["user_reports"]),
+      view_count: decode_view_count(m["view_count"]),
+      visited: decode_visited(m["visited"]),
     }
   end
 
@@ -736,12 +1082,36 @@ defmodule TopLevelData do
           modhash: String.t()
         }
 
+  def decode_before(value) when is_nil(value), do: value
+  def decode_before(_), do: {:error, "Unexpected type when decoding TopLevelData.before"}
+
+  def encode_before(value) when is_nil(value), do: value
+  def encode_before(_), do: {:error, "Unexpected type when encoding TopLevelData.before"}
+
+  def decode_children(value) when is_list(value), do: value
+  def decode_children(_), do: {:error, "Unexpected type when decoding TopLevelData.children"}
+
+  def encode_children(value) when is_list(value), do: value
+  def encode_children(_), do: {:error, "Unexpected type when encoding TopLevelData.children"}
+
+  def decode_data_after(value) when is_binary(value), do: value
+  def decode_data_after(_), do: {:error, "Unexpected type when decoding TopLevelData.data_after"}
+
+  def encode_data_after(value) when is_binary(value), do: value
+  def encode_data_after(_), do: {:error, "Unexpected type when encoding TopLevelData.data_after"}
+
+  def decode_modhash(value) when is_binary(value), do: value
+  def decode_modhash(_), do: {:error, "Unexpected type when decoding TopLevelData.modhash"}
+
+  def encode_modhash(value) when is_binary(value), do: value
+  def encode_modhash(_), do: {:error, "Unexpected type when encoding TopLevelData.modhash"}
+
   def from_map(m) do
     %TopLevelData{
-      before: m["before"],
+      before: decode_before(m["before"]),
       children: Enum.map(m["children"], &Child.from_map/1),
-      data_after: m["after"],
-      modhash: m["modhash"],
+      data_after: decode_data_after(m["after"]),
+      modhash: decode_modhash(m["modhash"]),
     }
   end
 
@@ -776,10 +1146,16 @@ defmodule TopLevel do
           kind: String.t()
         }
 
+  def decode_kind(value) when is_binary(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding TopLevel.kind"}
+
+  def encode_kind(value) when is_binary(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding TopLevel.kind"}
+
   def from_map(m) do
     %TopLevel{
       data: TopLevelData.from_map(m["data"]),
-      kind: m["kind"],
+      kind: decode_kind(m["kind"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/88130.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/88130.json/default/QuickType.ex
index ee06b77..98852a1 100644
--- a/base/elixir/test/inputs/json/misc/88130.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/88130.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Astronomy do
           sunset: String.t()
         }
 
+  def decode_sunrise(value) when is_binary(value), do: value
+  def decode_sunrise(_), do: {:error, "Unexpected type when decoding Astronomy.sunrise"}
+
+  def encode_sunrise(value) when is_binary(value), do: value
+  def encode_sunrise(_), do: {:error, "Unexpected type when encoding Astronomy.sunrise"}
+
+  def decode_sunset(value) when is_binary(value), do: value
+  def decode_sunset(_), do: {:error, "Unexpected type when decoding Astronomy.sunset"}
+
+  def encode_sunset(value) when is_binary(value), do: value
+  def encode_sunset(_), do: {:error, "Unexpected type when encoding Astronomy.sunset"}
+
   def from_map(m) do
     %Astronomy{
-      sunrise: m["sunrise"],
-      sunset: m["sunset"],
+      sunrise: decode_sunrise(m["sunrise"]),
+      sunset: decode_sunset(m["sunset"]),
     }
   end
 
@@ -52,12 +64,36 @@ defmodule Atmosphere do
           visibility: String.t()
         }
 
+  def decode_humidity(value) when is_binary(value), do: value
+  def decode_humidity(_), do: {:error, "Unexpected type when decoding Atmosphere.humidity"}
+
+  def encode_humidity(value) when is_binary(value), do: value
+  def encode_humidity(_), do: {:error, "Unexpected type when encoding Atmosphere.humidity"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Atmosphere.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Atmosphere.pressure"}
+
+  def decode_rising(value) when is_binary(value), do: value
+  def decode_rising(_), do: {:error, "Unexpected type when decoding Atmosphere.rising"}
+
+  def encode_rising(value) when is_binary(value), do: value
+  def encode_rising(_), do: {:error, "Unexpected type when encoding Atmosphere.rising"}
+
+  def decode_visibility(value) when is_binary(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Atmosphere.visibility"}
+
+  def encode_visibility(value) when is_binary(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Atmosphere.visibility"}
+
   def from_map(m) do
     %Atmosphere{
-      humidity: m["humidity"],
-      pressure: m["pressure"],
-      rising: m["rising"],
-      visibility: m["visibility"],
+      humidity: decode_humidity(m["humidity"]),
+      pressure: decode_pressure(m["pressure"]),
+      rising: decode_rising(m["rising"]),
+      visibility: decode_visibility(m["visibility"]),
     }
   end
 
@@ -95,13 +131,43 @@ defmodule Image do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Image.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Image.height"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Image.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Image.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Image.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Image.title"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Image.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Image.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Image.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Image.width"}
+
   def from_map(m) do
     %Image{
-      height: m["height"],
-      link: m["link"],
-      title: m["title"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      link: decode_link(m["link"]),
+      title: decode_title(m["title"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -139,12 +205,36 @@ defmodule Condition do
           text: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Condition.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Condition.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Condition.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Condition.date"}
+
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Condition.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Condition.temp"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Condition.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Condition.text"}
+
   def from_map(m) do
     %Condition{
-      code: m["code"],
-      date: m["date"],
-      temp: m["temp"],
-      text: m["text"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      temp: decode_temp(m["temp"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -183,14 +273,50 @@ defmodule Forecast do
           text: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Forecast.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Forecast.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Forecast.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Forecast.date"}
+
+  def decode_day(value) when is_binary(value), do: value
+  def decode_day(_), do: {:error, "Unexpected type when decoding Forecast.day"}
+
+  def encode_day(value) when is_binary(value), do: value
+  def encode_day(_), do: {:error, "Unexpected type when encoding Forecast.day"}
+
+  def decode_high(value) when is_binary(value), do: value
+  def decode_high(_), do: {:error, "Unexpected type when decoding Forecast.high"}
+
+  def encode_high(value) when is_binary(value), do: value
+  def encode_high(_), do: {:error, "Unexpected type when encoding Forecast.high"}
+
+  def decode_low(value) when is_binary(value), do: value
+  def decode_low(_), do: {:error, "Unexpected type when decoding Forecast.low"}
+
+  def encode_low(value) when is_binary(value), do: value
+  def encode_low(_), do: {:error, "Unexpected type when encoding Forecast.low"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Forecast.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Forecast.text"}
+
   def from_map(m) do
     %Forecast{
-      code: m["code"],
-      date: m["date"],
-      day: m["day"],
-      high: m["high"],
-      low: m["low"],
-      text: m["text"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      day: decode_day(m["day"]),
+      high: decode_high(m["high"]),
+      low: decode_low(m["low"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -226,9 +352,15 @@ defmodule GUID do
           is_perma_link: String.t()
         }
 
+  def decode_is_perma_link(value) when is_binary(value), do: value
+  def decode_is_perma_link(_), do: {:error, "Unexpected type when decoding GUID.is_perma_link"}
+
+  def encode_is_perma_link(value) when is_binary(value), do: value
+  def encode_is_perma_link(_), do: {:error, "Unexpected type when encoding GUID.is_perma_link"}
+
   def from_map(m) do
     %GUID{
-      is_perma_link: m["isPermaLink"],
+      is_perma_link: decode_is_perma_link(m["isPermaLink"]),
     }
   end
 
@@ -267,17 +399,59 @@ defmodule Item do
           title: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Item.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Item.description"}
+
+  def decode_forecast(value) when is_list(value), do: value
+  def decode_forecast(_), do: {:error, "Unexpected type when decoding Item.forecast"}
+
+  def encode_forecast(value) when is_list(value), do: value
+  def encode_forecast(_), do: {:error, "Unexpected type when encoding Item.forecast"}
+
+  def decode_lat(value) when is_binary(value), do: value
+  def decode_lat(_), do: {:error, "Unexpected type when decoding Item.lat"}
+
+  def encode_lat(value) when is_binary(value), do: value
+  def encode_lat(_), do: {:error, "Unexpected type when encoding Item.lat"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Item.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Item.link"}
+
+  def decode_long(value) when is_binary(value), do: value
+  def decode_long(_), do: {:error, "Unexpected type when decoding Item.long"}
+
+  def encode_long(value) when is_binary(value), do: value
+  def encode_long(_), do: {:error, "Unexpected type when encoding Item.long"}
+
+  def decode_pub_date(value) when is_binary(value), do: value
+  def decode_pub_date(_), do: {:error, "Unexpected type when decoding Item.pub_date"}
+
+  def encode_pub_date(value) when is_binary(value), do: value
+  def encode_pub_date(_), do: {:error, "Unexpected type when encoding Item.pub_date"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Item.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Item.title"}
+
   def from_map(m) do
     %Item{
       condition: Condition.from_map(m["condition"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       forecast: Enum.map(m["forecast"], &Forecast.from_map/1),
       guid: GUID.from_map(m["guid"]),
-      lat: m["lat"],
-      link: m["link"],
-      long: m["long"],
-      pub_date: m["pubDate"],
-      title: m["title"],
+      lat: decode_lat(m["lat"]),
+      link: decode_link(m["link"]),
+      long: decode_long(m["long"]),
+      pub_date: decode_pub_date(m["pubDate"]),
+      title: decode_title(m["title"]),
     }
   end
 
@@ -318,11 +492,29 @@ defmodule Location do
           region: String.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding Location.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding Location.city"}
+
+  def decode_country(value) when is_binary(value), do: value
+  def decode_country(_), do: {:error, "Unexpected type when decoding Location.country"}
+
+  def encode_country(value) when is_binary(value), do: value
+  def encode_country(_), do: {:error, "Unexpected type when encoding Location.country"}
+
+  def decode_region(value) when is_binary(value), do: value
+  def decode_region(_), do: {:error, "Unexpected type when decoding Location.region"}
+
+  def encode_region(value) when is_binary(value), do: value
+  def encode_region(_), do: {:error, "Unexpected type when encoding Location.region"}
+
   def from_map(m) do
     %Location{
-      city: m["city"],
-      country: m["country"],
-      region: m["region"],
+      city: decode_city(m["city"]),
+      country: decode_country(m["country"]),
+      region: decode_region(m["region"]),
     }
   end
 
@@ -358,12 +550,36 @@ defmodule Units do
           temperature: String.t()
         }
 
+  def decode_distance(value) when is_binary(value), do: value
+  def decode_distance(_), do: {:error, "Unexpected type when decoding Units.distance"}
+
+  def encode_distance(value) when is_binary(value), do: value
+  def encode_distance(_), do: {:error, "Unexpected type when encoding Units.distance"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Units.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Units.pressure"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Units.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Units.speed"}
+
+  def decode_temperature(value) when is_binary(value), do: value
+  def decode_temperature(_), do: {:error, "Unexpected type when decoding Units.temperature"}
+
+  def encode_temperature(value) when is_binary(value), do: value
+  def encode_temperature(_), do: {:error, "Unexpected type when encoding Units.temperature"}
+
   def from_map(m) do
     %Units{
-      distance: m["distance"],
-      pressure: m["pressure"],
-      speed: m["speed"],
-      temperature: m["temperature"],
+      distance: decode_distance(m["distance"]),
+      pressure: decode_pressure(m["pressure"]),
+      speed: decode_speed(m["speed"]),
+      temperature: decode_temperature(m["temperature"]),
     }
   end
 
@@ -399,11 +615,29 @@ defmodule Wind do
           speed: String.t()
         }
 
+  def decode_chill(value) when is_binary(value), do: value
+  def decode_chill(_), do: {:error, "Unexpected type when decoding Wind.chill"}
+
+  def encode_chill(value) when is_binary(value), do: value
+  def encode_chill(_), do: {:error, "Unexpected type when encoding Wind.chill"}
+
+  def decode_direction(value) when is_binary(value), do: value
+  def decode_direction(_), do: {:error, "Unexpected type when decoding Wind.direction"}
+
+  def encode_direction(value) when is_binary(value), do: value
+  def encode_direction(_), do: {:error, "Unexpected type when encoding Wind.direction"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Wind.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Wind.speed"}
+
   def from_map(m) do
     %Wind{
-      chill: m["chill"],
-      direction: m["direction"],
-      speed: m["speed"],
+      chill: decode_chill(m["chill"]),
+      direction: decode_direction(m["direction"]),
+      speed: decode_speed(m["speed"]),
     }
   end
 
@@ -448,19 +682,55 @@ defmodule Channel do
           wind: Wind.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Channel.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Channel.description"}
+
+  def decode_language(value) when is_binary(value), do: value
+  def decode_language(_), do: {:error, "Unexpected type when decoding Channel.language"}
+
+  def encode_language(value) when is_binary(value), do: value
+  def encode_language(_), do: {:error, "Unexpected type when encoding Channel.language"}
+
+  def decode_last_build_date(value) when is_binary(value), do: value
+  def decode_last_build_date(_), do: {:error, "Unexpected type when decoding Channel.last_build_date"}
+
+  def encode_last_build_date(value) when is_binary(value), do: value
+  def encode_last_build_date(_), do: {:error, "Unexpected type when encoding Channel.last_build_date"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Channel.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Channel.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Channel.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Channel.title"}
+
+  def decode_ttl(value) when is_binary(value), do: value
+  def decode_ttl(_), do: {:error, "Unexpected type when decoding Channel.ttl"}
+
+  def encode_ttl(value) when is_binary(value), do: value
+  def encode_ttl(_), do: {:error, "Unexpected type when encoding Channel.ttl"}
+
   def from_map(m) do
     %Channel{
       astronomy: Astronomy.from_map(m["astronomy"]),
       atmosphere: Atmosphere.from_map(m["atmosphere"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       image: Image.from_map(m["image"]),
       item: Item.from_map(m["item"]),
-      language: m["language"],
-      last_build_date: m["lastBuildDate"],
-      link: m["link"],
+      language: decode_language(m["language"]),
+      last_build_date: decode_last_build_date(m["lastBuildDate"]),
+      link: decode_link(m["link"]),
       location: Location.from_map(m["location"]),
-      title: m["title"],
-      ttl: m["ttl"],
+      title: decode_title(m["title"]),
+      ttl: decode_ttl(m["ttl"]),
       units: Units.from_map(m["units"]),
       wind: Wind.from_map(m["wind"]),
     }
@@ -541,11 +811,29 @@ defmodule Query do
           results: Results.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Query.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Query.count"}
+
+  def decode_created(value) when is_binary(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding Query.created"}
+
+  def encode_created(value) when is_binary(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding Query.created"}
+
+  def decode_lang(value) when is_binary(value), do: value
+  def decode_lang(_), do: {:error, "Unexpected type when decoding Query.lang"}
+
+  def encode_lang(value) when is_binary(value), do: value
+  def encode_lang(_), do: {:error, "Unexpected type when encoding Query.lang"}
+
   def from_map(m) do
     %Query{
-      count: m["count"],
-      created: m["created"],
-      lang: m["lang"],
+      count: decode_count(m["count"]),
+      created: decode_created(m["created"]),
+      lang: decode_lang(m["lang"]),
       results: Results.from_map(m["results"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/8a62c.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/8a62c.json/default/QuickType.ex
index bf47bf0..b805b08 100644
--- a/base/elixir/test/inputs/json/misc/8a62c.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/8a62c.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule TotalPopulation do
           population: integer()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TotalPopulation.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TotalPopulation.date"}
+
+  def decode_population(value) when is_integer(value), do: value
+  def decode_population(_), do: {:error, "Unexpected type when decoding TotalPopulation.population"}
+
+  def encode_population(value) when is_integer(value), do: value
+  def encode_population(_), do: {:error, "Unexpected type when encoding TotalPopulation.population"}
+
   def from_map(m) do
     %TotalPopulation{
-      date: m["date"],
-      population: m["population"],
+      date: decode_date(m["date"]),
+      population: decode_population(m["population"]),
     }
   end
 
@@ -49,6 +61,12 @@ defmodule TopLevel do
           total_population: [TotalPopulation.t()]
         }
 
+  def decode_total_population(value) when is_list(value), do: value
+  def decode_total_population(_), do: {:error, "Unexpected type when decoding TopLevel.total_population"}
+
+  def encode_total_population(value) when is_list(value), do: value
+  def encode_total_population(_), do: {:error, "Unexpected type when encoding TopLevel.total_population"}
+
   def from_map(m) do
     %TopLevel{
       total_population: Enum.map(m["total_population"], &TotalPopulation.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/908db.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/908db.json/default/QuickType.ex
index bc4e17b..9d93a75 100644
--- a/base/elixir/test/inputs/json/misc/908db.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/908db.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule StateState do
           state_name: String.t()
         }
 
+  def decode_state_id(value) when is_binary(value), do: value
+  def decode_state_id(_), do: {:error, "Unexpected type when decoding StateState.state_id"}
+
+  def encode_state_id(value) when is_binary(value), do: value
+  def encode_state_id(_), do: {:error, "Unexpected type when encoding StateState.state_id"}
+
+  def decode_state_name(value) when is_binary(value), do: value
+  def decode_state_name(_), do: {:error, "Unexpected type when decoding StateState.state_name"}
+
+  def encode_state_name(value) when is_binary(value), do: value
+  def encode_state_name(_), do: {:error, "Unexpected type when encoding StateState.state_name"}
+
   def from_map(m) do
     %StateState{
-      state_id: m["state_id"],
-      state_name: m["state_name"],
+      state_id: decode_state_id(m["state_id"]),
+      state_name: decode_state_name(m["state_name"]),
     }
   end
 
@@ -82,6 +94,12 @@ defmodule TopLevel do
           states: [StateElement.t()]
         }
 
+  def decode_states(value) when is_list(value), do: value
+  def decode_states(_), do: {:error, "Unexpected type when decoding TopLevel.states"}
+
+  def encode_states(value) when is_list(value), do: value
+  def encode_states(_), do: {:error, "Unexpected type when encoding TopLevel.states"}
+
   def from_map(m) do
     %TopLevel{
       states: Enum.map(m["states"], &StateElement.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/9617f.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/9617f.json/default/QuickType.ex
index 8937606..db497b1 100644
--- a/base/elixir/test/inputs/json/misc/9617f.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/9617f.json/default/QuickType.ex
@@ -15,11 +15,32 @@ defmodule TopLevel do
           rates: %{String.t() => float()}
         }
 
+  def decode_base(value) when is_binary(value), do: value
+  def decode_base(_), do: {:error, "Unexpected type when decoding TopLevel.base"}
+
+  def encode_base(value) when is_binary(value), do: value
+  def encode_base(_), do: {:error, "Unexpected type when encoding TopLevel.base"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel.date"}
+
+  def decode_rates_value(value) when is_float(value), do: value
+  def decode_rates_value(value) when is_integer(value), do: value
+  def decode_rates_value(_), do: {:error, "Unexpected type when decoding TopLevel.rates"}
+
+  def encode_rates_value(value) when is_float(value), do: value
+  def encode_rates_value(value) when is_integer(value), do: value
+  def encode_rates_value(_), do: {:error, "Unexpected type when encoding TopLevel.rates"}
+
   def from_map(m) do
     %TopLevel{
-      base: m["base"],
-      date: m["date"],
-      rates: m["rates"],
+      base: decode_base(m["base"]),
+      date: decode_date(m["date"]),
+      rates: m["rates"]
+      |> Map.new(fn {key, value} -> {key, decode_rates_value(value)} end),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/96f7c.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/96f7c.json/default/QuickType.ex
index 66eef23..fb03702 100644
--- a/base/elixir/test/inputs/json/misc/96f7c.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/96f7c.json/default/QuickType.ex
@@ -18,14 +18,50 @@ defmodule TopLevel do
           verifiable_password_authentication: boolean()
         }
 
+  def decode_git(value) when is_list(value), do: value
+  def decode_git(_), do: {:error, "Unexpected type when decoding TopLevel.git"}
+
+  def encode_git(value) when is_list(value), do: value
+  def encode_git(_), do: {:error, "Unexpected type when encoding TopLevel.git"}
+
+  def decode_github_services_sha(value) when is_binary(value), do: value
+  def decode_github_services_sha(_), do: {:error, "Unexpected type when decoding TopLevel.github_services_sha"}
+
+  def encode_github_services_sha(value) when is_binary(value), do: value
+  def encode_github_services_sha(_), do: {:error, "Unexpected type when encoding TopLevel.github_services_sha"}
+
+  def decode_hooks(value) when is_list(value), do: value
+  def decode_hooks(_), do: {:error, "Unexpected type when decoding TopLevel.hooks"}
+
+  def encode_hooks(value) when is_list(value), do: value
+  def encode_hooks(_), do: {:error, "Unexpected type when encoding TopLevel.hooks"}
+
+  def decode_importer(value) when is_list(value), do: value
+  def decode_importer(_), do: {:error, "Unexpected type when decoding TopLevel.importer"}
+
+  def encode_importer(value) when is_list(value), do: value
+  def encode_importer(_), do: {:error, "Unexpected type when encoding TopLevel.importer"}
+
+  def decode_pages(value) when is_list(value), do: value
+  def decode_pages(_), do: {:error, "Unexpected type when decoding TopLevel.pages"}
+
+  def encode_pages(value) when is_list(value), do: value
+  def encode_pages(_), do: {:error, "Unexpected type when encoding TopLevel.pages"}
+
+  def decode_verifiable_password_authentication(value) when is_boolean(value), do: value
+  def decode_verifiable_password_authentication(_), do: {:error, "Unexpected type when decoding TopLevel.verifiable_password_authentication"}
+
+  def encode_verifiable_password_authentication(value) when is_boolean(value), do: value
+  def encode_verifiable_password_authentication(_), do: {:error, "Unexpected type when encoding TopLevel.verifiable_password_authentication"}
+
   def from_map(m) do
     %TopLevel{
-      git: m["git"],
-      github_services_sha: m["github_services_sha"],
-      hooks: m["hooks"],
-      importer: m["importer"],
-      pages: m["pages"],
-      verifiable_password_authentication: m["verifiable_password_authentication"],
+      git: decode_git(m["git"]),
+      github_services_sha: decode_github_services_sha(m["github_services_sha"]),
+      hooks: decode_hooks(m["hooks"]),
+      importer: decode_importer(m["importer"]),
+      pages: decode_pages(m["pages"]),
+      verifiable_password_authentication: decode_verifiable_password_authentication(m["verifiable_password_authentication"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/9847b.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/9847b.json/default/QuickType.ex
index 1b22fd2..c51be35 100644
--- a/base/elixir/test/inputs/json/misc/9847b.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/9847b.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule TopLevelElement do
           name: String.t()
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.name"}
+
   def from_map(m) do
     %TopLevelElement{
-      id: m["id"],
-      name: m["name"],
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/9929c.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/9929c.json/default/QuickType.ex
index ee06b77..98852a1 100644
--- a/base/elixir/test/inputs/json/misc/9929c.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/9929c.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Astronomy do
           sunset: String.t()
         }
 
+  def decode_sunrise(value) when is_binary(value), do: value
+  def decode_sunrise(_), do: {:error, "Unexpected type when decoding Astronomy.sunrise"}
+
+  def encode_sunrise(value) when is_binary(value), do: value
+  def encode_sunrise(_), do: {:error, "Unexpected type when encoding Astronomy.sunrise"}
+
+  def decode_sunset(value) when is_binary(value), do: value
+  def decode_sunset(_), do: {:error, "Unexpected type when decoding Astronomy.sunset"}
+
+  def encode_sunset(value) when is_binary(value), do: value
+  def encode_sunset(_), do: {:error, "Unexpected type when encoding Astronomy.sunset"}
+
   def from_map(m) do
     %Astronomy{
-      sunrise: m["sunrise"],
-      sunset: m["sunset"],
+      sunrise: decode_sunrise(m["sunrise"]),
+      sunset: decode_sunset(m["sunset"]),
     }
   end
 
@@ -52,12 +64,36 @@ defmodule Atmosphere do
           visibility: String.t()
         }
 
+  def decode_humidity(value) when is_binary(value), do: value
+  def decode_humidity(_), do: {:error, "Unexpected type when decoding Atmosphere.humidity"}
+
+  def encode_humidity(value) when is_binary(value), do: value
+  def encode_humidity(_), do: {:error, "Unexpected type when encoding Atmosphere.humidity"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Atmosphere.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Atmosphere.pressure"}
+
+  def decode_rising(value) when is_binary(value), do: value
+  def decode_rising(_), do: {:error, "Unexpected type when decoding Atmosphere.rising"}
+
+  def encode_rising(value) when is_binary(value), do: value
+  def encode_rising(_), do: {:error, "Unexpected type when encoding Atmosphere.rising"}
+
+  def decode_visibility(value) when is_binary(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Atmosphere.visibility"}
+
+  def encode_visibility(value) when is_binary(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Atmosphere.visibility"}
+
   def from_map(m) do
     %Atmosphere{
-      humidity: m["humidity"],
-      pressure: m["pressure"],
-      rising: m["rising"],
-      visibility: m["visibility"],
+      humidity: decode_humidity(m["humidity"]),
+      pressure: decode_pressure(m["pressure"]),
+      rising: decode_rising(m["rising"]),
+      visibility: decode_visibility(m["visibility"]),
     }
   end
 
@@ -95,13 +131,43 @@ defmodule Image do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Image.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Image.height"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Image.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Image.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Image.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Image.title"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Image.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Image.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Image.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Image.width"}
+
   def from_map(m) do
     %Image{
-      height: m["height"],
-      link: m["link"],
-      title: m["title"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      link: decode_link(m["link"]),
+      title: decode_title(m["title"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -139,12 +205,36 @@ defmodule Condition do
           text: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Condition.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Condition.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Condition.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Condition.date"}
+
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Condition.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Condition.temp"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Condition.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Condition.text"}
+
   def from_map(m) do
     %Condition{
-      code: m["code"],
-      date: m["date"],
-      temp: m["temp"],
-      text: m["text"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      temp: decode_temp(m["temp"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -183,14 +273,50 @@ defmodule Forecast do
           text: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Forecast.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Forecast.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Forecast.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Forecast.date"}
+
+  def decode_day(value) when is_binary(value), do: value
+  def decode_day(_), do: {:error, "Unexpected type when decoding Forecast.day"}
+
+  def encode_day(value) when is_binary(value), do: value
+  def encode_day(_), do: {:error, "Unexpected type when encoding Forecast.day"}
+
+  def decode_high(value) when is_binary(value), do: value
+  def decode_high(_), do: {:error, "Unexpected type when decoding Forecast.high"}
+
+  def encode_high(value) when is_binary(value), do: value
+  def encode_high(_), do: {:error, "Unexpected type when encoding Forecast.high"}
+
+  def decode_low(value) when is_binary(value), do: value
+  def decode_low(_), do: {:error, "Unexpected type when decoding Forecast.low"}
+
+  def encode_low(value) when is_binary(value), do: value
+  def encode_low(_), do: {:error, "Unexpected type when encoding Forecast.low"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Forecast.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Forecast.text"}
+
   def from_map(m) do
     %Forecast{
-      code: m["code"],
-      date: m["date"],
-      day: m["day"],
-      high: m["high"],
-      low: m["low"],
-      text: m["text"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      day: decode_day(m["day"]),
+      high: decode_high(m["high"]),
+      low: decode_low(m["low"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -226,9 +352,15 @@ defmodule GUID do
           is_perma_link: String.t()
         }
 
+  def decode_is_perma_link(value) when is_binary(value), do: value
+  def decode_is_perma_link(_), do: {:error, "Unexpected type when decoding GUID.is_perma_link"}
+
+  def encode_is_perma_link(value) when is_binary(value), do: value
+  def encode_is_perma_link(_), do: {:error, "Unexpected type when encoding GUID.is_perma_link"}
+
   def from_map(m) do
     %GUID{
-      is_perma_link: m["isPermaLink"],
+      is_perma_link: decode_is_perma_link(m["isPermaLink"]),
     }
   end
 
@@ -267,17 +399,59 @@ defmodule Item do
           title: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Item.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Item.description"}
+
+  def decode_forecast(value) when is_list(value), do: value
+  def decode_forecast(_), do: {:error, "Unexpected type when decoding Item.forecast"}
+
+  def encode_forecast(value) when is_list(value), do: value
+  def encode_forecast(_), do: {:error, "Unexpected type when encoding Item.forecast"}
+
+  def decode_lat(value) when is_binary(value), do: value
+  def decode_lat(_), do: {:error, "Unexpected type when decoding Item.lat"}
+
+  def encode_lat(value) when is_binary(value), do: value
+  def encode_lat(_), do: {:error, "Unexpected type when encoding Item.lat"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Item.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Item.link"}
+
+  def decode_long(value) when is_binary(value), do: value
+  def decode_long(_), do: {:error, "Unexpected type when decoding Item.long"}
+
+  def encode_long(value) when is_binary(value), do: value
+  def encode_long(_), do: {:error, "Unexpected type when encoding Item.long"}
+
+  def decode_pub_date(value) when is_binary(value), do: value
+  def decode_pub_date(_), do: {:error, "Unexpected type when decoding Item.pub_date"}
+
+  def encode_pub_date(value) when is_binary(value), do: value
+  def encode_pub_date(_), do: {:error, "Unexpected type when encoding Item.pub_date"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Item.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Item.title"}
+
   def from_map(m) do
     %Item{
       condition: Condition.from_map(m["condition"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       forecast: Enum.map(m["forecast"], &Forecast.from_map/1),
       guid: GUID.from_map(m["guid"]),
-      lat: m["lat"],
-      link: m["link"],
-      long: m["long"],
-      pub_date: m["pubDate"],
-      title: m["title"],
+      lat: decode_lat(m["lat"]),
+      link: decode_link(m["link"]),
+      long: decode_long(m["long"]),
+      pub_date: decode_pub_date(m["pubDate"]),
+      title: decode_title(m["title"]),
     }
   end
 
@@ -318,11 +492,29 @@ defmodule Location do
           region: String.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding Location.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding Location.city"}
+
+  def decode_country(value) when is_binary(value), do: value
+  def decode_country(_), do: {:error, "Unexpected type when decoding Location.country"}
+
+  def encode_country(value) when is_binary(value), do: value
+  def encode_country(_), do: {:error, "Unexpected type when encoding Location.country"}
+
+  def decode_region(value) when is_binary(value), do: value
+  def decode_region(_), do: {:error, "Unexpected type when decoding Location.region"}
+
+  def encode_region(value) when is_binary(value), do: value
+  def encode_region(_), do: {:error, "Unexpected type when encoding Location.region"}
+
   def from_map(m) do
     %Location{
-      city: m["city"],
-      country: m["country"],
-      region: m["region"],
+      city: decode_city(m["city"]),
+      country: decode_country(m["country"]),
+      region: decode_region(m["region"]),
     }
   end
 
@@ -358,12 +550,36 @@ defmodule Units do
           temperature: String.t()
         }
 
+  def decode_distance(value) when is_binary(value), do: value
+  def decode_distance(_), do: {:error, "Unexpected type when decoding Units.distance"}
+
+  def encode_distance(value) when is_binary(value), do: value
+  def encode_distance(_), do: {:error, "Unexpected type when encoding Units.distance"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Units.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Units.pressure"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Units.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Units.speed"}
+
+  def decode_temperature(value) when is_binary(value), do: value
+  def decode_temperature(_), do: {:error, "Unexpected type when decoding Units.temperature"}
+
+  def encode_temperature(value) when is_binary(value), do: value
+  def encode_temperature(_), do: {:error, "Unexpected type when encoding Units.temperature"}
+
   def from_map(m) do
     %Units{
-      distance: m["distance"],
-      pressure: m["pressure"],
-      speed: m["speed"],
-      temperature: m["temperature"],
+      distance: decode_distance(m["distance"]),
+      pressure: decode_pressure(m["pressure"]),
+      speed: decode_speed(m["speed"]),
+      temperature: decode_temperature(m["temperature"]),
     }
   end
 
@@ -399,11 +615,29 @@ defmodule Wind do
           speed: String.t()
         }
 
+  def decode_chill(value) when is_binary(value), do: value
+  def decode_chill(_), do: {:error, "Unexpected type when decoding Wind.chill"}
+
+  def encode_chill(value) when is_binary(value), do: value
+  def encode_chill(_), do: {:error, "Unexpected type when encoding Wind.chill"}
+
+  def decode_direction(value) when is_binary(value), do: value
+  def decode_direction(_), do: {:error, "Unexpected type when decoding Wind.direction"}
+
+  def encode_direction(value) when is_binary(value), do: value
+  def encode_direction(_), do: {:error, "Unexpected type when encoding Wind.direction"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Wind.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Wind.speed"}
+
   def from_map(m) do
     %Wind{
-      chill: m["chill"],
-      direction: m["direction"],
-      speed: m["speed"],
+      chill: decode_chill(m["chill"]),
+      direction: decode_direction(m["direction"]),
+      speed: decode_speed(m["speed"]),
     }
   end
 
@@ -448,19 +682,55 @@ defmodule Channel do
           wind: Wind.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Channel.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Channel.description"}
+
+  def decode_language(value) when is_binary(value), do: value
+  def decode_language(_), do: {:error, "Unexpected type when decoding Channel.language"}
+
+  def encode_language(value) when is_binary(value), do: value
+  def encode_language(_), do: {:error, "Unexpected type when encoding Channel.language"}
+
+  def decode_last_build_date(value) when is_binary(value), do: value
+  def decode_last_build_date(_), do: {:error, "Unexpected type when decoding Channel.last_build_date"}
+
+  def encode_last_build_date(value) when is_binary(value), do: value
+  def encode_last_build_date(_), do: {:error, "Unexpected type when encoding Channel.last_build_date"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Channel.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Channel.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Channel.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Channel.title"}
+
+  def decode_ttl(value) when is_binary(value), do: value
+  def decode_ttl(_), do: {:error, "Unexpected type when decoding Channel.ttl"}
+
+  def encode_ttl(value) when is_binary(value), do: value
+  def encode_ttl(_), do: {:error, "Unexpected type when encoding Channel.ttl"}
+
   def from_map(m) do
     %Channel{
       astronomy: Astronomy.from_map(m["astronomy"]),
       atmosphere: Atmosphere.from_map(m["atmosphere"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       image: Image.from_map(m["image"]),
       item: Item.from_map(m["item"]),
-      language: m["language"],
-      last_build_date: m["lastBuildDate"],
-      link: m["link"],
+      language: decode_language(m["language"]),
+      last_build_date: decode_last_build_date(m["lastBuildDate"]),
+      link: decode_link(m["link"]),
       location: Location.from_map(m["location"]),
-      title: m["title"],
-      ttl: m["ttl"],
+      title: decode_title(m["title"]),
+      ttl: decode_ttl(m["ttl"]),
       units: Units.from_map(m["units"]),
       wind: Wind.from_map(m["wind"]),
     }
@@ -541,11 +811,29 @@ defmodule Query do
           results: Results.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Query.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Query.count"}
+
+  def decode_created(value) when is_binary(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding Query.created"}
+
+  def encode_created(value) when is_binary(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding Query.created"}
+
+  def decode_lang(value) when is_binary(value), do: value
+  def decode_lang(_), do: {:error, "Unexpected type when decoding Query.lang"}
+
+  def encode_lang(value) when is_binary(value), do: value
+  def encode_lang(_), do: {:error, "Unexpected type when encoding Query.lang"}
+
   def from_map(m) do
     %Query{
-      count: m["count"],
-      created: m["created"],
-      lang: m["lang"],
+      count: decode_count(m["count"]),
+      created: decode_created(m["created"]),
+      lang: decode_lang(m["lang"]),
       results: Results.from_map(m["results"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/996bd.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/996bd.json/default/QuickType.ex
index 3690a16..65a2285 100644
--- a/base/elixir/test/inputs/json/misc/996bd.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/996bd.json/default/QuickType.ex
@@ -61,9 +61,15 @@ defmodule Identifier do
           scheme: Scheme.t()
         }
 
+  def decode_identifier(value) when is_binary(value), do: value
+  def decode_identifier(_), do: {:error, "Unexpected type when decoding Identifier.identifier"}
+
+  def encode_identifier(value) when is_binary(value), do: value
+  def encode_identifier(_), do: {:error, "Unexpected type when encoding Identifier.identifier"}
+
   def from_map(m) do
     %Identifier{
-      identifier: m["identifier"],
+      identifier: decode_identifier(m["identifier"]),
       scheme: Scheme.decode(m["scheme"]),
     }
   end
@@ -145,10 +151,22 @@ defmodule Link do
           url: String.t()
         }
 
+  def decode_note(value) when is_binary(value), do: value
+  def decode_note(_), do: {:error, "Unexpected type when decoding Link.note"}
+
+  def encode_note(value) when is_binary(value), do: value
+  def encode_note(_), do: {:error, "Unexpected type when encoding Link.note"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Link.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Link.url"}
+
   def from_map(m) do
     %Link{
-      note: m["note"],
-      url: m["url"],
+      note: decode_note(m["note"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -274,11 +292,17 @@ defmodule Text do
           url: String.t()
         }
 
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Text.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Text.url"}
+
   def from_map(m) do
     %Text{
       media_type: MediaType.decode(m["media_type"]),
       title: Title.decode(m["title"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
     }
   end
 
@@ -318,14 +342,56 @@ defmodule TopLevelElement do
           text: [Text.t()]
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_identifiers(value) when is_list(value), do: value
+  def decode_identifiers(_), do: {:error, "Unexpected type when decoding TopLevelElement.identifiers"}
+
+  def encode_identifiers(value) when is_list(value), do: value
+  def encode_identifiers(_), do: {:error, "Unexpected type when encoding TopLevelElement.identifiers"}
+
+  def decode_keywords(value) when is_list(value), do: value
+  def decode_keywords(_), do: {:error, "Unexpected type when decoding TopLevelElement.keywords"}
+
+  def encode_keywords(value) when is_list(value), do: value
+  def encode_keywords(_), do: {:error, "Unexpected type when encoding TopLevelElement.keywords"}
+
+  def decode_links(value) when is_list(value), do: value
+  def decode_links(_), do: {:error, "Unexpected type when decoding TopLevelElement.links"}
+
+  def encode_links(value) when is_list(value), do: value
+  def encode_links(_), do: {:error, "Unexpected type when encoding TopLevelElement.links"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.name"}
+
+  def decode_other_names(value) when is_list(value), do: value
+  def decode_other_names(_), do: {:error, "Unexpected type when decoding TopLevelElement.other_names"}
+
+  def encode_other_names(value) when is_list(value), do: value
+  def encode_other_names(_), do: {:error, "Unexpected type when encoding TopLevelElement.other_names"}
+
+  def decode_text(value) when is_list(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding TopLevelElement.text"}
+
+  def encode_text(value) when is_list(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding TopLevelElement.text"}
+
   def from_map(m) do
     %TopLevelElement{
-      id: m["id"],
+      id: decode_id(m["id"]),
       identifiers: Enum.map(m["identifiers"], &Identifier.from_map/1),
       keywords: Enum.map(m["keywords"], &KeywordElement.decode/1),
       links: Enum.map(m["links"], &Link.from_map/1),
-      name: m["name"],
-      other_names: m["other_names"],
+      name: decode_name(m["name"]),
+      other_names: decode_other_names(m["other_names"]),
       superseded_by: m["superseded_by"],
       text: Enum.map(m["text"], &Text.from_map/1),
     }
diff --git a/base/elixir/test/inputs/json/misc/9a503.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/9a503.json/default/QuickType.ex
index 0b6e445..ef979ea 100644
--- a/base/elixir/test/inputs/json/misc/9a503.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/9a503.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Identifier do
           scheme: String.t()
         }
 
+  def decode_identifier(value) when is_binary(value), do: value
+  def decode_identifier(_), do: {:error, "Unexpected type when decoding Identifier.identifier"}
+
+  def encode_identifier(value) when is_binary(value), do: value
+  def encode_identifier(_), do: {:error, "Unexpected type when encoding Identifier.identifier"}
+
+  def decode_scheme(value) when is_binary(value), do: value
+  def decode_scheme(_), do: {:error, "Unexpected type when decoding Identifier.scheme"}
+
+  def encode_scheme(value) when is_binary(value), do: value
+  def encode_scheme(_), do: {:error, "Unexpected type when encoding Identifier.scheme"}
+
   def from_map(m) do
     %Identifier{
-      identifier: m["identifier"],
-      scheme: m["scheme"],
+      identifier: decode_identifier(m["identifier"]),
+      scheme: decode_scheme(m["scheme"]),
     }
   end
 
@@ -97,10 +109,22 @@ defmodule Link do
           url: String.t()
         }
 
+  def decode_note(value) when is_binary(value), do: value
+  def decode_note(_), do: {:error, "Unexpected type when decoding Link.note"}
+
+  def encode_note(value) when is_binary(value), do: value
+  def encode_note(_), do: {:error, "Unexpected type when encoding Link.note"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Link.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Link.url"}
+
   def from_map(m) do
     %Link{
-      note: m["note"],
-      url: m["url"],
+      note: decode_note(m["note"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -134,11 +158,29 @@ defmodule Text do
           url: String.t()
         }
 
+  def decode_media_type(value) when is_binary(value), do: value
+  def decode_media_type(_), do: {:error, "Unexpected type when decoding Text.media_type"}
+
+  def encode_media_type(value) when is_binary(value), do: value
+  def encode_media_type(_), do: {:error, "Unexpected type when encoding Text.media_type"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Text.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Text.title"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Text.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Text.url"}
+
   def from_map(m) do
     %Text{
-      media_type: m["media_type"],
-      title: m["title"],
-      url: m["url"],
+      media_type: decode_media_type(m["media_type"]),
+      title: decode_title(m["title"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -178,15 +220,63 @@ defmodule TopLevelElement do
           text: [Text.t()]
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_identifiers(value) when is_list(value), do: value
+  def decode_identifiers(_), do: {:error, "Unexpected type when decoding TopLevelElement.identifiers"}
+
+  def encode_identifiers(value) when is_list(value), do: value
+  def encode_identifiers(_), do: {:error, "Unexpected type when encoding TopLevelElement.identifiers"}
+
+  def decode_keywords(value) when is_list(value), do: value
+  def decode_keywords(_), do: {:error, "Unexpected type when decoding TopLevelElement.keywords"}
+
+  def encode_keywords(value) when is_list(value), do: value
+  def encode_keywords(_), do: {:error, "Unexpected type when encoding TopLevelElement.keywords"}
+
+  def decode_links(value) when is_list(value), do: value
+  def decode_links(_), do: {:error, "Unexpected type when decoding TopLevelElement.links"}
+
+  def encode_links(value) when is_list(value), do: value
+  def encode_links(_), do: {:error, "Unexpected type when encoding TopLevelElement.links"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.name"}
+
+  def decode_other_names(value) when is_list(value), do: value
+  def decode_other_names(_), do: {:error, "Unexpected type when decoding TopLevelElement.other_names"}
+
+  def encode_other_names(value) when is_list(value), do: value
+  def encode_other_names(_), do: {:error, "Unexpected type when encoding TopLevelElement.other_names"}
+
+  def decode_superseded_by(value) when is_nil(value), do: value
+  def decode_superseded_by(_), do: {:error, "Unexpected type when decoding TopLevelElement.superseded_by"}
+
+  def encode_superseded_by(value) when is_nil(value), do: value
+  def encode_superseded_by(_), do: {:error, "Unexpected type when encoding TopLevelElement.superseded_by"}
+
+  def decode_text(value) when is_list(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding TopLevelElement.text"}
+
+  def encode_text(value) when is_list(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding TopLevelElement.text"}
+
   def from_map(m) do
     %TopLevelElement{
-      id: m["id"],
+      id: decode_id(m["id"]),
       identifiers: Enum.map(m["identifiers"], &Identifier.from_map/1),
       keywords: Enum.map(m["keywords"], &KeywordElement.decode/1),
       links: Enum.map(m["links"], &Link.from_map/1),
-      name: m["name"],
-      other_names: m["other_names"],
-      superseded_by: m["superseded_by"],
+      name: decode_name(m["name"]),
+      other_names: decode_other_names(m["other_names"]),
+      superseded_by: decode_superseded_by(m["superseded_by"]),
       text: Enum.map(m["text"], &Text.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/9ac3b.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/9ac3b.json/default/QuickType.ex
index a9040b4..6aa6c9f 100644
--- a/base/elixir/test/inputs/json/misc/9ac3b.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/9ac3b.json/default/QuickType.ex
@@ -144,19 +144,67 @@ defmodule Result do
           uri: String.t()
         }
 
+  def decode_created_at(value) when is_binary(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding Result.created_at"}
+
+  def encode_created_at(value) when is_binary(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding Result.created_at"}
+
+  def decode_entity(value) when is_binary(value), do: value
+  def decode_entity(_), do: {:error, "Unexpected type when decoding Result.entity"}
+
+  def encode_entity(value) when is_binary(value), do: value
+  def encode_entity(_), do: {:error, "Unexpected type when encoding Result.entity"}
+
+  def decode_first_name(value) when is_binary(value), do: value
+  def decode_first_name(_), do: {:error, "Unexpected type when decoding Result.first_name"}
+
+  def encode_first_name(value) when is_binary(value), do: value
+  def encode_first_name(_), do: {:error, "Unexpected type when encoding Result.first_name"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Result.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Result.id"}
+
+  def decode_last_name(value) when is_binary(value), do: value
+  def decode_last_name(_), do: {:error, "Unexpected type when decoding Result.last_name"}
+
+  def encode_last_name(value) when is_binary(value), do: value
+  def encode_last_name(_), do: {:error, "Unexpected type when encoding Result.last_name"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Result.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Result.name"}
+
+  def decode_updated_at(value) when is_binary(value), do: value
+  def decode_updated_at(_), do: {:error, "Unexpected type when decoding Result.updated_at"}
+
+  def encode_updated_at(value) when is_binary(value), do: value
+  def encode_updated_at(_), do: {:error, "Unexpected type when encoding Result.updated_at"}
+
+  def decode_uri(value) when is_binary(value), do: value
+  def decode_uri(_), do: {:error, "Unexpected type when decoding Result.uri"}
+
+  def encode_uri(value) when is_binary(value), do: value
+  def encode_uri(_), do: {:error, "Unexpected type when encoding Result.uri"}
+
   def from_map(m) do
     %Result{
-      created_at: m["created_at"],
-      entity: m["entity"],
-      first_name: m["first_name"],
-      id: m["id"],
-      last_name: m["last_name"],
-      name: m["name"],
+      created_at: decode_created_at(m["created_at"]),
+      entity: decode_entity(m["entity"]),
+      first_name: decode_first_name(m["first_name"]),
+      id: decode_id(m["id"]),
+      last_name: decode_last_name(m["last_name"]),
+      name: decode_name(m["name"]),
       position: m["position"],
       status: Status.decode(m["status"]),
       title: m["title"] && Title.decode(m["title"]),
-      updated_at: m["updated_at"],
-      uri: m["uri"],
+      updated_at: decode_updated_at(m["updated_at"]),
+      uri: decode_uri(m["uri"]),
     }
   end
 
@@ -203,14 +251,50 @@ defmodule TopLevel do
           results: [Result.t()]
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding TopLevel.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding TopLevel.count"}
+
+  def decode_limit(value) when is_integer(value), do: value
+  def decode_limit(_), do: {:error, "Unexpected type when decoding TopLevel.limit"}
+
+  def encode_limit(value) when is_integer(value), do: value
+  def encode_limit(_), do: {:error, "Unexpected type when encoding TopLevel.limit"}
+
+  def decode_next(value) when is_binary(value), do: value
+  def decode_next(_), do: {:error, "Unexpected type when decoding TopLevel.next"}
+
+  def encode_next(value) when is_binary(value), do: value
+  def encode_next(_), do: {:error, "Unexpected type when encoding TopLevel.next"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding TopLevel.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding TopLevel.offset"}
+
+  def decode_previous(value) when is_boolean(value), do: value
+  def decode_previous(_), do: {:error, "Unexpected type when decoding TopLevel.previous"}
+
+  def encode_previous(value) when is_boolean(value), do: value
+  def encode_previous(_), do: {:error, "Unexpected type when encoding TopLevel.previous"}
+
+  def decode_results(value) when is_list(value), do: value
+  def decode_results(_), do: {:error, "Unexpected type when decoding TopLevel.results"}
+
+  def encode_results(value) when is_list(value), do: value
+  def encode_results(_), do: {:error, "Unexpected type when encoding TopLevel.results"}
+
   def from_map(m) do
     %TopLevel{
-      count: m["count"],
+      count: decode_count(m["count"]),
       facets: Facets.from_map(m["facets"]),
-      limit: m["limit"],
-      next: m["next"],
-      offset: m["offset"],
-      previous: m["previous"],
+      limit: decode_limit(m["limit"]),
+      next: decode_next(m["next"]),
+      offset: decode_offset(m["offset"]),
+      previous: decode_previous(m["previous"]),
       results: Enum.map(m["results"], &Result.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/9eed5.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/9eed5.json/default/QuickType.ex
index f789345..d329058 100644
--- a/base/elixir/test/inputs/json/misc/9eed5.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/9eed5.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Identifier do
           scheme: String.t()
         }
 
+  def decode_identifier(value) when is_binary(value), do: value
+  def decode_identifier(_), do: {:error, "Unexpected type when decoding Identifier.identifier"}
+
+  def encode_identifier(value) when is_binary(value), do: value
+  def encode_identifier(_), do: {:error, "Unexpected type when encoding Identifier.identifier"}
+
+  def decode_scheme(value) when is_binary(value), do: value
+  def decode_scheme(_), do: {:error, "Unexpected type when decoding Identifier.scheme"}
+
+  def encode_scheme(value) when is_binary(value), do: value
+  def encode_scheme(_), do: {:error, "Unexpected type when encoding Identifier.scheme"}
+
   def from_map(m) do
     %Identifier{
-      identifier: m["identifier"],
-      scheme: m["scheme"],
+      identifier: decode_identifier(m["identifier"]),
+      scheme: decode_scheme(m["scheme"]),
     }
   end
 
@@ -96,10 +108,22 @@ defmodule Link do
           url: String.t()
         }
 
+  def decode_note(value) when is_binary(value), do: value
+  def decode_note(_), do: {:error, "Unexpected type when decoding Link.note"}
+
+  def encode_note(value) when is_binary(value), do: value
+  def encode_note(_), do: {:error, "Unexpected type when encoding Link.note"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Link.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Link.url"}
+
   def from_map(m) do
     %Link{
-      note: m["note"],
-      url: m["url"],
+      note: decode_note(m["note"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -133,11 +157,29 @@ defmodule Text do
           url: String.t()
         }
 
+  def decode_media_type(value) when is_binary(value), do: value
+  def decode_media_type(_), do: {:error, "Unexpected type when decoding Text.media_type"}
+
+  def encode_media_type(value) when is_binary(value), do: value
+  def encode_media_type(_), do: {:error, "Unexpected type when encoding Text.media_type"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Text.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Text.title"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Text.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Text.url"}
+
   def from_map(m) do
     %Text{
-      media_type: m["media_type"],
-      title: m["title"],
-      url: m["url"],
+      media_type: decode_media_type(m["media_type"]),
+      title: decode_title(m["title"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -177,15 +219,63 @@ defmodule TopLevelElement do
           text: [Text.t()]
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_identifiers(value) when is_list(value), do: value
+  def decode_identifiers(_), do: {:error, "Unexpected type when decoding TopLevelElement.identifiers"}
+
+  def encode_identifiers(value) when is_list(value), do: value
+  def encode_identifiers(_), do: {:error, "Unexpected type when encoding TopLevelElement.identifiers"}
+
+  def decode_keywords(value) when is_list(value), do: value
+  def decode_keywords(_), do: {:error, "Unexpected type when decoding TopLevelElement.keywords"}
+
+  def encode_keywords(value) when is_list(value), do: value
+  def encode_keywords(_), do: {:error, "Unexpected type when encoding TopLevelElement.keywords"}
+
+  def decode_links(value) when is_list(value), do: value
+  def decode_links(_), do: {:error, "Unexpected type when decoding TopLevelElement.links"}
+
+  def encode_links(value) when is_list(value), do: value
+  def encode_links(_), do: {:error, "Unexpected type when encoding TopLevelElement.links"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.name"}
+
+  def decode_other_names(value) when is_list(value), do: value
+  def decode_other_names(_), do: {:error, "Unexpected type when decoding TopLevelElement.other_names"}
+
+  def encode_other_names(value) when is_list(value), do: value
+  def encode_other_names(_), do: {:error, "Unexpected type when encoding TopLevelElement.other_names"}
+
+  def decode_superseded_by(value) when is_nil(value), do: value
+  def decode_superseded_by(_), do: {:error, "Unexpected type when decoding TopLevelElement.superseded_by"}
+
+  def encode_superseded_by(value) when is_nil(value), do: value
+  def encode_superseded_by(_), do: {:error, "Unexpected type when encoding TopLevelElement.superseded_by"}
+
+  def decode_text(value) when is_list(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding TopLevelElement.text"}
+
+  def encode_text(value) when is_list(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding TopLevelElement.text"}
+
   def from_map(m) do
     %TopLevelElement{
-      id: m["id"],
+      id: decode_id(m["id"]),
       identifiers: Enum.map(m["identifiers"], &Identifier.from_map/1),
       keywords: Enum.map(m["keywords"], &KeywordElement.decode/1),
       links: Enum.map(m["links"], &Link.from_map/1),
-      name: m["name"],
-      other_names: m["other_names"],
-      superseded_by: m["superseded_by"],
+      name: decode_name(m["name"]),
+      other_names: decode_other_names(m["other_names"]),
+      superseded_by: decode_superseded_by(m["superseded_by"]),
       text: Enum.map(m["text"], &Text.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/a0496.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/a0496.json/default/QuickType.ex
index e940590..6c10070 100644
--- a/base/elixir/test/inputs/json/misc/a0496.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/a0496.json/default/QuickType.ex
@@ -58,25 +58,121 @@ defmodule TopLevel do
           urlize_name: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding TopLevel.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding TopLevel.code"}
+
+  def decode_column_names(value) when is_list(value), do: value
+  def decode_column_names(_), do: {:error, "Unexpected type when decoding TopLevel.column_names"}
+
+  def encode_column_names(value) when is_list(value), do: value
+  def encode_column_names(_), do: {:error, "Unexpected type when encoding TopLevel.column_names"}
+
+  def decode_data(value) when is_list(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data(value) when is_list(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding TopLevel.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding TopLevel.description"}
+
+  def decode_display_url(value) when is_binary(value), do: value
+  def decode_display_url(_), do: {:error, "Unexpected type when decoding TopLevel.display_url"}
+
+  def encode_display_url(value) when is_binary(value), do: value
+  def encode_display_url(_), do: {:error, "Unexpected type when encoding TopLevel.display_url"}
+
+  def decode_frequency(value) when is_binary(value), do: value
+  def decode_frequency(_), do: {:error, "Unexpected type when decoding TopLevel.frequency"}
+
+  def encode_frequency(value) when is_binary(value), do: value
+  def encode_frequency(_), do: {:error, "Unexpected type when encoding TopLevel.frequency"}
+
+  def decode_from_date(value) when is_binary(value), do: value
+  def decode_from_date(_), do: {:error, "Unexpected type when decoding TopLevel.from_date"}
+
+  def encode_from_date(value) when is_binary(value), do: value
+  def encode_from_date(_), do: {:error, "Unexpected type when encoding TopLevel.from_date"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevel.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevel.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_premium(value) when is_boolean(value), do: value
+  def decode_premium(_), do: {:error, "Unexpected type when decoding TopLevel.premium"}
+
+  def encode_premium(value) when is_boolean(value), do: value
+  def encode_premium(_), do: {:error, "Unexpected type when encoding TopLevel.premium"}
+
+  def decode_source_code(value) when is_binary(value), do: value
+  def decode_source_code(_), do: {:error, "Unexpected type when decoding TopLevel.source_code"}
+
+  def encode_source_code(value) when is_binary(value), do: value
+  def encode_source_code(_), do: {:error, "Unexpected type when encoding TopLevel.source_code"}
+
+  def decode_source_name(value) when is_binary(value), do: value
+  def decode_source_name(_), do: {:error, "Unexpected type when decoding TopLevel.source_name"}
+
+  def encode_source_name(value) when is_binary(value), do: value
+  def encode_source_name(_), do: {:error, "Unexpected type when encoding TopLevel.source_name"}
+
+  def decode_to_date(value) when is_binary(value), do: value
+  def decode_to_date(_), do: {:error, "Unexpected type when decoding TopLevel.to_date"}
+
+  def encode_to_date(value) when is_binary(value), do: value
+  def encode_to_date(_), do: {:error, "Unexpected type when encoding TopLevel.to_date"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding TopLevel.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding TopLevel.type"}
+
+  def decode_updated_at(value) when is_binary(value), do: value
+  def decode_updated_at(_), do: {:error, "Unexpected type when decoding TopLevel.updated_at"}
+
+  def encode_updated_at(value) when is_binary(value), do: value
+  def encode_updated_at(_), do: {:error, "Unexpected type when encoding TopLevel.updated_at"}
+
+  def decode_urlize_name(value) when is_binary(value), do: value
+  def decode_urlize_name(_), do: {:error, "Unexpected type when decoding TopLevel.urlize_name"}
+
+  def encode_urlize_name(value) when is_binary(value), do: value
+  def encode_urlize_name(_), do: {:error, "Unexpected type when encoding TopLevel.urlize_name"}
+
   def from_map(m) do
     %TopLevel{
-      code: m["code"],
-      column_names: m["column_names"],
-      data: m["data"],
-      description: m["description"],
-      display_url: m["display_url"],
+      code: decode_code(m["code"]),
+      column_names: decode_column_names(m["column_names"]),
+      data: decode_data(m["data"]),
+      description: decode_description(m["description"]),
+      display_url: decode_display_url(m["display_url"]),
       errors: Errors.from_map(m["errors"]),
-      frequency: m["frequency"],
-      from_date: m["from_date"],
-      id: m["id"],
-      name: m["name"],
-      premium: m["premium"],
-      source_code: m["source_code"],
-      source_name: m["source_name"],
-      to_date: m["to_date"],
-      type: m["type"],
-      updated_at: m["updated_at"],
-      urlize_name: m["urlize_name"],
+      frequency: decode_frequency(m["frequency"]),
+      from_date: decode_from_date(m["from_date"]),
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
+      premium: decode_premium(m["premium"]),
+      source_code: decode_source_code(m["source_code"]),
+      source_name: decode_source_name(m["source_name"]),
+      to_date: decode_to_date(m["to_date"]),
+      type: decode_type(m["type"]),
+      updated_at: decode_updated_at(m["updated_at"]),
+      urlize_name: decode_urlize_name(m["urlize_name"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/a1eca.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/a1eca.json/default/QuickType.ex
index ee06b77..98852a1 100644
--- a/base/elixir/test/inputs/json/misc/a1eca.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/a1eca.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Astronomy do
           sunset: String.t()
         }
 
+  def decode_sunrise(value) when is_binary(value), do: value
+  def decode_sunrise(_), do: {:error, "Unexpected type when decoding Astronomy.sunrise"}
+
+  def encode_sunrise(value) when is_binary(value), do: value
+  def encode_sunrise(_), do: {:error, "Unexpected type when encoding Astronomy.sunrise"}
+
+  def decode_sunset(value) when is_binary(value), do: value
+  def decode_sunset(_), do: {:error, "Unexpected type when decoding Astronomy.sunset"}
+
+  def encode_sunset(value) when is_binary(value), do: value
+  def encode_sunset(_), do: {:error, "Unexpected type when encoding Astronomy.sunset"}
+
   def from_map(m) do
     %Astronomy{
-      sunrise: m["sunrise"],
-      sunset: m["sunset"],
+      sunrise: decode_sunrise(m["sunrise"]),
+      sunset: decode_sunset(m["sunset"]),
     }
   end
 
@@ -52,12 +64,36 @@ defmodule Atmosphere do
           visibility: String.t()
         }
 
+  def decode_humidity(value) when is_binary(value), do: value
+  def decode_humidity(_), do: {:error, "Unexpected type when decoding Atmosphere.humidity"}
+
+  def encode_humidity(value) when is_binary(value), do: value
+  def encode_humidity(_), do: {:error, "Unexpected type when encoding Atmosphere.humidity"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Atmosphere.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Atmosphere.pressure"}
+
+  def decode_rising(value) when is_binary(value), do: value
+  def decode_rising(_), do: {:error, "Unexpected type when decoding Atmosphere.rising"}
+
+  def encode_rising(value) when is_binary(value), do: value
+  def encode_rising(_), do: {:error, "Unexpected type when encoding Atmosphere.rising"}
+
+  def decode_visibility(value) when is_binary(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Atmosphere.visibility"}
+
+  def encode_visibility(value) when is_binary(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Atmosphere.visibility"}
+
   def from_map(m) do
     %Atmosphere{
-      humidity: m["humidity"],
-      pressure: m["pressure"],
-      rising: m["rising"],
-      visibility: m["visibility"],
+      humidity: decode_humidity(m["humidity"]),
+      pressure: decode_pressure(m["pressure"]),
+      rising: decode_rising(m["rising"]),
+      visibility: decode_visibility(m["visibility"]),
     }
   end
 
@@ -95,13 +131,43 @@ defmodule Image do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Image.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Image.height"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Image.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Image.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Image.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Image.title"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Image.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Image.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Image.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Image.width"}
+
   def from_map(m) do
     %Image{
-      height: m["height"],
-      link: m["link"],
-      title: m["title"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      link: decode_link(m["link"]),
+      title: decode_title(m["title"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -139,12 +205,36 @@ defmodule Condition do
           text: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Condition.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Condition.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Condition.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Condition.date"}
+
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Condition.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Condition.temp"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Condition.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Condition.text"}
+
   def from_map(m) do
     %Condition{
-      code: m["code"],
-      date: m["date"],
-      temp: m["temp"],
-      text: m["text"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      temp: decode_temp(m["temp"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -183,14 +273,50 @@ defmodule Forecast do
           text: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Forecast.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Forecast.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Forecast.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Forecast.date"}
+
+  def decode_day(value) when is_binary(value), do: value
+  def decode_day(_), do: {:error, "Unexpected type when decoding Forecast.day"}
+
+  def encode_day(value) when is_binary(value), do: value
+  def encode_day(_), do: {:error, "Unexpected type when encoding Forecast.day"}
+
+  def decode_high(value) when is_binary(value), do: value
+  def decode_high(_), do: {:error, "Unexpected type when decoding Forecast.high"}
+
+  def encode_high(value) when is_binary(value), do: value
+  def encode_high(_), do: {:error, "Unexpected type when encoding Forecast.high"}
+
+  def decode_low(value) when is_binary(value), do: value
+  def decode_low(_), do: {:error, "Unexpected type when decoding Forecast.low"}
+
+  def encode_low(value) when is_binary(value), do: value
+  def encode_low(_), do: {:error, "Unexpected type when encoding Forecast.low"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Forecast.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Forecast.text"}
+
   def from_map(m) do
     %Forecast{
-      code: m["code"],
-      date: m["date"],
-      day: m["day"],
-      high: m["high"],
-      low: m["low"],
-      text: m["text"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      day: decode_day(m["day"]),
+      high: decode_high(m["high"]),
+      low: decode_low(m["low"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -226,9 +352,15 @@ defmodule GUID do
           is_perma_link: String.t()
         }
 
+  def decode_is_perma_link(value) when is_binary(value), do: value
+  def decode_is_perma_link(_), do: {:error, "Unexpected type when decoding GUID.is_perma_link"}
+
+  def encode_is_perma_link(value) when is_binary(value), do: value
+  def encode_is_perma_link(_), do: {:error, "Unexpected type when encoding GUID.is_perma_link"}
+
   def from_map(m) do
     %GUID{
-      is_perma_link: m["isPermaLink"],
+      is_perma_link: decode_is_perma_link(m["isPermaLink"]),
     }
   end
 
@@ -267,17 +399,59 @@ defmodule Item do
           title: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Item.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Item.description"}
+
+  def decode_forecast(value) when is_list(value), do: value
+  def decode_forecast(_), do: {:error, "Unexpected type when decoding Item.forecast"}
+
+  def encode_forecast(value) when is_list(value), do: value
+  def encode_forecast(_), do: {:error, "Unexpected type when encoding Item.forecast"}
+
+  def decode_lat(value) when is_binary(value), do: value
+  def decode_lat(_), do: {:error, "Unexpected type when decoding Item.lat"}
+
+  def encode_lat(value) when is_binary(value), do: value
+  def encode_lat(_), do: {:error, "Unexpected type when encoding Item.lat"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Item.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Item.link"}
+
+  def decode_long(value) when is_binary(value), do: value
+  def decode_long(_), do: {:error, "Unexpected type when decoding Item.long"}
+
+  def encode_long(value) when is_binary(value), do: value
+  def encode_long(_), do: {:error, "Unexpected type when encoding Item.long"}
+
+  def decode_pub_date(value) when is_binary(value), do: value
+  def decode_pub_date(_), do: {:error, "Unexpected type when decoding Item.pub_date"}
+
+  def encode_pub_date(value) when is_binary(value), do: value
+  def encode_pub_date(_), do: {:error, "Unexpected type when encoding Item.pub_date"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Item.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Item.title"}
+
   def from_map(m) do
     %Item{
       condition: Condition.from_map(m["condition"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       forecast: Enum.map(m["forecast"], &Forecast.from_map/1),
       guid: GUID.from_map(m["guid"]),
-      lat: m["lat"],
-      link: m["link"],
-      long: m["long"],
-      pub_date: m["pubDate"],
-      title: m["title"],
+      lat: decode_lat(m["lat"]),
+      link: decode_link(m["link"]),
+      long: decode_long(m["long"]),
+      pub_date: decode_pub_date(m["pubDate"]),
+      title: decode_title(m["title"]),
     }
   end
 
@@ -318,11 +492,29 @@ defmodule Location do
           region: String.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding Location.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding Location.city"}
+
+  def decode_country(value) when is_binary(value), do: value
+  def decode_country(_), do: {:error, "Unexpected type when decoding Location.country"}
+
+  def encode_country(value) when is_binary(value), do: value
+  def encode_country(_), do: {:error, "Unexpected type when encoding Location.country"}
+
+  def decode_region(value) when is_binary(value), do: value
+  def decode_region(_), do: {:error, "Unexpected type when decoding Location.region"}
+
+  def encode_region(value) when is_binary(value), do: value
+  def encode_region(_), do: {:error, "Unexpected type when encoding Location.region"}
+
   def from_map(m) do
     %Location{
-      city: m["city"],
-      country: m["country"],
-      region: m["region"],
+      city: decode_city(m["city"]),
+      country: decode_country(m["country"]),
+      region: decode_region(m["region"]),
     }
   end
 
@@ -358,12 +550,36 @@ defmodule Units do
           temperature: String.t()
         }
 
+  def decode_distance(value) when is_binary(value), do: value
+  def decode_distance(_), do: {:error, "Unexpected type when decoding Units.distance"}
+
+  def encode_distance(value) when is_binary(value), do: value
+  def encode_distance(_), do: {:error, "Unexpected type when encoding Units.distance"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Units.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Units.pressure"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Units.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Units.speed"}
+
+  def decode_temperature(value) when is_binary(value), do: value
+  def decode_temperature(_), do: {:error, "Unexpected type when decoding Units.temperature"}
+
+  def encode_temperature(value) when is_binary(value), do: value
+  def encode_temperature(_), do: {:error, "Unexpected type when encoding Units.temperature"}
+
   def from_map(m) do
     %Units{
-      distance: m["distance"],
-      pressure: m["pressure"],
-      speed: m["speed"],
-      temperature: m["temperature"],
+      distance: decode_distance(m["distance"]),
+      pressure: decode_pressure(m["pressure"]),
+      speed: decode_speed(m["speed"]),
+      temperature: decode_temperature(m["temperature"]),
     }
   end
 
@@ -399,11 +615,29 @@ defmodule Wind do
           speed: String.t()
         }
 
+  def decode_chill(value) when is_binary(value), do: value
+  def decode_chill(_), do: {:error, "Unexpected type when decoding Wind.chill"}
+
+  def encode_chill(value) when is_binary(value), do: value
+  def encode_chill(_), do: {:error, "Unexpected type when encoding Wind.chill"}
+
+  def decode_direction(value) when is_binary(value), do: value
+  def decode_direction(_), do: {:error, "Unexpected type when decoding Wind.direction"}
+
+  def encode_direction(value) when is_binary(value), do: value
+  def encode_direction(_), do: {:error, "Unexpected type when encoding Wind.direction"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Wind.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Wind.speed"}
+
   def from_map(m) do
     %Wind{
-      chill: m["chill"],
-      direction: m["direction"],
-      speed: m["speed"],
+      chill: decode_chill(m["chill"]),
+      direction: decode_direction(m["direction"]),
+      speed: decode_speed(m["speed"]),
     }
   end
 
@@ -448,19 +682,55 @@ defmodule Channel do
           wind: Wind.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Channel.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Channel.description"}
+
+  def decode_language(value) when is_binary(value), do: value
+  def decode_language(_), do: {:error, "Unexpected type when decoding Channel.language"}
+
+  def encode_language(value) when is_binary(value), do: value
+  def encode_language(_), do: {:error, "Unexpected type when encoding Channel.language"}
+
+  def decode_last_build_date(value) when is_binary(value), do: value
+  def decode_last_build_date(_), do: {:error, "Unexpected type when decoding Channel.last_build_date"}
+
+  def encode_last_build_date(value) when is_binary(value), do: value
+  def encode_last_build_date(_), do: {:error, "Unexpected type when encoding Channel.last_build_date"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Channel.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Channel.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Channel.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Channel.title"}
+
+  def decode_ttl(value) when is_binary(value), do: value
+  def decode_ttl(_), do: {:error, "Unexpected type when decoding Channel.ttl"}
+
+  def encode_ttl(value) when is_binary(value), do: value
+  def encode_ttl(_), do: {:error, "Unexpected type when encoding Channel.ttl"}
+
   def from_map(m) do
     %Channel{
       astronomy: Astronomy.from_map(m["astronomy"]),
       atmosphere: Atmosphere.from_map(m["atmosphere"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       image: Image.from_map(m["image"]),
       item: Item.from_map(m["item"]),
-      language: m["language"],
-      last_build_date: m["lastBuildDate"],
-      link: m["link"],
+      language: decode_language(m["language"]),
+      last_build_date: decode_last_build_date(m["lastBuildDate"]),
+      link: decode_link(m["link"]),
       location: Location.from_map(m["location"]),
-      title: m["title"],
-      ttl: m["ttl"],
+      title: decode_title(m["title"]),
+      ttl: decode_ttl(m["ttl"]),
       units: Units.from_map(m["units"]),
       wind: Wind.from_map(m["wind"]),
     }
@@ -541,11 +811,29 @@ defmodule Query do
           results: Results.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Query.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Query.count"}
+
+  def decode_created(value) when is_binary(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding Query.created"}
+
+  def encode_created(value) when is_binary(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding Query.created"}
+
+  def decode_lang(value) when is_binary(value), do: value
+  def decode_lang(_), do: {:error, "Unexpected type when decoding Query.lang"}
+
+  def encode_lang(value) when is_binary(value), do: value
+  def encode_lang(_), do: {:error, "Unexpected type when encoding Query.lang"}
+
   def from_map(m) do
     %Query{
-      count: m["count"],
-      created: m["created"],
-      lang: m["lang"],
+      count: decode_count(m["count"]),
+      created: decode_created(m["created"]),
+      lang: decode_lang(m["lang"]),
       results: Results.from_map(m["results"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/a3d8c.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/a3d8c.json/default/QuickType.ex
index f19349c..6b07b4b 100644
--- a/base/elixir/test/inputs/json/misc/a3d8c.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/a3d8c.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Top do
           item: String.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Top.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Top.count"}
+
+  def decode_item(value) when is_binary(value), do: value
+  def decode_item(_), do: {:error, "Unexpected type when decoding Top.item"}
+
+  def encode_item(value) when is_binary(value), do: value
+  def encode_item(_), do: {:error, "Unexpected type when encoding Top.item"}
+
   def from_map(m) do
     %Top{
-      count: m["count"],
-      item: m["item"],
+      count: decode_count(m["count"]),
+      item: decode_item(m["item"]),
     }
   end
 
@@ -55,13 +67,43 @@ defmodule CachedContents do
           top: [Top.t()]
         }
 
+  def decode_largest(value) when is_binary(value), do: value
+  def decode_largest(_), do: {:error, "Unexpected type when decoding CachedContents.largest"}
+
+  def encode_largest(value) when is_binary(value), do: value
+  def encode_largest(_), do: {:error, "Unexpected type when encoding CachedContents.largest"}
+
+  def decode_non_null(value) when is_integer(value), do: value
+  def decode_non_null(_), do: {:error, "Unexpected type when decoding CachedContents.non_null"}
+
+  def encode_non_null(value) when is_integer(value), do: value
+  def encode_non_null(_), do: {:error, "Unexpected type when encoding CachedContents.non_null"}
+
+  def decode_null(value) when is_integer(value), do: value
+  def decode_null(_), do: {:error, "Unexpected type when decoding CachedContents.null"}
+
+  def encode_null(value) when is_integer(value), do: value
+  def encode_null(_), do: {:error, "Unexpected type when encoding CachedContents.null"}
+
+  def decode_smallest(value) when is_binary(value), do: value
+  def decode_smallest(_), do: {:error, "Unexpected type when decoding CachedContents.smallest"}
+
+  def encode_smallest(value) when is_binary(value), do: value
+  def encode_smallest(_), do: {:error, "Unexpected type when encoding CachedContents.smallest"}
+
+  def decode_top(value) when is_list(value), do: value
+  def decode_top(_), do: {:error, "Unexpected type when decoding CachedContents.top"}
+
+  def encode_top(value) when is_list(value), do: value
+  def encode_top(_), do: {:error, "Unexpected type when encoding CachedContents.top"}
+
   def from_map(m) do
     %CachedContents{
       average: m["average"],
-      largest: m["largest"],
-      non_null: m["non_null"],
-      null: m["null"],
-      smallest: m["smallest"],
+      largest: decode_largest(m["largest"]),
+      non_null: decode_non_null(m["non_null"]),
+      null: decode_null(m["null"]),
+      smallest: decode_smallest(m["smallest"]),
       sum: m["sum"],
       top: Enum.map(m["top"], &Top.from_map/1),
     }
@@ -186,16 +228,40 @@ defmodule Column do
           width: integer() | nil
         }
 
+  def decode_field_name(value) when is_binary(value), do: value
+  def decode_field_name(_), do: {:error, "Unexpected type when decoding Column.field_name"}
+
+  def encode_field_name(value) when is_binary(value), do: value
+  def encode_field_name(_), do: {:error, "Unexpected type when encoding Column.field_name"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Column.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Column.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Column.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Column.name"}
+
+  def decode_position(value) when is_integer(value), do: value
+  def decode_position(_), do: {:error, "Unexpected type when decoding Column.position"}
+
+  def encode_position(value) when is_integer(value), do: value
+  def encode_position(_), do: {:error, "Unexpected type when encoding Column.position"}
+
   def from_map(m) do
     %Column{
       cached_contents: m["cachedContents"] && CachedContents.from_map(m["cachedContents"]),
       data_type_name: TypeName.decode(m["dataTypeName"]),
-      field_name: m["fieldName"],
+      field_name: decode_field_name(m["fieldName"]),
       flags: m["flags"],
       format: Query.from_map(m["format"]),
-      id: m["id"],
-      name: m["name"],
-      position: m["position"],
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
+      position: decode_position(m["position"]),
       render_type_name: TypeName.decode(m["renderTypeName"]),
       table_column_id: m["tableColumnId"],
       width: m["width"],
@@ -241,11 +307,29 @@ defmodule Grant do
           type: String.t()
         }
 
+  def decode_flags(value) when is_list(value), do: value
+  def decode_flags(_), do: {:error, "Unexpected type when decoding Grant.flags"}
+
+  def encode_flags(value) when is_list(value), do: value
+  def encode_flags(_), do: {:error, "Unexpected type when encoding Grant.flags"}
+
+  def decode_inherited(value) when is_boolean(value), do: value
+  def decode_inherited(_), do: {:error, "Unexpected type when decoding Grant.inherited"}
+
+  def encode_inherited(value) when is_boolean(value), do: value
+  def encode_inherited(_), do: {:error, "Unexpected type when encoding Grant.inherited"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Grant.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Grant.type"}
+
   def from_map(m) do
     %Grant{
-      flags: m["flags"],
-      inherited: m["inherited"],
-      type: m["type"],
+      flags: decode_flags(m["flags"]),
+      inherited: decode_inherited(m["inherited"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -278,9 +362,15 @@ defmodule License do
           name: String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding License.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding License.name"}
+
   def from_map(m) do
     %License{
-      name: m["name"],
+      name: decode_name(m["name"]),
     }
   end
 
@@ -311,9 +401,15 @@ defmodule Visible do
           table: boolean()
         }
 
+  def decode_table(value) when is_boolean(value), do: value
+  def decode_table(_), do: {:error, "Unexpected type when decoding Visible.table"}
+
+  def encode_table(value) when is_boolean(value), do: value
+  def encode_table(_), do: {:error, "Unexpected type when encoding Visible.table"}
+
   def from_map(m) do
     %Visible{
-      table: m["table"],
+      table: decode_table(m["table"]),
     }
   end
 
@@ -381,13 +477,37 @@ defmodule Metadata do
           row_identifier: String.t()
         }
 
+  def decode_available_display_types(value) when is_list(value), do: value
+  def decode_available_display_types(_), do: {:error, "Unexpected type when decoding Metadata.available_display_types"}
+
+  def encode_available_display_types(value) when is_list(value), do: value
+  def encode_available_display_types(_), do: {:error, "Unexpected type when encoding Metadata.available_display_types"}
+
+  def decode_rdf_class(value) when is_binary(value), do: value
+  def decode_rdf_class(_), do: {:error, "Unexpected type when decoding Metadata.rdf_class"}
+
+  def encode_rdf_class(value) when is_binary(value), do: value
+  def encode_rdf_class(_), do: {:error, "Unexpected type when encoding Metadata.rdf_class"}
+
+  def decode_rdf_subject(value) when is_binary(value), do: value
+  def decode_rdf_subject(_), do: {:error, "Unexpected type when decoding Metadata.rdf_subject"}
+
+  def encode_rdf_subject(value) when is_binary(value), do: value
+  def encode_rdf_subject(_), do: {:error, "Unexpected type when encoding Metadata.rdf_subject"}
+
+  def decode_row_identifier(value) when is_binary(value), do: value
+  def decode_row_identifier(_), do: {:error, "Unexpected type when decoding Metadata.row_identifier"}
+
+  def encode_row_identifier(value) when is_binary(value), do: value
+  def encode_row_identifier(_), do: {:error, "Unexpected type when encoding Metadata.row_identifier"}
+
   def from_map(m) do
     %Metadata{
-      available_display_types: m["availableDisplayTypes"],
-      rdf_class: m["rdfClass"],
-      rdf_subject: m["rdfSubject"],
+      available_display_types: decode_available_display_types(m["availableDisplayTypes"]),
+      rdf_class: decode_rdf_class(m["rdfClass"]),
+      rdf_subject: decode_rdf_subject(m["rdfSubject"]),
       render_type_config: RenderTypeConfig.from_map(m["renderTypeConfig"]),
-      row_identifier: m["rowIdentifier"],
+      row_identifier: decode_row_identifier(m["rowIdentifier"]),
     }
   end
 
@@ -424,11 +544,29 @@ defmodule Owner do
           screen_name: String.t()
         }
 
+  def decode_display_name(value) when is_binary(value), do: value
+  def decode_display_name(_), do: {:error, "Unexpected type when decoding Owner.display_name"}
+
+  def encode_display_name(value) when is_binary(value), do: value
+  def encode_display_name(_), do: {:error, "Unexpected type when encoding Owner.display_name"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Owner.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Owner.id"}
+
+  def decode_screen_name(value) when is_binary(value), do: value
+  def decode_screen_name(_), do: {:error, "Unexpected type when decoding Owner.screen_name"}
+
+  def encode_screen_name(value) when is_binary(value), do: value
+  def encode_screen_name(_), do: {:error, "Unexpected type when encoding Owner.screen_name"}
+
   def from_map(m) do
     %Owner{
-      display_name: m["displayName"],
-      id: m["id"],
-      screen_name: m["screenName"],
+      display_name: decode_display_name(m["displayName"]),
+      id: decode_id(m["id"]),
+      screen_name: decode_screen_name(m["screenName"]),
     }
   end
 
@@ -497,45 +635,237 @@ defmodule View do
           view_type: String.t()
         }
 
+  def decode_average_rating(value) when is_integer(value), do: value
+  def decode_average_rating(_), do: {:error, "Unexpected type when decoding View.average_rating"}
+
+  def encode_average_rating(value) when is_integer(value), do: value
+  def encode_average_rating(_), do: {:error, "Unexpected type when encoding View.average_rating"}
+
+  def decode_category(value) when is_binary(value), do: value
+  def decode_category(_), do: {:error, "Unexpected type when decoding View.category"}
+
+  def encode_category(value) when is_binary(value), do: value
+  def encode_category(_), do: {:error, "Unexpected type when encoding View.category"}
+
+  def decode_columns(value) when is_list(value), do: value
+  def decode_columns(_), do: {:error, "Unexpected type when decoding View.columns"}
+
+  def encode_columns(value) when is_list(value), do: value
+  def encode_columns(_), do: {:error, "Unexpected type when encoding View.columns"}
+
+  def decode_created_at(value) when is_integer(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding View.created_at"}
+
+  def encode_created_at(value) when is_integer(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding View.created_at"}
+
+  def decode_display_type(value) when is_binary(value), do: value
+  def decode_display_type(_), do: {:error, "Unexpected type when decoding View.display_type"}
+
+  def encode_display_type(value) when is_binary(value), do: value
+  def encode_display_type(_), do: {:error, "Unexpected type when encoding View.display_type"}
+
+  def decode_download_count(value) when is_integer(value), do: value
+  def decode_download_count(_), do: {:error, "Unexpected type when decoding View.download_count"}
+
+  def encode_download_count(value) when is_integer(value), do: value
+  def encode_download_count(_), do: {:error, "Unexpected type when encoding View.download_count"}
+
+  def decode_flags(value) when is_list(value), do: value
+  def decode_flags(_), do: {:error, "Unexpected type when decoding View.flags"}
+
+  def encode_flags(value) when is_list(value), do: value
+  def encode_flags(_), do: {:error, "Unexpected type when encoding View.flags"}
+
+  def decode_grants(value) when is_list(value), do: value
+  def decode_grants(_), do: {:error, "Unexpected type when decoding View.grants"}
+
+  def encode_grants(value) when is_list(value), do: value
+  def encode_grants(_), do: {:error, "Unexpected type when encoding View.grants"}
+
+  def decode_hide_from_catalog(value) when is_boolean(value), do: value
+  def decode_hide_from_catalog(_), do: {:error, "Unexpected type when decoding View.hide_from_catalog"}
+
+  def encode_hide_from_catalog(value) when is_boolean(value), do: value
+  def encode_hide_from_catalog(_), do: {:error, "Unexpected type when encoding View.hide_from_catalog"}
+
+  def decode_hide_from_data_json(value) when is_boolean(value), do: value
+  def decode_hide_from_data_json(_), do: {:error, "Unexpected type when decoding View.hide_from_data_json"}
+
+  def encode_hide_from_data_json(value) when is_boolean(value), do: value
+  def encode_hide_from_data_json(_), do: {:error, "Unexpected type when encoding View.hide_from_data_json"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding View.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding View.id"}
+
+  def decode_index_updated_at(value) when is_integer(value), do: value
+  def decode_index_updated_at(_), do: {:error, "Unexpected type when decoding View.index_updated_at"}
+
+  def encode_index_updated_at(value) when is_integer(value), do: value
+  def encode_index_updated_at(_), do: {:error, "Unexpected type when encoding View.index_updated_at"}
+
+  def decode_license_id(value) when is_binary(value), do: value
+  def decode_license_id(_), do: {:error, "Unexpected type when decoding View.license_id"}
+
+  def encode_license_id(value) when is_binary(value), do: value
+  def encode_license_id(_), do: {:error, "Unexpected type when encoding View.license_id"}
+
+  def decode_locale(value) when is_binary(value), do: value
+  def decode_locale(_), do: {:error, "Unexpected type when decoding View.locale"}
+
+  def encode_locale(value) when is_binary(value), do: value
+  def encode_locale(_), do: {:error, "Unexpected type when encoding View.locale"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding View.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding View.name"}
+
+  def decode_new_backend(value) when is_boolean(value), do: value
+  def decode_new_backend(_), do: {:error, "Unexpected type when decoding View.new_backend"}
+
+  def encode_new_backend(value) when is_boolean(value), do: value
+  def encode_new_backend(_), do: {:error, "Unexpected type when encoding View.new_backend"}
+
+  def decode_number_of_comments(value) when is_integer(value), do: value
+  def decode_number_of_comments(_), do: {:error, "Unexpected type when decoding View.number_of_comments"}
+
+  def encode_number_of_comments(value) when is_integer(value), do: value
+  def encode_number_of_comments(_), do: {:error, "Unexpected type when encoding View.number_of_comments"}
+
+  def decode_oid(value) when is_integer(value), do: value
+  def decode_oid(_), do: {:error, "Unexpected type when decoding View.oid"}
+
+  def encode_oid(value) when is_integer(value), do: value
+  def encode_oid(_), do: {:error, "Unexpected type when encoding View.oid"}
+
+  def decode_provenance(value) when is_binary(value), do: value
+  def decode_provenance(_), do: {:error, "Unexpected type when decoding View.provenance"}
+
+  def encode_provenance(value) when is_binary(value), do: value
+  def encode_provenance(_), do: {:error, "Unexpected type when encoding View.provenance"}
+
+  def decode_publication_append_enabled(value) when is_boolean(value), do: value
+  def decode_publication_append_enabled(_), do: {:error, "Unexpected type when decoding View.publication_append_enabled"}
+
+  def encode_publication_append_enabled(value) when is_boolean(value), do: value
+  def encode_publication_append_enabled(_), do: {:error, "Unexpected type when encoding View.publication_append_enabled"}
+
+  def decode_publication_date(value) when is_integer(value), do: value
+  def decode_publication_date(_), do: {:error, "Unexpected type when decoding View.publication_date"}
+
+  def encode_publication_date(value) when is_integer(value), do: value
+  def encode_publication_date(_), do: {:error, "Unexpected type when encoding View.publication_date"}
+
+  def decode_publication_group(value) when is_integer(value), do: value
+  def decode_publication_group(_), do: {:error, "Unexpected type when decoding View.publication_group"}
+
+  def encode_publication_group(value) when is_integer(value), do: value
+  def encode_publication_group(_), do: {:error, "Unexpected type when encoding View.publication_group"}
+
+  def decode_publication_stage(value) when is_binary(value), do: value
+  def decode_publication_stage(_), do: {:error, "Unexpected type when decoding View.publication_stage"}
+
+  def encode_publication_stage(value) when is_binary(value), do: value
+  def encode_publication_stage(_), do: {:error, "Unexpected type when encoding View.publication_stage"}
+
+  def decode_rights(value) when is_list(value), do: value
+  def decode_rights(_), do: {:error, "Unexpected type when decoding View.rights"}
+
+  def encode_rights(value) when is_list(value), do: value
+  def encode_rights(_), do: {:error, "Unexpected type when encoding View.rights"}
+
+  def decode_row_class(value) when is_binary(value), do: value
+  def decode_row_class(_), do: {:error, "Unexpected type when decoding View.row_class"}
+
+  def encode_row_class(value) when is_binary(value), do: value
+  def encode_row_class(_), do: {:error, "Unexpected type when encoding View.row_class"}
+
+  def decode_rows_updated_at(value) when is_integer(value), do: value
+  def decode_rows_updated_at(_), do: {:error, "Unexpected type when decoding View.rows_updated_at"}
+
+  def encode_rows_updated_at(value) when is_integer(value), do: value
+  def encode_rows_updated_at(_), do: {:error, "Unexpected type when encoding View.rows_updated_at"}
+
+  def decode_rows_updated_by(value) when is_binary(value), do: value
+  def decode_rows_updated_by(_), do: {:error, "Unexpected type when decoding View.rows_updated_by"}
+
+  def encode_rows_updated_by(value) when is_binary(value), do: value
+  def encode_rows_updated_by(_), do: {:error, "Unexpected type when encoding View.rows_updated_by"}
+
+  def decode_table_id(value) when is_integer(value), do: value
+  def decode_table_id(_), do: {:error, "Unexpected type when decoding View.table_id"}
+
+  def encode_table_id(value) when is_integer(value), do: value
+  def encode_table_id(_), do: {:error, "Unexpected type when encoding View.table_id"}
+
+  def decode_total_times_rated(value) when is_integer(value), do: value
+  def decode_total_times_rated(_), do: {:error, "Unexpected type when decoding View.total_times_rated"}
+
+  def encode_total_times_rated(value) when is_integer(value), do: value
+  def encode_total_times_rated(_), do: {:error, "Unexpected type when encoding View.total_times_rated"}
+
+  def decode_view_count(value) when is_integer(value), do: value
+  def decode_view_count(_), do: {:error, "Unexpected type when decoding View.view_count"}
+
+  def encode_view_count(value) when is_integer(value), do: value
+  def encode_view_count(_), do: {:error, "Unexpected type when encoding View.view_count"}
+
+  def decode_view_last_modified(value) when is_integer(value), do: value
+  def decode_view_last_modified(_), do: {:error, "Unexpected type when decoding View.view_last_modified"}
+
+  def encode_view_last_modified(value) when is_integer(value), do: value
+  def encode_view_last_modified(_), do: {:error, "Unexpected type when encoding View.view_last_modified"}
+
+  def decode_view_type(value) when is_binary(value), do: value
+  def decode_view_type(_), do: {:error, "Unexpected type when decoding View.view_type"}
+
+  def encode_view_type(value) when is_binary(value), do: value
+  def encode_view_type(_), do: {:error, "Unexpected type when encoding View.view_type"}
+
   def from_map(m) do
     %View{
-      average_rating: m["averageRating"],
-      category: m["category"],
+      average_rating: decode_average_rating(m["averageRating"]),
+      category: decode_category(m["category"]),
       columns: Enum.map(m["columns"], &Column.from_map/1),
-      created_at: m["createdAt"],
-      display_type: m["displayType"],
-      download_count: m["downloadCount"],
-      flags: m["flags"],
+      created_at: decode_created_at(m["createdAt"]),
+      display_type: decode_display_type(m["displayType"]),
+      download_count: decode_download_count(m["downloadCount"]),
+      flags: decode_flags(m["flags"]),
       grants: Enum.map(m["grants"], &Grant.from_map/1),
-      hide_from_catalog: m["hideFromCatalog"],
-      hide_from_data_json: m["hideFromDataJson"],
-      id: m["id"],
-      index_updated_at: m["indexUpdatedAt"],
+      hide_from_catalog: decode_hide_from_catalog(m["hideFromCatalog"]),
+      hide_from_data_json: decode_hide_from_data_json(m["hideFromDataJson"]),
+      id: decode_id(m["id"]),
+      index_updated_at: decode_index_updated_at(m["indexUpdatedAt"]),
       license: License.from_map(m["license"]),
-      license_id: m["licenseId"],
-      locale: m["locale"],
+      license_id: decode_license_id(m["licenseId"]),
+      locale: decode_locale(m["locale"]),
       metadata: Metadata.from_map(m["metadata"]),
-      name: m["name"],
-      new_backend: m["newBackend"],
-      number_of_comments: m["numberOfComments"],
-      oid: m["oid"],
+      name: decode_name(m["name"]),
+      new_backend: decode_new_backend(m["newBackend"]),
+      number_of_comments: decode_number_of_comments(m["numberOfComments"]),
+      oid: decode_oid(m["oid"]),
       owner: Owner.from_map(m["owner"]),
-      provenance: m["provenance"],
-      publication_append_enabled: m["publicationAppendEnabled"],
-      publication_date: m["publicationDate"],
-      publication_group: m["publicationGroup"],
-      publication_stage: m["publicationStage"],
+      provenance: decode_provenance(m["provenance"]),
+      publication_append_enabled: decode_publication_append_enabled(m["publicationAppendEnabled"]),
+      publication_date: decode_publication_date(m["publicationDate"]),
+      publication_group: decode_publication_group(m["publicationGroup"]),
+      publication_stage: decode_publication_stage(m["publicationStage"]),
       query: Query.from_map(m["query"]),
-      rights: m["rights"],
-      row_class: m["rowClass"],
-      rows_updated_at: m["rowsUpdatedAt"],
-      rows_updated_by: m["rowsUpdatedBy"],
+      rights: decode_rights(m["rights"]),
+      row_class: decode_row_class(m["rowClass"]),
+      rows_updated_at: decode_rows_updated_at(m["rowsUpdatedAt"]),
+      rows_updated_by: decode_rows_updated_by(m["rowsUpdatedBy"]),
       table_author: Owner.from_map(m["tableAuthor"]),
-      table_id: m["tableId"],
-      total_times_rated: m["totalTimesRated"],
-      view_count: m["viewCount"],
-      view_last_modified: m["viewLastModified"],
-      view_type: m["viewType"],
+      table_id: decode_table_id(m["tableId"]),
+      total_times_rated: decode_total_times_rated(m["totalTimesRated"]),
+      view_count: decode_view_count(m["viewCount"]),
+      view_last_modified: decode_view_last_modified(m["viewLastModified"]),
+      view_type: decode_view_type(m["viewType"]),
     }
   end
 
@@ -636,9 +966,15 @@ defmodule TopLevel do
           meta: Meta.t()
         }
 
+  def decode_data(value) when is_list(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data(value) when is_list(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
   def from_map(m) do
     %TopLevel{
-      data: m["data"],
+      data: decode_data(m["data"]),
       meta: Meta.from_map(m["meta"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/a45b0.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/a45b0.json/default/QuickType.ex
index 193f7cc..81e4144 100644
--- a/base/elixir/test/inputs/json/misc/a45b0.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/a45b0.json/default/QuickType.ex
@@ -63,14 +63,44 @@ defmodule TopLevelElement do
           year: integer()
         }
 
+  def decode_age(value) when is_integer(value), do: value
+  def decode_age(_), do: {:error, "Unexpected type when decoding TopLevelElement.age"}
+
+  def encode_age(value) when is_integer(value), do: value
+  def encode_age(_), do: {:error, "Unexpected type when encoding TopLevelElement.age"}
+
+  def decode_females(value) when is_integer(value), do: value
+  def decode_females(_), do: {:error, "Unexpected type when decoding TopLevelElement.females"}
+
+  def encode_females(value) when is_integer(value), do: value
+  def encode_females(_), do: {:error, "Unexpected type when encoding TopLevelElement.females"}
+
+  def decode_males(value) when is_integer(value), do: value
+  def decode_males(_), do: {:error, "Unexpected type when decoding TopLevelElement.males"}
+
+  def encode_males(value) when is_integer(value), do: value
+  def encode_males(_), do: {:error, "Unexpected type when encoding TopLevelElement.males"}
+
+  def decode_total(value) when is_integer(value), do: value
+  def decode_total(_), do: {:error, "Unexpected type when decoding TopLevelElement.total"}
+
+  def encode_total(value) when is_integer(value), do: value
+  def encode_total(_), do: {:error, "Unexpected type when encoding TopLevelElement.total"}
+
+  def decode_year(value) when is_integer(value), do: value
+  def decode_year(_), do: {:error, "Unexpected type when decoding TopLevelElement.year"}
+
+  def encode_year(value) when is_integer(value), do: value
+  def encode_year(_), do: {:error, "Unexpected type when encoding TopLevelElement.year"}
+
   def from_map(m) do
     %TopLevelElement{
-      age: m["age"],
+      age: decode_age(m["age"]),
       country: Country.decode(m["country"]),
-      females: m["females"],
-      males: m["males"],
-      total: m["total"],
-      year: m["year"],
+      females: decode_females(m["females"]),
+      males: decode_males(m["males"]),
+      total: decode_total(m["total"]),
+      year: decode_year(m["year"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/a71df.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/a71df.json/default/QuickType.ex
index b9f86f4..e9a4777 100644
--- a/base/elixir/test/inputs/json/misc/a71df.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/a71df.json/default/QuickType.ex
@@ -21,17 +21,71 @@ defmodule Status do
           type: String.t()
         }
 
+  def decode_avg_delay(value) when is_binary(value), do: value
+  def decode_avg_delay(_), do: {:error, "Unexpected type when decoding Status.avg_delay"}
+
+  def encode_avg_delay(value) when is_binary(value), do: value
+  def encode_avg_delay(_), do: {:error, "Unexpected type when encoding Status.avg_delay"}
+
+  def decode_closure_begin(value) when is_binary(value), do: value
+  def decode_closure_begin(_), do: {:error, "Unexpected type when decoding Status.closure_begin"}
+
+  def encode_closure_begin(value) when is_binary(value), do: value
+  def encode_closure_begin(_), do: {:error, "Unexpected type when encoding Status.closure_begin"}
+
+  def decode_closure_end(value) when is_binary(value), do: value
+  def decode_closure_end(_), do: {:error, "Unexpected type when decoding Status.closure_end"}
+
+  def encode_closure_end(value) when is_binary(value), do: value
+  def encode_closure_end(_), do: {:error, "Unexpected type when encoding Status.closure_end"}
+
+  def decode_end_time(value) when is_binary(value), do: value
+  def decode_end_time(_), do: {:error, "Unexpected type when decoding Status.end_time"}
+
+  def encode_end_time(value) when is_binary(value), do: value
+  def encode_end_time(_), do: {:error, "Unexpected type when encoding Status.end_time"}
+
+  def decode_max_delay(value) when is_binary(value), do: value
+  def decode_max_delay(_), do: {:error, "Unexpected type when decoding Status.max_delay"}
+
+  def encode_max_delay(value) when is_binary(value), do: value
+  def encode_max_delay(_), do: {:error, "Unexpected type when encoding Status.max_delay"}
+
+  def decode_min_delay(value) when is_binary(value), do: value
+  def decode_min_delay(_), do: {:error, "Unexpected type when decoding Status.min_delay"}
+
+  def encode_min_delay(value) when is_binary(value), do: value
+  def encode_min_delay(_), do: {:error, "Unexpected type when encoding Status.min_delay"}
+
+  def decode_reason(value) when is_binary(value), do: value
+  def decode_reason(_), do: {:error, "Unexpected type when decoding Status.reason"}
+
+  def encode_reason(value) when is_binary(value), do: value
+  def encode_reason(_), do: {:error, "Unexpected type when encoding Status.reason"}
+
+  def decode_trend(value) when is_binary(value), do: value
+  def decode_trend(_), do: {:error, "Unexpected type when decoding Status.trend"}
+
+  def encode_trend(value) when is_binary(value), do: value
+  def encode_trend(_), do: {:error, "Unexpected type when encoding Status.trend"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Status.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Status.type"}
+
   def from_map(m) do
     %Status{
-      avg_delay: m["avgDelay"],
-      closure_begin: m["closureBegin"],
-      closure_end: m["closureEnd"],
-      end_time: m["endTime"],
-      max_delay: m["maxDelay"],
-      min_delay: m["minDelay"],
-      reason: m["reason"],
-      trend: m["trend"],
-      type: m["type"],
+      avg_delay: decode_avg_delay(m["avgDelay"]),
+      closure_begin: decode_closure_begin(m["closureBegin"]),
+      closure_end: decode_closure_end(m["closureEnd"]),
+      end_time: decode_end_time(m["endTime"]),
+      max_delay: decode_max_delay(m["maxDelay"]),
+      min_delay: decode_min_delay(m["minDelay"]),
+      reason: decode_reason(m["reason"]),
+      trend: decode_trend(m["trend"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -72,11 +126,29 @@ defmodule Meta do
           url: String.t()
         }
 
+  def decode_credit(value) when is_binary(value), do: value
+  def decode_credit(_), do: {:error, "Unexpected type when decoding Meta.credit"}
+
+  def encode_credit(value) when is_binary(value), do: value
+  def encode_credit(_), do: {:error, "Unexpected type when encoding Meta.credit"}
+
+  def decode_updated(value) when is_binary(value), do: value
+  def decode_updated(_), do: {:error, "Unexpected type when decoding Meta.updated"}
+
+  def encode_updated(value) when is_binary(value), do: value
+  def encode_updated(_), do: {:error, "Unexpected type when encoding Meta.updated"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Meta.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Meta.url"}
+
   def from_map(m) do
     %Meta{
-      credit: m["credit"],
-      updated: m["updated"],
-      url: m["url"],
+      credit: decode_credit(m["credit"]),
+      updated: decode_updated(m["updated"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -113,13 +185,39 @@ defmodule Weather do
           wind: String.t()
         }
 
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Weather.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Weather.temp"}
+
+  def decode_visibility(value) when is_float(value), do: value
+  def decode_visibility(value) when is_integer(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Weather.visibility"}
+
+  def encode_visibility(value) when is_float(value), do: value
+  def encode_visibility(value) when is_integer(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Weather.visibility"}
+
+  def decode_weather(value) when is_binary(value), do: value
+  def decode_weather(_), do: {:error, "Unexpected type when decoding Weather.weather"}
+
+  def encode_weather(value) when is_binary(value), do: value
+  def encode_weather(_), do: {:error, "Unexpected type when encoding Weather.weather"}
+
+  def decode_wind(value) when is_binary(value), do: value
+  def decode_wind(_), do: {:error, "Unexpected type when decoding Weather.wind"}
+
+  def encode_wind(value) when is_binary(value), do: value
+  def encode_wind(_), do: {:error, "Unexpected type when encoding Weather.wind"}
+
   def from_map(m) do
     %Weather{
       meta: Meta.from_map(m["meta"]),
-      temp: m["temp"],
-      visibility: m["visibility"],
-      weather: m["weather"],
-      wind: m["wind"],
+      temp: decode_temp(m["temp"]),
+      visibility: decode_visibility(m["visibility"]),
+      weather: decode_weather(m["weather"]),
+      wind: decode_wind(m["wind"]),
     }
   end
 
@@ -161,14 +259,50 @@ defmodule TopLevel do
           weather: Weather.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding TopLevel.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding TopLevel.city"}
+
+  def decode_delay(value) when is_binary(value), do: value
+  def decode_delay(_), do: {:error, "Unexpected type when decoding TopLevel.delay"}
+
+  def encode_delay(value) when is_binary(value), do: value
+  def encode_delay(_), do: {:error, "Unexpected type when encoding TopLevel.delay"}
+
+  def decode_iata(value) when is_binary(value), do: value
+  def decode_iata(_), do: {:error, "Unexpected type when decoding TopLevel.iata"}
+
+  def encode_iata(value) when is_binary(value), do: value
+  def encode_iata(_), do: {:error, "Unexpected type when encoding TopLevel.iata"}
+
+  def decode_icao(value) when is_binary(value), do: value
+  def decode_icao(_), do: {:error, "Unexpected type when decoding TopLevel.icao"}
+
+  def encode_icao(value) when is_binary(value), do: value
+  def encode_icao(_), do: {:error, "Unexpected type when encoding TopLevel.icao"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding TopLevel.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding TopLevel.state"}
+
   def from_map(m) do
     %TopLevel{
-      city: m["city"],
-      delay: m["delay"],
-      iata: m["IATA"],
-      icao: m["ICAO"],
-      name: m["name"],
-      state: m["state"],
+      city: decode_city(m["city"]),
+      delay: decode_delay(m["delay"]),
+      iata: decode_iata(m["IATA"]),
+      icao: decode_icao(m["ICAO"]),
+      name: decode_name(m["name"]),
+      state: decode_state(m["state"]),
       status: Status.from_map(m["status"]),
       weather: Weather.from_map(m["weather"]),
     }
diff --git a/base/elixir/test/inputs/json/misc/a9691.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/a9691.json/default/QuickType.ex
index 8937606..db497b1 100644
--- a/base/elixir/test/inputs/json/misc/a9691.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/a9691.json/default/QuickType.ex
@@ -15,11 +15,32 @@ defmodule TopLevel do
           rates: %{String.t() => float()}
         }
 
+  def decode_base(value) when is_binary(value), do: value
+  def decode_base(_), do: {:error, "Unexpected type when decoding TopLevel.base"}
+
+  def encode_base(value) when is_binary(value), do: value
+  def encode_base(_), do: {:error, "Unexpected type when encoding TopLevel.base"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel.date"}
+
+  def decode_rates_value(value) when is_float(value), do: value
+  def decode_rates_value(value) when is_integer(value), do: value
+  def decode_rates_value(_), do: {:error, "Unexpected type when decoding TopLevel.rates"}
+
+  def encode_rates_value(value) when is_float(value), do: value
+  def encode_rates_value(value) when is_integer(value), do: value
+  def encode_rates_value(_), do: {:error, "Unexpected type when encoding TopLevel.rates"}
+
   def from_map(m) do
     %TopLevel{
-      base: m["base"],
-      date: m["date"],
-      rates: m["rates"],
+      base: decode_base(m["base"]),
+      date: decode_date(m["date"]),
+      rates: m["rates"]
+      |> Map.new(fn {key, value} -> {key, decode_rates_value(value)} end),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/ab0d1.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/ab0d1.json/default/QuickType.ex
index 193f7cc..81e4144 100644
--- a/base/elixir/test/inputs/json/misc/ab0d1.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/ab0d1.json/default/QuickType.ex
@@ -63,14 +63,44 @@ defmodule TopLevelElement do
           year: integer()
         }
 
+  def decode_age(value) when is_integer(value), do: value
+  def decode_age(_), do: {:error, "Unexpected type when decoding TopLevelElement.age"}
+
+  def encode_age(value) when is_integer(value), do: value
+  def encode_age(_), do: {:error, "Unexpected type when encoding TopLevelElement.age"}
+
+  def decode_females(value) when is_integer(value), do: value
+  def decode_females(_), do: {:error, "Unexpected type when decoding TopLevelElement.females"}
+
+  def encode_females(value) when is_integer(value), do: value
+  def encode_females(_), do: {:error, "Unexpected type when encoding TopLevelElement.females"}
+
+  def decode_males(value) when is_integer(value), do: value
+  def decode_males(_), do: {:error, "Unexpected type when decoding TopLevelElement.males"}
+
+  def encode_males(value) when is_integer(value), do: value
+  def encode_males(_), do: {:error, "Unexpected type when encoding TopLevelElement.males"}
+
+  def decode_total(value) when is_integer(value), do: value
+  def decode_total(_), do: {:error, "Unexpected type when decoding TopLevelElement.total"}
+
+  def encode_total(value) when is_integer(value), do: value
+  def encode_total(_), do: {:error, "Unexpected type when encoding TopLevelElement.total"}
+
+  def decode_year(value) when is_integer(value), do: value
+  def decode_year(_), do: {:error, "Unexpected type when decoding TopLevelElement.year"}
+
+  def encode_year(value) when is_integer(value), do: value
+  def encode_year(_), do: {:error, "Unexpected type when encoding TopLevelElement.year"}
+
   def from_map(m) do
     %TopLevelElement{
-      age: m["age"],
+      age: decode_age(m["age"]),
       country: Country.decode(m["country"]),
-      females: m["females"],
-      males: m["males"],
-      total: m["total"],
-      year: m["year"],
+      females: decode_females(m["females"]),
+      males: decode_males(m["males"]),
+      total: decode_total(m["total"]),
+      year: decode_year(m["year"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/abb4b.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/abb4b.json/default/QuickType.ex
index bf47bf0..b805b08 100644
--- a/base/elixir/test/inputs/json/misc/abb4b.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/abb4b.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule TotalPopulation do
           population: integer()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TotalPopulation.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TotalPopulation.date"}
+
+  def decode_population(value) when is_integer(value), do: value
+  def decode_population(_), do: {:error, "Unexpected type when decoding TotalPopulation.population"}
+
+  def encode_population(value) when is_integer(value), do: value
+  def encode_population(_), do: {:error, "Unexpected type when encoding TotalPopulation.population"}
+
   def from_map(m) do
     %TotalPopulation{
-      date: m["date"],
-      population: m["population"],
+      date: decode_date(m["date"]),
+      population: decode_population(m["population"]),
     }
   end
 
@@ -49,6 +61,12 @@ defmodule TopLevel do
           total_population: [TotalPopulation.t()]
         }
 
+  def decode_total_population(value) when is_list(value), do: value
+  def decode_total_population(_), do: {:error, "Unexpected type when decoding TopLevel.total_population"}
+
+  def encode_total_population(value) when is_list(value), do: value
+  def encode_total_population(_), do: {:error, "Unexpected type when encoding TopLevel.total_population"}
+
   def from_map(m) do
     %TopLevel{
       total_population: Enum.map(m["total_population"], &TotalPopulation.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/ac944.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/ac944.json/default/QuickType.ex
index 8937606..db497b1 100644
--- a/base/elixir/test/inputs/json/misc/ac944.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/ac944.json/default/QuickType.ex
@@ -15,11 +15,32 @@ defmodule TopLevel do
           rates: %{String.t() => float()}
         }
 
+  def decode_base(value) when is_binary(value), do: value
+  def decode_base(_), do: {:error, "Unexpected type when decoding TopLevel.base"}
+
+  def encode_base(value) when is_binary(value), do: value
+  def encode_base(_), do: {:error, "Unexpected type when encoding TopLevel.base"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel.date"}
+
+  def decode_rates_value(value) when is_float(value), do: value
+  def decode_rates_value(value) when is_integer(value), do: value
+  def decode_rates_value(_), do: {:error, "Unexpected type when decoding TopLevel.rates"}
+
+  def encode_rates_value(value) when is_float(value), do: value
+  def encode_rates_value(value) when is_integer(value), do: value
+  def encode_rates_value(_), do: {:error, "Unexpected type when encoding TopLevel.rates"}
+
   def from_map(m) do
     %TopLevel{
-      base: m["base"],
-      date: m["date"],
-      rates: m["rates"],
+      base: decode_base(m["base"]),
+      date: decode_date(m["date"]),
+      rates: m["rates"]
+      |> Map.new(fn {key, value} -> {key, decode_rates_value(value)} end),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/ad8be.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/ad8be.json/default/QuickType.ex
index a2da62e..a0bb327 100644
--- a/base/elixir/test/inputs/json/misc/ad8be.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/ad8be.json/default/QuickType.ex
@@ -61,9 +61,15 @@ defmodule Identifier do
           scheme: Scheme.t()
         }
 
+  def decode_identifier(value) when is_binary(value), do: value
+  def decode_identifier(_), do: {:error, "Unexpected type when decoding Identifier.identifier"}
+
+  def encode_identifier(value) when is_binary(value), do: value
+  def encode_identifier(_), do: {:error, "Unexpected type when encoding Identifier.identifier"}
+
   def from_map(m) do
     %Identifier{
-      identifier: m["identifier"],
+      identifier: decode_identifier(m["identifier"]),
       scheme: Scheme.decode(m["scheme"]),
     }
   end
@@ -203,10 +209,16 @@ defmodule Link do
           url: String.t()
         }
 
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Link.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Link.url"}
+
   def from_map(m) do
     %Link{
       note: Note.decode(m["note"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
     }
   end
 
@@ -239,9 +251,15 @@ defmodule OtherName do
           note: nil | String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding OtherName.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding OtherName.name"}
+
   def from_map(m) do
     %OtherName{
-      name: m["name"],
+      name: decode_name(m["name"]),
       note: m["note"],
     }
   end
@@ -370,11 +388,17 @@ defmodule Text do
           url: String.t()
         }
 
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Text.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Text.url"}
+
   def from_map(m) do
     %Text{
       media_type: MediaType.decode(m["media_type"]),
       title: Title.decode(m["title"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
     }
   end
 
@@ -414,13 +438,55 @@ defmodule TopLevelElement do
           text: [Text.t()]
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_identifiers(value) when is_list(value), do: value
+  def decode_identifiers(_), do: {:error, "Unexpected type when decoding TopLevelElement.identifiers"}
+
+  def encode_identifiers(value) when is_list(value), do: value
+  def encode_identifiers(_), do: {:error, "Unexpected type when encoding TopLevelElement.identifiers"}
+
+  def decode_keywords(value) when is_list(value), do: value
+  def decode_keywords(_), do: {:error, "Unexpected type when decoding TopLevelElement.keywords"}
+
+  def encode_keywords(value) when is_list(value), do: value
+  def encode_keywords(_), do: {:error, "Unexpected type when encoding TopLevelElement.keywords"}
+
+  def decode_links(value) when is_list(value), do: value
+  def decode_links(_), do: {:error, "Unexpected type when decoding TopLevelElement.links"}
+
+  def encode_links(value) when is_list(value), do: value
+  def encode_links(_), do: {:error, "Unexpected type when encoding TopLevelElement.links"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.name"}
+
+  def decode_other_names(value) when is_list(value), do: value
+  def decode_other_names(_), do: {:error, "Unexpected type when decoding TopLevelElement.other_names"}
+
+  def encode_other_names(value) when is_list(value), do: value
+  def encode_other_names(_), do: {:error, "Unexpected type when encoding TopLevelElement.other_names"}
+
+  def decode_text(value) when is_list(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding TopLevelElement.text"}
+
+  def encode_text(value) when is_list(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding TopLevelElement.text"}
+
   def from_map(m) do
     %TopLevelElement{
-      id: m["id"],
+      id: decode_id(m["id"]),
       identifiers: Enum.map(m["identifiers"], &Identifier.from_map/1),
       keywords: Enum.map(m["keywords"], &KeywordElement.decode/1),
       links: Enum.map(m["links"], &Link.from_map/1),
-      name: m["name"],
+      name: decode_name(m["name"]),
       other_names: Enum.map(m["other_names"], &OtherName.from_map/1),
       superseded_by: m["superseded_by"],
       text: Enum.map(m["text"], &Text.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/ae7f0.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/ae7f0.json/default/QuickType.ex
index 8c54ca1..d2c9e21 100644
--- a/base/elixir/test/inputs/json/misc/ae7f0.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/ae7f0.json/default/QuickType.ex
@@ -326,68 +326,378 @@ defmodule ChildData do
           visited: boolean()
         }
 
+  def decode_approved_at_utc(value) when is_nil(value), do: value
+  def decode_approved_at_utc(_), do: {:error, "Unexpected type when decoding ChildData.approved_at_utc"}
+
+  def encode_approved_at_utc(value) when is_nil(value), do: value
+  def encode_approved_at_utc(_), do: {:error, "Unexpected type when encoding ChildData.approved_at_utc"}
+
+  def decode_approved_by(value) when is_nil(value), do: value
+  def decode_approved_by(_), do: {:error, "Unexpected type when decoding ChildData.approved_by"}
+
+  def encode_approved_by(value) when is_nil(value), do: value
+  def encode_approved_by(_), do: {:error, "Unexpected type when encoding ChildData.approved_by"}
+
+  def decode_archived(value) when is_boolean(value), do: value
+  def decode_archived(_), do: {:error, "Unexpected type when decoding ChildData.archived"}
+
+  def encode_archived(value) when is_boolean(value), do: value
+  def encode_archived(_), do: {:error, "Unexpected type when encoding ChildData.archived"}
+
+  def decode_author(value) when is_binary(value), do: value
+  def decode_author(_), do: {:error, "Unexpected type when decoding ChildData.author"}
+
+  def encode_author(value) when is_binary(value), do: value
+  def encode_author(_), do: {:error, "Unexpected type when encoding ChildData.author"}
+
+  def decode_author_flair_css_class(value) when is_nil(value), do: value
+  def decode_author_flair_css_class(_), do: {:error, "Unexpected type when decoding ChildData.author_flair_css_class"}
+
+  def encode_author_flair_css_class(value) when is_nil(value), do: value
+  def encode_author_flair_css_class(_), do: {:error, "Unexpected type when encoding ChildData.author_flair_css_class"}
+
+  def decode_author_flair_text(value) when is_nil(value), do: value
+  def decode_author_flair_text(_), do: {:error, "Unexpected type when decoding ChildData.author_flair_text"}
+
+  def encode_author_flair_text(value) when is_nil(value), do: value
+  def encode_author_flair_text(_), do: {:error, "Unexpected type when encoding ChildData.author_flair_text"}
+
+  def decode_banned_at_utc(value) when is_nil(value), do: value
+  def decode_banned_at_utc(_), do: {:error, "Unexpected type when decoding ChildData.banned_at_utc"}
+
+  def encode_banned_at_utc(value) when is_nil(value), do: value
+  def encode_banned_at_utc(_), do: {:error, "Unexpected type when encoding ChildData.banned_at_utc"}
+
+  def decode_banned_by(value) when is_nil(value), do: value
+  def decode_banned_by(_), do: {:error, "Unexpected type when decoding ChildData.banned_by"}
+
+  def encode_banned_by(value) when is_nil(value), do: value
+  def encode_banned_by(_), do: {:error, "Unexpected type when encoding ChildData.banned_by"}
+
+  def decode_brand_safe(value) when is_boolean(value), do: value
+  def decode_brand_safe(_), do: {:error, "Unexpected type when decoding ChildData.brand_safe"}
+
+  def encode_brand_safe(value) when is_boolean(value), do: value
+  def encode_brand_safe(_), do: {:error, "Unexpected type when encoding ChildData.brand_safe"}
+
+  def decode_can_gild(value) when is_boolean(value), do: value
+  def decode_can_gild(_), do: {:error, "Unexpected type when decoding ChildData.can_gild"}
+
+  def encode_can_gild(value) when is_boolean(value), do: value
+  def encode_can_gild(_), do: {:error, "Unexpected type when encoding ChildData.can_gild"}
+
+  def decode_can_mod_post(value) when is_boolean(value), do: value
+  def decode_can_mod_post(_), do: {:error, "Unexpected type when decoding ChildData.can_mod_post"}
+
+  def encode_can_mod_post(value) when is_boolean(value), do: value
+  def encode_can_mod_post(_), do: {:error, "Unexpected type when encoding ChildData.can_mod_post"}
+
+  def decode_clicked(value) when is_boolean(value), do: value
+  def decode_clicked(_), do: {:error, "Unexpected type when decoding ChildData.clicked"}
+
+  def encode_clicked(value) when is_boolean(value), do: value
+  def encode_clicked(_), do: {:error, "Unexpected type when encoding ChildData.clicked"}
+
+  def decode_contest_mode(value) when is_boolean(value), do: value
+  def decode_contest_mode(_), do: {:error, "Unexpected type when decoding ChildData.contest_mode"}
+
+  def encode_contest_mode(value) when is_boolean(value), do: value
+  def encode_contest_mode(_), do: {:error, "Unexpected type when encoding ChildData.contest_mode"}
+
+  def decode_created(value) when is_float(value), do: value
+  def decode_created(value) when is_integer(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding ChildData.created"}
+
+  def encode_created(value) when is_float(value), do: value
+  def encode_created(value) when is_integer(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding ChildData.created"}
+
+  def decode_created_utc(value) when is_float(value), do: value
+  def decode_created_utc(value) when is_integer(value), do: value
+  def decode_created_utc(_), do: {:error, "Unexpected type when decoding ChildData.created_utc"}
+
+  def encode_created_utc(value) when is_float(value), do: value
+  def encode_created_utc(value) when is_integer(value), do: value
+  def encode_created_utc(_), do: {:error, "Unexpected type when encoding ChildData.created_utc"}
+
+  def decode_distinguished(value) when is_nil(value), do: value
+  def decode_distinguished(_), do: {:error, "Unexpected type when decoding ChildData.distinguished"}
+
+  def encode_distinguished(value) when is_nil(value), do: value
+  def encode_distinguished(_), do: {:error, "Unexpected type when encoding ChildData.distinguished"}
+
+  def decode_downs(value) when is_integer(value), do: value
+  def decode_downs(_), do: {:error, "Unexpected type when decoding ChildData.downs"}
+
+  def encode_downs(value) when is_integer(value), do: value
+  def encode_downs(_), do: {:error, "Unexpected type when encoding ChildData.downs"}
+
+  def decode_edited(value) when is_boolean(value), do: value
+  def decode_edited(_), do: {:error, "Unexpected type when decoding ChildData.edited"}
+
+  def encode_edited(value) when is_boolean(value), do: value
+  def encode_edited(_), do: {:error, "Unexpected type when encoding ChildData.edited"}
+
+  def decode_gilded(value) when is_integer(value), do: value
+  def decode_gilded(_), do: {:error, "Unexpected type when decoding ChildData.gilded"}
+
+  def encode_gilded(value) when is_integer(value), do: value
+  def encode_gilded(_), do: {:error, "Unexpected type when encoding ChildData.gilded"}
+
+  def decode_hidden(value) when is_boolean(value), do: value
+  def decode_hidden(_), do: {:error, "Unexpected type when decoding ChildData.hidden"}
+
+  def encode_hidden(value) when is_boolean(value), do: value
+  def encode_hidden(_), do: {:error, "Unexpected type when encoding ChildData.hidden"}
+
+  def decode_hide_score(value) when is_boolean(value), do: value
+  def decode_hide_score(_), do: {:error, "Unexpected type when decoding ChildData.hide_score"}
+
+  def encode_hide_score(value) when is_boolean(value), do: value
+  def encode_hide_score(_), do: {:error, "Unexpected type when encoding ChildData.hide_score"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding ChildData.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding ChildData.id"}
+
+  def decode_is_self(value) when is_boolean(value), do: value
+  def decode_is_self(_), do: {:error, "Unexpected type when decoding ChildData.is_self"}
+
+  def encode_is_self(value) when is_boolean(value), do: value
+  def encode_is_self(_), do: {:error, "Unexpected type when encoding ChildData.is_self"}
+
+  def decode_is_video(value) when is_boolean(value), do: value
+  def decode_is_video(_), do: {:error, "Unexpected type when decoding ChildData.is_video"}
+
+  def encode_is_video(value) when is_boolean(value), do: value
+  def encode_is_video(_), do: {:error, "Unexpected type when encoding ChildData.is_video"}
+
+  def decode_likes(value) when is_nil(value), do: value
+  def decode_likes(_), do: {:error, "Unexpected type when decoding ChildData.likes"}
+
+  def encode_likes(value) when is_nil(value), do: value
+  def encode_likes(_), do: {:error, "Unexpected type when encoding ChildData.likes"}
+
+  def decode_locked(value) when is_boolean(value), do: value
+  def decode_locked(_), do: {:error, "Unexpected type when decoding ChildData.locked"}
+
+  def encode_locked(value) when is_boolean(value), do: value
+  def encode_locked(_), do: {:error, "Unexpected type when encoding ChildData.locked"}
+
+  def decode_media(value) when is_nil(value), do: value
+  def decode_media(_), do: {:error, "Unexpected type when decoding ChildData.media"}
+
+  def encode_media(value) when is_nil(value), do: value
+  def encode_media(_), do: {:error, "Unexpected type when encoding ChildData.media"}
+
+  def decode_mod_reports(value) when is_list(value), do: value
+  def decode_mod_reports(_), do: {:error, "Unexpected type when decoding ChildData.mod_reports"}
+
+  def encode_mod_reports(value) when is_list(value), do: value
+  def encode_mod_reports(_), do: {:error, "Unexpected type when encoding ChildData.mod_reports"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding ChildData.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding ChildData.name"}
+
+  def decode_num_comments(value) when is_integer(value), do: value
+  def decode_num_comments(_), do: {:error, "Unexpected type when decoding ChildData.num_comments"}
+
+  def encode_num_comments(value) when is_integer(value), do: value
+  def encode_num_comments(_), do: {:error, "Unexpected type when encoding ChildData.num_comments"}
+
+  def decode_num_reports(value) when is_nil(value), do: value
+  def decode_num_reports(_), do: {:error, "Unexpected type when decoding ChildData.num_reports"}
+
+  def encode_num_reports(value) when is_nil(value), do: value
+  def encode_num_reports(_), do: {:error, "Unexpected type when encoding ChildData.num_reports"}
+
+  def decode_over_18(value) when is_boolean(value), do: value
+  def decode_over_18(_), do: {:error, "Unexpected type when decoding ChildData.over_18"}
+
+  def encode_over_18(value) when is_boolean(value), do: value
+  def encode_over_18(_), do: {:error, "Unexpected type when encoding ChildData.over_18"}
+
+  def decode_permalink(value) when is_binary(value), do: value
+  def decode_permalink(_), do: {:error, "Unexpected type when decoding ChildData.permalink"}
+
+  def encode_permalink(value) when is_binary(value), do: value
+  def encode_permalink(_), do: {:error, "Unexpected type when encoding ChildData.permalink"}
+
+  def decode_quarantine(value) when is_boolean(value), do: value
+  def decode_quarantine(_), do: {:error, "Unexpected type when decoding ChildData.quarantine"}
+
+  def encode_quarantine(value) when is_boolean(value), do: value
+  def encode_quarantine(_), do: {:error, "Unexpected type when encoding ChildData.quarantine"}
+
+  def decode_removal_reason(value) when is_nil(value), do: value
+  def decode_removal_reason(_), do: {:error, "Unexpected type when decoding ChildData.removal_reason"}
+
+  def encode_removal_reason(value) when is_nil(value), do: value
+  def encode_removal_reason(_), do: {:error, "Unexpected type when encoding ChildData.removal_reason"}
+
+  def decode_report_reasons(value) when is_nil(value), do: value
+  def decode_report_reasons(_), do: {:error, "Unexpected type when decoding ChildData.report_reasons"}
+
+  def encode_report_reasons(value) when is_nil(value), do: value
+  def encode_report_reasons(_), do: {:error, "Unexpected type when encoding ChildData.report_reasons"}
+
+  def decode_saved(value) when is_boolean(value), do: value
+  def decode_saved(_), do: {:error, "Unexpected type when decoding ChildData.saved"}
+
+  def encode_saved(value) when is_boolean(value), do: value
+  def encode_saved(_), do: {:error, "Unexpected type when encoding ChildData.saved"}
+
+  def decode_score(value) when is_integer(value), do: value
+  def decode_score(_), do: {:error, "Unexpected type when decoding ChildData.score"}
+
+  def encode_score(value) when is_integer(value), do: value
+  def encode_score(_), do: {:error, "Unexpected type when encoding ChildData.score"}
+
+  def decode_secure_media(value) when is_nil(value), do: value
+  def decode_secure_media(_), do: {:error, "Unexpected type when decoding ChildData.secure_media"}
+
+  def encode_secure_media(value) when is_nil(value), do: value
+  def encode_secure_media(_), do: {:error, "Unexpected type when encoding ChildData.secure_media"}
+
+  def decode_selftext(value) when is_binary(value), do: value
+  def decode_selftext(_), do: {:error, "Unexpected type when decoding ChildData.selftext"}
+
+  def encode_selftext(value) when is_binary(value), do: value
+  def encode_selftext(_), do: {:error, "Unexpected type when encoding ChildData.selftext"}
+
+  def decode_selftext_html(value) when is_nil(value), do: value
+  def decode_selftext_html(_), do: {:error, "Unexpected type when decoding ChildData.selftext_html"}
+
+  def encode_selftext_html(value) when is_nil(value), do: value
+  def encode_selftext_html(_), do: {:error, "Unexpected type when encoding ChildData.selftext_html"}
+
+  def decode_spoiler(value) when is_boolean(value), do: value
+  def decode_spoiler(_), do: {:error, "Unexpected type when decoding ChildData.spoiler"}
+
+  def encode_spoiler(value) when is_boolean(value), do: value
+  def encode_spoiler(_), do: {:error, "Unexpected type when encoding ChildData.spoiler"}
+
+  def decode_stickied(value) when is_boolean(value), do: value
+  def decode_stickied(_), do: {:error, "Unexpected type when decoding ChildData.stickied"}
+
+  def encode_stickied(value) when is_boolean(value), do: value
+  def encode_stickied(_), do: {:error, "Unexpected type when encoding ChildData.stickied"}
+
+  def decode_suggested_sort(value) when is_nil(value), do: value
+  def decode_suggested_sort(_), do: {:error, "Unexpected type when decoding ChildData.suggested_sort"}
+
+  def encode_suggested_sort(value) when is_nil(value), do: value
+  def encode_suggested_sort(_), do: {:error, "Unexpected type when encoding ChildData.suggested_sort"}
+
+  def decode_thumbnail(value) when is_binary(value), do: value
+  def decode_thumbnail(_), do: {:error, "Unexpected type when decoding ChildData.thumbnail"}
+
+  def encode_thumbnail(value) when is_binary(value), do: value
+  def encode_thumbnail(_), do: {:error, "Unexpected type when encoding ChildData.thumbnail"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding ChildData.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding ChildData.title"}
+
+  def decode_ups(value) when is_integer(value), do: value
+  def decode_ups(_), do: {:error, "Unexpected type when decoding ChildData.ups"}
+
+  def encode_ups(value) when is_integer(value), do: value
+  def encode_ups(_), do: {:error, "Unexpected type when encoding ChildData.ups"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding ChildData.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding ChildData.url"}
+
+  def decode_user_reports(value) when is_list(value), do: value
+  def decode_user_reports(_), do: {:error, "Unexpected type when decoding ChildData.user_reports"}
+
+  def encode_user_reports(value) when is_list(value), do: value
+  def encode_user_reports(_), do: {:error, "Unexpected type when encoding ChildData.user_reports"}
+
+  def decode_view_count(value) when is_nil(value), do: value
+  def decode_view_count(_), do: {:error, "Unexpected type when decoding ChildData.view_count"}
+
+  def encode_view_count(value) when is_nil(value), do: value
+  def encode_view_count(_), do: {:error, "Unexpected type when encoding ChildData.view_count"}
+
+  def decode_visited(value) when is_boolean(value), do: value
+  def decode_visited(_), do: {:error, "Unexpected type when decoding ChildData.visited"}
+
+  def encode_visited(value) when is_boolean(value), do: value
+  def encode_visited(_), do: {:error, "Unexpected type when encoding ChildData.visited"}
+
   def from_map(m) do
     %ChildData{
-      approved_at_utc: m["approved_at_utc"],
-      approved_by: m["approved_by"],
-      archived: m["archived"],
-      author: m["author"],
-      author_flair_css_class: m["author_flair_css_class"],
-      author_flair_text: m["author_flair_text"],
-      banned_at_utc: m["banned_at_utc"],
-      banned_by: m["banned_by"],
-      brand_safe: m["brand_safe"],
-      can_gild: m["can_gild"],
-      can_mod_post: m["can_mod_post"],
-      clicked: m["clicked"],
-      contest_mode: m["contest_mode"],
-      created: m["created"],
-      created_utc: m["created_utc"],
-      distinguished: m["distinguished"],
+      approved_at_utc: decode_approved_at_utc(m["approved_at_utc"]),
+      approved_by: decode_approved_by(m["approved_by"]),
+      archived: decode_archived(m["archived"]),
+      author: decode_author(m["author"]),
+      author_flair_css_class: decode_author_flair_css_class(m["author_flair_css_class"]),
+      author_flair_text: decode_author_flair_text(m["author_flair_text"]),
+      banned_at_utc: decode_banned_at_utc(m["banned_at_utc"]),
+      banned_by: decode_banned_by(m["banned_by"]),
+      brand_safe: decode_brand_safe(m["brand_safe"]),
+      can_gild: decode_can_gild(m["can_gild"]),
+      can_mod_post: decode_can_mod_post(m["can_mod_post"]),
+      clicked: decode_clicked(m["clicked"]),
+      contest_mode: decode_contest_mode(m["contest_mode"]),
+      created: decode_created(m["created"]),
+      created_utc: decode_created_utc(m["created_utc"]),
+      distinguished: decode_distinguished(m["distinguished"]),
       domain: Domain.decode(m["domain"]),
-      downs: m["downs"],
-      edited: m["edited"],
-      gilded: m["gilded"],
-      hidden: m["hidden"],
-      hide_score: m["hide_score"],
-      id: m["id"],
-      is_self: m["is_self"],
-      is_video: m["is_video"],
-      likes: m["likes"],
+      downs: decode_downs(m["downs"]),
+      edited: decode_edited(m["edited"]),
+      gilded: decode_gilded(m["gilded"]),
+      hidden: decode_hidden(m["hidden"]),
+      hide_score: decode_hide_score(m["hide_score"]),
+      id: decode_id(m["id"]),
+      is_self: decode_is_self(m["is_self"]),
+      is_video: decode_is_video(m["is_video"]),
+      likes: decode_likes(m["likes"]),
       link_flair_css_class: m["link_flair_css_class"],
       link_flair_text: m["link_flair_text"],
-      locked: m["locked"],
-      media: m["media"],
+      locked: decode_locked(m["locked"]),
+      media: decode_media(m["media"]),
       media_embed: MediaEmbed.from_map(m["media_embed"]),
-      mod_reports: m["mod_reports"],
-      name: m["name"],
-      num_comments: m["num_comments"],
-      num_reports: m["num_reports"],
-      over_18: m["over_18"],
-      permalink: m["permalink"],
-      quarantine: m["quarantine"],
-      removal_reason: m["removal_reason"],
-      report_reasons: m["report_reasons"],
-      saved: m["saved"],
-      score: m["score"],
-      secure_media: m["secure_media"],
+      mod_reports: decode_mod_reports(m["mod_reports"]),
+      name: decode_name(m["name"]),
+      num_comments: decode_num_comments(m["num_comments"]),
+      num_reports: decode_num_reports(m["num_reports"]),
+      over_18: decode_over_18(m["over_18"]),
+      permalink: decode_permalink(m["permalink"]),
+      quarantine: decode_quarantine(m["quarantine"]),
+      removal_reason: decode_removal_reason(m["removal_reason"]),
+      report_reasons: decode_report_reasons(m["report_reasons"]),
+      saved: decode_saved(m["saved"]),
+      score: decode_score(m["score"]),
+      secure_media: decode_secure_media(m["secure_media"]),
       secure_media_embed: MediaEmbed.from_map(m["secure_media_embed"]),
-      selftext: m["selftext"],
-      selftext_html: m["selftext_html"],
-      spoiler: m["spoiler"],
-      stickied: m["stickied"],
+      selftext: decode_selftext(m["selftext"]),
+      selftext_html: decode_selftext_html(m["selftext_html"]),
+      spoiler: decode_spoiler(m["spoiler"]),
+      stickied: decode_stickied(m["stickied"]),
       subreddit: Subreddit.decode(m["subreddit"]),
       subreddit_id: SubredditID.decode(m["subreddit_id"]),
       subreddit_name_prefixed: SubredditNamePrefixed.decode(m["subreddit_name_prefixed"]),
       subreddit_type: SubredditType.decode(m["subreddit_type"]),
-      suggested_sort: m["suggested_sort"],
-      thumbnail: m["thumbnail"],
-      title: m["title"],
-      ups: m["ups"],
-      url: m["url"],
-      user_reports: m["user_reports"],
-      view_count: m["view_count"],
-      visited: m["visited"],
+      suggested_sort: decode_suggested_sort(m["suggested_sort"]),
+      thumbnail: decode_thumbnail(m["thumbnail"]),
+      title: decode_title(m["title"]),
+      ups: decode_ups(m["ups"]),
+      url: decode_url(m["url"]),
+      user_reports: decode_user_reports(m["user_reports"]),
+      view_count: decode_view_count(m["view_count"]),
+      visited: decode_visited(m["visited"]),
     }
   end
 
@@ -561,12 +871,36 @@ defmodule TopLevelData do
           modhash: String.t()
         }
 
+  def decode_before(value) when is_nil(value), do: value
+  def decode_before(_), do: {:error, "Unexpected type when decoding TopLevelData.before"}
+
+  def encode_before(value) when is_nil(value), do: value
+  def encode_before(_), do: {:error, "Unexpected type when encoding TopLevelData.before"}
+
+  def decode_children(value) when is_list(value), do: value
+  def decode_children(_), do: {:error, "Unexpected type when decoding TopLevelData.children"}
+
+  def encode_children(value) when is_list(value), do: value
+  def encode_children(_), do: {:error, "Unexpected type when encoding TopLevelData.children"}
+
+  def decode_data_after(value) when is_binary(value), do: value
+  def decode_data_after(_), do: {:error, "Unexpected type when decoding TopLevelData.data_after"}
+
+  def encode_data_after(value) when is_binary(value), do: value
+  def encode_data_after(_), do: {:error, "Unexpected type when encoding TopLevelData.data_after"}
+
+  def decode_modhash(value) when is_binary(value), do: value
+  def decode_modhash(_), do: {:error, "Unexpected type when decoding TopLevelData.modhash"}
+
+  def encode_modhash(value) when is_binary(value), do: value
+  def encode_modhash(_), do: {:error, "Unexpected type when encoding TopLevelData.modhash"}
+
   def from_map(m) do
     %TopLevelData{
-      before: m["before"],
+      before: decode_before(m["before"]),
       children: Enum.map(m["children"], &Child.from_map/1),
-      data_after: m["after"],
-      modhash: m["modhash"],
+      data_after: decode_data_after(m["after"]),
+      modhash: decode_modhash(m["modhash"]),
     }
   end
 
@@ -601,10 +935,16 @@ defmodule TopLevel do
           kind: String.t()
         }
 
+  def decode_kind(value) when is_binary(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding TopLevel.kind"}
+
+  def encode_kind(value) when is_binary(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding TopLevel.kind"}
+
   def from_map(m) do
     %TopLevel{
       data: TopLevelData.from_map(m["data"]),
-      kind: m["kind"],
+      kind: decode_kind(m["kind"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/ae9ca.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/ae9ca.json/default/QuickType.ex
index ad42659..fbf612d 100644
--- a/base/elixir/test/inputs/json/misc/ae9ca.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/ae9ca.json/default/QuickType.ex
@@ -59,9 +59,15 @@ defmodule Geometry do
           type: GeometryType.t()
         }
 
+  def decode_coordinates(value) when is_list(value), do: value
+  def decode_coordinates(_), do: {:error, "Unexpected type when decoding Geometry.coordinates"}
+
+  def encode_coordinates(value) when is_list(value), do: value
+  def encode_coordinates(_), do: {:error, "Unexpected type when encoding Geometry.coordinates"}
+
   def from_map(m) do
     %Geometry{
-      coordinates: m["coordinates"],
+      coordinates: decode_coordinates(m["coordinates"]),
       type: GeometryType.decode(m["type"]),
     }
   end
@@ -243,17 +249,59 @@ defmodule Properties do
           ward: Ward.t()
         }
 
+  def decode_area(value) when is_binary(value), do: value
+  def decode_area(_), do: {:error, "Unexpected type when decoding Properties.area"}
+
+  def encode_area(value) when is_binary(value), do: value
+  def encode_area(_), do: {:error, "Unexpected type when encoding Properties.area"}
+
+  def decode_central_asset_id(value) when is_binary(value), do: value
+  def decode_central_asset_id(_), do: {:error, "Unexpected type when decoding Properties.central_asset_id"}
+
+  def encode_central_asset_id(value) when is_binary(value), do: value
+  def encode_central_asset_id(_), do: {:error, "Unexpected type when encoding Properties.central_asset_id"}
+
+  def decode_feature_location(value) when is_binary(value), do: value
+  def decode_feature_location(_), do: {:error, "Unexpected type when decoding Properties.feature_location"}
+
+  def encode_feature_location(value) when is_binary(value), do: value
+  def encode_feature_location(_), do: {:error, "Unexpected type when encoding Properties.feature_location"}
+
+  def decode_lat(value) when is_binary(value), do: value
+  def decode_lat(_), do: {:error, "Unexpected type when decoding Properties.lat"}
+
+  def encode_lat(value) when is_binary(value), do: value
+  def encode_lat(_), do: {:error, "Unexpected type when encoding Properties.lat"}
+
+  def decode_long(value) when is_binary(value), do: value
+  def decode_long(_), do: {:error, "Unexpected type when decoding Properties.long"}
+
+  def encode_long(value) when is_binary(value), do: value
+  def encode_long(_), do: {:error, "Unexpected type when encoding Properties.long"}
+
+  def decode_number(value) when is_binary(value), do: value
+  def decode_number(_), do: {:error, "Unexpected type when decoding Properties.number"}
+
+  def encode_number(value) when is_binary(value), do: value
+  def encode_number(_), do: {:error, "Unexpected type when encoding Properties.number"}
+
+  def decode_site_name(value) when is_binary(value), do: value
+  def decode_site_name(_), do: {:error, "Unexpected type when decoding Properties.site_name"}
+
+  def encode_site_name(value) when is_binary(value), do: value
+  def encode_site_name(_), do: {:error, "Unexpected type when encoding Properties.site_name"}
+
   def from_map(m) do
     %Properties{
-      area: m["Area"],
-      central_asset_id: m["Central Asset ID"],
+      area: decode_area(m["Area"]),
+      central_asset_id: decode_central_asset_id(m["Central Asset ID"]),
       class: Class.decode(m["Class"]),
-      feature_location: m["Feature Location"],
-      lat: m["lat"],
-      long: m["long"],
+      feature_location: decode_feature_location(m["Feature Location"]),
+      lat: decode_lat(m["lat"]),
+      long: decode_long(m["long"]),
       maintaining_authority: MaintainingAuthority.decode(m["Maintaining Authority"]),
-      number: m["Number"],
-      site_name: m["Site Name"],
+      number: decode_number(m["Number"]),
+      site_name: decode_site_name(m["Site Name"]),
       ward: Ward.decode(m["Ward"]),
     }
   end
@@ -380,11 +428,29 @@ defmodule TopLevel do
           type: String.t()
         }
 
+  def decode_features(value) when is_list(value), do: value
+  def decode_features(_), do: {:error, "Unexpected type when decoding TopLevel.features"}
+
+  def encode_features(value) when is_list(value), do: value
+  def encode_features(_), do: {:error, "Unexpected type when encoding TopLevel.features"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding TopLevel.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding TopLevel.type"}
+
   def from_map(m) do
     %TopLevel{
       features: Enum.map(m["features"], &Feature.from_map/1),
-      name: m["name"],
-      type: m["type"],
+      name: decode_name(m["name"]),
+      type: decode_type(m["type"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/af2d1.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/af2d1.json/default/QuickType.ex
index bf15b60..fe939a6 100644
--- a/base/elixir/test/inputs/json/misc/af2d1.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/af2d1.json/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule CRSProperties do
           name: String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding CRSProperties.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding CRSProperties.name"}
+
   def from_map(m) do
     %CRSProperties{
-      name: m["name"],
+      name: decode_name(m["name"]),
     }
   end
 
@@ -47,10 +53,16 @@ defmodule CRS do
           type: String.t()
         }
 
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding CRS.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding CRS.type"}
+
   def from_map(m) do
     %CRS{
       properties: CRSProperties.from_map(m["properties"]),
-      type: m["type"],
+      type: decode_type(m["type"]),
     }
   end
 
@@ -128,9 +140,15 @@ defmodule Geometry do
           type: GeometryType.t()
         }
 
+  def decode_coordinates(value) when is_list(value), do: value
+  def decode_coordinates(_), do: {:error, "Unexpected type when decoding Geometry.coordinates"}
+
+  def encode_coordinates(value) when is_list(value), do: value
+  def encode_coordinates(_), do: {:error, "Unexpected type when encoding Geometry.coordinates"}
+
   def from_map(m) do
     %Geometry{
-      coordinates: m["coordinates"],
+      coordinates: decode_coordinates(m["coordinates"]),
       type: GeometryType.decode(m["type"]),
     }
   end
@@ -572,46 +590,188 @@ defmodule FeatureProperties do
           updateuser: nil
         }
 
+  def decode_area(value) when is_float(value), do: value
+  def decode_area(value) when is_integer(value), do: value
+  def decode_area(_), do: {:error, "Unexpected type when decoding FeatureProperties.area"}
+
+  def encode_area(value) when is_float(value), do: value
+  def encode_area(value) when is_integer(value), do: value
+  def encode_area(_), do: {:error, "Unexpected type when encoding FeatureProperties.area"}
+
+  def decode_asset_numb(value) when is_binary(value), do: value
+  def decode_asset_numb(_), do: {:error, "Unexpected type when decoding FeatureProperties.asset_numb"}
+
+  def encode_asset_numb(value) when is_binary(value), do: value
+  def encode_asset_numb(_), do: {:error, "Unexpected type when encoding FeatureProperties.asset_numb"}
+
+  def decode_condition(value) when is_integer(value), do: value
+  def decode_condition(_), do: {:error, "Unexpected type when decoding FeatureProperties.condition"}
+
+  def encode_condition(value) when is_integer(value), do: value
+  def encode_condition(_), do: {:error, "Unexpected type when encoding FeatureProperties.condition"}
+
+  def decode_createdate(value) when is_nil(value), do: value
+  def decode_createdate(_), do: {:error, "Unexpected type when decoding FeatureProperties.createdate"}
+
+  def encode_createdate(value) when is_nil(value), do: value
+  def encode_createdate(_), do: {:error, "Unexpected type when encoding FeatureProperties.createdate"}
+
+  def decode_createuser(value) when is_nil(value), do: value
+  def decode_createuser(_), do: {:error, "Unexpected type when decoding FeatureProperties.createuser"}
+
+  def encode_createuser(value) when is_nil(value), do: value
+  def encode_createuser(_), do: {:error, "Unexpected type when encoding FeatureProperties.createuser"}
+
+  def decode_disposal_d(value) when is_nil(value), do: value
+  def decode_disposal_d(_), do: {:error, "Unexpected type when decoding FeatureProperties.disposal_d"}
+
+  def encode_disposal_d(value) when is_nil(value), do: value
+  def encode_disposal_d(_), do: {:error, "Unexpected type when encoding FeatureProperties.disposal_d"}
+
+  def decode_documents(value) when is_binary(value), do: value
+  def decode_documents(_), do: {:error, "Unexpected type when decoding FeatureProperties.documents"}
+
+  def encode_documents(value) when is_binary(value), do: value
+  def encode_documents(_), do: {:error, "Unexpected type when encoding FeatureProperties.documents"}
+
+  def decode_historic_c(value) when is_integer(value), do: value
+  def decode_historic_c(_), do: {:error, "Unexpected type when decoding FeatureProperties.historic_c"}
+
+  def encode_historic_c(value) when is_integer(value), do: value
+  def encode_historic_c(_), do: {:error, "Unexpected type when encoding FeatureProperties.historic_c"}
+
+  def decode_inspection(value) when is_binary(value), do: value
+  def decode_inspection(_), do: {:error, "Unexpected type when decoding FeatureProperties.inspection"}
+
+  def encode_inspection(value) when is_binary(value), do: value
+  def encode_inspection(_), do: {:error, "Unexpected type when encoding FeatureProperties.inspection"}
+
+  def decode_inspectors(value) when is_nil(value), do: value
+  def decode_inspectors(_), do: {:error, "Unexpected type when decoding FeatureProperties.inspectors"}
+
+  def encode_inspectors(value) when is_nil(value), do: value
+  def encode_inspectors(_), do: {:error, "Unexpected type when encoding FeatureProperties.inspectors"}
+
+  def decode_last_updat(value) when is_nil(value), do: value
+  def decode_last_updat(_), do: {:error, "Unexpected type when decoding FeatureProperties.last_updat"}
+
+  def encode_last_updat(value) when is_nil(value), do: value
+  def encode_last_updat(_), do: {:error, "Unexpected type when encoding FeatureProperties.last_updat"}
+
+  def decode_mi_prinx(value) when is_integer(value), do: value
+  def decode_mi_prinx(_), do: {:error, "Unexpected type when decoding FeatureProperties.mi_prinx"}
+
+  def encode_mi_prinx(value) when is_integer(value), do: value
+  def encode_mi_prinx(_), do: {:error, "Unexpected type when encoding FeatureProperties.mi_prinx"}
+
+  def decode_number_lan(value) when is_integer(value), do: value
+  def decode_number_lan(_), do: {:error, "Unexpected type when decoding FeatureProperties.number_lan"}
+
+  def encode_number_lan(value) when is_integer(value), do: value
+  def encode_number_lan(_), do: {:error, "Unexpected type when encoding FeatureProperties.number_lan"}
+
+  def decode_rec_id(value) when is_integer(value), do: value
+  def decode_rec_id(_), do: {:error, "Unexpected type when decoding FeatureProperties.rec_id"}
+
+  def encode_rec_id(value) when is_integer(value), do: value
+  def encode_rec_id(_), do: {:error, "Unexpected type when encoding FeatureProperties.rec_id"}
+
+  def decode_shape_area(value) when is_float(value), do: value
+  def decode_shape_area(value) when is_integer(value), do: value
+  def decode_shape_area(_), do: {:error, "Unexpected type when decoding FeatureProperties.shape_area"}
+
+  def encode_shape_area(value) when is_float(value), do: value
+  def encode_shape_area(value) when is_integer(value), do: value
+  def encode_shape_area(_), do: {:error, "Unexpected type when encoding FeatureProperties.shape_area"}
+
+  def decode_shape_leng(value) when is_float(value), do: value
+  def decode_shape_leng(value) when is_integer(value), do: value
+  def decode_shape_leng(_), do: {:error, "Unexpected type when decoding FeatureProperties.shape_leng"}
+
+  def encode_shape_leng(value) when is_float(value), do: value
+  def encode_shape_leng(value) when is_integer(value), do: value
+  def encode_shape_leng(_), do: {:error, "Unexpected type when encoding FeatureProperties.shape_leng"}
+
+  def decode_survey_num(value) when is_nil(value), do: value
+  def decode_survey_num(_), do: {:error, "Unexpected type when decoding FeatureProperties.survey_num"}
+
+  def encode_survey_num(value) when is_nil(value), do: value
+  def encode_survey_num(_), do: {:error, "Unexpected type when encoding FeatureProperties.survey_num"}
+
+  def decode_toe_rl(value) when is_float(value), do: value
+  def decode_toe_rl(value) when is_integer(value), do: value
+  def decode_toe_rl(_), do: {:error, "Unexpected type when decoding FeatureProperties.toe_rl"}
+
+  def encode_toe_rl(value) when is_float(value), do: value
+  def encode_toe_rl(value) when is_integer(value), do: value
+  def encode_toe_rl(_), do: {:error, "Unexpected type when encoding FeatureProperties.toe_rl"}
+
+  def decode_top_rl(value) when is_float(value), do: value
+  def decode_top_rl(value) when is_integer(value), do: value
+  def decode_top_rl(_), do: {:error, "Unexpected type when decoding FeatureProperties.top_rl"}
+
+  def encode_top_rl(value) when is_float(value), do: value
+  def encode_top_rl(value) when is_integer(value), do: value
+  def encode_top_rl(_), do: {:error, "Unexpected type when encoding FeatureProperties.top_rl"}
+
+  def decode_update_dat(value) when is_binary(value), do: value
+  def decode_update_dat(_), do: {:error, "Unexpected type when decoding FeatureProperties.update_dat"}
+
+  def encode_update_dat(value) when is_binary(value), do: value
+  def encode_update_dat(_), do: {:error, "Unexpected type when encoding FeatureProperties.update_dat"}
+
+  def decode_updatedate(value) when is_nil(value), do: value
+  def decode_updatedate(_), do: {:error, "Unexpected type when decoding FeatureProperties.updatedate"}
+
+  def encode_updatedate(value) when is_nil(value), do: value
+  def encode_updatedate(_), do: {:error, "Unexpected type when encoding FeatureProperties.updatedate"}
+
+  def decode_updateuser(value) when is_nil(value), do: value
+  def decode_updateuser(_), do: {:error, "Unexpected type when decoding FeatureProperties.updateuser"}
+
+  def encode_updateuser(value) when is_nil(value), do: value
+  def encode_updateuser(_), do: {:error, "Unexpected type when encoding FeatureProperties.updateuser"}
+
   def from_map(m) do
     %FeatureProperties{
       add_improv: m["add_improv"] && AddImprov.decode(m["add_improv"]),
-      area: m["area_"],
-      asset_numb: m["asset_numb"],
+      area: decode_area(m["area_"]),
+      asset_numb: decode_asset_numb(m["asset_numb"]),
       comments: m["comments"],
-      condition: m["condition"],
+      condition: decode_condition(m["condition"]),
       constructi: m["constructi"],
-      createdate: m["createdate"],
-      createuser: m["createuser"],
-      disposal_d: m["disposal_d"],
-      documents: m["documents"],
+      createdate: decode_createdate(m["createdate"]),
+      createuser: decode_createuser(m["createuser"]),
+      disposal_d: decode_disposal_d(m["disposal_d"]),
+      documents: decode_documents(m["documents"]),
       drawing_nu: m["drawing_nu"],
       file_numbe: m["file_numbe"],
       folder_num: m["folder_num"],
       funding_ba: m["funding_ba"] && FundingBa.decode(m["funding_ba"]),
-      historic_c: m["historic_c"],
-      inspection: m["inspection"],
-      inspectors: m["inspectors"],
-      last_updat: m["last_updat"],
+      historic_c: decode_historic_c(m["historic_c"]),
+      inspection: decode_inspection(m["inspection"]),
+      inspectors: decode_inspectors(m["inspectors"]),
+      last_updat: decode_last_updat(m["last_updat"]),
       level_accu: m["level_accu"] && LevelAccu.decode(m["level_accu"]),
       material: Material.decode(m["material"]),
-      mi_prinx: m["mi_prinx"],
+      mi_prinx: decode_mi_prinx(m["mi_prinx"]),
       mi_symbolo: MiSymbolo.decode(m["mi_symbolo"]),
-      number_lan: m["number_lan"],
+      number_lan: decode_number_lan(m["number_lan"]),
       owner: m["owner"],
       positional: m["positional"] && LevelAccu.decode(m["positional"]),
       project_nu: m["project_nu"],
-      rec_id: m["rec_id"],
+      rec_id: decode_rec_id(m["rec_id"]),
       record_cre: m["record_cre"],
-      shape_area: m["shape_area"],
-      shape_leng: m["shape_leng"],
+      shape_area: decode_shape_area(m["shape_area"]),
+      shape_leng: decode_shape_leng(m["shape_leng"]),
       status: Status.decode(m["status"]),
-      survey_num: m["survey_num"],
-      toe_rl: m["toe_rl"],
-      top_rl: m["top_rl"],
+      survey_num: decode_survey_num(m["survey_num"]),
+      toe_rl: decode_toe_rl(m["toe_rl"]),
+      top_rl: decode_top_rl(m["top_rl"]),
       type: m["type"] && PropertiesType.decode(m["type"]),
-      update_dat: m["update_dat"],
-      updatedate: m["updatedate"],
-      updateuser: m["updateuser"],
+      update_dat: decode_update_dat(m["update_dat"]),
+      updatedate: decode_updatedate(m["updatedate"]),
+      updateuser: decode_updateuser(m["updateuser"]),
     }
   end
 
@@ -728,11 +888,17 @@ defmodule Feature do
           type: FeatureType.t()
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Feature.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Feature.id"}
+
   def from_map(m) do
     %Feature{
       geometry: Geometry.from_map(m["geometry"]),
       geometry_name: GeometryName.decode(m["geometry_name"]),
-      id: m["id"],
+      id: decode_id(m["id"]),
       properties: FeatureProperties.from_map(m["properties"]),
       type: FeatureType.decode(m["type"]),
     }
@@ -772,12 +938,30 @@ defmodule TopLevel do
           type: String.t()
         }
 
+  def decode_features(value) when is_list(value), do: value
+  def decode_features(_), do: {:error, "Unexpected type when decoding TopLevel.features"}
+
+  def encode_features(value) when is_list(value), do: value
+  def encode_features(_), do: {:error, "Unexpected type when encoding TopLevel.features"}
+
+  def decode_total_features(value) when is_integer(value), do: value
+  def decode_total_features(_), do: {:error, "Unexpected type when decoding TopLevel.total_features"}
+
+  def encode_total_features(value) when is_integer(value), do: value
+  def encode_total_features(_), do: {:error, "Unexpected type when encoding TopLevel.total_features"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding TopLevel.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding TopLevel.type"}
+
   def from_map(m) do
     %TopLevel{
       crs: CRS.from_map(m["crs"]),
       features: Enum.map(m["features"], &Feature.from_map/1),
-      total_features: m["totalFeatures"],
-      type: m["type"],
+      total_features: decode_total_features(m["totalFeatures"]),
+      type: decode_type(m["type"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/b4865.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/b4865.json/default/QuickType.ex
index e02865b..b191784 100644
--- a/base/elixir/test/inputs/json/misc/b4865.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/b4865.json/default/QuickType.ex
@@ -105,9 +105,15 @@ defmodule Geolocation do
           type: Type.t()
         }
 
+  def decode_coordinates(value) when is_list(value), do: value
+  def decode_coordinates(_), do: {:error, "Unexpected type when decoding Geolocation.coordinates"}
+
+  def encode_coordinates(value) when is_list(value), do: value
+  def encode_coordinates(_), do: {:error, "Unexpected type when encoding Geolocation.coordinates"}
+
   def from_map(m) do
     %Geolocation{
-      coordinates: m["coordinates"],
+      coordinates: decode_coordinates(m["coordinates"]),
       type: Type.decode(m["type"]),
     }
   end
@@ -196,17 +202,35 @@ defmodule TopLevelElement do
           year: String.t() | nil
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.name"}
+
+  def decode_recclass(value) when is_binary(value), do: value
+  def decode_recclass(_), do: {:error, "Unexpected type when decoding TopLevelElement.recclass"}
+
+  def encode_recclass(value) when is_binary(value), do: value
+  def encode_recclass(_), do: {:error, "Unexpected type when encoding TopLevelElement.recclass"}
+
   def from_map(m) do
     %TopLevelElement{
       computed_region_cbhk_fwbd: m[":@computed_region_cbhk_fwbd"],
       computed_region_nnqa_25_f4: m[":@computed_region_nnqa_25f4"],
       fall: Fall.decode(m["fall"]),
       geolocation: m["geolocation"] && Geolocation.from_map(m["geolocation"]),
-      id: m["id"],
+      id: decode_id(m["id"]),
       mass: m["mass"],
-      name: m["name"],
+      name: decode_name(m["name"]),
       nametype: Nametype.decode(m["nametype"]),
-      recclass: m["recclass"],
+      recclass: decode_recclass(m["recclass"]),
       reclat: m["reclat"],
       reclong: m["reclong"],
       year: m["year"],
diff --git a/base/elixir/test/inputs/json/misc/b6f2c.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/b6f2c.json/default/QuickType.ex
index bf47bf0..b805b08 100644
--- a/base/elixir/test/inputs/json/misc/b6f2c.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/b6f2c.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule TotalPopulation do
           population: integer()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TotalPopulation.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TotalPopulation.date"}
+
+  def decode_population(value) when is_integer(value), do: value
+  def decode_population(_), do: {:error, "Unexpected type when decoding TotalPopulation.population"}
+
+  def encode_population(value) when is_integer(value), do: value
+  def encode_population(_), do: {:error, "Unexpected type when encoding TotalPopulation.population"}
+
   def from_map(m) do
     %TotalPopulation{
-      date: m["date"],
-      population: m["population"],
+      date: decode_date(m["date"]),
+      population: decode_population(m["population"]),
     }
   end
 
@@ -49,6 +61,12 @@ defmodule TopLevel do
           total_population: [TotalPopulation.t()]
         }
 
+  def decode_total_population(value) when is_list(value), do: value
+  def decode_total_population(_), do: {:error, "Unexpected type when decoding TopLevel.total_population"}
+
+  def encode_total_population(value) when is_list(value), do: value
+  def encode_total_population(_), do: {:error, "Unexpected type when encoding TopLevel.total_population"}
+
   def from_map(m) do
     %TopLevel{
       total_population: Enum.map(m["total_population"], &TotalPopulation.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/b6fe5.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/b6fe5.json/default/QuickType.ex
index 86803a9..72f022b 100644
--- a/base/elixir/test/inputs/json/misc/b6fe5.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/b6fe5.json/default/QuickType.ex
@@ -16,12 +16,36 @@ defmodule TopLevel do
           theater: String.t()
         }
 
+  def decode_group(value) when is_binary(value), do: value
+  def decode_group(_), do: {:error, "Unexpected type when decoding TopLevel.group"}
+
+  def encode_group(value) when is_binary(value), do: value
+  def encode_group(_), do: {:error, "Unexpected type when encoding TopLevel.group"}
+
+  def decode_movie(value) when is_binary(value), do: value
+  def decode_movie(_), do: {:error, "Unexpected type when decoding TopLevel.movie"}
+
+  def encode_movie(value) when is_binary(value), do: value
+  def encode_movie(_), do: {:error, "Unexpected type when encoding TopLevel.movie"}
+
+  def decode_movie_image(value) when is_binary(value), do: value
+  def decode_movie_image(_), do: {:error, "Unexpected type when decoding TopLevel.movie_image"}
+
+  def encode_movie_image(value) when is_binary(value), do: value
+  def encode_movie_image(_), do: {:error, "Unexpected type when encoding TopLevel.movie_image"}
+
+  def decode_theater(value) when is_binary(value), do: value
+  def decode_theater(_), do: {:error, "Unexpected type when decoding TopLevel.theater"}
+
+  def encode_theater(value) when is_binary(value), do: value
+  def encode_theater(_), do: {:error, "Unexpected type when encoding TopLevel.theater"}
+
   def from_map(m) do
     %TopLevel{
-      group: m["group"],
-      movie: m["movie"],
-      movie_image: m["movie-image"],
-      theater: m["theater"],
+      group: decode_group(m["group"]),
+      movie: decode_movie(m["movie"]),
+      movie_image: decode_movie_image(m["movie-image"]),
+      theater: decode_theater(m["theater"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/b9f64.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/b9f64.json/default/QuickType.ex
index b62a29d..a10c624 100644
--- a/base/elixir/test/inputs/json/misc/b9f64.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/b9f64.json/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule TopLevel do
           user_agent: String.t()
         }
 
+  def decode_user_agent(value) when is_binary(value), do: value
+  def decode_user_agent(_), do: {:error, "Unexpected type when decoding TopLevel.user_agent"}
+
+  def encode_user_agent(value) when is_binary(value), do: value
+  def encode_user_agent(_), do: {:error, "Unexpected type when encoding TopLevel.user_agent"}
+
   def from_map(m) do
     %TopLevel{
-      user_agent: m["user-agent"],
+      user_agent: decode_user_agent(m["user-agent"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/bb1ec.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/bb1ec.json/default/QuickType.ex
index bf47bf0..b805b08 100644
--- a/base/elixir/test/inputs/json/misc/bb1ec.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/bb1ec.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule TotalPopulation do
           population: integer()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TotalPopulation.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TotalPopulation.date"}
+
+  def decode_population(value) when is_integer(value), do: value
+  def decode_population(_), do: {:error, "Unexpected type when decoding TotalPopulation.population"}
+
+  def encode_population(value) when is_integer(value), do: value
+  def encode_population(_), do: {:error, "Unexpected type when encoding TotalPopulation.population"}
+
   def from_map(m) do
     %TotalPopulation{
-      date: m["date"],
-      population: m["population"],
+      date: decode_date(m["date"]),
+      population: decode_population(m["population"]),
     }
   end
 
@@ -49,6 +61,12 @@ defmodule TopLevel do
           total_population: [TotalPopulation.t()]
         }
 
+  def decode_total_population(value) when is_list(value), do: value
+  def decode_total_population(_), do: {:error, "Unexpected type when decoding TopLevel.total_population"}
+
+  def encode_total_population(value) when is_list(value), do: value
+  def encode_total_population(_), do: {:error, "Unexpected type when encoding TopLevel.total_population"}
+
   def from_map(m) do
     %TopLevel{
       total_population: Enum.map(m["total_population"], &TotalPopulation.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/be234.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/be234.json/default/QuickType.ex
index dc14f1b..7122f00 100644
--- a/base/elixir/test/inputs/json/misc/be234.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/be234.json/default/QuickType.ex
@@ -73,20 +73,92 @@ defmodule Oembed do
           width: integer()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Oembed.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Oembed.description"}
+
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Oembed.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Oembed.height"}
+
+  def decode_html(value) when is_binary(value), do: value
+  def decode_html(_), do: {:error, "Unexpected type when decoding Oembed.html"}
+
+  def encode_html(value) when is_binary(value), do: value
+  def encode_html(_), do: {:error, "Unexpected type when encoding Oembed.html"}
+
+  def decode_provider_name(value) when is_binary(value), do: value
+  def decode_provider_name(_), do: {:error, "Unexpected type when decoding Oembed.provider_name"}
+
+  def encode_provider_name(value) when is_binary(value), do: value
+  def encode_provider_name(_), do: {:error, "Unexpected type when encoding Oembed.provider_name"}
+
+  def decode_provider_url(value) when is_binary(value), do: value
+  def decode_provider_url(_), do: {:error, "Unexpected type when decoding Oembed.provider_url"}
+
+  def encode_provider_url(value) when is_binary(value), do: value
+  def encode_provider_url(_), do: {:error, "Unexpected type when encoding Oembed.provider_url"}
+
+  def decode_thumbnail_height(value) when is_integer(value), do: value
+  def decode_thumbnail_height(_), do: {:error, "Unexpected type when decoding Oembed.thumbnail_height"}
+
+  def encode_thumbnail_height(value) when is_integer(value), do: value
+  def encode_thumbnail_height(_), do: {:error, "Unexpected type when encoding Oembed.thumbnail_height"}
+
+  def decode_thumbnail_url(value) when is_binary(value), do: value
+  def decode_thumbnail_url(_), do: {:error, "Unexpected type when decoding Oembed.thumbnail_url"}
+
+  def encode_thumbnail_url(value) when is_binary(value), do: value
+  def encode_thumbnail_url(_), do: {:error, "Unexpected type when encoding Oembed.thumbnail_url"}
+
+  def decode_thumbnail_width(value) when is_integer(value), do: value
+  def decode_thumbnail_width(_), do: {:error, "Unexpected type when decoding Oembed.thumbnail_width"}
+
+  def encode_thumbnail_width(value) when is_integer(value), do: value
+  def encode_thumbnail_width(_), do: {:error, "Unexpected type when encoding Oembed.thumbnail_width"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Oembed.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Oembed.title"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Oembed.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Oembed.type"}
+
+  def decode_version(value) when is_binary(value), do: value
+  def decode_version(_), do: {:error, "Unexpected type when decoding Oembed.version"}
+
+  def encode_version(value) when is_binary(value), do: value
+  def encode_version(_), do: {:error, "Unexpected type when encoding Oembed.version"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Oembed.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Oembed.width"}
+
   def from_map(m) do
     %Oembed{
-      description: m["description"],
-      height: m["height"],
-      html: m["html"],
-      provider_name: m["provider_name"],
-      provider_url: m["provider_url"],
-      thumbnail_height: m["thumbnail_height"],
-      thumbnail_url: m["thumbnail_url"],
-      thumbnail_width: m["thumbnail_width"],
-      title: m["title"],
-      type: m["type"],
-      version: m["version"],
-      width: m["width"],
+      description: decode_description(m["description"]),
+      height: decode_height(m["height"]),
+      html: decode_html(m["html"]),
+      provider_name: decode_provider_name(m["provider_name"]),
+      provider_url: decode_provider_url(m["provider_url"]),
+      thumbnail_height: decode_thumbnail_height(m["thumbnail_height"]),
+      thumbnail_url: decode_thumbnail_url(m["thumbnail_url"]),
+      thumbnail_width: decode_thumbnail_width(m["thumbnail_width"]),
+      title: decode_title(m["title"]),
+      type: decode_type(m["type"]),
+      version: decode_version(m["version"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -254,11 +326,29 @@ defmodule Source do
           width: integer()
         }
 
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Source.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Source.height"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Source.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Source.url"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Source.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Source.width"}
+
   def from_map(m) do
     %Source{
-      height: m["height"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -292,6 +382,12 @@ defmodule GIF do
           source: Source.t()
         }
 
+  def decode_resolutions(value) when is_list(value), do: value
+  def decode_resolutions(_), do: {:error, "Unexpected type when decoding GIF.resolutions"}
+
+  def encode_resolutions(value) when is_list(value), do: value
+  def encode_resolutions(_), do: {:error, "Unexpected type when encoding GIF.resolutions"}
+
   def from_map(m) do
     %GIF{
       resolutions: Enum.map(m["resolutions"], &Source.from_map/1),
@@ -365,9 +461,21 @@ defmodule Image do
           variants: Variants.t()
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Image.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Image.id"}
+
+  def decode_resolutions(value) when is_list(value), do: value
+  def decode_resolutions(_), do: {:error, "Unexpected type when decoding Image.resolutions"}
+
+  def encode_resolutions(value) when is_list(value), do: value
+  def encode_resolutions(_), do: {:error, "Unexpected type when encoding Image.resolutions"}
+
   def from_map(m) do
     %Image{
-      id: m["id"],
+      id: decode_id(m["id"]),
       resolutions: Enum.map(m["resolutions"], &Source.from_map/1),
       source: Source.from_map(m["source"]),
       variants: Variants.from_map(m["variants"]),
@@ -405,9 +513,21 @@ defmodule Preview do
           images: [Image.t()]
         }
 
+  def decode_enabled(value) when is_boolean(value), do: value
+  def decode_enabled(_), do: {:error, "Unexpected type when decoding Preview.enabled"}
+
+  def encode_enabled(value) when is_boolean(value), do: value
+  def encode_enabled(_), do: {:error, "Unexpected type when encoding Preview.enabled"}
+
+  def decode_images(value) when is_list(value), do: value
+  def decode_images(_), do: {:error, "Unexpected type when decoding Preview.images"}
+
+  def encode_images(value) when is_list(value), do: value
+  def encode_images(_), do: {:error, "Unexpected type when encoding Preview.images"}
+
   def from_map(m) do
     %Preview{
-      enabled: m["enabled"],
+      enabled: decode_enabled(m["enabled"]),
       images: Enum.map(m["images"], &Image.from_map/1),
     }
   end
@@ -683,72 +803,382 @@ defmodule ChildData do
           visited: boolean()
         }
 
+  def decode_approved_at_utc(value) when is_nil(value), do: value
+  def decode_approved_at_utc(_), do: {:error, "Unexpected type when decoding ChildData.approved_at_utc"}
+
+  def encode_approved_at_utc(value) when is_nil(value), do: value
+  def encode_approved_at_utc(_), do: {:error, "Unexpected type when encoding ChildData.approved_at_utc"}
+
+  def decode_approved_by(value) when is_nil(value), do: value
+  def decode_approved_by(_), do: {:error, "Unexpected type when decoding ChildData.approved_by"}
+
+  def encode_approved_by(value) when is_nil(value), do: value
+  def encode_approved_by(_), do: {:error, "Unexpected type when encoding ChildData.approved_by"}
+
+  def decode_archived(value) when is_boolean(value), do: value
+  def decode_archived(_), do: {:error, "Unexpected type when decoding ChildData.archived"}
+
+  def encode_archived(value) when is_boolean(value), do: value
+  def encode_archived(_), do: {:error, "Unexpected type when encoding ChildData.archived"}
+
+  def decode_author(value) when is_binary(value), do: value
+  def decode_author(_), do: {:error, "Unexpected type when decoding ChildData.author"}
+
+  def encode_author(value) when is_binary(value), do: value
+  def encode_author(_), do: {:error, "Unexpected type when encoding ChildData.author"}
+
+  def decode_author_flair_css_class(value) when is_nil(value), do: value
+  def decode_author_flair_css_class(_), do: {:error, "Unexpected type when decoding ChildData.author_flair_css_class"}
+
+  def encode_author_flair_css_class(value) when is_nil(value), do: value
+  def encode_author_flair_css_class(_), do: {:error, "Unexpected type when encoding ChildData.author_flair_css_class"}
+
+  def decode_banned_at_utc(value) when is_nil(value), do: value
+  def decode_banned_at_utc(_), do: {:error, "Unexpected type when decoding ChildData.banned_at_utc"}
+
+  def encode_banned_at_utc(value) when is_nil(value), do: value
+  def encode_banned_at_utc(_), do: {:error, "Unexpected type when encoding ChildData.banned_at_utc"}
+
+  def decode_banned_by(value) when is_nil(value), do: value
+  def decode_banned_by(_), do: {:error, "Unexpected type when decoding ChildData.banned_by"}
+
+  def encode_banned_by(value) when is_nil(value), do: value
+  def encode_banned_by(_), do: {:error, "Unexpected type when encoding ChildData.banned_by"}
+
+  def decode_brand_safe(value) when is_boolean(value), do: value
+  def decode_brand_safe(_), do: {:error, "Unexpected type when decoding ChildData.brand_safe"}
+
+  def encode_brand_safe(value) when is_boolean(value), do: value
+  def encode_brand_safe(_), do: {:error, "Unexpected type when encoding ChildData.brand_safe"}
+
+  def decode_can_gild(value) when is_boolean(value), do: value
+  def decode_can_gild(_), do: {:error, "Unexpected type when decoding ChildData.can_gild"}
+
+  def encode_can_gild(value) when is_boolean(value), do: value
+  def encode_can_gild(_), do: {:error, "Unexpected type when encoding ChildData.can_gild"}
+
+  def decode_can_mod_post(value) when is_boolean(value), do: value
+  def decode_can_mod_post(_), do: {:error, "Unexpected type when decoding ChildData.can_mod_post"}
+
+  def encode_can_mod_post(value) when is_boolean(value), do: value
+  def encode_can_mod_post(_), do: {:error, "Unexpected type when encoding ChildData.can_mod_post"}
+
+  def decode_clicked(value) when is_boolean(value), do: value
+  def decode_clicked(_), do: {:error, "Unexpected type when decoding ChildData.clicked"}
+
+  def encode_clicked(value) when is_boolean(value), do: value
+  def encode_clicked(_), do: {:error, "Unexpected type when encoding ChildData.clicked"}
+
+  def decode_contest_mode(value) when is_boolean(value), do: value
+  def decode_contest_mode(_), do: {:error, "Unexpected type when decoding ChildData.contest_mode"}
+
+  def encode_contest_mode(value) when is_boolean(value), do: value
+  def encode_contest_mode(_), do: {:error, "Unexpected type when encoding ChildData.contest_mode"}
+
+  def decode_created(value) when is_float(value), do: value
+  def decode_created(value) when is_integer(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding ChildData.created"}
+
+  def encode_created(value) when is_float(value), do: value
+  def encode_created(value) when is_integer(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding ChildData.created"}
+
+  def decode_created_utc(value) when is_float(value), do: value
+  def decode_created_utc(value) when is_integer(value), do: value
+  def decode_created_utc(_), do: {:error, "Unexpected type when decoding ChildData.created_utc"}
+
+  def encode_created_utc(value) when is_float(value), do: value
+  def encode_created_utc(value) when is_integer(value), do: value
+  def encode_created_utc(_), do: {:error, "Unexpected type when encoding ChildData.created_utc"}
+
+  def decode_downs(value) when is_integer(value), do: value
+  def decode_downs(_), do: {:error, "Unexpected type when decoding ChildData.downs"}
+
+  def encode_downs(value) when is_integer(value), do: value
+  def encode_downs(_), do: {:error, "Unexpected type when encoding ChildData.downs"}
+
+  def decode_edited(value) when is_boolean(value), do: value
+  def decode_edited(_), do: {:error, "Unexpected type when decoding ChildData.edited"}
+
+  def encode_edited(value) when is_boolean(value), do: value
+  def encode_edited(_), do: {:error, "Unexpected type when encoding ChildData.edited"}
+
+  def decode_gilded(value) when is_integer(value), do: value
+  def decode_gilded(_), do: {:error, "Unexpected type when decoding ChildData.gilded"}
+
+  def encode_gilded(value) when is_integer(value), do: value
+  def encode_gilded(_), do: {:error, "Unexpected type when encoding ChildData.gilded"}
+
+  def decode_hidden(value) when is_boolean(value), do: value
+  def decode_hidden(_), do: {:error, "Unexpected type when decoding ChildData.hidden"}
+
+  def encode_hidden(value) when is_boolean(value), do: value
+  def encode_hidden(_), do: {:error, "Unexpected type when encoding ChildData.hidden"}
+
+  def decode_hide_score(value) when is_boolean(value), do: value
+  def decode_hide_score(_), do: {:error, "Unexpected type when decoding ChildData.hide_score"}
+
+  def encode_hide_score(value) when is_boolean(value), do: value
+  def encode_hide_score(_), do: {:error, "Unexpected type when encoding ChildData.hide_score"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding ChildData.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding ChildData.id"}
+
+  def decode_is_self(value) when is_boolean(value), do: value
+  def decode_is_self(_), do: {:error, "Unexpected type when decoding ChildData.is_self"}
+
+  def encode_is_self(value) when is_boolean(value), do: value
+  def encode_is_self(_), do: {:error, "Unexpected type when encoding ChildData.is_self"}
+
+  def decode_is_video(value) when is_boolean(value), do: value
+  def decode_is_video(_), do: {:error, "Unexpected type when decoding ChildData.is_video"}
+
+  def encode_is_video(value) when is_boolean(value), do: value
+  def encode_is_video(_), do: {:error, "Unexpected type when encoding ChildData.is_video"}
+
+  def decode_likes(value) when is_nil(value), do: value
+  def decode_likes(_), do: {:error, "Unexpected type when decoding ChildData.likes"}
+
+  def encode_likes(value) when is_nil(value), do: value
+  def encode_likes(_), do: {:error, "Unexpected type when encoding ChildData.likes"}
+
+  def decode_link_flair_css_class(value) when is_nil(value), do: value
+  def decode_link_flair_css_class(_), do: {:error, "Unexpected type when decoding ChildData.link_flair_css_class"}
+
+  def encode_link_flair_css_class(value) when is_nil(value), do: value
+  def encode_link_flair_css_class(_), do: {:error, "Unexpected type when encoding ChildData.link_flair_css_class"}
+
+  def decode_link_flair_text(value) when is_nil(value), do: value
+  def decode_link_flair_text(_), do: {:error, "Unexpected type when decoding ChildData.link_flair_text"}
+
+  def encode_link_flair_text(value) when is_nil(value), do: value
+  def encode_link_flair_text(_), do: {:error, "Unexpected type when encoding ChildData.link_flair_text"}
+
+  def decode_locked(value) when is_boolean(value), do: value
+  def decode_locked(_), do: {:error, "Unexpected type when decoding ChildData.locked"}
+
+  def encode_locked(value) when is_boolean(value), do: value
+  def encode_locked(_), do: {:error, "Unexpected type when encoding ChildData.locked"}
+
+  def decode_mod_reports(value) when is_list(value), do: value
+  def decode_mod_reports(_), do: {:error, "Unexpected type when decoding ChildData.mod_reports"}
+
+  def encode_mod_reports(value) when is_list(value), do: value
+  def encode_mod_reports(_), do: {:error, "Unexpected type when encoding ChildData.mod_reports"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding ChildData.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding ChildData.name"}
+
+  def decode_num_comments(value) when is_integer(value), do: value
+  def decode_num_comments(_), do: {:error, "Unexpected type when decoding ChildData.num_comments"}
+
+  def encode_num_comments(value) when is_integer(value), do: value
+  def encode_num_comments(_), do: {:error, "Unexpected type when encoding ChildData.num_comments"}
+
+  def decode_num_reports(value) when is_nil(value), do: value
+  def decode_num_reports(_), do: {:error, "Unexpected type when decoding ChildData.num_reports"}
+
+  def encode_num_reports(value) when is_nil(value), do: value
+  def encode_num_reports(_), do: {:error, "Unexpected type when encoding ChildData.num_reports"}
+
+  def decode_over_18(value) when is_boolean(value), do: value
+  def decode_over_18(_), do: {:error, "Unexpected type when decoding ChildData.over_18"}
+
+  def encode_over_18(value) when is_boolean(value), do: value
+  def encode_over_18(_), do: {:error, "Unexpected type when encoding ChildData.over_18"}
+
+  def decode_permalink(value) when is_binary(value), do: value
+  def decode_permalink(_), do: {:error, "Unexpected type when decoding ChildData.permalink"}
+
+  def encode_permalink(value) when is_binary(value), do: value
+  def encode_permalink(_), do: {:error, "Unexpected type when encoding ChildData.permalink"}
+
+  def decode_quarantine(value) when is_boolean(value), do: value
+  def decode_quarantine(_), do: {:error, "Unexpected type when decoding ChildData.quarantine"}
+
+  def encode_quarantine(value) when is_boolean(value), do: value
+  def encode_quarantine(_), do: {:error, "Unexpected type when encoding ChildData.quarantine"}
+
+  def decode_removal_reason(value) when is_nil(value), do: value
+  def decode_removal_reason(_), do: {:error, "Unexpected type when decoding ChildData.removal_reason"}
+
+  def encode_removal_reason(value) when is_nil(value), do: value
+  def encode_removal_reason(_), do: {:error, "Unexpected type when encoding ChildData.removal_reason"}
+
+  def decode_report_reasons(value) when is_nil(value), do: value
+  def decode_report_reasons(_), do: {:error, "Unexpected type when decoding ChildData.report_reasons"}
+
+  def encode_report_reasons(value) when is_nil(value), do: value
+  def encode_report_reasons(_), do: {:error, "Unexpected type when encoding ChildData.report_reasons"}
+
+  def decode_saved(value) when is_boolean(value), do: value
+  def decode_saved(_), do: {:error, "Unexpected type when decoding ChildData.saved"}
+
+  def encode_saved(value) when is_boolean(value), do: value
+  def encode_saved(_), do: {:error, "Unexpected type when encoding ChildData.saved"}
+
+  def decode_score(value) when is_integer(value), do: value
+  def decode_score(_), do: {:error, "Unexpected type when decoding ChildData.score"}
+
+  def encode_score(value) when is_integer(value), do: value
+  def encode_score(_), do: {:error, "Unexpected type when encoding ChildData.score"}
+
+  def decode_selftext(value) when is_binary(value), do: value
+  def decode_selftext(_), do: {:error, "Unexpected type when decoding ChildData.selftext"}
+
+  def encode_selftext(value) when is_binary(value), do: value
+  def encode_selftext(_), do: {:error, "Unexpected type when encoding ChildData.selftext"}
+
+  def decode_selftext_html(value) when is_nil(value), do: value
+  def decode_selftext_html(_), do: {:error, "Unexpected type when decoding ChildData.selftext_html"}
+
+  def encode_selftext_html(value) when is_nil(value), do: value
+  def encode_selftext_html(_), do: {:error, "Unexpected type when encoding ChildData.selftext_html"}
+
+  def decode_spoiler(value) when is_boolean(value), do: value
+  def decode_spoiler(_), do: {:error, "Unexpected type when decoding ChildData.spoiler"}
+
+  def encode_spoiler(value) when is_boolean(value), do: value
+  def encode_spoiler(_), do: {:error, "Unexpected type when encoding ChildData.spoiler"}
+
+  def decode_stickied(value) when is_boolean(value), do: value
+  def decode_stickied(_), do: {:error, "Unexpected type when decoding ChildData.stickied"}
+
+  def encode_stickied(value) when is_boolean(value), do: value
+  def encode_stickied(_), do: {:error, "Unexpected type when encoding ChildData.stickied"}
+
+  def decode_suggested_sort(value) when is_nil(value), do: value
+  def decode_suggested_sort(_), do: {:error, "Unexpected type when decoding ChildData.suggested_sort"}
+
+  def encode_suggested_sort(value) when is_nil(value), do: value
+  def encode_suggested_sort(_), do: {:error, "Unexpected type when encoding ChildData.suggested_sort"}
+
+  def decode_thumbnail(value) when is_binary(value), do: value
+  def decode_thumbnail(_), do: {:error, "Unexpected type when decoding ChildData.thumbnail"}
+
+  def encode_thumbnail(value) when is_binary(value), do: value
+  def encode_thumbnail(_), do: {:error, "Unexpected type when encoding ChildData.thumbnail"}
+
+  def decode_thumbnail_height(value) when is_integer(value), do: value
+  def decode_thumbnail_height(_), do: {:error, "Unexpected type when decoding ChildData.thumbnail_height"}
+
+  def encode_thumbnail_height(value) when is_integer(value), do: value
+  def encode_thumbnail_height(_), do: {:error, "Unexpected type when encoding ChildData.thumbnail_height"}
+
+  def decode_thumbnail_width(value) when is_integer(value), do: value
+  def decode_thumbnail_width(_), do: {:error, "Unexpected type when decoding ChildData.thumbnail_width"}
+
+  def encode_thumbnail_width(value) when is_integer(value), do: value
+  def encode_thumbnail_width(_), do: {:error, "Unexpected type when encoding ChildData.thumbnail_width"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding ChildData.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding ChildData.title"}
+
+  def decode_ups(value) when is_integer(value), do: value
+  def decode_ups(_), do: {:error, "Unexpected type when decoding ChildData.ups"}
+
+  def encode_ups(value) when is_integer(value), do: value
+  def encode_ups(_), do: {:error, "Unexpected type when encoding ChildData.ups"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding ChildData.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding ChildData.url"}
+
+  def decode_user_reports(value) when is_list(value), do: value
+  def decode_user_reports(_), do: {:error, "Unexpected type when decoding ChildData.user_reports"}
+
+  def encode_user_reports(value) when is_list(value), do: value
+  def encode_user_reports(_), do: {:error, "Unexpected type when encoding ChildData.user_reports"}
+
+  def decode_view_count(value) when is_nil(value), do: value
+  def decode_view_count(_), do: {:error, "Unexpected type when decoding ChildData.view_count"}
+
+  def encode_view_count(value) when is_nil(value), do: value
+  def encode_view_count(_), do: {:error, "Unexpected type when encoding ChildData.view_count"}
+
+  def decode_visited(value) when is_boolean(value), do: value
+  def decode_visited(_), do: {:error, "Unexpected type when decoding ChildData.visited"}
+
+  def encode_visited(value) when is_boolean(value), do: value
+  def encode_visited(_), do: {:error, "Unexpected type when encoding ChildData.visited"}
+
   def from_map(m) do
     %ChildData{
-      approved_at_utc: m["approved_at_utc"],
-      approved_by: m["approved_by"],
-      archived: m["archived"],
-      author: m["author"],
-      author_flair_css_class: m["author_flair_css_class"],
+      approved_at_utc: decode_approved_at_utc(m["approved_at_utc"]),
+      approved_by: decode_approved_by(m["approved_by"]),
+      archived: decode_archived(m["archived"]),
+      author: decode_author(m["author"]),
+      author_flair_css_class: decode_author_flair_css_class(m["author_flair_css_class"]),
       author_flair_text: m["author_flair_text"],
-      banned_at_utc: m["banned_at_utc"],
-      banned_by: m["banned_by"],
-      brand_safe: m["brand_safe"],
-      can_gild: m["can_gild"],
-      can_mod_post: m["can_mod_post"],
-      clicked: m["clicked"],
-      contest_mode: m["contest_mode"],
-      created: m["created"],
-      created_utc: m["created_utc"],
+      banned_at_utc: decode_banned_at_utc(m["banned_at_utc"]),
+      banned_by: decode_banned_by(m["banned_by"]),
+      brand_safe: decode_brand_safe(m["brand_safe"]),
+      can_gild: decode_can_gild(m["can_gild"]),
+      can_mod_post: decode_can_mod_post(m["can_mod_post"]),
+      clicked: decode_clicked(m["clicked"]),
+      contest_mode: decode_contest_mode(m["contest_mode"]),
+      created: decode_created(m["created"]),
+      created_utc: decode_created_utc(m["created_utc"]),
       distinguished: m["distinguished"],
       domain: Domain.decode(m["domain"]),
-      downs: m["downs"],
-      edited: m["edited"],
-      gilded: m["gilded"],
-      hidden: m["hidden"],
-      hide_score: m["hide_score"],
-      id: m["id"],
-      is_self: m["is_self"],
-      is_video: m["is_video"],
-      likes: m["likes"],
-      link_flair_css_class: m["link_flair_css_class"],
-      link_flair_text: m["link_flair_text"],
-      locked: m["locked"],
+      downs: decode_downs(m["downs"]),
+      edited: decode_edited(m["edited"]),
+      gilded: decode_gilded(m["gilded"]),
+      hidden: decode_hidden(m["hidden"]),
+      hide_score: decode_hide_score(m["hide_score"]),
+      id: decode_id(m["id"]),
+      is_self: decode_is_self(m["is_self"]),
+      is_video: decode_is_video(m["is_video"]),
+      likes: decode_likes(m["likes"]),
+      link_flair_css_class: decode_link_flair_css_class(m["link_flair_css_class"]),
+      link_flair_text: decode_link_flair_text(m["link_flair_text"]),
+      locked: decode_locked(m["locked"]),
       media: m["media"] && Media.from_map(m["media"]),
       media_embed: MediaEmbed.from_map(m["media_embed"]),
-      mod_reports: m["mod_reports"],
-      name: m["name"],
-      num_comments: m["num_comments"],
-      num_reports: m["num_reports"],
-      over_18: m["over_18"],
-      permalink: m["permalink"],
+      mod_reports: decode_mod_reports(m["mod_reports"]),
+      name: decode_name(m["name"]),
+      num_comments: decode_num_comments(m["num_comments"]),
+      num_reports: decode_num_reports(m["num_reports"]),
+      over_18: decode_over_18(m["over_18"]),
+      permalink: decode_permalink(m["permalink"]),
       post_hint: PostHint.decode(m["post_hint"]),
       preview: Preview.from_map(m["preview"]),
-      quarantine: m["quarantine"],
-      removal_reason: m["removal_reason"],
-      report_reasons: m["report_reasons"],
-      saved: m["saved"],
-      score: m["score"],
+      quarantine: decode_quarantine(m["quarantine"]),
+      removal_reason: decode_removal_reason(m["removal_reason"]),
+      report_reasons: decode_report_reasons(m["report_reasons"]),
+      saved: decode_saved(m["saved"]),
+      score: decode_score(m["score"]),
       secure_media: m["secure_media"] && Media.from_map(m["secure_media"]),
       secure_media_embed: MediaEmbed.from_map(m["secure_media_embed"]),
-      selftext: m["selftext"],
-      selftext_html: m["selftext_html"],
-      spoiler: m["spoiler"],
-      stickied: m["stickied"],
+      selftext: decode_selftext(m["selftext"]),
+      selftext_html: decode_selftext_html(m["selftext_html"]),
+      spoiler: decode_spoiler(m["spoiler"]),
+      stickied: decode_stickied(m["stickied"]),
       subreddit: Subreddit.decode(m["subreddit"]),
       subreddit_id: SubredditID.decode(m["subreddit_id"]),
       subreddit_name_prefixed: SubredditNamePrefixed.decode(m["subreddit_name_prefixed"]),
       subreddit_type: SubredditType.decode(m["subreddit_type"]),
-      suggested_sort: m["suggested_sort"],
-      thumbnail: m["thumbnail"],
-      thumbnail_height: m["thumbnail_height"],
-      thumbnail_width: m["thumbnail_width"],
-      title: m["title"],
-      ups: m["ups"],
-      url: m["url"],
-      user_reports: m["user_reports"],
-      view_count: m["view_count"],
-      visited: m["visited"],
+      suggested_sort: decode_suggested_sort(m["suggested_sort"]),
+      thumbnail: decode_thumbnail(m["thumbnail"]),
+      thumbnail_height: decode_thumbnail_height(m["thumbnail_height"]),
+      thumbnail_width: decode_thumbnail_width(m["thumbnail_width"]),
+      title: decode_title(m["title"]),
+      ups: decode_ups(m["ups"]),
+      url: decode_url(m["url"]),
+      user_reports: decode_user_reports(m["user_reports"]),
+      view_count: decode_view_count(m["view_count"]),
+      visited: decode_visited(m["visited"]),
     }
   end
 
@@ -926,12 +1356,36 @@ defmodule TopLevelData do
           modhash: String.t()
         }
 
+  def decode_before(value) when is_nil(value), do: value
+  def decode_before(_), do: {:error, "Unexpected type when decoding TopLevelData.before"}
+
+  def encode_before(value) when is_nil(value), do: value
+  def encode_before(_), do: {:error, "Unexpected type when encoding TopLevelData.before"}
+
+  def decode_children(value) when is_list(value), do: value
+  def decode_children(_), do: {:error, "Unexpected type when decoding TopLevelData.children"}
+
+  def encode_children(value) when is_list(value), do: value
+  def encode_children(_), do: {:error, "Unexpected type when encoding TopLevelData.children"}
+
+  def decode_data_after(value) when is_binary(value), do: value
+  def decode_data_after(_), do: {:error, "Unexpected type when decoding TopLevelData.data_after"}
+
+  def encode_data_after(value) when is_binary(value), do: value
+  def encode_data_after(_), do: {:error, "Unexpected type when encoding TopLevelData.data_after"}
+
+  def decode_modhash(value) when is_binary(value), do: value
+  def decode_modhash(_), do: {:error, "Unexpected type when decoding TopLevelData.modhash"}
+
+  def encode_modhash(value) when is_binary(value), do: value
+  def encode_modhash(_), do: {:error, "Unexpected type when encoding TopLevelData.modhash"}
+
   def from_map(m) do
     %TopLevelData{
-      before: m["before"],
+      before: decode_before(m["before"]),
       children: Enum.map(m["children"], &Child.from_map/1),
-      data_after: m["after"],
-      modhash: m["modhash"],
+      data_after: decode_data_after(m["after"]),
+      modhash: decode_modhash(m["modhash"]),
     }
   end
 
@@ -966,10 +1420,16 @@ defmodule TopLevel do
           kind: String.t()
         }
 
+  def decode_kind(value) when is_binary(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding TopLevel.kind"}
+
+  def encode_kind(value) when is_binary(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding TopLevel.kind"}
+
   def from_map(m) do
     %TopLevel{
       data: TopLevelData.from_map(m["data"]),
-      kind: m["kind"],
+      kind: decode_kind(m["kind"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/c0356.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/c0356.json/default/QuickType.ex
index cc2f97b..507e406 100644
--- a/base/elixir/test/inputs/json/misc/c0356.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/c0356.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Datum do
           value: String.t()
         }
 
+  def decode_anomaly(value) when is_binary(value), do: value
+  def decode_anomaly(_), do: {:error, "Unexpected type when decoding Datum.anomaly"}
+
+  def encode_anomaly(value) when is_binary(value), do: value
+  def encode_anomaly(_), do: {:error, "Unexpected type when encoding Datum.anomaly"}
+
+  def decode_value(value) when is_binary(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding Datum.value"}
+
+  def encode_value(value) when is_binary(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding Datum.value"}
+
   def from_map(m) do
     %Datum{
-      anomaly: m["anomaly"],
-      value: m["value"],
+      anomaly: decode_anomaly(m["anomaly"]),
+      value: decode_value(m["value"]),
     }
   end
 
@@ -51,11 +63,29 @@ defmodule Description do
           title: String.t()
         }
 
+  def decode_base_period(value) when is_binary(value), do: value
+  def decode_base_period(_), do: {:error, "Unexpected type when decoding Description.base_period"}
+
+  def encode_base_period(value) when is_binary(value), do: value
+  def encode_base_period(_), do: {:error, "Unexpected type when encoding Description.base_period"}
+
+  def decode_missing(value) when is_integer(value), do: value
+  def decode_missing(_), do: {:error, "Unexpected type when decoding Description.missing"}
+
+  def encode_missing(value) when is_integer(value), do: value
+  def encode_missing(_), do: {:error, "Unexpected type when encoding Description.missing"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Description.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Description.title"}
+
   def from_map(m) do
     %Description{
-      base_period: m["base_period"],
-      missing: m["missing"],
-      title: m["title"],
+      base_period: decode_base_period(m["base_period"]),
+      missing: decode_missing(m["missing"]),
+      title: decode_title(m["title"]),
     }
   end
 
@@ -91,7 +121,8 @@ defmodule TopLevel do
 
   def from_map(m) do
     %TopLevel{
-      data: m["data"],
+      data: m["data"]
+      |> Map.new(fn {key, value} -> {key, Datum.from_map(value)} end),
       description: Description.from_map(m["description"]),
     }
   end
@@ -104,7 +135,8 @@ defmodule TopLevel do
 
   def to_map(struct) do
     %{
-      "data" => struct.data,
+      "data" => struct.data
+      |> Map.new(fn {key, value} -> {key, Datum.to_map(value)} end),
       "description" => Description.to_map(struct.description),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/c0a3a.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/c0a3a.json/default/QuickType.ex
index b9f86f4..e9a4777 100644
--- a/base/elixir/test/inputs/json/misc/c0a3a.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/c0a3a.json/default/QuickType.ex
@@ -21,17 +21,71 @@ defmodule Status do
           type: String.t()
         }
 
+  def decode_avg_delay(value) when is_binary(value), do: value
+  def decode_avg_delay(_), do: {:error, "Unexpected type when decoding Status.avg_delay"}
+
+  def encode_avg_delay(value) when is_binary(value), do: value
+  def encode_avg_delay(_), do: {:error, "Unexpected type when encoding Status.avg_delay"}
+
+  def decode_closure_begin(value) when is_binary(value), do: value
+  def decode_closure_begin(_), do: {:error, "Unexpected type when decoding Status.closure_begin"}
+
+  def encode_closure_begin(value) when is_binary(value), do: value
+  def encode_closure_begin(_), do: {:error, "Unexpected type when encoding Status.closure_begin"}
+
+  def decode_closure_end(value) when is_binary(value), do: value
+  def decode_closure_end(_), do: {:error, "Unexpected type when decoding Status.closure_end"}
+
+  def encode_closure_end(value) when is_binary(value), do: value
+  def encode_closure_end(_), do: {:error, "Unexpected type when encoding Status.closure_end"}
+
+  def decode_end_time(value) when is_binary(value), do: value
+  def decode_end_time(_), do: {:error, "Unexpected type when decoding Status.end_time"}
+
+  def encode_end_time(value) when is_binary(value), do: value
+  def encode_end_time(_), do: {:error, "Unexpected type when encoding Status.end_time"}
+
+  def decode_max_delay(value) when is_binary(value), do: value
+  def decode_max_delay(_), do: {:error, "Unexpected type when decoding Status.max_delay"}
+
+  def encode_max_delay(value) when is_binary(value), do: value
+  def encode_max_delay(_), do: {:error, "Unexpected type when encoding Status.max_delay"}
+
+  def decode_min_delay(value) when is_binary(value), do: value
+  def decode_min_delay(_), do: {:error, "Unexpected type when decoding Status.min_delay"}
+
+  def encode_min_delay(value) when is_binary(value), do: value
+  def encode_min_delay(_), do: {:error, "Unexpected type when encoding Status.min_delay"}
+
+  def decode_reason(value) when is_binary(value), do: value
+  def decode_reason(_), do: {:error, "Unexpected type when decoding Status.reason"}
+
+  def encode_reason(value) when is_binary(value), do: value
+  def encode_reason(_), do: {:error, "Unexpected type when encoding Status.reason"}
+
+  def decode_trend(value) when is_binary(value), do: value
+  def decode_trend(_), do: {:error, "Unexpected type when decoding Status.trend"}
+
+  def encode_trend(value) when is_binary(value), do: value
+  def encode_trend(_), do: {:error, "Unexpected type when encoding Status.trend"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Status.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Status.type"}
+
   def from_map(m) do
     %Status{
-      avg_delay: m["avgDelay"],
-      closure_begin: m["closureBegin"],
-      closure_end: m["closureEnd"],
-      end_time: m["endTime"],
-      max_delay: m["maxDelay"],
-      min_delay: m["minDelay"],
-      reason: m["reason"],
-      trend: m["trend"],
-      type: m["type"],
+      avg_delay: decode_avg_delay(m["avgDelay"]),
+      closure_begin: decode_closure_begin(m["closureBegin"]),
+      closure_end: decode_closure_end(m["closureEnd"]),
+      end_time: decode_end_time(m["endTime"]),
+      max_delay: decode_max_delay(m["maxDelay"]),
+      min_delay: decode_min_delay(m["minDelay"]),
+      reason: decode_reason(m["reason"]),
+      trend: decode_trend(m["trend"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -72,11 +126,29 @@ defmodule Meta do
           url: String.t()
         }
 
+  def decode_credit(value) when is_binary(value), do: value
+  def decode_credit(_), do: {:error, "Unexpected type when decoding Meta.credit"}
+
+  def encode_credit(value) when is_binary(value), do: value
+  def encode_credit(_), do: {:error, "Unexpected type when encoding Meta.credit"}
+
+  def decode_updated(value) when is_binary(value), do: value
+  def decode_updated(_), do: {:error, "Unexpected type when decoding Meta.updated"}
+
+  def encode_updated(value) when is_binary(value), do: value
+  def encode_updated(_), do: {:error, "Unexpected type when encoding Meta.updated"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Meta.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Meta.url"}
+
   def from_map(m) do
     %Meta{
-      credit: m["credit"],
-      updated: m["updated"],
-      url: m["url"],
+      credit: decode_credit(m["credit"]),
+      updated: decode_updated(m["updated"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -113,13 +185,39 @@ defmodule Weather do
           wind: String.t()
         }
 
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Weather.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Weather.temp"}
+
+  def decode_visibility(value) when is_float(value), do: value
+  def decode_visibility(value) when is_integer(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Weather.visibility"}
+
+  def encode_visibility(value) when is_float(value), do: value
+  def encode_visibility(value) when is_integer(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Weather.visibility"}
+
+  def decode_weather(value) when is_binary(value), do: value
+  def decode_weather(_), do: {:error, "Unexpected type when decoding Weather.weather"}
+
+  def encode_weather(value) when is_binary(value), do: value
+  def encode_weather(_), do: {:error, "Unexpected type when encoding Weather.weather"}
+
+  def decode_wind(value) when is_binary(value), do: value
+  def decode_wind(_), do: {:error, "Unexpected type when decoding Weather.wind"}
+
+  def encode_wind(value) when is_binary(value), do: value
+  def encode_wind(_), do: {:error, "Unexpected type when encoding Weather.wind"}
+
   def from_map(m) do
     %Weather{
       meta: Meta.from_map(m["meta"]),
-      temp: m["temp"],
-      visibility: m["visibility"],
-      weather: m["weather"],
-      wind: m["wind"],
+      temp: decode_temp(m["temp"]),
+      visibility: decode_visibility(m["visibility"]),
+      weather: decode_weather(m["weather"]),
+      wind: decode_wind(m["wind"]),
     }
   end
 
@@ -161,14 +259,50 @@ defmodule TopLevel do
           weather: Weather.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding TopLevel.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding TopLevel.city"}
+
+  def decode_delay(value) when is_binary(value), do: value
+  def decode_delay(_), do: {:error, "Unexpected type when decoding TopLevel.delay"}
+
+  def encode_delay(value) when is_binary(value), do: value
+  def encode_delay(_), do: {:error, "Unexpected type when encoding TopLevel.delay"}
+
+  def decode_iata(value) when is_binary(value), do: value
+  def decode_iata(_), do: {:error, "Unexpected type when decoding TopLevel.iata"}
+
+  def encode_iata(value) when is_binary(value), do: value
+  def encode_iata(_), do: {:error, "Unexpected type when encoding TopLevel.iata"}
+
+  def decode_icao(value) when is_binary(value), do: value
+  def decode_icao(_), do: {:error, "Unexpected type when decoding TopLevel.icao"}
+
+  def encode_icao(value) when is_binary(value), do: value
+  def encode_icao(_), do: {:error, "Unexpected type when encoding TopLevel.icao"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding TopLevel.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding TopLevel.state"}
+
   def from_map(m) do
     %TopLevel{
-      city: m["city"],
-      delay: m["delay"],
-      iata: m["IATA"],
-      icao: m["ICAO"],
-      name: m["name"],
-      state: m["state"],
+      city: decode_city(m["city"]),
+      delay: decode_delay(m["delay"]),
+      iata: decode_iata(m["IATA"]),
+      icao: decode_icao(m["ICAO"]),
+      name: decode_name(m["name"]),
+      state: decode_state(m["state"]),
       status: Status.from_map(m["status"]),
       weather: Weather.from_map(m["weather"]),
     }
diff --git a/base/elixir/test/inputs/json/misc/c3303.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/c3303.json/default/QuickType.ex
index ab4a2c7..30f13b9 100644
--- a/base/elixir/test/inputs/json/misc/c3303.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/c3303.json/default/QuickType.ex
@@ -16,12 +16,30 @@ defmodule The480_WStill do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding The480_WStill.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding The480_WStill.height"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding The480_WStill.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding The480_WStill.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding The480_WStill.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding The480_WStill.width"}
+
   def from_map(m) do
     %The480_WStill{
-      height: m["height"],
+      height: decode_height(m["height"]),
       size: m["size"],
-      url: m["url"],
-      width: m["width"],
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -58,12 +76,36 @@ defmodule DownsizedSmall do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding DownsizedSmall.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding DownsizedSmall.height"}
+
+  def decode_mp4(value) when is_binary(value), do: value
+  def decode_mp4(_), do: {:error, "Unexpected type when decoding DownsizedSmall.mp4"}
+
+  def encode_mp4(value) when is_binary(value), do: value
+  def encode_mp4(_), do: {:error, "Unexpected type when encoding DownsizedSmall.mp4"}
+
+  def decode_mp4_size(value) when is_binary(value), do: value
+  def decode_mp4_size(_), do: {:error, "Unexpected type when decoding DownsizedSmall.mp4_size"}
+
+  def encode_mp4_size(value) when is_binary(value), do: value
+  def encode_mp4_size(_), do: {:error, "Unexpected type when encoding DownsizedSmall.mp4_size"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding DownsizedSmall.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding DownsizedSmall.width"}
+
   def from_map(m) do
     %DownsizedSmall{
-      height: m["height"],
-      mp4: m["mp4"],
-      mp4_size: m["mp4_size"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      mp4: decode_mp4(m["mp4"]),
+      mp4_size: decode_mp4_size(m["mp4_size"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -106,18 +148,54 @@ defmodule FixedHeight do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding FixedHeight.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding FixedHeight.height"}
+
+  def decode_size(value) when is_binary(value), do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding FixedHeight.size"}
+
+  def encode_size(value) when is_binary(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding FixedHeight.size"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding FixedHeight.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding FixedHeight.url"}
+
+  def decode_webp(value) when is_binary(value), do: value
+  def decode_webp(_), do: {:error, "Unexpected type when decoding FixedHeight.webp"}
+
+  def encode_webp(value) when is_binary(value), do: value
+  def encode_webp(_), do: {:error, "Unexpected type when encoding FixedHeight.webp"}
+
+  def decode_webp_size(value) when is_binary(value), do: value
+  def decode_webp_size(_), do: {:error, "Unexpected type when decoding FixedHeight.webp_size"}
+
+  def encode_webp_size(value) when is_binary(value), do: value
+  def encode_webp_size(_), do: {:error, "Unexpected type when encoding FixedHeight.webp_size"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding FixedHeight.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding FixedHeight.width"}
+
   def from_map(m) do
     %FixedHeight{
       frames: m["frames"],
       hash: m["hash"],
-      height: m["height"],
+      height: decode_height(m["height"]),
       mp4: m["mp4"],
       mp4_size: m["mp4_size"],
-      size: m["size"],
-      url: m["url"],
-      webp: m["webp"],
-      webp_size: m["webp_size"],
-      width: m["width"],
+      size: decode_size(m["size"]),
+      url: decode_url(m["url"]),
+      webp: decode_webp(m["webp"]),
+      webp_size: decode_webp_size(m["webp_size"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -158,10 +236,22 @@ defmodule Looping do
           mp4_size: String.t()
         }
 
+  def decode_mp4(value) when is_binary(value), do: value
+  def decode_mp4(_), do: {:error, "Unexpected type when decoding Looping.mp4"}
+
+  def encode_mp4(value) when is_binary(value), do: value
+  def encode_mp4(_), do: {:error, "Unexpected type when encoding Looping.mp4"}
+
+  def decode_mp4_size(value) when is_binary(value), do: value
+  def decode_mp4_size(_), do: {:error, "Unexpected type when decoding Looping.mp4_size"}
+
+  def encode_mp4_size(value) when is_binary(value), do: value
+  def encode_mp4_size(_), do: {:error, "Unexpected type when encoding Looping.mp4_size"}
+
   def from_map(m) do
     %Looping{
-      mp4: m["mp4"],
-      mp4_size: m["mp4_size"],
+      mp4: decode_mp4(m["mp4"]),
+      mp4_size: decode_mp4_size(m["mp4_size"]),
     }
   end
 
@@ -434,12 +524,36 @@ defmodule User do
           username: Username.t()
         }
 
+  def decode_avatar_url(value) when is_binary(value), do: value
+  def decode_avatar_url(_), do: {:error, "Unexpected type when decoding User.avatar_url"}
+
+  def encode_avatar_url(value) when is_binary(value), do: value
+  def encode_avatar_url(_), do: {:error, "Unexpected type when encoding User.avatar_url"}
+
+  def decode_banner_url(value) when is_binary(value), do: value
+  def decode_banner_url(_), do: {:error, "Unexpected type when decoding User.banner_url"}
+
+  def encode_banner_url(value) when is_binary(value), do: value
+  def encode_banner_url(_), do: {:error, "Unexpected type when encoding User.banner_url"}
+
+  def decode_display_name(value) when is_binary(value), do: value
+  def decode_display_name(_), do: {:error, "Unexpected type when decoding User.display_name"}
+
+  def encode_display_name(value) when is_binary(value), do: value
+  def encode_display_name(_), do: {:error, "Unexpected type when encoding User.display_name"}
+
+  def decode_profile_url(value) when is_binary(value), do: value
+  def decode_profile_url(_), do: {:error, "Unexpected type when decoding User.profile_url"}
+
+  def encode_profile_url(value) when is_binary(value), do: value
+  def encode_profile_url(_), do: {:error, "Unexpected type when encoding User.profile_url"}
+
   def from_map(m) do
     %User{
-      avatar_url: m["avatar_url"],
-      banner_url: m["banner_url"],
-      display_name: m["display_name"],
-      profile_url: m["profile_url"],
+      avatar_url: decode_avatar_url(m["avatar_url"]),
+      banner_url: decode_banner_url(m["banner_url"]),
+      display_name: decode_display_name(m["display_name"]),
+      profile_url: decode_profile_url(m["profile_url"]),
       username: Username.decode(m["username"]),
     }
   end
@@ -492,24 +606,102 @@ defmodule Datum do
           username: Username.t()
         }
 
+  def decode_bitly_gif_url(value) when is_binary(value), do: value
+  def decode_bitly_gif_url(_), do: {:error, "Unexpected type when decoding Datum.bitly_gif_url"}
+
+  def encode_bitly_gif_url(value) when is_binary(value), do: value
+  def encode_bitly_gif_url(_), do: {:error, "Unexpected type when encoding Datum.bitly_gif_url"}
+
+  def decode_bitly_url(value) when is_binary(value), do: value
+  def decode_bitly_url(_), do: {:error, "Unexpected type when decoding Datum.bitly_url"}
+
+  def encode_bitly_url(value) when is_binary(value), do: value
+  def encode_bitly_url(_), do: {:error, "Unexpected type when encoding Datum.bitly_url"}
+
+  def decode_content_url(value) when is_binary(value), do: value
+  def decode_content_url(_), do: {:error, "Unexpected type when decoding Datum.content_url"}
+
+  def encode_content_url(value) when is_binary(value), do: value
+  def encode_content_url(_), do: {:error, "Unexpected type when encoding Datum.content_url"}
+
+  def decode_embed_url(value) when is_binary(value), do: value
+  def decode_embed_url(_), do: {:error, "Unexpected type when decoding Datum.embed_url"}
+
+  def encode_embed_url(value) when is_binary(value), do: value
+  def encode_embed_url(_), do: {:error, "Unexpected type when encoding Datum.embed_url"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Datum.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Datum.id"}
+
+  def decode_import_datetime(value) when is_binary(value), do: value
+  def decode_import_datetime(_), do: {:error, "Unexpected type when decoding Datum.import_datetime"}
+
+  def encode_import_datetime(value) when is_binary(value), do: value
+  def encode_import_datetime(_), do: {:error, "Unexpected type when encoding Datum.import_datetime"}
+
+  def decode_is_indexable(value) when is_integer(value), do: value
+  def decode_is_indexable(_), do: {:error, "Unexpected type when decoding Datum.is_indexable"}
+
+  def encode_is_indexable(value) when is_integer(value), do: value
+  def encode_is_indexable(_), do: {:error, "Unexpected type when encoding Datum.is_indexable"}
+
+  def decode_slug(value) when is_binary(value), do: value
+  def decode_slug(_), do: {:error, "Unexpected type when decoding Datum.slug"}
+
+  def encode_slug(value) when is_binary(value), do: value
+  def encode_slug(_), do: {:error, "Unexpected type when encoding Datum.slug"}
+
+  def decode_source(value) when is_binary(value), do: value
+  def decode_source(_), do: {:error, "Unexpected type when decoding Datum.source"}
+
+  def encode_source(value) when is_binary(value), do: value
+  def encode_source(_), do: {:error, "Unexpected type when encoding Datum.source"}
+
+  def decode_source_post_url(value) when is_binary(value), do: value
+  def decode_source_post_url(_), do: {:error, "Unexpected type when decoding Datum.source_post_url"}
+
+  def encode_source_post_url(value) when is_binary(value), do: value
+  def encode_source_post_url(_), do: {:error, "Unexpected type when encoding Datum.source_post_url"}
+
+  def decode_source_tld(value) when is_binary(value), do: value
+  def decode_source_tld(_), do: {:error, "Unexpected type when decoding Datum.source_tld"}
+
+  def encode_source_tld(value) when is_binary(value), do: value
+  def encode_source_tld(_), do: {:error, "Unexpected type when encoding Datum.source_tld"}
+
+  def decode_trending_datetime(value) when is_binary(value), do: value
+  def decode_trending_datetime(_), do: {:error, "Unexpected type when decoding Datum.trending_datetime"}
+
+  def encode_trending_datetime(value) when is_binary(value), do: value
+  def encode_trending_datetime(_), do: {:error, "Unexpected type when encoding Datum.trending_datetime"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Datum.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Datum.url"}
+
   def from_map(m) do
     %Datum{
-      bitly_gif_url: m["bitly_gif_url"],
-      bitly_url: m["bitly_url"],
-      content_url: m["content_url"],
-      embed_url: m["embed_url"],
-      id: m["id"],
+      bitly_gif_url: decode_bitly_gif_url(m["bitly_gif_url"]),
+      bitly_url: decode_bitly_url(m["bitly_url"]),
+      content_url: decode_content_url(m["content_url"]),
+      embed_url: decode_embed_url(m["embed_url"]),
+      id: decode_id(m["id"]),
       images: Images.from_map(m["images"]),
-      import_datetime: m["import_datetime"],
-      is_indexable: m["is_indexable"],
+      import_datetime: decode_import_datetime(m["import_datetime"]),
+      is_indexable: decode_is_indexable(m["is_indexable"]),
       rating: Rating.decode(m["rating"]),
-      slug: m["slug"],
-      source: m["source"],
-      source_post_url: m["source_post_url"],
-      source_tld: m["source_tld"],
-      trending_datetime: m["trending_datetime"],
+      slug: decode_slug(m["slug"]),
+      source: decode_source(m["source"]),
+      source_post_url: decode_source_post_url(m["source_post_url"]),
+      source_tld: decode_source_tld(m["source_tld"]),
+      trending_datetime: decode_trending_datetime(m["trending_datetime"]),
       type: Type.decode(m["type"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
       user: m["user"] && User.from_map(m["user"]),
       username: Username.decode(m["username"]),
     }
@@ -561,11 +753,29 @@ defmodule Meta do
           status: integer()
         }
 
+  def decode_msg(value) when is_binary(value), do: value
+  def decode_msg(_), do: {:error, "Unexpected type when decoding Meta.msg"}
+
+  def encode_msg(value) when is_binary(value), do: value
+  def encode_msg(_), do: {:error, "Unexpected type when encoding Meta.msg"}
+
+  def decode_response_id(value) when is_binary(value), do: value
+  def decode_response_id(_), do: {:error, "Unexpected type when decoding Meta.response_id"}
+
+  def encode_response_id(value) when is_binary(value), do: value
+  def encode_response_id(_), do: {:error, "Unexpected type when encoding Meta.response_id"}
+
+  def decode_status(value) when is_integer(value), do: value
+  def decode_status(_), do: {:error, "Unexpected type when decoding Meta.status"}
+
+  def encode_status(value) when is_integer(value), do: value
+  def encode_status(_), do: {:error, "Unexpected type when encoding Meta.status"}
+
   def from_map(m) do
     %Meta{
-      msg: m["msg"],
-      response_id: m["response_id"],
-      status: m["status"],
+      msg: decode_msg(m["msg"]),
+      response_id: decode_response_id(m["response_id"]),
+      status: decode_status(m["status"]),
     }
   end
 
@@ -600,11 +810,29 @@ defmodule Pagination do
           total_count: integer()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Pagination.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Pagination.count"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding Pagination.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding Pagination.offset"}
+
+  def decode_total_count(value) when is_integer(value), do: value
+  def decode_total_count(_), do: {:error, "Unexpected type when decoding Pagination.total_count"}
+
+  def encode_total_count(value) when is_integer(value), do: value
+  def encode_total_count(_), do: {:error, "Unexpected type when encoding Pagination.total_count"}
+
   def from_map(m) do
     %Pagination{
-      count: m["count"],
-      offset: m["offset"],
-      total_count: m["total_count"],
+      count: decode_count(m["count"]),
+      offset: decode_offset(m["offset"]),
+      total_count: decode_total_count(m["total_count"]),
     }
   end
 
@@ -639,6 +867,12 @@ defmodule TopLevel do
           pagination: Pagination.t()
         }
 
+  def decode_data(value) when is_list(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data(value) when is_list(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
   def from_map(m) do
     %TopLevel{
       data: Enum.map(m["data"], &Datum.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/c6cfd.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/c6cfd.json/default/QuickType.ex
index 9180a36..3c26a79 100644
--- a/base/elixir/test/inputs/json/misc/c6cfd.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/c6cfd.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Country do
           name: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Country.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Country.code"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Country.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Country.name"}
+
   def from_map(m) do
     %Country{
-      code: m["code"],
-      name: m["name"],
+      code: decode_code(m["code"]),
+      name: decode_name(m["name"]),
     }
   end
 
@@ -49,6 +61,12 @@ defmodule TopLevel do
           countries: [Country.t()]
         }
 
+  def decode_countries(value) when is_list(value), do: value
+  def decode_countries(_), do: {:error, "Unexpected type when decoding TopLevel.countries"}
+
+  def encode_countries(value) when is_list(value), do: value
+  def encode_countries(_), do: {:error, "Unexpected type when encoding TopLevel.countries"}
+
   def from_map(m) do
     %TopLevel{
       countries: Enum.map(m["countries"], &Country.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/c8c7e.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/c8c7e.json/default/QuickType.ex
index 14539c1..1c99295 100644
--- a/base/elixir/test/inputs/json/misc/c8c7e.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/c8c7e.json/default/QuickType.ex
@@ -145,13 +145,31 @@ defmodule TopLevel1 do
           value: String.t()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel1.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel1.date"}
+
+  def decode_decimal(value) when is_binary(value), do: value
+  def decode_decimal(_), do: {:error, "Unexpected type when decoding TopLevel1.decimal"}
+
+  def encode_decimal(value) when is_binary(value), do: value
+  def encode_decimal(_), do: {:error, "Unexpected type when encoding TopLevel1.decimal"}
+
+  def decode_value(value) when is_binary(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding TopLevel1.value"}
+
+  def encode_value(value) when is_binary(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding TopLevel1.value"}
+
   def from_map(m) do
     %TopLevel1{
       country: Country.from_map(m["country"]),
-      date: m["date"],
-      decimal: m["decimal"],
+      date: decode_date(m["date"]),
+      decimal: decode_decimal(m["decimal"]),
       indicator: Country.from_map(m["indicator"]),
-      value: m["value"],
+      value: decode_value(m["value"]),
     }
   end
 
@@ -189,12 +207,36 @@ defmodule TopLevel2 do
           total: integer()
         }
 
+  def decode_page(value) when is_integer(value), do: value
+  def decode_page(_), do: {:error, "Unexpected type when decoding TopLevel2.page"}
+
+  def encode_page(value) when is_integer(value), do: value
+  def encode_page(_), do: {:error, "Unexpected type when encoding TopLevel2.page"}
+
+  def decode_pages(value) when is_integer(value), do: value
+  def decode_pages(_), do: {:error, "Unexpected type when decoding TopLevel2.pages"}
+
+  def encode_pages(value) when is_integer(value), do: value
+  def encode_pages(_), do: {:error, "Unexpected type when encoding TopLevel2.pages"}
+
+  def decode_per_page(value) when is_binary(value), do: value
+  def decode_per_page(_), do: {:error, "Unexpected type when decoding TopLevel2.per_page"}
+
+  def encode_per_page(value) when is_binary(value), do: value
+  def encode_per_page(_), do: {:error, "Unexpected type when encoding TopLevel2.per_page"}
+
+  def decode_total(value) when is_integer(value), do: value
+  def decode_total(_), do: {:error, "Unexpected type when decoding TopLevel2.total"}
+
+  def encode_total(value) when is_integer(value), do: value
+  def encode_total(_), do: {:error, "Unexpected type when encoding TopLevel2.total"}
+
   def from_map(m) do
     %TopLevel2{
-      page: m["page"],
-      pages: m["pages"],
-      per_page: m["per_page"],
-      total: m["total"],
+      page: decode_page(m["page"]),
+      pages: decode_pages(m["pages"]),
+      per_page: decode_per_page(m["per_page"]),
+      total: decode_total(m["total"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/cb0cc.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/cb0cc.json/default/QuickType.ex
index 8eb79fe..32d2359 100644
--- a/base/elixir/test/inputs/json/misc/cb0cc.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/cb0cc.json/default/QuickType.ex
@@ -67,13 +67,37 @@ defmodule Laureate do
           surname: String.t()
         }
 
+  def decode_firstname(value) when is_binary(value), do: value
+  def decode_firstname(_), do: {:error, "Unexpected type when decoding Laureate.firstname"}
+
+  def encode_firstname(value) when is_binary(value), do: value
+  def encode_firstname(_), do: {:error, "Unexpected type when encoding Laureate.firstname"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Laureate.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Laureate.id"}
+
+  def decode_share(value) when is_binary(value), do: value
+  def decode_share(_), do: {:error, "Unexpected type when decoding Laureate.share"}
+
+  def encode_share(value) when is_binary(value), do: value
+  def encode_share(_), do: {:error, "Unexpected type when encoding Laureate.share"}
+
+  def decode_surname(value) when is_binary(value), do: value
+  def decode_surname(_), do: {:error, "Unexpected type when decoding Laureate.surname"}
+
+  def encode_surname(value) when is_binary(value), do: value
+  def encode_surname(_), do: {:error, "Unexpected type when encoding Laureate.surname"}
+
   def from_map(m) do
     %Laureate{
-      firstname: m["firstname"],
-      id: m["id"],
+      firstname: decode_firstname(m["firstname"]),
+      id: decode_id(m["id"]),
       motivation: m["motivation"],
-      share: m["share"],
-      surname: m["surname"],
+      share: decode_share(m["share"]),
+      surname: decode_surname(m["surname"]),
     }
   end
 
@@ -111,12 +135,24 @@ defmodule Prize do
           year: String.t()
         }
 
+  def decode_laureates(value) when is_list(value), do: value
+  def decode_laureates(_), do: {:error, "Unexpected type when decoding Prize.laureates"}
+
+  def encode_laureates(value) when is_list(value), do: value
+  def encode_laureates(_), do: {:error, "Unexpected type when encoding Prize.laureates"}
+
+  def decode_year(value) when is_binary(value), do: value
+  def decode_year(_), do: {:error, "Unexpected type when decoding Prize.year"}
+
+  def encode_year(value) when is_binary(value), do: value
+  def encode_year(_), do: {:error, "Unexpected type when encoding Prize.year"}
+
   def from_map(m) do
     %Prize{
       category: Category.decode(m["category"]),
       laureates: Enum.map(m["laureates"], &Laureate.from_map/1),
       overall_motivation: m["overallMotivation"],
-      year: m["year"],
+      year: decode_year(m["year"]),
     }
   end
 
@@ -150,6 +186,12 @@ defmodule TopLevel do
           prizes: [Prize.t()]
         }
 
+  def decode_prizes(value) when is_list(value), do: value
+  def decode_prizes(_), do: {:error, "Unexpected type when decoding TopLevel.prizes"}
+
+  def encode_prizes(value) when is_list(value), do: value
+  def encode_prizes(_), do: {:error, "Unexpected type when encoding TopLevel.prizes"}
+
   def from_map(m) do
     %TopLevel{
       prizes: Enum.map(m["prizes"], &Prize.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/cb81e.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/cb81e.json/default/QuickType.ex
index 4117027..d9903c5 100644
--- a/base/elixir/test/inputs/json/misc/cb81e.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/cb81e.json/default/QuickType.ex
@@ -16,12 +16,36 @@ defmodule Description do
           units: String.t()
         }
 
+  def decode_base_period(value) when is_binary(value), do: value
+  def decode_base_period(_), do: {:error, "Unexpected type when decoding Description.base_period"}
+
+  def encode_base_period(value) when is_binary(value), do: value
+  def encode_base_period(_), do: {:error, "Unexpected type when encoding Description.base_period"}
+
+  def decode_missing(value) when is_binary(value), do: value
+  def decode_missing(_), do: {:error, "Unexpected type when decoding Description.missing"}
+
+  def encode_missing(value) when is_binary(value), do: value
+  def encode_missing(_), do: {:error, "Unexpected type when encoding Description.missing"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Description.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Description.title"}
+
+  def decode_units(value) when is_binary(value), do: value
+  def decode_units(_), do: {:error, "Unexpected type when decoding Description.units"}
+
+  def encode_units(value) when is_binary(value), do: value
+  def encode_units(_), do: {:error, "Unexpected type when encoding Description.units"}
+
   def from_map(m) do
     %Description{
-      base_period: m["base_period"],
-      missing: m["missing"],
-      title: m["title"],
-      units: m["units"],
+      base_period: decode_base_period(m["base_period"]),
+      missing: decode_missing(m["missing"]),
+      title: decode_title(m["title"]),
+      units: decode_units(m["units"]),
     }
   end
 
@@ -56,9 +80,16 @@ defmodule TopLevel do
           description: Description.t()
         }
 
+  def decode_data_value(value) when is_binary(value), do: value
+  def decode_data_value(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data_value(value) when is_binary(value), do: value
+  def encode_data_value(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
   def from_map(m) do
     %TopLevel{
-      data: m["data"],
+      data: m["data"]
+      |> Map.new(fn {key, value} -> {key, decode_data_value(value)} end),
       description: Description.from_map(m["description"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/ccd18.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/ccd18.json/default/QuickType.ex
index b9f86f4..e9a4777 100644
--- a/base/elixir/test/inputs/json/misc/ccd18.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/ccd18.json/default/QuickType.ex
@@ -21,17 +21,71 @@ defmodule Status do
           type: String.t()
         }
 
+  def decode_avg_delay(value) when is_binary(value), do: value
+  def decode_avg_delay(_), do: {:error, "Unexpected type when decoding Status.avg_delay"}
+
+  def encode_avg_delay(value) when is_binary(value), do: value
+  def encode_avg_delay(_), do: {:error, "Unexpected type when encoding Status.avg_delay"}
+
+  def decode_closure_begin(value) when is_binary(value), do: value
+  def decode_closure_begin(_), do: {:error, "Unexpected type when decoding Status.closure_begin"}
+
+  def encode_closure_begin(value) when is_binary(value), do: value
+  def encode_closure_begin(_), do: {:error, "Unexpected type when encoding Status.closure_begin"}
+
+  def decode_closure_end(value) when is_binary(value), do: value
+  def decode_closure_end(_), do: {:error, "Unexpected type when decoding Status.closure_end"}
+
+  def encode_closure_end(value) when is_binary(value), do: value
+  def encode_closure_end(_), do: {:error, "Unexpected type when encoding Status.closure_end"}
+
+  def decode_end_time(value) when is_binary(value), do: value
+  def decode_end_time(_), do: {:error, "Unexpected type when decoding Status.end_time"}
+
+  def encode_end_time(value) when is_binary(value), do: value
+  def encode_end_time(_), do: {:error, "Unexpected type when encoding Status.end_time"}
+
+  def decode_max_delay(value) when is_binary(value), do: value
+  def decode_max_delay(_), do: {:error, "Unexpected type when decoding Status.max_delay"}
+
+  def encode_max_delay(value) when is_binary(value), do: value
+  def encode_max_delay(_), do: {:error, "Unexpected type when encoding Status.max_delay"}
+
+  def decode_min_delay(value) when is_binary(value), do: value
+  def decode_min_delay(_), do: {:error, "Unexpected type when decoding Status.min_delay"}
+
+  def encode_min_delay(value) when is_binary(value), do: value
+  def encode_min_delay(_), do: {:error, "Unexpected type when encoding Status.min_delay"}
+
+  def decode_reason(value) when is_binary(value), do: value
+  def decode_reason(_), do: {:error, "Unexpected type when decoding Status.reason"}
+
+  def encode_reason(value) when is_binary(value), do: value
+  def encode_reason(_), do: {:error, "Unexpected type when encoding Status.reason"}
+
+  def decode_trend(value) when is_binary(value), do: value
+  def decode_trend(_), do: {:error, "Unexpected type when decoding Status.trend"}
+
+  def encode_trend(value) when is_binary(value), do: value
+  def encode_trend(_), do: {:error, "Unexpected type when encoding Status.trend"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Status.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Status.type"}
+
   def from_map(m) do
     %Status{
-      avg_delay: m["avgDelay"],
-      closure_begin: m["closureBegin"],
-      closure_end: m["closureEnd"],
-      end_time: m["endTime"],
-      max_delay: m["maxDelay"],
-      min_delay: m["minDelay"],
-      reason: m["reason"],
-      trend: m["trend"],
-      type: m["type"],
+      avg_delay: decode_avg_delay(m["avgDelay"]),
+      closure_begin: decode_closure_begin(m["closureBegin"]),
+      closure_end: decode_closure_end(m["closureEnd"]),
+      end_time: decode_end_time(m["endTime"]),
+      max_delay: decode_max_delay(m["maxDelay"]),
+      min_delay: decode_min_delay(m["minDelay"]),
+      reason: decode_reason(m["reason"]),
+      trend: decode_trend(m["trend"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -72,11 +126,29 @@ defmodule Meta do
           url: String.t()
         }
 
+  def decode_credit(value) when is_binary(value), do: value
+  def decode_credit(_), do: {:error, "Unexpected type when decoding Meta.credit"}
+
+  def encode_credit(value) when is_binary(value), do: value
+  def encode_credit(_), do: {:error, "Unexpected type when encoding Meta.credit"}
+
+  def decode_updated(value) when is_binary(value), do: value
+  def decode_updated(_), do: {:error, "Unexpected type when decoding Meta.updated"}
+
+  def encode_updated(value) when is_binary(value), do: value
+  def encode_updated(_), do: {:error, "Unexpected type when encoding Meta.updated"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Meta.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Meta.url"}
+
   def from_map(m) do
     %Meta{
-      credit: m["credit"],
-      updated: m["updated"],
-      url: m["url"],
+      credit: decode_credit(m["credit"]),
+      updated: decode_updated(m["updated"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -113,13 +185,39 @@ defmodule Weather do
           wind: String.t()
         }
 
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Weather.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Weather.temp"}
+
+  def decode_visibility(value) when is_float(value), do: value
+  def decode_visibility(value) when is_integer(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Weather.visibility"}
+
+  def encode_visibility(value) when is_float(value), do: value
+  def encode_visibility(value) when is_integer(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Weather.visibility"}
+
+  def decode_weather(value) when is_binary(value), do: value
+  def decode_weather(_), do: {:error, "Unexpected type when decoding Weather.weather"}
+
+  def encode_weather(value) when is_binary(value), do: value
+  def encode_weather(_), do: {:error, "Unexpected type when encoding Weather.weather"}
+
+  def decode_wind(value) when is_binary(value), do: value
+  def decode_wind(_), do: {:error, "Unexpected type when decoding Weather.wind"}
+
+  def encode_wind(value) when is_binary(value), do: value
+  def encode_wind(_), do: {:error, "Unexpected type when encoding Weather.wind"}
+
   def from_map(m) do
     %Weather{
       meta: Meta.from_map(m["meta"]),
-      temp: m["temp"],
-      visibility: m["visibility"],
-      weather: m["weather"],
-      wind: m["wind"],
+      temp: decode_temp(m["temp"]),
+      visibility: decode_visibility(m["visibility"]),
+      weather: decode_weather(m["weather"]),
+      wind: decode_wind(m["wind"]),
     }
   end
 
@@ -161,14 +259,50 @@ defmodule TopLevel do
           weather: Weather.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding TopLevel.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding TopLevel.city"}
+
+  def decode_delay(value) when is_binary(value), do: value
+  def decode_delay(_), do: {:error, "Unexpected type when decoding TopLevel.delay"}
+
+  def encode_delay(value) when is_binary(value), do: value
+  def encode_delay(_), do: {:error, "Unexpected type when encoding TopLevel.delay"}
+
+  def decode_iata(value) when is_binary(value), do: value
+  def decode_iata(_), do: {:error, "Unexpected type when decoding TopLevel.iata"}
+
+  def encode_iata(value) when is_binary(value), do: value
+  def encode_iata(_), do: {:error, "Unexpected type when encoding TopLevel.iata"}
+
+  def decode_icao(value) when is_binary(value), do: value
+  def decode_icao(_), do: {:error, "Unexpected type when decoding TopLevel.icao"}
+
+  def encode_icao(value) when is_binary(value), do: value
+  def encode_icao(_), do: {:error, "Unexpected type when encoding TopLevel.icao"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding TopLevel.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding TopLevel.state"}
+
   def from_map(m) do
     %TopLevel{
-      city: m["city"],
-      delay: m["delay"],
-      iata: m["IATA"],
-      icao: m["ICAO"],
-      name: m["name"],
-      state: m["state"],
+      city: decode_city(m["city"]),
+      delay: decode_delay(m["delay"]),
+      iata: decode_iata(m["IATA"]),
+      icao: decode_icao(m["ICAO"]),
+      name: decode_name(m["name"]),
+      state: decode_state(m["state"]),
       status: Status.from_map(m["status"]),
       weather: Weather.from_map(m["weather"]),
     }
diff --git a/base/elixir/test/inputs/json/misc/cd238.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/cd238.json/default/QuickType.ex
index b9f86f4..e9a4777 100644
--- a/base/elixir/test/inputs/json/misc/cd238.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/cd238.json/default/QuickType.ex
@@ -21,17 +21,71 @@ defmodule Status do
           type: String.t()
         }
 
+  def decode_avg_delay(value) when is_binary(value), do: value
+  def decode_avg_delay(_), do: {:error, "Unexpected type when decoding Status.avg_delay"}
+
+  def encode_avg_delay(value) when is_binary(value), do: value
+  def encode_avg_delay(_), do: {:error, "Unexpected type when encoding Status.avg_delay"}
+
+  def decode_closure_begin(value) when is_binary(value), do: value
+  def decode_closure_begin(_), do: {:error, "Unexpected type when decoding Status.closure_begin"}
+
+  def encode_closure_begin(value) when is_binary(value), do: value
+  def encode_closure_begin(_), do: {:error, "Unexpected type when encoding Status.closure_begin"}
+
+  def decode_closure_end(value) when is_binary(value), do: value
+  def decode_closure_end(_), do: {:error, "Unexpected type when decoding Status.closure_end"}
+
+  def encode_closure_end(value) when is_binary(value), do: value
+  def encode_closure_end(_), do: {:error, "Unexpected type when encoding Status.closure_end"}
+
+  def decode_end_time(value) when is_binary(value), do: value
+  def decode_end_time(_), do: {:error, "Unexpected type when decoding Status.end_time"}
+
+  def encode_end_time(value) when is_binary(value), do: value
+  def encode_end_time(_), do: {:error, "Unexpected type when encoding Status.end_time"}
+
+  def decode_max_delay(value) when is_binary(value), do: value
+  def decode_max_delay(_), do: {:error, "Unexpected type when decoding Status.max_delay"}
+
+  def encode_max_delay(value) when is_binary(value), do: value
+  def encode_max_delay(_), do: {:error, "Unexpected type when encoding Status.max_delay"}
+
+  def decode_min_delay(value) when is_binary(value), do: value
+  def decode_min_delay(_), do: {:error, "Unexpected type when decoding Status.min_delay"}
+
+  def encode_min_delay(value) when is_binary(value), do: value
+  def encode_min_delay(_), do: {:error, "Unexpected type when encoding Status.min_delay"}
+
+  def decode_reason(value) when is_binary(value), do: value
+  def decode_reason(_), do: {:error, "Unexpected type when decoding Status.reason"}
+
+  def encode_reason(value) when is_binary(value), do: value
+  def encode_reason(_), do: {:error, "Unexpected type when encoding Status.reason"}
+
+  def decode_trend(value) when is_binary(value), do: value
+  def decode_trend(_), do: {:error, "Unexpected type when decoding Status.trend"}
+
+  def encode_trend(value) when is_binary(value), do: value
+  def encode_trend(_), do: {:error, "Unexpected type when encoding Status.trend"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Status.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Status.type"}
+
   def from_map(m) do
     %Status{
-      avg_delay: m["avgDelay"],
-      closure_begin: m["closureBegin"],
-      closure_end: m["closureEnd"],
-      end_time: m["endTime"],
-      max_delay: m["maxDelay"],
-      min_delay: m["minDelay"],
-      reason: m["reason"],
-      trend: m["trend"],
-      type: m["type"],
+      avg_delay: decode_avg_delay(m["avgDelay"]),
+      closure_begin: decode_closure_begin(m["closureBegin"]),
+      closure_end: decode_closure_end(m["closureEnd"]),
+      end_time: decode_end_time(m["endTime"]),
+      max_delay: decode_max_delay(m["maxDelay"]),
+      min_delay: decode_min_delay(m["minDelay"]),
+      reason: decode_reason(m["reason"]),
+      trend: decode_trend(m["trend"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -72,11 +126,29 @@ defmodule Meta do
           url: String.t()
         }
 
+  def decode_credit(value) when is_binary(value), do: value
+  def decode_credit(_), do: {:error, "Unexpected type when decoding Meta.credit"}
+
+  def encode_credit(value) when is_binary(value), do: value
+  def encode_credit(_), do: {:error, "Unexpected type when encoding Meta.credit"}
+
+  def decode_updated(value) when is_binary(value), do: value
+  def decode_updated(_), do: {:error, "Unexpected type when decoding Meta.updated"}
+
+  def encode_updated(value) when is_binary(value), do: value
+  def encode_updated(_), do: {:error, "Unexpected type when encoding Meta.updated"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Meta.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Meta.url"}
+
   def from_map(m) do
     %Meta{
-      credit: m["credit"],
-      updated: m["updated"],
-      url: m["url"],
+      credit: decode_credit(m["credit"]),
+      updated: decode_updated(m["updated"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -113,13 +185,39 @@ defmodule Weather do
           wind: String.t()
         }
 
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Weather.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Weather.temp"}
+
+  def decode_visibility(value) when is_float(value), do: value
+  def decode_visibility(value) when is_integer(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Weather.visibility"}
+
+  def encode_visibility(value) when is_float(value), do: value
+  def encode_visibility(value) when is_integer(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Weather.visibility"}
+
+  def decode_weather(value) when is_binary(value), do: value
+  def decode_weather(_), do: {:error, "Unexpected type when decoding Weather.weather"}
+
+  def encode_weather(value) when is_binary(value), do: value
+  def encode_weather(_), do: {:error, "Unexpected type when encoding Weather.weather"}
+
+  def decode_wind(value) when is_binary(value), do: value
+  def decode_wind(_), do: {:error, "Unexpected type when decoding Weather.wind"}
+
+  def encode_wind(value) when is_binary(value), do: value
+  def encode_wind(_), do: {:error, "Unexpected type when encoding Weather.wind"}
+
   def from_map(m) do
     %Weather{
       meta: Meta.from_map(m["meta"]),
-      temp: m["temp"],
-      visibility: m["visibility"],
-      weather: m["weather"],
-      wind: m["wind"],
+      temp: decode_temp(m["temp"]),
+      visibility: decode_visibility(m["visibility"]),
+      weather: decode_weather(m["weather"]),
+      wind: decode_wind(m["wind"]),
     }
   end
 
@@ -161,14 +259,50 @@ defmodule TopLevel do
           weather: Weather.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding TopLevel.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding TopLevel.city"}
+
+  def decode_delay(value) when is_binary(value), do: value
+  def decode_delay(_), do: {:error, "Unexpected type when decoding TopLevel.delay"}
+
+  def encode_delay(value) when is_binary(value), do: value
+  def encode_delay(_), do: {:error, "Unexpected type when encoding TopLevel.delay"}
+
+  def decode_iata(value) when is_binary(value), do: value
+  def decode_iata(_), do: {:error, "Unexpected type when decoding TopLevel.iata"}
+
+  def encode_iata(value) when is_binary(value), do: value
+  def encode_iata(_), do: {:error, "Unexpected type when encoding TopLevel.iata"}
+
+  def decode_icao(value) when is_binary(value), do: value
+  def decode_icao(_), do: {:error, "Unexpected type when decoding TopLevel.icao"}
+
+  def encode_icao(value) when is_binary(value), do: value
+  def encode_icao(_), do: {:error, "Unexpected type when encoding TopLevel.icao"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding TopLevel.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding TopLevel.state"}
+
   def from_map(m) do
     %TopLevel{
-      city: m["city"],
-      delay: m["delay"],
-      iata: m["IATA"],
-      icao: m["ICAO"],
-      name: m["name"],
-      state: m["state"],
+      city: decode_city(m["city"]),
+      delay: decode_delay(m["delay"]),
+      iata: decode_iata(m["IATA"]),
+      icao: decode_icao(m["ICAO"]),
+      name: decode_name(m["name"]),
+      state: decode_state(m["state"]),
       status: Status.from_map(m["status"]),
       weather: Weather.from_map(m["weather"]),
     }
diff --git a/base/elixir/test/inputs/json/misc/cd463.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/cd463.json/default/QuickType.ex
index 8937606..db497b1 100644
--- a/base/elixir/test/inputs/json/misc/cd463.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/cd463.json/default/QuickType.ex
@@ -15,11 +15,32 @@ defmodule TopLevel do
           rates: %{String.t() => float()}
         }
 
+  def decode_base(value) when is_binary(value), do: value
+  def decode_base(_), do: {:error, "Unexpected type when decoding TopLevel.base"}
+
+  def encode_base(value) when is_binary(value), do: value
+  def encode_base(_), do: {:error, "Unexpected type when encoding TopLevel.base"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel.date"}
+
+  def decode_rates_value(value) when is_float(value), do: value
+  def decode_rates_value(value) when is_integer(value), do: value
+  def decode_rates_value(_), do: {:error, "Unexpected type when decoding TopLevel.rates"}
+
+  def encode_rates_value(value) when is_float(value), do: value
+  def encode_rates_value(value) when is_integer(value), do: value
+  def encode_rates_value(_), do: {:error, "Unexpected type when encoding TopLevel.rates"}
+
   def from_map(m) do
     %TopLevel{
-      base: m["base"],
-      date: m["date"],
-      rates: m["rates"],
+      base: decode_base(m["base"]),
+      date: decode_date(m["date"]),
+      rates: m["rates"]
+      |> Map.new(fn {key, value} -> {key, decode_rates_value(value)} end),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/cda6c.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/cda6c.json/default/QuickType.ex
index 26ca2bd..26584c7 100644
--- a/base/elixir/test/inputs/json/misc/cda6c.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/cda6c.json/default/QuickType.ex
@@ -145,13 +145,31 @@ defmodule TopLevel1 do
           value: String.t()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel1.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel1.date"}
+
+  def decode_decimal(value) when is_binary(value), do: value
+  def decode_decimal(_), do: {:error, "Unexpected type when decoding TopLevel1.decimal"}
+
+  def encode_decimal(value) when is_binary(value), do: value
+  def encode_decimal(_), do: {:error, "Unexpected type when encoding TopLevel1.decimal"}
+
+  def decode_value(value) when is_binary(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding TopLevel1.value"}
+
+  def encode_value(value) when is_binary(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding TopLevel1.value"}
+
   def from_map(m) do
     %TopLevel1{
       country: Country.from_map(m["country"]),
-      date: m["date"],
-      decimal: m["decimal"],
+      date: decode_date(m["date"]),
+      decimal: decode_decimal(m["decimal"]),
       indicator: Country.from_map(m["indicator"]),
-      value: m["value"],
+      value: decode_value(m["value"]),
     }
   end
 
@@ -189,12 +207,36 @@ defmodule TopLevel2 do
           total: integer()
         }
 
+  def decode_page(value) when is_integer(value), do: value
+  def decode_page(_), do: {:error, "Unexpected type when decoding TopLevel2.page"}
+
+  def encode_page(value) when is_integer(value), do: value
+  def encode_page(_), do: {:error, "Unexpected type when encoding TopLevel2.page"}
+
+  def decode_pages(value) when is_integer(value), do: value
+  def decode_pages(_), do: {:error, "Unexpected type when decoding TopLevel2.pages"}
+
+  def encode_pages(value) when is_integer(value), do: value
+  def encode_pages(_), do: {:error, "Unexpected type when encoding TopLevel2.pages"}
+
+  def decode_per_page(value) when is_binary(value), do: value
+  def decode_per_page(_), do: {:error, "Unexpected type when decoding TopLevel2.per_page"}
+
+  def encode_per_page(value) when is_binary(value), do: value
+  def encode_per_page(_), do: {:error, "Unexpected type when encoding TopLevel2.per_page"}
+
+  def decode_total(value) when is_integer(value), do: value
+  def decode_total(_), do: {:error, "Unexpected type when decoding TopLevel2.total"}
+
+  def encode_total(value) when is_integer(value), do: value
+  def encode_total(_), do: {:error, "Unexpected type when encoding TopLevel2.total"}
+
   def from_map(m) do
     %TopLevel2{
-      page: m["page"],
-      pages: m["pages"],
-      per_page: m["per_page"],
-      total: m["total"],
+      page: decode_page(m["page"]),
+      pages: decode_pages(m["pages"]),
+      per_page: decode_per_page(m["per_page"]),
+      total: decode_total(m["total"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/cf0d8.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/cf0d8.json/default/QuickType.ex
index ee06b77..98852a1 100644
--- a/base/elixir/test/inputs/json/misc/cf0d8.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/cf0d8.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Astronomy do
           sunset: String.t()
         }
 
+  def decode_sunrise(value) when is_binary(value), do: value
+  def decode_sunrise(_), do: {:error, "Unexpected type when decoding Astronomy.sunrise"}
+
+  def encode_sunrise(value) when is_binary(value), do: value
+  def encode_sunrise(_), do: {:error, "Unexpected type when encoding Astronomy.sunrise"}
+
+  def decode_sunset(value) when is_binary(value), do: value
+  def decode_sunset(_), do: {:error, "Unexpected type when decoding Astronomy.sunset"}
+
+  def encode_sunset(value) when is_binary(value), do: value
+  def encode_sunset(_), do: {:error, "Unexpected type when encoding Astronomy.sunset"}
+
   def from_map(m) do
     %Astronomy{
-      sunrise: m["sunrise"],
-      sunset: m["sunset"],
+      sunrise: decode_sunrise(m["sunrise"]),
+      sunset: decode_sunset(m["sunset"]),
     }
   end
 
@@ -52,12 +64,36 @@ defmodule Atmosphere do
           visibility: String.t()
         }
 
+  def decode_humidity(value) when is_binary(value), do: value
+  def decode_humidity(_), do: {:error, "Unexpected type when decoding Atmosphere.humidity"}
+
+  def encode_humidity(value) when is_binary(value), do: value
+  def encode_humidity(_), do: {:error, "Unexpected type when encoding Atmosphere.humidity"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Atmosphere.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Atmosphere.pressure"}
+
+  def decode_rising(value) when is_binary(value), do: value
+  def decode_rising(_), do: {:error, "Unexpected type when decoding Atmosphere.rising"}
+
+  def encode_rising(value) when is_binary(value), do: value
+  def encode_rising(_), do: {:error, "Unexpected type when encoding Atmosphere.rising"}
+
+  def decode_visibility(value) when is_binary(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Atmosphere.visibility"}
+
+  def encode_visibility(value) when is_binary(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Atmosphere.visibility"}
+
   def from_map(m) do
     %Atmosphere{
-      humidity: m["humidity"],
-      pressure: m["pressure"],
-      rising: m["rising"],
-      visibility: m["visibility"],
+      humidity: decode_humidity(m["humidity"]),
+      pressure: decode_pressure(m["pressure"]),
+      rising: decode_rising(m["rising"]),
+      visibility: decode_visibility(m["visibility"]),
     }
   end
 
@@ -95,13 +131,43 @@ defmodule Image do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Image.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Image.height"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Image.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Image.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Image.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Image.title"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Image.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Image.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Image.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Image.width"}
+
   def from_map(m) do
     %Image{
-      height: m["height"],
-      link: m["link"],
-      title: m["title"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      link: decode_link(m["link"]),
+      title: decode_title(m["title"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -139,12 +205,36 @@ defmodule Condition do
           text: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Condition.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Condition.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Condition.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Condition.date"}
+
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Condition.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Condition.temp"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Condition.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Condition.text"}
+
   def from_map(m) do
     %Condition{
-      code: m["code"],
-      date: m["date"],
-      temp: m["temp"],
-      text: m["text"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      temp: decode_temp(m["temp"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -183,14 +273,50 @@ defmodule Forecast do
           text: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Forecast.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Forecast.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Forecast.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Forecast.date"}
+
+  def decode_day(value) when is_binary(value), do: value
+  def decode_day(_), do: {:error, "Unexpected type when decoding Forecast.day"}
+
+  def encode_day(value) when is_binary(value), do: value
+  def encode_day(_), do: {:error, "Unexpected type when encoding Forecast.day"}
+
+  def decode_high(value) when is_binary(value), do: value
+  def decode_high(_), do: {:error, "Unexpected type when decoding Forecast.high"}
+
+  def encode_high(value) when is_binary(value), do: value
+  def encode_high(_), do: {:error, "Unexpected type when encoding Forecast.high"}
+
+  def decode_low(value) when is_binary(value), do: value
+  def decode_low(_), do: {:error, "Unexpected type when decoding Forecast.low"}
+
+  def encode_low(value) when is_binary(value), do: value
+  def encode_low(_), do: {:error, "Unexpected type when encoding Forecast.low"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Forecast.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Forecast.text"}
+
   def from_map(m) do
     %Forecast{
-      code: m["code"],
-      date: m["date"],
-      day: m["day"],
-      high: m["high"],
-      low: m["low"],
-      text: m["text"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      day: decode_day(m["day"]),
+      high: decode_high(m["high"]),
+      low: decode_low(m["low"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -226,9 +352,15 @@ defmodule GUID do
           is_perma_link: String.t()
         }
 
+  def decode_is_perma_link(value) when is_binary(value), do: value
+  def decode_is_perma_link(_), do: {:error, "Unexpected type when decoding GUID.is_perma_link"}
+
+  def encode_is_perma_link(value) when is_binary(value), do: value
+  def encode_is_perma_link(_), do: {:error, "Unexpected type when encoding GUID.is_perma_link"}
+
   def from_map(m) do
     %GUID{
-      is_perma_link: m["isPermaLink"],
+      is_perma_link: decode_is_perma_link(m["isPermaLink"]),
     }
   end
 
@@ -267,17 +399,59 @@ defmodule Item do
           title: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Item.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Item.description"}
+
+  def decode_forecast(value) when is_list(value), do: value
+  def decode_forecast(_), do: {:error, "Unexpected type when decoding Item.forecast"}
+
+  def encode_forecast(value) when is_list(value), do: value
+  def encode_forecast(_), do: {:error, "Unexpected type when encoding Item.forecast"}
+
+  def decode_lat(value) when is_binary(value), do: value
+  def decode_lat(_), do: {:error, "Unexpected type when decoding Item.lat"}
+
+  def encode_lat(value) when is_binary(value), do: value
+  def encode_lat(_), do: {:error, "Unexpected type when encoding Item.lat"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Item.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Item.link"}
+
+  def decode_long(value) when is_binary(value), do: value
+  def decode_long(_), do: {:error, "Unexpected type when decoding Item.long"}
+
+  def encode_long(value) when is_binary(value), do: value
+  def encode_long(_), do: {:error, "Unexpected type when encoding Item.long"}
+
+  def decode_pub_date(value) when is_binary(value), do: value
+  def decode_pub_date(_), do: {:error, "Unexpected type when decoding Item.pub_date"}
+
+  def encode_pub_date(value) when is_binary(value), do: value
+  def encode_pub_date(_), do: {:error, "Unexpected type when encoding Item.pub_date"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Item.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Item.title"}
+
   def from_map(m) do
     %Item{
       condition: Condition.from_map(m["condition"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       forecast: Enum.map(m["forecast"], &Forecast.from_map/1),
       guid: GUID.from_map(m["guid"]),
-      lat: m["lat"],
-      link: m["link"],
-      long: m["long"],
-      pub_date: m["pubDate"],
-      title: m["title"],
+      lat: decode_lat(m["lat"]),
+      link: decode_link(m["link"]),
+      long: decode_long(m["long"]),
+      pub_date: decode_pub_date(m["pubDate"]),
+      title: decode_title(m["title"]),
     }
   end
 
@@ -318,11 +492,29 @@ defmodule Location do
           region: String.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding Location.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding Location.city"}
+
+  def decode_country(value) when is_binary(value), do: value
+  def decode_country(_), do: {:error, "Unexpected type when decoding Location.country"}
+
+  def encode_country(value) when is_binary(value), do: value
+  def encode_country(_), do: {:error, "Unexpected type when encoding Location.country"}
+
+  def decode_region(value) when is_binary(value), do: value
+  def decode_region(_), do: {:error, "Unexpected type when decoding Location.region"}
+
+  def encode_region(value) when is_binary(value), do: value
+  def encode_region(_), do: {:error, "Unexpected type when encoding Location.region"}
+
   def from_map(m) do
     %Location{
-      city: m["city"],
-      country: m["country"],
-      region: m["region"],
+      city: decode_city(m["city"]),
+      country: decode_country(m["country"]),
+      region: decode_region(m["region"]),
     }
   end
 
@@ -358,12 +550,36 @@ defmodule Units do
           temperature: String.t()
         }
 
+  def decode_distance(value) when is_binary(value), do: value
+  def decode_distance(_), do: {:error, "Unexpected type when decoding Units.distance"}
+
+  def encode_distance(value) when is_binary(value), do: value
+  def encode_distance(_), do: {:error, "Unexpected type when encoding Units.distance"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Units.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Units.pressure"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Units.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Units.speed"}
+
+  def decode_temperature(value) when is_binary(value), do: value
+  def decode_temperature(_), do: {:error, "Unexpected type when decoding Units.temperature"}
+
+  def encode_temperature(value) when is_binary(value), do: value
+  def encode_temperature(_), do: {:error, "Unexpected type when encoding Units.temperature"}
+
   def from_map(m) do
     %Units{
-      distance: m["distance"],
-      pressure: m["pressure"],
-      speed: m["speed"],
-      temperature: m["temperature"],
+      distance: decode_distance(m["distance"]),
+      pressure: decode_pressure(m["pressure"]),
+      speed: decode_speed(m["speed"]),
+      temperature: decode_temperature(m["temperature"]),
     }
   end
 
@@ -399,11 +615,29 @@ defmodule Wind do
           speed: String.t()
         }
 
+  def decode_chill(value) when is_binary(value), do: value
+  def decode_chill(_), do: {:error, "Unexpected type when decoding Wind.chill"}
+
+  def encode_chill(value) when is_binary(value), do: value
+  def encode_chill(_), do: {:error, "Unexpected type when encoding Wind.chill"}
+
+  def decode_direction(value) when is_binary(value), do: value
+  def decode_direction(_), do: {:error, "Unexpected type when decoding Wind.direction"}
+
+  def encode_direction(value) when is_binary(value), do: value
+  def encode_direction(_), do: {:error, "Unexpected type when encoding Wind.direction"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Wind.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Wind.speed"}
+
   def from_map(m) do
     %Wind{
-      chill: m["chill"],
-      direction: m["direction"],
-      speed: m["speed"],
+      chill: decode_chill(m["chill"]),
+      direction: decode_direction(m["direction"]),
+      speed: decode_speed(m["speed"]),
     }
   end
 
@@ -448,19 +682,55 @@ defmodule Channel do
           wind: Wind.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Channel.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Channel.description"}
+
+  def decode_language(value) when is_binary(value), do: value
+  def decode_language(_), do: {:error, "Unexpected type when decoding Channel.language"}
+
+  def encode_language(value) when is_binary(value), do: value
+  def encode_language(_), do: {:error, "Unexpected type when encoding Channel.language"}
+
+  def decode_last_build_date(value) when is_binary(value), do: value
+  def decode_last_build_date(_), do: {:error, "Unexpected type when decoding Channel.last_build_date"}
+
+  def encode_last_build_date(value) when is_binary(value), do: value
+  def encode_last_build_date(_), do: {:error, "Unexpected type when encoding Channel.last_build_date"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Channel.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Channel.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Channel.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Channel.title"}
+
+  def decode_ttl(value) when is_binary(value), do: value
+  def decode_ttl(_), do: {:error, "Unexpected type when decoding Channel.ttl"}
+
+  def encode_ttl(value) when is_binary(value), do: value
+  def encode_ttl(_), do: {:error, "Unexpected type when encoding Channel.ttl"}
+
   def from_map(m) do
     %Channel{
       astronomy: Astronomy.from_map(m["astronomy"]),
       atmosphere: Atmosphere.from_map(m["atmosphere"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       image: Image.from_map(m["image"]),
       item: Item.from_map(m["item"]),
-      language: m["language"],
-      last_build_date: m["lastBuildDate"],
-      link: m["link"],
+      language: decode_language(m["language"]),
+      last_build_date: decode_last_build_date(m["lastBuildDate"]),
+      link: decode_link(m["link"]),
       location: Location.from_map(m["location"]),
-      title: m["title"],
-      ttl: m["ttl"],
+      title: decode_title(m["title"]),
+      ttl: decode_ttl(m["ttl"]),
       units: Units.from_map(m["units"]),
       wind: Wind.from_map(m["wind"]),
     }
@@ -541,11 +811,29 @@ defmodule Query do
           results: Results.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Query.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Query.count"}
+
+  def decode_created(value) when is_binary(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding Query.created"}
+
+  def encode_created(value) when is_binary(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding Query.created"}
+
+  def decode_lang(value) when is_binary(value), do: value
+  def decode_lang(_), do: {:error, "Unexpected type when decoding Query.lang"}
+
+  def encode_lang(value) when is_binary(value), do: value
+  def encode_lang(_), do: {:error, "Unexpected type when encoding Query.lang"}
+
   def from_map(m) do
     %Query{
-      count: m["count"],
-      created: m["created"],
-      lang: m["lang"],
+      count: decode_count(m["count"]),
+      created: decode_created(m["created"]),
+      lang: decode_lang(m["lang"]),
       results: Results.from_map(m["results"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/cfbce.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/cfbce.json/default/QuickType.ex
index 8937606..db497b1 100644
--- a/base/elixir/test/inputs/json/misc/cfbce.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/cfbce.json/default/QuickType.ex
@@ -15,11 +15,32 @@ defmodule TopLevel do
           rates: %{String.t() => float()}
         }
 
+  def decode_base(value) when is_binary(value), do: value
+  def decode_base(_), do: {:error, "Unexpected type when decoding TopLevel.base"}
+
+  def encode_base(value) when is_binary(value), do: value
+  def encode_base(_), do: {:error, "Unexpected type when encoding TopLevel.base"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel.date"}
+
+  def decode_rates_value(value) when is_float(value), do: value
+  def decode_rates_value(value) when is_integer(value), do: value
+  def decode_rates_value(_), do: {:error, "Unexpected type when decoding TopLevel.rates"}
+
+  def encode_rates_value(value) when is_float(value), do: value
+  def encode_rates_value(value) when is_integer(value), do: value
+  def encode_rates_value(_), do: {:error, "Unexpected type when encoding TopLevel.rates"}
+
   def from_map(m) do
     %TopLevel{
-      base: m["base"],
-      date: m["date"],
-      rates: m["rates"],
+      base: decode_base(m["base"]),
+      date: decode_date(m["date"]),
+      rates: m["rates"]
+      |> Map.new(fn {key, value} -> {key, decode_rates_value(value)} end),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/d0908.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/d0908.json/default/QuickType.ex
index bf47bf0..b805b08 100644
--- a/base/elixir/test/inputs/json/misc/d0908.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/d0908.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule TotalPopulation do
           population: integer()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TotalPopulation.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TotalPopulation.date"}
+
+  def decode_population(value) when is_integer(value), do: value
+  def decode_population(_), do: {:error, "Unexpected type when decoding TotalPopulation.population"}
+
+  def encode_population(value) when is_integer(value), do: value
+  def encode_population(_), do: {:error, "Unexpected type when encoding TotalPopulation.population"}
+
   def from_map(m) do
     %TotalPopulation{
-      date: m["date"],
-      population: m["population"],
+      date: decode_date(m["date"]),
+      population: decode_population(m["population"]),
     }
   end
 
@@ -49,6 +61,12 @@ defmodule TopLevel do
           total_population: [TotalPopulation.t()]
         }
 
+  def decode_total_population(value) when is_list(value), do: value
+  def decode_total_population(_), do: {:error, "Unexpected type when decoding TopLevel.total_population"}
+
+  def encode_total_population(value) when is_list(value), do: value
+  def encode_total_population(_), do: {:error, "Unexpected type when encoding TopLevel.total_population"}
+
   def from_map(m) do
     %TopLevel{
       total_population: Enum.map(m["total_population"], &TotalPopulation.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/d23d5.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/d23d5.json/default/QuickType.ex
index 0684ee9..cd5365d 100644
--- a/base/elixir/test/inputs/json/misc/d23d5.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/d23d5.json/default/QuickType.ex
@@ -47,14 +47,44 @@ defmodule Result do
           uri: String.t()
         }
 
+  def decode_created_at(value) when is_binary(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding Result.created_at"}
+
+  def encode_created_at(value) when is_binary(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding Result.created_at"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Result.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Result.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Result.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Result.name"}
+
+  def decode_updated_at(value) when is_binary(value), do: value
+  def decode_updated_at(_), do: {:error, "Unexpected type when decoding Result.updated_at"}
+
+  def encode_updated_at(value) when is_binary(value), do: value
+  def encode_updated_at(_), do: {:error, "Unexpected type when encoding Result.updated_at"}
+
+  def decode_uri(value) when is_binary(value), do: value
+  def decode_uri(_), do: {:error, "Unexpected type when decoding Result.uri"}
+
+  def encode_uri(value) when is_binary(value), do: value
+  def encode_uri(_), do: {:error, "Unexpected type when encoding Result.uri"}
+
   def from_map(m) do
     %Result{
       acronym: m["acronym"],
-      created_at: m["created_at"],
-      id: m["id"],
-      name: m["name"],
-      updated_at: m["updated_at"],
-      uri: m["uri"],
+      created_at: decode_created_at(m["created_at"]),
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
+      updated_at: decode_updated_at(m["updated_at"]),
+      uri: decode_uri(m["uri"]),
     }
   end
 
@@ -96,14 +126,50 @@ defmodule TopLevel do
           results: [Result.t()]
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding TopLevel.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding TopLevel.count"}
+
+  def decode_limit(value) when is_integer(value), do: value
+  def decode_limit(_), do: {:error, "Unexpected type when decoding TopLevel.limit"}
+
+  def encode_limit(value) when is_integer(value), do: value
+  def encode_limit(_), do: {:error, "Unexpected type when encoding TopLevel.limit"}
+
+  def decode_next(value) when is_binary(value), do: value
+  def decode_next(_), do: {:error, "Unexpected type when decoding TopLevel.next"}
+
+  def encode_next(value) when is_binary(value), do: value
+  def encode_next(_), do: {:error, "Unexpected type when encoding TopLevel.next"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding TopLevel.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding TopLevel.offset"}
+
+  def decode_previous(value) when is_boolean(value), do: value
+  def decode_previous(_), do: {:error, "Unexpected type when decoding TopLevel.previous"}
+
+  def encode_previous(value) when is_boolean(value), do: value
+  def encode_previous(_), do: {:error, "Unexpected type when encoding TopLevel.previous"}
+
+  def decode_results(value) when is_list(value), do: value
+  def decode_results(_), do: {:error, "Unexpected type when decoding TopLevel.results"}
+
+  def encode_results(value) when is_list(value), do: value
+  def encode_results(_), do: {:error, "Unexpected type when encoding TopLevel.results"}
+
   def from_map(m) do
     %TopLevel{
-      count: m["count"],
+      count: decode_count(m["count"]),
       facets: Facets.from_map(m["facets"]),
-      limit: m["limit"],
-      next: m["next"],
-      offset: m["offset"],
-      previous: m["previous"],
+      limit: decode_limit(m["limit"]),
+      next: decode_next(m["next"]),
+      offset: decode_offset(m["offset"]),
+      previous: decode_previous(m["previous"]),
       results: Enum.map(m["results"], &Result.from_map/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/dbfb3.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/dbfb3.json/default/QuickType.ex
index 58b497d..a821358 100644
--- a/base/elixir/test/inputs/json/misc/dbfb3.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/dbfb3.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Astronomy do
           sunset: String.t()
         }
 
+  def decode_sunrise(value) when is_binary(value), do: value
+  def decode_sunrise(_), do: {:error, "Unexpected type when decoding Astronomy.sunrise"}
+
+  def encode_sunrise(value) when is_binary(value), do: value
+  def encode_sunrise(_), do: {:error, "Unexpected type when encoding Astronomy.sunrise"}
+
+  def decode_sunset(value) when is_binary(value), do: value
+  def decode_sunset(_), do: {:error, "Unexpected type when decoding Astronomy.sunset"}
+
+  def encode_sunset(value) when is_binary(value), do: value
+  def encode_sunset(_), do: {:error, "Unexpected type when encoding Astronomy.sunset"}
+
   def from_map(m) do
     %Astronomy{
-      sunrise: m["sunrise"],
-      sunset: m["sunset"],
+      sunrise: decode_sunrise(m["sunrise"]),
+      sunset: decode_sunset(m["sunset"]),
     }
   end
 
@@ -52,12 +64,36 @@ defmodule Atmosphere do
           visibility: String.t()
         }
 
+  def decode_humidity(value) when is_binary(value), do: value
+  def decode_humidity(_), do: {:error, "Unexpected type when decoding Atmosphere.humidity"}
+
+  def encode_humidity(value) when is_binary(value), do: value
+  def encode_humidity(_), do: {:error, "Unexpected type when encoding Atmosphere.humidity"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Atmosphere.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Atmosphere.pressure"}
+
+  def decode_rising(value) when is_binary(value), do: value
+  def decode_rising(_), do: {:error, "Unexpected type when decoding Atmosphere.rising"}
+
+  def encode_rising(value) when is_binary(value), do: value
+  def encode_rising(_), do: {:error, "Unexpected type when encoding Atmosphere.rising"}
+
+  def decode_visibility(value) when is_binary(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Atmosphere.visibility"}
+
+  def encode_visibility(value) when is_binary(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Atmosphere.visibility"}
+
   def from_map(m) do
     %Atmosphere{
-      humidity: m["humidity"],
-      pressure: m["pressure"],
-      rising: m["rising"],
-      visibility: m["visibility"],
+      humidity: decode_humidity(m["humidity"]),
+      pressure: decode_pressure(m["pressure"]),
+      rising: decode_rising(m["rising"]),
+      visibility: decode_visibility(m["visibility"]),
     }
   end
 
@@ -95,13 +131,43 @@ defmodule Image do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Image.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Image.height"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Image.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Image.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Image.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Image.title"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Image.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Image.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Image.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Image.width"}
+
   def from_map(m) do
     %Image{
-      height: m["height"],
-      link: m["link"],
-      title: m["title"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      link: decode_link(m["link"]),
+      title: decode_title(m["title"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -185,11 +251,29 @@ defmodule Condition do
           text: Text.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Condition.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Condition.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Condition.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Condition.date"}
+
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Condition.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Condition.temp"}
+
   def from_map(m) do
     %Condition{
-      code: m["code"],
-      date: m["date"],
-      temp: m["temp"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      temp: decode_temp(m["temp"]),
       text: Text.decode(m["text"]),
     }
   end
@@ -229,13 +313,43 @@ defmodule Forecast do
           text: Text.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Forecast.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Forecast.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Forecast.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Forecast.date"}
+
+  def decode_day(value) when is_binary(value), do: value
+  def decode_day(_), do: {:error, "Unexpected type when decoding Forecast.day"}
+
+  def encode_day(value) when is_binary(value), do: value
+  def encode_day(_), do: {:error, "Unexpected type when encoding Forecast.day"}
+
+  def decode_high(value) when is_binary(value), do: value
+  def decode_high(_), do: {:error, "Unexpected type when decoding Forecast.high"}
+
+  def encode_high(value) when is_binary(value), do: value
+  def encode_high(_), do: {:error, "Unexpected type when encoding Forecast.high"}
+
+  def decode_low(value) when is_binary(value), do: value
+  def decode_low(_), do: {:error, "Unexpected type when decoding Forecast.low"}
+
+  def encode_low(value) when is_binary(value), do: value
+  def encode_low(_), do: {:error, "Unexpected type when encoding Forecast.low"}
+
   def from_map(m) do
     %Forecast{
-      code: m["code"],
-      date: m["date"],
-      day: m["day"],
-      high: m["high"],
-      low: m["low"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      day: decode_day(m["day"]),
+      high: decode_high(m["high"]),
+      low: decode_low(m["low"]),
       text: Text.decode(m["text"]),
     }
   end
@@ -272,9 +386,15 @@ defmodule GUID do
           is_perma_link: String.t()
         }
 
+  def decode_is_perma_link(value) when is_binary(value), do: value
+  def decode_is_perma_link(_), do: {:error, "Unexpected type when decoding GUID.is_perma_link"}
+
+  def encode_is_perma_link(value) when is_binary(value), do: value
+  def encode_is_perma_link(_), do: {:error, "Unexpected type when encoding GUID.is_perma_link"}
+
   def from_map(m) do
     %GUID{
-      is_perma_link: m["isPermaLink"],
+      is_perma_link: decode_is_perma_link(m["isPermaLink"]),
     }
   end
 
@@ -313,17 +433,59 @@ defmodule Item do
           title: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Item.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Item.description"}
+
+  def decode_forecast(value) when is_list(value), do: value
+  def decode_forecast(_), do: {:error, "Unexpected type when decoding Item.forecast"}
+
+  def encode_forecast(value) when is_list(value), do: value
+  def encode_forecast(_), do: {:error, "Unexpected type when encoding Item.forecast"}
+
+  def decode_lat(value) when is_binary(value), do: value
+  def decode_lat(_), do: {:error, "Unexpected type when decoding Item.lat"}
+
+  def encode_lat(value) when is_binary(value), do: value
+  def encode_lat(_), do: {:error, "Unexpected type when encoding Item.lat"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Item.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Item.link"}
+
+  def decode_long(value) when is_binary(value), do: value
+  def decode_long(_), do: {:error, "Unexpected type when decoding Item.long"}
+
+  def encode_long(value) when is_binary(value), do: value
+  def encode_long(_), do: {:error, "Unexpected type when encoding Item.long"}
+
+  def decode_pub_date(value) when is_binary(value), do: value
+  def decode_pub_date(_), do: {:error, "Unexpected type when decoding Item.pub_date"}
+
+  def encode_pub_date(value) when is_binary(value), do: value
+  def encode_pub_date(_), do: {:error, "Unexpected type when encoding Item.pub_date"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Item.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Item.title"}
+
   def from_map(m) do
     %Item{
       condition: Condition.from_map(m["condition"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       forecast: Enum.map(m["forecast"], &Forecast.from_map/1),
       guid: GUID.from_map(m["guid"]),
-      lat: m["lat"],
-      link: m["link"],
-      long: m["long"],
-      pub_date: m["pubDate"],
-      title: m["title"],
+      lat: decode_lat(m["lat"]),
+      link: decode_link(m["link"]),
+      long: decode_long(m["long"]),
+      pub_date: decode_pub_date(m["pubDate"]),
+      title: decode_title(m["title"]),
     }
   end
 
@@ -364,11 +526,29 @@ defmodule Location do
           region: String.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding Location.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding Location.city"}
+
+  def decode_country(value) when is_binary(value), do: value
+  def decode_country(_), do: {:error, "Unexpected type when decoding Location.country"}
+
+  def encode_country(value) when is_binary(value), do: value
+  def encode_country(_), do: {:error, "Unexpected type when encoding Location.country"}
+
+  def decode_region(value) when is_binary(value), do: value
+  def decode_region(_), do: {:error, "Unexpected type when decoding Location.region"}
+
+  def encode_region(value) when is_binary(value), do: value
+  def encode_region(_), do: {:error, "Unexpected type when encoding Location.region"}
+
   def from_map(m) do
     %Location{
-      city: m["city"],
-      country: m["country"],
-      region: m["region"],
+      city: decode_city(m["city"]),
+      country: decode_country(m["country"]),
+      region: decode_region(m["region"]),
     }
   end
 
@@ -404,12 +584,36 @@ defmodule Units do
           temperature: String.t()
         }
 
+  def decode_distance(value) when is_binary(value), do: value
+  def decode_distance(_), do: {:error, "Unexpected type when decoding Units.distance"}
+
+  def encode_distance(value) when is_binary(value), do: value
+  def encode_distance(_), do: {:error, "Unexpected type when encoding Units.distance"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Units.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Units.pressure"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Units.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Units.speed"}
+
+  def decode_temperature(value) when is_binary(value), do: value
+  def decode_temperature(_), do: {:error, "Unexpected type when decoding Units.temperature"}
+
+  def encode_temperature(value) when is_binary(value), do: value
+  def encode_temperature(_), do: {:error, "Unexpected type when encoding Units.temperature"}
+
   def from_map(m) do
     %Units{
-      distance: m["distance"],
-      pressure: m["pressure"],
-      speed: m["speed"],
-      temperature: m["temperature"],
+      distance: decode_distance(m["distance"]),
+      pressure: decode_pressure(m["pressure"]),
+      speed: decode_speed(m["speed"]),
+      temperature: decode_temperature(m["temperature"]),
     }
   end
 
@@ -445,11 +649,29 @@ defmodule Wind do
           speed: String.t()
         }
 
+  def decode_chill(value) when is_binary(value), do: value
+  def decode_chill(_), do: {:error, "Unexpected type when decoding Wind.chill"}
+
+  def encode_chill(value) when is_binary(value), do: value
+  def encode_chill(_), do: {:error, "Unexpected type when encoding Wind.chill"}
+
+  def decode_direction(value) when is_binary(value), do: value
+  def decode_direction(_), do: {:error, "Unexpected type when decoding Wind.direction"}
+
+  def encode_direction(value) when is_binary(value), do: value
+  def encode_direction(_), do: {:error, "Unexpected type when encoding Wind.direction"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Wind.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Wind.speed"}
+
   def from_map(m) do
     %Wind{
-      chill: m["chill"],
-      direction: m["direction"],
-      speed: m["speed"],
+      chill: decode_chill(m["chill"]),
+      direction: decode_direction(m["direction"]),
+      speed: decode_speed(m["speed"]),
     }
   end
 
@@ -494,19 +716,55 @@ defmodule Channel do
           wind: Wind.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Channel.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Channel.description"}
+
+  def decode_language(value) when is_binary(value), do: value
+  def decode_language(_), do: {:error, "Unexpected type when decoding Channel.language"}
+
+  def encode_language(value) when is_binary(value), do: value
+  def encode_language(_), do: {:error, "Unexpected type when encoding Channel.language"}
+
+  def decode_last_build_date(value) when is_binary(value), do: value
+  def decode_last_build_date(_), do: {:error, "Unexpected type when decoding Channel.last_build_date"}
+
+  def encode_last_build_date(value) when is_binary(value), do: value
+  def encode_last_build_date(_), do: {:error, "Unexpected type when encoding Channel.last_build_date"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Channel.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Channel.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Channel.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Channel.title"}
+
+  def decode_ttl(value) when is_binary(value), do: value
+  def decode_ttl(_), do: {:error, "Unexpected type when decoding Channel.ttl"}
+
+  def encode_ttl(value) when is_binary(value), do: value
+  def encode_ttl(_), do: {:error, "Unexpected type when encoding Channel.ttl"}
+
   def from_map(m) do
     %Channel{
       astronomy: Astronomy.from_map(m["astronomy"]),
       atmosphere: Atmosphere.from_map(m["atmosphere"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       image: Image.from_map(m["image"]),
       item: Item.from_map(m["item"]),
-      language: m["language"],
-      last_build_date: m["lastBuildDate"],
-      link: m["link"],
+      language: decode_language(m["language"]),
+      last_build_date: decode_last_build_date(m["lastBuildDate"]),
+      link: decode_link(m["link"]),
       location: Location.from_map(m["location"]),
-      title: m["title"],
-      ttl: m["ttl"],
+      title: decode_title(m["title"]),
+      ttl: decode_ttl(m["ttl"]),
       units: Units.from_map(m["units"]),
       wind: Wind.from_map(m["wind"]),
     }
@@ -587,11 +845,29 @@ defmodule Query do
           results: Results.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Query.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Query.count"}
+
+  def decode_created(value) when is_binary(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding Query.created"}
+
+  def encode_created(value) when is_binary(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding Query.created"}
+
+  def decode_lang(value) when is_binary(value), do: value
+  def decode_lang(_), do: {:error, "Unexpected type when decoding Query.lang"}
+
+  def encode_lang(value) when is_binary(value), do: value
+  def encode_lang(_), do: {:error, "Unexpected type when encoding Query.lang"}
+
   def from_map(m) do
     %Query{
-      count: m["count"],
-      created: m["created"],
-      lang: m["lang"],
+      count: decode_count(m["count"]),
+      created: decode_created(m["created"]),
+      lang: decode_lang(m["lang"]),
       results: Results.from_map(m["results"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/dc44f.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/dc44f.json/default/QuickType.ex
index d9f444b..8660e75 100644
--- a/base/elixir/test/inputs/json/misc/dc44f.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/dc44f.json/default/QuickType.ex
@@ -409,10 +409,22 @@ defmodule Ruling do
           text: String.t()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Ruling.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Ruling.date"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Ruling.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Ruling.text"}
+
   def from_map(m) do
     %Ruling{
-      date: m["date"],
-      text: m["text"],
+      date: decode_date(m["date"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -565,25 +577,91 @@ defmodule Card do
           variations: [integer()] | nil
         }
 
+  def decode_artist(value) when is_binary(value), do: value
+  def decode_artist(_), do: {:error, "Unexpected type when decoding Card.artist"}
+
+  def encode_artist(value) when is_binary(value), do: value
+  def encode_artist(_), do: {:error, "Unexpected type when encoding Card.artist"}
+
+  def decode_cmc(value) when is_integer(value), do: value
+  def decode_cmc(_), do: {:error, "Unexpected type when decoding Card.cmc"}
+
+  def encode_cmc(value) when is_integer(value), do: value
+  def encode_cmc(_), do: {:error, "Unexpected type when encoding Card.cmc"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Card.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Card.id"}
+
+  def decode_image_name(value) when is_binary(value), do: value
+  def decode_image_name(_), do: {:error, "Unexpected type when decoding Card.image_name"}
+
+  def encode_image_name(value) when is_binary(value), do: value
+  def encode_image_name(_), do: {:error, "Unexpected type when encoding Card.image_name"}
+
+  def decode_legalities(value) when is_list(value), do: value
+  def decode_legalities(_), do: {:error, "Unexpected type when decoding Card.legalities"}
+
+  def encode_legalities(value) when is_list(value), do: value
+  def encode_legalities(_), do: {:error, "Unexpected type when encoding Card.legalities"}
+
+  def decode_multiverseid(value) when is_integer(value), do: value
+  def decode_multiverseid(_), do: {:error, "Unexpected type when decoding Card.multiverseid"}
+
+  def encode_multiverseid(value) when is_integer(value), do: value
+  def encode_multiverseid(_), do: {:error, "Unexpected type when encoding Card.multiverseid"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Card.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Card.name"}
+
+  def decode_original_type(value) when is_binary(value), do: value
+  def decode_original_type(_), do: {:error, "Unexpected type when decoding Card.original_type"}
+
+  def encode_original_type(value) when is_binary(value), do: value
+  def encode_original_type(_), do: {:error, "Unexpected type when encoding Card.original_type"}
+
+  def decode_printings(value) when is_list(value), do: value
+  def decode_printings(_), do: {:error, "Unexpected type when decoding Card.printings"}
+
+  def encode_printings(value) when is_list(value), do: value
+  def encode_printings(_), do: {:error, "Unexpected type when encoding Card.printings"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Card.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Card.type"}
+
+  def decode_types(value) when is_list(value), do: value
+  def decode_types(_), do: {:error, "Unexpected type when decoding Card.types"}
+
+  def encode_types(value) when is_list(value), do: value
+  def encode_types(_), do: {:error, "Unexpected type when encoding Card.types"}
+
   def from_map(m) do
     %Card{
-      artist: m["artist"],
-      cmc: m["cmc"],
+      artist: decode_artist(m["artist"]),
+      cmc: decode_cmc(m["cmc"]),
       color_identity: m["colorIdentity"] && Enum.map(m["colorIdentity"], &ColorIdentity.decode/1),
       colors: m["colors"] && Enum.map(m["colors"], &Color.decode/1),
       flavor: m["flavor"],
-      id: m["id"],
-      image_name: m["imageName"],
+      id: decode_id(m["id"]),
+      image_name: decode_image_name(m["imageName"]),
       layout: Layout.decode(m["layout"]),
       legalities: Enum.map(m["legalities"], &LegalityElement.from_map/1),
       mana_cost: m["manaCost"],
       mci_number: m["mciNumber"],
-      multiverseid: m["multiverseid"],
-      name: m["name"],
+      multiverseid: decode_multiverseid(m["multiverseid"]),
+      name: decode_name(m["name"]),
       original_text: m["originalText"],
-      original_type: m["originalType"],
+      original_type: decode_original_type(m["originalType"]),
       power: m["power"],
-      printings: m["printings"],
+      printings: decode_printings(m["printings"]),
       rarity: Rarity.decode(m["rarity"]),
       reserved: m["reserved"],
       rulings: m["rulings"] && Enum.map(m["rulings"], &Ruling.from_map/1),
@@ -591,7 +669,7 @@ defmodule Card do
       supertypes: m["supertypes"] && Enum.map(m["supertypes"], &Supertype.decode/1),
       text: m["text"],
       toughness: m["toughness"],
-      type: m["type"],
+      type: decode_type(m["type"]),
       types: Enum.map(m["types"], &Type.decode/1),
       variations: m["variations"],
     }
@@ -660,19 +738,85 @@ defmodule TopLevel do
           type: String.t()
         }
 
+  def decode_booster(value) when is_list(value), do: value
+  def decode_booster(_), do: {:error, "Unexpected type when decoding TopLevel.booster"}
+
+  def encode_booster(value) when is_list(value), do: value
+  def encode_booster(_), do: {:error, "Unexpected type when encoding TopLevel.booster"}
+
+  def decode_border(value) when is_binary(value), do: value
+  def decode_border(_), do: {:error, "Unexpected type when decoding TopLevel.border"}
+
+  def encode_border(value) when is_binary(value), do: value
+  def encode_border(_), do: {:error, "Unexpected type when encoding TopLevel.border"}
+
+  def decode_cards(value) when is_list(value), do: value
+  def decode_cards(_), do: {:error, "Unexpected type when decoding TopLevel.cards"}
+
+  def encode_cards(value) when is_list(value), do: value
+  def encode_cards(_), do: {:error, "Unexpected type when encoding TopLevel.cards"}
+
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding TopLevel.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding TopLevel.code"}
+
+  def decode_gatherer_code(value) when is_binary(value), do: value
+  def decode_gatherer_code(_), do: {:error, "Unexpected type when decoding TopLevel.gatherer_code"}
+
+  def encode_gatherer_code(value) when is_binary(value), do: value
+  def encode_gatherer_code(_), do: {:error, "Unexpected type when encoding TopLevel.gatherer_code"}
+
+  def decode_magic_cards_info_code(value) when is_binary(value), do: value
+  def decode_magic_cards_info_code(_), do: {:error, "Unexpected type when decoding TopLevel.magic_cards_info_code"}
+
+  def encode_magic_cards_info_code(value) when is_binary(value), do: value
+  def encode_magic_cards_info_code(_), do: {:error, "Unexpected type when encoding TopLevel.magic_cards_info_code"}
+
+  def decode_mkm_id(value) when is_integer(value), do: value
+  def decode_mkm_id(_), do: {:error, "Unexpected type when decoding TopLevel.mkm_id"}
+
+  def encode_mkm_id(value) when is_integer(value), do: value
+  def encode_mkm_id(_), do: {:error, "Unexpected type when encoding TopLevel.mkm_id"}
+
+  def decode_mkm_name(value) when is_binary(value), do: value
+  def decode_mkm_name(_), do: {:error, "Unexpected type when decoding TopLevel.mkm_name"}
+
+  def encode_mkm_name(value) when is_binary(value), do: value
+  def encode_mkm_name(_), do: {:error, "Unexpected type when encoding TopLevel.mkm_name"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_release_date(value) when is_binary(value), do: value
+  def decode_release_date(_), do: {:error, "Unexpected type when decoding TopLevel.release_date"}
+
+  def encode_release_date(value) when is_binary(value), do: value
+  def encode_release_date(_), do: {:error, "Unexpected type when encoding TopLevel.release_date"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding TopLevel.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding TopLevel.type"}
+
   def from_map(m) do
     %TopLevel{
       booster: Enum.map(m["booster"], &Booster.decode/1),
-      border: m["border"],
+      border: decode_border(m["border"]),
       cards: Enum.map(m["cards"], &Card.from_map/1),
-      code: m["code"],
-      gatherer_code: m["gathererCode"],
-      magic_cards_info_code: m["magicCardsInfoCode"],
-      mkm_id: m["mkm_id"],
-      mkm_name: m["mkm_name"],
-      name: m["name"],
-      release_date: m["releaseDate"],
-      type: m["type"],
+      code: decode_code(m["code"]),
+      gatherer_code: decode_gatherer_code(m["gathererCode"]),
+      magic_cards_info_code: decode_magic_cards_info_code(m["magicCardsInfoCode"]),
+      mkm_id: decode_mkm_id(m["mkm_id"]),
+      mkm_name: decode_mkm_name(m["mkm_name"]),
+      name: decode_name(m["name"]),
+      release_date: decode_release_date(m["releaseDate"]),
+      type: decode_type(m["type"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/dd1ce.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/dd1ce.json/default/QuickType.ex
index d9f444b..8660e75 100644
--- a/base/elixir/test/inputs/json/misc/dd1ce.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/dd1ce.json/default/QuickType.ex
@@ -409,10 +409,22 @@ defmodule Ruling do
           text: String.t()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Ruling.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Ruling.date"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Ruling.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Ruling.text"}
+
   def from_map(m) do
     %Ruling{
-      date: m["date"],
-      text: m["text"],
+      date: decode_date(m["date"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -565,25 +577,91 @@ defmodule Card do
           variations: [integer()] | nil
         }
 
+  def decode_artist(value) when is_binary(value), do: value
+  def decode_artist(_), do: {:error, "Unexpected type when decoding Card.artist"}
+
+  def encode_artist(value) when is_binary(value), do: value
+  def encode_artist(_), do: {:error, "Unexpected type when encoding Card.artist"}
+
+  def decode_cmc(value) when is_integer(value), do: value
+  def decode_cmc(_), do: {:error, "Unexpected type when decoding Card.cmc"}
+
+  def encode_cmc(value) when is_integer(value), do: value
+  def encode_cmc(_), do: {:error, "Unexpected type when encoding Card.cmc"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Card.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Card.id"}
+
+  def decode_image_name(value) when is_binary(value), do: value
+  def decode_image_name(_), do: {:error, "Unexpected type when decoding Card.image_name"}
+
+  def encode_image_name(value) when is_binary(value), do: value
+  def encode_image_name(_), do: {:error, "Unexpected type when encoding Card.image_name"}
+
+  def decode_legalities(value) when is_list(value), do: value
+  def decode_legalities(_), do: {:error, "Unexpected type when decoding Card.legalities"}
+
+  def encode_legalities(value) when is_list(value), do: value
+  def encode_legalities(_), do: {:error, "Unexpected type when encoding Card.legalities"}
+
+  def decode_multiverseid(value) when is_integer(value), do: value
+  def decode_multiverseid(_), do: {:error, "Unexpected type when decoding Card.multiverseid"}
+
+  def encode_multiverseid(value) when is_integer(value), do: value
+  def encode_multiverseid(_), do: {:error, "Unexpected type when encoding Card.multiverseid"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Card.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Card.name"}
+
+  def decode_original_type(value) when is_binary(value), do: value
+  def decode_original_type(_), do: {:error, "Unexpected type when decoding Card.original_type"}
+
+  def encode_original_type(value) when is_binary(value), do: value
+  def encode_original_type(_), do: {:error, "Unexpected type when encoding Card.original_type"}
+
+  def decode_printings(value) when is_list(value), do: value
+  def decode_printings(_), do: {:error, "Unexpected type when decoding Card.printings"}
+
+  def encode_printings(value) when is_list(value), do: value
+  def encode_printings(_), do: {:error, "Unexpected type when encoding Card.printings"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Card.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Card.type"}
+
+  def decode_types(value) when is_list(value), do: value
+  def decode_types(_), do: {:error, "Unexpected type when decoding Card.types"}
+
+  def encode_types(value) when is_list(value), do: value
+  def encode_types(_), do: {:error, "Unexpected type when encoding Card.types"}
+
   def from_map(m) do
     %Card{
-      artist: m["artist"],
-      cmc: m["cmc"],
+      artist: decode_artist(m["artist"]),
+      cmc: decode_cmc(m["cmc"]),
       color_identity: m["colorIdentity"] && Enum.map(m["colorIdentity"], &ColorIdentity.decode/1),
       colors: m["colors"] && Enum.map(m["colors"], &Color.decode/1),
       flavor: m["flavor"],
-      id: m["id"],
-      image_name: m["imageName"],
+      id: decode_id(m["id"]),
+      image_name: decode_image_name(m["imageName"]),
       layout: Layout.decode(m["layout"]),
       legalities: Enum.map(m["legalities"], &LegalityElement.from_map/1),
       mana_cost: m["manaCost"],
       mci_number: m["mciNumber"],
-      multiverseid: m["multiverseid"],
-      name: m["name"],
+      multiverseid: decode_multiverseid(m["multiverseid"]),
+      name: decode_name(m["name"]),
       original_text: m["originalText"],
-      original_type: m["originalType"],
+      original_type: decode_original_type(m["originalType"]),
       power: m["power"],
-      printings: m["printings"],
+      printings: decode_printings(m["printings"]),
       rarity: Rarity.decode(m["rarity"]),
       reserved: m["reserved"],
       rulings: m["rulings"] && Enum.map(m["rulings"], &Ruling.from_map/1),
@@ -591,7 +669,7 @@ defmodule Card do
       supertypes: m["supertypes"] && Enum.map(m["supertypes"], &Supertype.decode/1),
       text: m["text"],
       toughness: m["toughness"],
-      type: m["type"],
+      type: decode_type(m["type"]),
       types: Enum.map(m["types"], &Type.decode/1),
       variations: m["variations"],
     }
@@ -660,19 +738,85 @@ defmodule TopLevel do
           type: String.t()
         }
 
+  def decode_booster(value) when is_list(value), do: value
+  def decode_booster(_), do: {:error, "Unexpected type when decoding TopLevel.booster"}
+
+  def encode_booster(value) when is_list(value), do: value
+  def encode_booster(_), do: {:error, "Unexpected type when encoding TopLevel.booster"}
+
+  def decode_border(value) when is_binary(value), do: value
+  def decode_border(_), do: {:error, "Unexpected type when decoding TopLevel.border"}
+
+  def encode_border(value) when is_binary(value), do: value
+  def encode_border(_), do: {:error, "Unexpected type when encoding TopLevel.border"}
+
+  def decode_cards(value) when is_list(value), do: value
+  def decode_cards(_), do: {:error, "Unexpected type when decoding TopLevel.cards"}
+
+  def encode_cards(value) when is_list(value), do: value
+  def encode_cards(_), do: {:error, "Unexpected type when encoding TopLevel.cards"}
+
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding TopLevel.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding TopLevel.code"}
+
+  def decode_gatherer_code(value) when is_binary(value), do: value
+  def decode_gatherer_code(_), do: {:error, "Unexpected type when decoding TopLevel.gatherer_code"}
+
+  def encode_gatherer_code(value) when is_binary(value), do: value
+  def encode_gatherer_code(_), do: {:error, "Unexpected type when encoding TopLevel.gatherer_code"}
+
+  def decode_magic_cards_info_code(value) when is_binary(value), do: value
+  def decode_magic_cards_info_code(_), do: {:error, "Unexpected type when decoding TopLevel.magic_cards_info_code"}
+
+  def encode_magic_cards_info_code(value) when is_binary(value), do: value
+  def encode_magic_cards_info_code(_), do: {:error, "Unexpected type when encoding TopLevel.magic_cards_info_code"}
+
+  def decode_mkm_id(value) when is_integer(value), do: value
+  def decode_mkm_id(_), do: {:error, "Unexpected type when decoding TopLevel.mkm_id"}
+
+  def encode_mkm_id(value) when is_integer(value), do: value
+  def encode_mkm_id(_), do: {:error, "Unexpected type when encoding TopLevel.mkm_id"}
+
+  def decode_mkm_name(value) when is_binary(value), do: value
+  def decode_mkm_name(_), do: {:error, "Unexpected type when decoding TopLevel.mkm_name"}
+
+  def encode_mkm_name(value) when is_binary(value), do: value
+  def encode_mkm_name(_), do: {:error, "Unexpected type when encoding TopLevel.mkm_name"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_release_date(value) when is_binary(value), do: value
+  def decode_release_date(_), do: {:error, "Unexpected type when decoding TopLevel.release_date"}
+
+  def encode_release_date(value) when is_binary(value), do: value
+  def encode_release_date(_), do: {:error, "Unexpected type when encoding TopLevel.release_date"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding TopLevel.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding TopLevel.type"}
+
   def from_map(m) do
     %TopLevel{
       booster: Enum.map(m["booster"], &Booster.decode/1),
-      border: m["border"],
+      border: decode_border(m["border"]),
       cards: Enum.map(m["cards"], &Card.from_map/1),
-      code: m["code"],
-      gatherer_code: m["gathererCode"],
-      magic_cards_info_code: m["magicCardsInfoCode"],
-      mkm_id: m["mkm_id"],
-      mkm_name: m["mkm_name"],
-      name: m["name"],
-      release_date: m["releaseDate"],
-      type: m["type"],
+      code: decode_code(m["code"]),
+      gatherer_code: decode_gatherer_code(m["gathererCode"]),
+      magic_cards_info_code: decode_magic_cards_info_code(m["magicCardsInfoCode"]),
+      mkm_id: decode_mkm_id(m["mkm_id"]),
+      mkm_name: decode_mkm_name(m["mkm_name"]),
+      name: decode_name(m["name"]),
+      release_date: decode_release_date(m["releaseDate"]),
+      type: decode_type(m["type"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/dec3a.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/dec3a.json/default/QuickType.ex
index 10609ea..3fe1f4d 100644
--- a/base/elixir/test/inputs/json/misc/dec3a.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/dec3a.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule ResponseInfo do
           status: integer()
         }
 
+  def decode_developer_message(value) when is_binary(value), do: value
+  def decode_developer_message(_), do: {:error, "Unexpected type when decoding ResponseInfo.developer_message"}
+
+  def encode_developer_message(value) when is_binary(value), do: value
+  def encode_developer_message(_), do: {:error, "Unexpected type when encoding ResponseInfo.developer_message"}
+
+  def decode_status(value) when is_integer(value), do: value
+  def decode_status(_), do: {:error, "Unexpected type when decoding ResponseInfo.status"}
+
+  def encode_status(value) when is_integer(value), do: value
+  def encode_status(_), do: {:error, "Unexpected type when encoding ResponseInfo.status"}
+
   def from_map(m) do
     %ResponseInfo{
-      developer_message: m["developerMessage"],
-      status: m["status"],
+      developer_message: decode_developer_message(m["developerMessage"]),
+      status: decode_status(m["status"]),
     }
   end
 
@@ -51,11 +63,29 @@ defmodule Resultset do
           pagesize: integer()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Resultset.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Resultset.count"}
+
+  def decode_page(value) when is_integer(value), do: value
+  def decode_page(_), do: {:error, "Unexpected type when decoding Resultset.page"}
+
+  def encode_page(value) when is_integer(value), do: value
+  def encode_page(_), do: {:error, "Unexpected type when encoding Resultset.page"}
+
+  def decode_pagesize(value) when is_integer(value), do: value
+  def decode_pagesize(_), do: {:error, "Unexpected type when decoding Resultset.pagesize"}
+
+  def encode_pagesize(value) when is_integer(value), do: value
+  def encode_pagesize(_), do: {:error, "Unexpected type when encoding Resultset.pagesize"}
+
   def from_map(m) do
     %Resultset{
-      count: m["count"],
-      page: m["page"],
-      pagesize: m["pagesize"],
+      count: decode_count(m["count"]),
+      page: decode_page(m["page"]),
+      pagesize: decode_pagesize(m["pagesize"]),
     }
   end
 
@@ -90,9 +120,17 @@ defmodule Metadata do
           resultset: Resultset.t()
         }
 
+  def decode_execution_time(value) when is_float(value), do: value
+  def decode_execution_time(value) when is_integer(value), do: value
+  def decode_execution_time(_), do: {:error, "Unexpected type when decoding Metadata.execution_time"}
+
+  def encode_execution_time(value) when is_float(value), do: value
+  def encode_execution_time(value) when is_integer(value), do: value
+  def encode_execution_time(_), do: {:error, "Unexpected type when encoding Metadata.execution_time"}
+
   def from_map(m) do
     %Metadata{
-      execution_time: m["executionTime"],
+      execution_time: decode_execution_time(m["executionTime"]),
       response_info: ResponseInfo.from_map(m["responseInfo"]),
       resultset: Resultset.from_map(m["resultset"]),
     }
@@ -128,10 +166,22 @@ defmodule HiringOrg do
           uuid: String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding HiringOrg.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding HiringOrg.name"}
+
+  def decode_uuid(value) when is_binary(value), do: value
+  def decode_uuid(_), do: {:error, "Unexpected type when decoding HiringOrg.uuid"}
+
+  def encode_uuid(value) when is_binary(value), do: value
+  def encode_uuid(_), do: {:error, "Unexpected type when encoding HiringOrg.uuid"}
+
   def from_map(m) do
     %HiringOrg{
-      name: m["name"],
-      uuid: m["uuid"],
+      name: decode_name(m["name"]),
+      uuid: decode_uuid(m["uuid"]),
     }
   end
 
@@ -172,18 +222,78 @@ defmodule Location do
           thoroughfare: String.t()
         }
 
+  def decode_administrative_area(value) when is_binary(value), do: value
+  def decode_administrative_area(_), do: {:error, "Unexpected type when decoding Location.administrative_area"}
+
+  def encode_administrative_area(value) when is_binary(value), do: value
+  def encode_administrative_area(_), do: {:error, "Unexpected type when encoding Location.administrative_area"}
+
+  def decode_country(value) when is_binary(value), do: value
+  def decode_country(_), do: {:error, "Unexpected type when decoding Location.country"}
+
+  def encode_country(value) when is_binary(value), do: value
+  def encode_country(_), do: {:error, "Unexpected type when encoding Location.country"}
+
+  def decode_fax_number(value) when is_binary(value), do: value
+  def decode_fax_number(_), do: {:error, "Unexpected type when decoding Location.fax_number"}
+
+  def encode_fax_number(value) when is_binary(value), do: value
+  def encode_fax_number(_), do: {:error, "Unexpected type when encoding Location.fax_number"}
+
+  def decode_locality(value) when is_binary(value), do: value
+  def decode_locality(_), do: {:error, "Unexpected type when decoding Location.locality"}
+
+  def encode_locality(value) when is_binary(value), do: value
+  def encode_locality(_), do: {:error, "Unexpected type when encoding Location.locality"}
+
+  def decode_mobile_number(value) when is_binary(value), do: value
+  def decode_mobile_number(_), do: {:error, "Unexpected type when decoding Location.mobile_number"}
+
+  def encode_mobile_number(value) when is_binary(value), do: value
+  def encode_mobile_number(_), do: {:error, "Unexpected type when encoding Location.mobile_number"}
+
+  def decode_phone_number(value) when is_binary(value), do: value
+  def decode_phone_number(_), do: {:error, "Unexpected type when decoding Location.phone_number"}
+
+  def encode_phone_number(value) when is_binary(value), do: value
+  def encode_phone_number(_), do: {:error, "Unexpected type when encoding Location.phone_number"}
+
+  def decode_phone_number_extension(value) when is_binary(value), do: value
+  def decode_phone_number_extension(_), do: {:error, "Unexpected type when decoding Location.phone_number_extension"}
+
+  def encode_phone_number_extension(value) when is_binary(value), do: value
+  def encode_phone_number_extension(_), do: {:error, "Unexpected type when encoding Location.phone_number_extension"}
+
+  def decode_postal_code(value) when is_binary(value), do: value
+  def decode_postal_code(_), do: {:error, "Unexpected type when decoding Location.postal_code"}
+
+  def encode_postal_code(value) when is_binary(value), do: value
+  def encode_postal_code(_), do: {:error, "Unexpected type when encoding Location.postal_code"}
+
+  def decode_sub_premise(value) when is_nil(value), do: value
+  def decode_sub_premise(_), do: {:error, "Unexpected type when decoding Location.sub_premise"}
+
+  def encode_sub_premise(value) when is_nil(value), do: value
+  def encode_sub_premise(_), do: {:error, "Unexpected type when encoding Location.sub_premise"}
+
+  def decode_thoroughfare(value) when is_binary(value), do: value
+  def decode_thoroughfare(_), do: {:error, "Unexpected type when decoding Location.thoroughfare"}
+
+  def encode_thoroughfare(value) when is_binary(value), do: value
+  def encode_thoroughfare(_), do: {:error, "Unexpected type when encoding Location.thoroughfare"}
+
   def from_map(m) do
     %Location{
-      administrative_area: m["administrative_area"],
-      country: m["country"],
-      fax_number: m["fax_number"],
-      locality: m["locality"],
-      mobile_number: m["mobile_number"],
-      phone_number: m["phone_number"],
-      phone_number_extension: m["phone_number_extension"],
-      postal_code: m["postal_code"],
-      sub_premise: m["sub_premise"],
-      thoroughfare: m["thoroughfare"],
+      administrative_area: decode_administrative_area(m["administrative_area"]),
+      country: decode_country(m["country"]),
+      fax_number: decode_fax_number(m["fax_number"]),
+      locality: decode_locality(m["locality"]),
+      mobile_number: decode_mobile_number(m["mobile_number"]),
+      phone_number: decode_phone_number(m["phone_number"]),
+      phone_number_extension: decode_phone_number_extension(m["phone_number_extension"]),
+      postal_code: decode_postal_code(m["postal_code"]),
+      sub_premise: decode_sub_premise(m["sub_premise"]),
+      thoroughfare: decode_thoroughfare(m["thoroughfare"]),
     }
   end
 
@@ -244,30 +354,150 @@ defmodule Result do
           vuuid: String.t()
         }
 
+  def decode_about_office(value) when is_binary(value), do: value
+  def decode_about_office(_), do: {:error, "Unexpected type when decoding Result.about_office"}
+
+  def encode_about_office(value) when is_binary(value), do: value
+  def encode_about_office(_), do: {:error, "Unexpected type when encoding Result.about_office"}
+
+  def decode_application_process(value) when is_binary(value), do: value
+  def decode_application_process(_), do: {:error, "Unexpected type when decoding Result.application_process"}
+
+  def encode_application_process(value) when is_binary(value), do: value
+  def encode_application_process(_), do: {:error, "Unexpected type when encoding Result.application_process"}
+
+  def decode_body(value) when is_binary(value), do: value
+  def decode_body(_), do: {:error, "Unexpected type when decoding Result.body"}
+
+  def encode_body(value) when is_binary(value), do: value
+  def encode_body(_), do: {:error, "Unexpected type when encoding Result.body"}
+
+  def decode_changed(value) when is_binary(value), do: value
+  def decode_changed(_), do: {:error, "Unexpected type when decoding Result.changed"}
+
+  def encode_changed(value) when is_binary(value), do: value
+  def encode_changed(_), do: {:error, "Unexpected type when encoding Result.changed"}
+
+  def decode_created(value) when is_binary(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding Result.created"}
+
+  def encode_created(value) when is_binary(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding Result.created"}
+
+  def decode_deadline(value) when is_nil(value), do: value
+  def decode_deadline(_), do: {:error, "Unexpected type when decoding Result.deadline"}
+
+  def encode_deadline(value) when is_nil(value), do: value
+  def encode_deadline(_), do: {:error, "Unexpected type when encoding Result.deadline"}
+
+  def decode_hiring_office(value) when is_nil(value), do: value
+  def decode_hiring_office(_), do: {:error, "Unexpected type when decoding Result.hiring_office"}
+
+  def encode_hiring_office(value) when is_nil(value), do: value
+  def encode_hiring_office(_), do: {:error, "Unexpected type when encoding Result.hiring_office"}
+
+  def decode_job_id(value) when is_nil(value), do: value
+  def decode_job_id(_), do: {:error, "Unexpected type when decoding Result.job_id"}
+
+  def encode_job_id(value) when is_nil(value), do: value
+  def encode_job_id(_), do: {:error, "Unexpected type when encoding Result.job_id"}
+
+  def decode_language(value) when is_binary(value), do: value
+  def decode_language(_), do: {:error, "Unexpected type when decoding Result.language"}
+
+  def encode_language(value) when is_binary(value), do: value
+  def encode_language(_), do: {:error, "Unexpected type when encoding Result.language"}
+
+  def decode_num_positions(value) when is_binary(value), do: value
+  def decode_num_positions(_), do: {:error, "Unexpected type when decoding Result.num_positions"}
+
+  def encode_num_positions(value) when is_binary(value), do: value
+  def encode_num_positions(_), do: {:error, "Unexpected type when encoding Result.num_positions"}
+
+  def decode_position(value) when is_binary(value), do: value
+  def decode_position(_), do: {:error, "Unexpected type when decoding Result.position"}
+
+  def encode_position(value) when is_binary(value), do: value
+  def encode_position(_), do: {:error, "Unexpected type when encoding Result.position"}
+
+  def decode_practice_area(value) when is_binary(value), do: value
+  def decode_practice_area(_), do: {:error, "Unexpected type when decoding Result.practice_area"}
+
+  def encode_practice_area(value) when is_binary(value), do: value
+  def encode_practice_area(_), do: {:error, "Unexpected type when encoding Result.practice_area"}
+
+  def decode_qualifications(value) when is_binary(value), do: value
+  def decode_qualifications(_), do: {:error, "Unexpected type when decoding Result.qualifications"}
+
+  def encode_qualifications(value) when is_binary(value), do: value
+  def encode_qualifications(_), do: {:error, "Unexpected type when encoding Result.qualifications"}
+
+  def decode_relocation_expenses(value) when is_nil(value), do: value
+  def decode_relocation_expenses(_), do: {:error, "Unexpected type when decoding Result.relocation_expenses"}
+
+  def encode_relocation_expenses(value) when is_nil(value), do: value
+  def encode_relocation_expenses(_), do: {:error, "Unexpected type when encoding Result.relocation_expenses"}
+
+  def decode_salary(value) when is_binary(value), do: value
+  def decode_salary(_), do: {:error, "Unexpected type when decoding Result.salary"}
+
+  def encode_salary(value) when is_binary(value), do: value
+  def encode_salary(_), do: {:error, "Unexpected type when encoding Result.salary"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Result.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Result.title"}
+
+  def decode_travel(value) when is_binary(value), do: value
+  def decode_travel(_), do: {:error, "Unexpected type when decoding Result.travel"}
+
+  def encode_travel(value) when is_binary(value), do: value
+  def encode_travel(_), do: {:error, "Unexpected type when encoding Result.travel"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Result.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Result.url"}
+
+  def decode_uuid(value) when is_binary(value), do: value
+  def decode_uuid(_), do: {:error, "Unexpected type when decoding Result.uuid"}
+
+  def encode_uuid(value) when is_binary(value), do: value
+  def encode_uuid(_), do: {:error, "Unexpected type when encoding Result.uuid"}
+
+  def decode_vuuid(value) when is_binary(value), do: value
+  def decode_vuuid(_), do: {:error, "Unexpected type when decoding Result.vuuid"}
+
+  def encode_vuuid(value) when is_binary(value), do: value
+  def encode_vuuid(_), do: {:error, "Unexpected type when encoding Result.vuuid"}
+
   def from_map(m) do
     %Result{
-      about_office: m["about_office"],
-      application_process: m["application_process"],
-      body: m["body"],
-      changed: m["changed"],
-      created: m["created"],
-      deadline: m["deadline"],
-      hiring_office: m["hiring_office"],
+      about_office: decode_about_office(m["about_office"]),
+      application_process: decode_application_process(m["application_process"]),
+      body: decode_body(m["body"]),
+      changed: decode_changed(m["changed"]),
+      created: decode_created(m["created"]),
+      deadline: decode_deadline(m["deadline"]),
+      hiring_office: decode_hiring_office(m["hiring_office"]),
       hiring_org: HiringOrg.from_map(m["hiring_org"]),
-      job_id: m["job_id"],
-      language: m["language"],
+      job_id: decode_job_id(m["job_id"]),
+      language: decode_language(m["language"]),
       location: Location.from_map(m["location"]),
-      num_positions: m["num_positions"],
-      position: m["position"],
-      practice_area: m["practice_area"],
-      qualifications: m["qualifications"],
-      relocation_expenses: m["relocation_expenses"],
-      salary: m["salary"],
-      title: m["title"],
-      travel: m["travel"],
-      url: m["url"],
-      uuid: m["uuid"],
-      vuuid: m["vuuid"],
+      num_positions: decode_num_positions(m["num_positions"]),
+      position: decode_position(m["position"]),
+      practice_area: decode_practice_area(m["practice_area"]),
+      qualifications: decode_qualifications(m["qualifications"]),
+      relocation_expenses: decode_relocation_expenses(m["relocation_expenses"]),
+      salary: decode_salary(m["salary"]),
+      title: decode_title(m["title"]),
+      travel: decode_travel(m["travel"]),
+      url: decode_url(m["url"]),
+      uuid: decode_uuid(m["uuid"]),
+      vuuid: decode_vuuid(m["vuuid"]),
     }
   end
 
@@ -320,6 +550,12 @@ defmodule TopLevel do
           results: [Result.t()]
         }
 
+  def decode_results(value) when is_list(value), do: value
+  def decode_results(_), do: {:error, "Unexpected type when decoding TopLevel.results"}
+
+  def encode_results(value) when is_list(value), do: value
+  def encode_results(_), do: {:error, "Unexpected type when encoding TopLevel.results"}
+
   def from_map(m) do
     %TopLevel{
       metadata: Metadata.from_map(m["metadata"]),
diff --git a/base/elixir/test/inputs/json/misc/df957.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/df957.json/default/QuickType.ex
index ee06b77..98852a1 100644
--- a/base/elixir/test/inputs/json/misc/df957.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/df957.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Astronomy do
           sunset: String.t()
         }
 
+  def decode_sunrise(value) when is_binary(value), do: value
+  def decode_sunrise(_), do: {:error, "Unexpected type when decoding Astronomy.sunrise"}
+
+  def encode_sunrise(value) when is_binary(value), do: value
+  def encode_sunrise(_), do: {:error, "Unexpected type when encoding Astronomy.sunrise"}
+
+  def decode_sunset(value) when is_binary(value), do: value
+  def decode_sunset(_), do: {:error, "Unexpected type when decoding Astronomy.sunset"}
+
+  def encode_sunset(value) when is_binary(value), do: value
+  def encode_sunset(_), do: {:error, "Unexpected type when encoding Astronomy.sunset"}
+
   def from_map(m) do
     %Astronomy{
-      sunrise: m["sunrise"],
-      sunset: m["sunset"],
+      sunrise: decode_sunrise(m["sunrise"]),
+      sunset: decode_sunset(m["sunset"]),
     }
   end
 
@@ -52,12 +64,36 @@ defmodule Atmosphere do
           visibility: String.t()
         }
 
+  def decode_humidity(value) when is_binary(value), do: value
+  def decode_humidity(_), do: {:error, "Unexpected type when decoding Atmosphere.humidity"}
+
+  def encode_humidity(value) when is_binary(value), do: value
+  def encode_humidity(_), do: {:error, "Unexpected type when encoding Atmosphere.humidity"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Atmosphere.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Atmosphere.pressure"}
+
+  def decode_rising(value) when is_binary(value), do: value
+  def decode_rising(_), do: {:error, "Unexpected type when decoding Atmosphere.rising"}
+
+  def encode_rising(value) when is_binary(value), do: value
+  def encode_rising(_), do: {:error, "Unexpected type when encoding Atmosphere.rising"}
+
+  def decode_visibility(value) when is_binary(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Atmosphere.visibility"}
+
+  def encode_visibility(value) when is_binary(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Atmosphere.visibility"}
+
   def from_map(m) do
     %Atmosphere{
-      humidity: m["humidity"],
-      pressure: m["pressure"],
-      rising: m["rising"],
-      visibility: m["visibility"],
+      humidity: decode_humidity(m["humidity"]),
+      pressure: decode_pressure(m["pressure"]),
+      rising: decode_rising(m["rising"]),
+      visibility: decode_visibility(m["visibility"]),
     }
   end
 
@@ -95,13 +131,43 @@ defmodule Image do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Image.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Image.height"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Image.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Image.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Image.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Image.title"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Image.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Image.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Image.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Image.width"}
+
   def from_map(m) do
     %Image{
-      height: m["height"],
-      link: m["link"],
-      title: m["title"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      link: decode_link(m["link"]),
+      title: decode_title(m["title"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -139,12 +205,36 @@ defmodule Condition do
           text: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Condition.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Condition.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Condition.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Condition.date"}
+
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Condition.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Condition.temp"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Condition.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Condition.text"}
+
   def from_map(m) do
     %Condition{
-      code: m["code"],
-      date: m["date"],
-      temp: m["temp"],
-      text: m["text"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      temp: decode_temp(m["temp"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -183,14 +273,50 @@ defmodule Forecast do
           text: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Forecast.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Forecast.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Forecast.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Forecast.date"}
+
+  def decode_day(value) when is_binary(value), do: value
+  def decode_day(_), do: {:error, "Unexpected type when decoding Forecast.day"}
+
+  def encode_day(value) when is_binary(value), do: value
+  def encode_day(_), do: {:error, "Unexpected type when encoding Forecast.day"}
+
+  def decode_high(value) when is_binary(value), do: value
+  def decode_high(_), do: {:error, "Unexpected type when decoding Forecast.high"}
+
+  def encode_high(value) when is_binary(value), do: value
+  def encode_high(_), do: {:error, "Unexpected type when encoding Forecast.high"}
+
+  def decode_low(value) when is_binary(value), do: value
+  def decode_low(_), do: {:error, "Unexpected type when decoding Forecast.low"}
+
+  def encode_low(value) when is_binary(value), do: value
+  def encode_low(_), do: {:error, "Unexpected type when encoding Forecast.low"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Forecast.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Forecast.text"}
+
   def from_map(m) do
     %Forecast{
-      code: m["code"],
-      date: m["date"],
-      day: m["day"],
-      high: m["high"],
-      low: m["low"],
-      text: m["text"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      day: decode_day(m["day"]),
+      high: decode_high(m["high"]),
+      low: decode_low(m["low"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -226,9 +352,15 @@ defmodule GUID do
           is_perma_link: String.t()
         }
 
+  def decode_is_perma_link(value) when is_binary(value), do: value
+  def decode_is_perma_link(_), do: {:error, "Unexpected type when decoding GUID.is_perma_link"}
+
+  def encode_is_perma_link(value) when is_binary(value), do: value
+  def encode_is_perma_link(_), do: {:error, "Unexpected type when encoding GUID.is_perma_link"}
+
   def from_map(m) do
     %GUID{
-      is_perma_link: m["isPermaLink"],
+      is_perma_link: decode_is_perma_link(m["isPermaLink"]),
     }
   end
 
@@ -267,17 +399,59 @@ defmodule Item do
           title: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Item.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Item.description"}
+
+  def decode_forecast(value) when is_list(value), do: value
+  def decode_forecast(_), do: {:error, "Unexpected type when decoding Item.forecast"}
+
+  def encode_forecast(value) when is_list(value), do: value
+  def encode_forecast(_), do: {:error, "Unexpected type when encoding Item.forecast"}
+
+  def decode_lat(value) when is_binary(value), do: value
+  def decode_lat(_), do: {:error, "Unexpected type when decoding Item.lat"}
+
+  def encode_lat(value) when is_binary(value), do: value
+  def encode_lat(_), do: {:error, "Unexpected type when encoding Item.lat"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Item.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Item.link"}
+
+  def decode_long(value) when is_binary(value), do: value
+  def decode_long(_), do: {:error, "Unexpected type when decoding Item.long"}
+
+  def encode_long(value) when is_binary(value), do: value
+  def encode_long(_), do: {:error, "Unexpected type when encoding Item.long"}
+
+  def decode_pub_date(value) when is_binary(value), do: value
+  def decode_pub_date(_), do: {:error, "Unexpected type when decoding Item.pub_date"}
+
+  def encode_pub_date(value) when is_binary(value), do: value
+  def encode_pub_date(_), do: {:error, "Unexpected type when encoding Item.pub_date"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Item.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Item.title"}
+
   def from_map(m) do
     %Item{
       condition: Condition.from_map(m["condition"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       forecast: Enum.map(m["forecast"], &Forecast.from_map/1),
       guid: GUID.from_map(m["guid"]),
-      lat: m["lat"],
-      link: m["link"],
-      long: m["long"],
-      pub_date: m["pubDate"],
-      title: m["title"],
+      lat: decode_lat(m["lat"]),
+      link: decode_link(m["link"]),
+      long: decode_long(m["long"]),
+      pub_date: decode_pub_date(m["pubDate"]),
+      title: decode_title(m["title"]),
     }
   end
 
@@ -318,11 +492,29 @@ defmodule Location do
           region: String.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding Location.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding Location.city"}
+
+  def decode_country(value) when is_binary(value), do: value
+  def decode_country(_), do: {:error, "Unexpected type when decoding Location.country"}
+
+  def encode_country(value) when is_binary(value), do: value
+  def encode_country(_), do: {:error, "Unexpected type when encoding Location.country"}
+
+  def decode_region(value) when is_binary(value), do: value
+  def decode_region(_), do: {:error, "Unexpected type when decoding Location.region"}
+
+  def encode_region(value) when is_binary(value), do: value
+  def encode_region(_), do: {:error, "Unexpected type when encoding Location.region"}
+
   def from_map(m) do
     %Location{
-      city: m["city"],
-      country: m["country"],
-      region: m["region"],
+      city: decode_city(m["city"]),
+      country: decode_country(m["country"]),
+      region: decode_region(m["region"]),
     }
   end
 
@@ -358,12 +550,36 @@ defmodule Units do
           temperature: String.t()
         }
 
+  def decode_distance(value) when is_binary(value), do: value
+  def decode_distance(_), do: {:error, "Unexpected type when decoding Units.distance"}
+
+  def encode_distance(value) when is_binary(value), do: value
+  def encode_distance(_), do: {:error, "Unexpected type when encoding Units.distance"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Units.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Units.pressure"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Units.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Units.speed"}
+
+  def decode_temperature(value) when is_binary(value), do: value
+  def decode_temperature(_), do: {:error, "Unexpected type when decoding Units.temperature"}
+
+  def encode_temperature(value) when is_binary(value), do: value
+  def encode_temperature(_), do: {:error, "Unexpected type when encoding Units.temperature"}
+
   def from_map(m) do
     %Units{
-      distance: m["distance"],
-      pressure: m["pressure"],
-      speed: m["speed"],
-      temperature: m["temperature"],
+      distance: decode_distance(m["distance"]),
+      pressure: decode_pressure(m["pressure"]),
+      speed: decode_speed(m["speed"]),
+      temperature: decode_temperature(m["temperature"]),
     }
   end
 
@@ -399,11 +615,29 @@ defmodule Wind do
           speed: String.t()
         }
 
+  def decode_chill(value) when is_binary(value), do: value
+  def decode_chill(_), do: {:error, "Unexpected type when decoding Wind.chill"}
+
+  def encode_chill(value) when is_binary(value), do: value
+  def encode_chill(_), do: {:error, "Unexpected type when encoding Wind.chill"}
+
+  def decode_direction(value) when is_binary(value), do: value
+  def decode_direction(_), do: {:error, "Unexpected type when decoding Wind.direction"}
+
+  def encode_direction(value) when is_binary(value), do: value
+  def encode_direction(_), do: {:error, "Unexpected type when encoding Wind.direction"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Wind.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Wind.speed"}
+
   def from_map(m) do
     %Wind{
-      chill: m["chill"],
-      direction: m["direction"],
-      speed: m["speed"],
+      chill: decode_chill(m["chill"]),
+      direction: decode_direction(m["direction"]),
+      speed: decode_speed(m["speed"]),
     }
   end
 
@@ -448,19 +682,55 @@ defmodule Channel do
           wind: Wind.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Channel.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Channel.description"}
+
+  def decode_language(value) when is_binary(value), do: value
+  def decode_language(_), do: {:error, "Unexpected type when decoding Channel.language"}
+
+  def encode_language(value) when is_binary(value), do: value
+  def encode_language(_), do: {:error, "Unexpected type when encoding Channel.language"}
+
+  def decode_last_build_date(value) when is_binary(value), do: value
+  def decode_last_build_date(_), do: {:error, "Unexpected type when decoding Channel.last_build_date"}
+
+  def encode_last_build_date(value) when is_binary(value), do: value
+  def encode_last_build_date(_), do: {:error, "Unexpected type when encoding Channel.last_build_date"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Channel.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Channel.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Channel.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Channel.title"}
+
+  def decode_ttl(value) when is_binary(value), do: value
+  def decode_ttl(_), do: {:error, "Unexpected type when decoding Channel.ttl"}
+
+  def encode_ttl(value) when is_binary(value), do: value
+  def encode_ttl(_), do: {:error, "Unexpected type when encoding Channel.ttl"}
+
   def from_map(m) do
     %Channel{
       astronomy: Astronomy.from_map(m["astronomy"]),
       atmosphere: Atmosphere.from_map(m["atmosphere"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       image: Image.from_map(m["image"]),
       item: Item.from_map(m["item"]),
-      language: m["language"],
-      last_build_date: m["lastBuildDate"],
-      link: m["link"],
+      language: decode_language(m["language"]),
+      last_build_date: decode_last_build_date(m["lastBuildDate"]),
+      link: decode_link(m["link"]),
       location: Location.from_map(m["location"]),
-      title: m["title"],
-      ttl: m["ttl"],
+      title: decode_title(m["title"]),
+      ttl: decode_ttl(m["ttl"]),
       units: Units.from_map(m["units"]),
       wind: Wind.from_map(m["wind"]),
     }
@@ -541,11 +811,29 @@ defmodule Query do
           results: Results.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Query.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Query.count"}
+
+  def decode_created(value) when is_binary(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding Query.created"}
+
+  def encode_created(value) when is_binary(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding Query.created"}
+
+  def decode_lang(value) when is_binary(value), do: value
+  def decode_lang(_), do: {:error, "Unexpected type when decoding Query.lang"}
+
+  def encode_lang(value) when is_binary(value), do: value
+  def encode_lang(_), do: {:error, "Unexpected type when encoding Query.lang"}
+
   def from_map(m) do
     %Query{
-      count: m["count"],
-      created: m["created"],
-      lang: m["lang"],
+      count: decode_count(m["count"]),
+      created: decode_created(m["created"]),
+      lang: decode_lang(m["lang"]),
       results: Results.from_map(m["results"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/e0ac7.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/e0ac7.json/default/QuickType.ex
index fed49cd..1da236b 100644
--- a/base/elixir/test/inputs/json/misc/e0ac7.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/e0ac7.json/default/QuickType.ex
@@ -16,12 +16,30 @@ defmodule Downsized do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Downsized.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Downsized.height"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Downsized.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Downsized.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Downsized.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Downsized.width"}
+
   def from_map(m) do
     %Downsized{
-      height: m["height"],
+      height: decode_height(m["height"]),
       size: m["size"],
-      url: m["url"],
-      width: m["width"],
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -58,12 +76,36 @@ defmodule DownsizedSmall do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding DownsizedSmall.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding DownsizedSmall.height"}
+
+  def decode_mp4(value) when is_binary(value), do: value
+  def decode_mp4(_), do: {:error, "Unexpected type when decoding DownsizedSmall.mp4"}
+
+  def encode_mp4(value) when is_binary(value), do: value
+  def encode_mp4(_), do: {:error, "Unexpected type when encoding DownsizedSmall.mp4"}
+
+  def decode_mp4_size(value) when is_binary(value), do: value
+  def decode_mp4_size(_), do: {:error, "Unexpected type when decoding DownsizedSmall.mp4_size"}
+
+  def encode_mp4_size(value) when is_binary(value), do: value
+  def encode_mp4_size(_), do: {:error, "Unexpected type when encoding DownsizedSmall.mp4_size"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding DownsizedSmall.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding DownsizedSmall.width"}
+
   def from_map(m) do
     %DownsizedSmall{
-      height: m["height"],
-      mp4: m["mp4"],
-      mp4_size: m["mp4_size"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      mp4: decode_mp4(m["mp4"]),
+      mp4_size: decode_mp4_size(m["mp4_size"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -106,18 +148,54 @@ defmodule FixedHeight do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding FixedHeight.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding FixedHeight.height"}
+
+  def decode_size(value) when is_binary(value), do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding FixedHeight.size"}
+
+  def encode_size(value) when is_binary(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding FixedHeight.size"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding FixedHeight.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding FixedHeight.url"}
+
+  def decode_webp(value) when is_binary(value), do: value
+  def decode_webp(_), do: {:error, "Unexpected type when decoding FixedHeight.webp"}
+
+  def encode_webp(value) when is_binary(value), do: value
+  def encode_webp(_), do: {:error, "Unexpected type when encoding FixedHeight.webp"}
+
+  def decode_webp_size(value) when is_binary(value), do: value
+  def decode_webp_size(_), do: {:error, "Unexpected type when decoding FixedHeight.webp_size"}
+
+  def encode_webp_size(value) when is_binary(value), do: value
+  def encode_webp_size(_), do: {:error, "Unexpected type when encoding FixedHeight.webp_size"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding FixedHeight.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding FixedHeight.width"}
+
   def from_map(m) do
     %FixedHeight{
       frames: m["frames"],
       hash: m["hash"],
-      height: m["height"],
+      height: decode_height(m["height"]),
       mp4: m["mp4"],
       mp4_size: m["mp4_size"],
-      size: m["size"],
-      url: m["url"],
-      webp: m["webp"],
-      webp_size: m["webp_size"],
-      width: m["width"],
+      size: decode_size(m["size"]),
+      url: decode_url(m["url"]),
+      webp: decode_webp(m["webp"]),
+      webp_size: decode_webp_size(m["webp_size"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -158,10 +236,22 @@ defmodule Looping do
           mp4_size: String.t()
         }
 
+  def decode_mp4(value) when is_binary(value), do: value
+  def decode_mp4(_), do: {:error, "Unexpected type when decoding Looping.mp4"}
+
+  def encode_mp4(value) when is_binary(value), do: value
+  def encode_mp4(_), do: {:error, "Unexpected type when encoding Looping.mp4"}
+
+  def decode_mp4_size(value) when is_binary(value), do: value
+  def decode_mp4_size(_), do: {:error, "Unexpected type when decoding Looping.mp4_size"}
+
+  def encode_mp4_size(value) when is_binary(value), do: value
+  def encode_mp4_size(_), do: {:error, "Unexpected type when encoding Looping.mp4_size"}
+
   def from_map(m) do
     %Looping{
-      mp4: m["mp4"],
-      mp4_size: m["mp4_size"],
+      mp4: decode_mp4(m["mp4"]),
+      mp4_size: decode_mp4_size(m["mp4_size"]),
     }
   end
 
@@ -389,14 +479,50 @@ defmodule User do
           username: String.t()
         }
 
+  def decode_avatar_url(value) when is_binary(value), do: value
+  def decode_avatar_url(_), do: {:error, "Unexpected type when decoding User.avatar_url"}
+
+  def encode_avatar_url(value) when is_binary(value), do: value
+  def encode_avatar_url(_), do: {:error, "Unexpected type when encoding User.avatar_url"}
+
+  def decode_banner_url(value) when is_binary(value), do: value
+  def decode_banner_url(_), do: {:error, "Unexpected type when decoding User.banner_url"}
+
+  def encode_banner_url(value) when is_binary(value), do: value
+  def encode_banner_url(_), do: {:error, "Unexpected type when encoding User.banner_url"}
+
+  def decode_display_name(value) when is_binary(value), do: value
+  def decode_display_name(_), do: {:error, "Unexpected type when decoding User.display_name"}
+
+  def encode_display_name(value) when is_binary(value), do: value
+  def encode_display_name(_), do: {:error, "Unexpected type when encoding User.display_name"}
+
+  def decode_profile_url(value) when is_binary(value), do: value
+  def decode_profile_url(_), do: {:error, "Unexpected type when decoding User.profile_url"}
+
+  def encode_profile_url(value) when is_binary(value), do: value
+  def encode_profile_url(_), do: {:error, "Unexpected type when encoding User.profile_url"}
+
+  def decode_twitter(value) when is_binary(value), do: value
+  def decode_twitter(_), do: {:error, "Unexpected type when decoding User.twitter"}
+
+  def encode_twitter(value) when is_binary(value), do: value
+  def encode_twitter(_), do: {:error, "Unexpected type when encoding User.twitter"}
+
+  def decode_username(value) when is_binary(value), do: value
+  def decode_username(_), do: {:error, "Unexpected type when decoding User.username"}
+
+  def encode_username(value) when is_binary(value), do: value
+  def encode_username(_), do: {:error, "Unexpected type when encoding User.username"}
+
   def from_map(m) do
     %User{
-      avatar_url: m["avatar_url"],
-      banner_url: m["banner_url"],
-      display_name: m["display_name"],
-      profile_url: m["profile_url"],
-      twitter: m["twitter"],
-      username: m["username"],
+      avatar_url: decode_avatar_url(m["avatar_url"]),
+      banner_url: decode_banner_url(m["banner_url"]),
+      display_name: decode_display_name(m["display_name"]),
+      profile_url: decode_profile_url(m["profile_url"]),
+      twitter: decode_twitter(m["twitter"]),
+      username: decode_username(m["username"]),
     }
   end
 
@@ -449,26 +575,110 @@ defmodule Datum do
           username: String.t()
         }
 
+  def decode_bitly_gif_url(value) when is_binary(value), do: value
+  def decode_bitly_gif_url(_), do: {:error, "Unexpected type when decoding Datum.bitly_gif_url"}
+
+  def encode_bitly_gif_url(value) when is_binary(value), do: value
+  def encode_bitly_gif_url(_), do: {:error, "Unexpected type when encoding Datum.bitly_gif_url"}
+
+  def decode_bitly_url(value) when is_binary(value), do: value
+  def decode_bitly_url(_), do: {:error, "Unexpected type when decoding Datum.bitly_url"}
+
+  def encode_bitly_url(value) when is_binary(value), do: value
+  def encode_bitly_url(_), do: {:error, "Unexpected type when encoding Datum.bitly_url"}
+
+  def decode_content_url(value) when is_binary(value), do: value
+  def decode_content_url(_), do: {:error, "Unexpected type when decoding Datum.content_url"}
+
+  def encode_content_url(value) when is_binary(value), do: value
+  def encode_content_url(_), do: {:error, "Unexpected type when encoding Datum.content_url"}
+
+  def decode_embed_url(value) when is_binary(value), do: value
+  def decode_embed_url(_), do: {:error, "Unexpected type when decoding Datum.embed_url"}
+
+  def encode_embed_url(value) when is_binary(value), do: value
+  def encode_embed_url(_), do: {:error, "Unexpected type when encoding Datum.embed_url"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Datum.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Datum.id"}
+
+  def decode_import_datetime(value) when is_binary(value), do: value
+  def decode_import_datetime(_), do: {:error, "Unexpected type when decoding Datum.import_datetime"}
+
+  def encode_import_datetime(value) when is_binary(value), do: value
+  def encode_import_datetime(_), do: {:error, "Unexpected type when encoding Datum.import_datetime"}
+
+  def decode_is_indexable(value) when is_integer(value), do: value
+  def decode_is_indexable(_), do: {:error, "Unexpected type when decoding Datum.is_indexable"}
+
+  def encode_is_indexable(value) when is_integer(value), do: value
+  def encode_is_indexable(_), do: {:error, "Unexpected type when encoding Datum.is_indexable"}
+
+  def decode_slug(value) when is_binary(value), do: value
+  def decode_slug(_), do: {:error, "Unexpected type when decoding Datum.slug"}
+
+  def encode_slug(value) when is_binary(value), do: value
+  def encode_slug(_), do: {:error, "Unexpected type when encoding Datum.slug"}
+
+  def decode_source(value) when is_binary(value), do: value
+  def decode_source(_), do: {:error, "Unexpected type when decoding Datum.source"}
+
+  def encode_source(value) when is_binary(value), do: value
+  def encode_source(_), do: {:error, "Unexpected type when encoding Datum.source"}
+
+  def decode_source_post_url(value) when is_binary(value), do: value
+  def decode_source_post_url(_), do: {:error, "Unexpected type when decoding Datum.source_post_url"}
+
+  def encode_source_post_url(value) when is_binary(value), do: value
+  def encode_source_post_url(_), do: {:error, "Unexpected type when encoding Datum.source_post_url"}
+
+  def decode_source_tld(value) when is_binary(value), do: value
+  def decode_source_tld(_), do: {:error, "Unexpected type when decoding Datum.source_tld"}
+
+  def encode_source_tld(value) when is_binary(value), do: value
+  def encode_source_tld(_), do: {:error, "Unexpected type when encoding Datum.source_tld"}
+
+  def decode_trending_datetime(value) when is_binary(value), do: value
+  def decode_trending_datetime(_), do: {:error, "Unexpected type when decoding Datum.trending_datetime"}
+
+  def encode_trending_datetime(value) when is_binary(value), do: value
+  def encode_trending_datetime(_), do: {:error, "Unexpected type when encoding Datum.trending_datetime"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Datum.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Datum.url"}
+
+  def decode_username(value) when is_binary(value), do: value
+  def decode_username(_), do: {:error, "Unexpected type when decoding Datum.username"}
+
+  def encode_username(value) when is_binary(value), do: value
+  def encode_username(_), do: {:error, "Unexpected type when encoding Datum.username"}
+
   def from_map(m) do
     %Datum{
-      bitly_gif_url: m["bitly_gif_url"],
-      bitly_url: m["bitly_url"],
-      content_url: m["content_url"],
-      embed_url: m["embed_url"],
-      id: m["id"],
+      bitly_gif_url: decode_bitly_gif_url(m["bitly_gif_url"]),
+      bitly_url: decode_bitly_url(m["bitly_url"]),
+      content_url: decode_content_url(m["content_url"]),
+      embed_url: decode_embed_url(m["embed_url"]),
+      id: decode_id(m["id"]),
       images: Images.from_map(m["images"]),
-      import_datetime: m["import_datetime"],
-      is_indexable: m["is_indexable"],
+      import_datetime: decode_import_datetime(m["import_datetime"]),
+      is_indexable: decode_is_indexable(m["is_indexable"]),
       rating: Rating.decode(m["rating"]),
-      slug: m["slug"],
-      source: m["source"],
-      source_post_url: m["source_post_url"],
-      source_tld: m["source_tld"],
-      trending_datetime: m["trending_datetime"],
+      slug: decode_slug(m["slug"]),
+      source: decode_source(m["source"]),
+      source_post_url: decode_source_post_url(m["source_post_url"]),
+      source_tld: decode_source_tld(m["source_tld"]),
+      trending_datetime: decode_trending_datetime(m["trending_datetime"]),
       type: Type.decode(m["type"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
       user: m["user"] && User.from_map(m["user"]),
-      username: m["username"],
+      username: decode_username(m["username"]),
     }
   end
 
@@ -518,11 +728,29 @@ defmodule Meta do
           status: integer()
         }
 
+  def decode_msg(value) when is_binary(value), do: value
+  def decode_msg(_), do: {:error, "Unexpected type when decoding Meta.msg"}
+
+  def encode_msg(value) when is_binary(value), do: value
+  def encode_msg(_), do: {:error, "Unexpected type when encoding Meta.msg"}
+
+  def decode_response_id(value) when is_binary(value), do: value
+  def decode_response_id(_), do: {:error, "Unexpected type when decoding Meta.response_id"}
+
+  def encode_response_id(value) when is_binary(value), do: value
+  def encode_response_id(_), do: {:error, "Unexpected type when encoding Meta.response_id"}
+
+  def decode_status(value) when is_integer(value), do: value
+  def decode_status(_), do: {:error, "Unexpected type when decoding Meta.status"}
+
+  def encode_status(value) when is_integer(value), do: value
+  def encode_status(_), do: {:error, "Unexpected type when encoding Meta.status"}
+
   def from_map(m) do
     %Meta{
-      msg: m["msg"],
-      response_id: m["response_id"],
-      status: m["status"],
+      msg: decode_msg(m["msg"]),
+      response_id: decode_response_id(m["response_id"]),
+      status: decode_status(m["status"]),
     }
   end
 
@@ -557,11 +785,29 @@ defmodule Pagination do
           total_count: integer()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Pagination.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Pagination.count"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding Pagination.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding Pagination.offset"}
+
+  def decode_total_count(value) when is_integer(value), do: value
+  def decode_total_count(_), do: {:error, "Unexpected type when decoding Pagination.total_count"}
+
+  def encode_total_count(value) when is_integer(value), do: value
+  def encode_total_count(_), do: {:error, "Unexpected type when encoding Pagination.total_count"}
+
   def from_map(m) do
     %Pagination{
-      count: m["count"],
-      offset: m["offset"],
-      total_count: m["total_count"],
+      count: decode_count(m["count"]),
+      offset: decode_offset(m["offset"]),
+      total_count: decode_total_count(m["total_count"]),
     }
   end
 
@@ -596,6 +842,12 @@ defmodule TopLevel do
           pagination: Pagination.t()
         }
 
+  def decode_data(value) when is_list(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data(value) when is_list(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
   def from_map(m) do
     %TopLevel{
       data: Enum.map(m["data"], &Datum.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/e2915.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/e2915.json/default/QuickType.ex
index 51d7b9a..f8f3db0 100644
--- a/base/elixir/test/inputs/json/misc/e2915.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/e2915.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Astronomy do
           sunset: String.t()
         }
 
+  def decode_sunrise(value) when is_binary(value), do: value
+  def decode_sunrise(_), do: {:error, "Unexpected type when decoding Astronomy.sunrise"}
+
+  def encode_sunrise(value) when is_binary(value), do: value
+  def encode_sunrise(_), do: {:error, "Unexpected type when encoding Astronomy.sunrise"}
+
+  def decode_sunset(value) when is_binary(value), do: value
+  def decode_sunset(_), do: {:error, "Unexpected type when decoding Astronomy.sunset"}
+
+  def encode_sunset(value) when is_binary(value), do: value
+  def encode_sunset(_), do: {:error, "Unexpected type when encoding Astronomy.sunset"}
+
   def from_map(m) do
     %Astronomy{
-      sunrise: m["sunrise"],
-      sunset: m["sunset"],
+      sunrise: decode_sunrise(m["sunrise"]),
+      sunset: decode_sunset(m["sunset"]),
     }
   end
 
@@ -52,12 +64,36 @@ defmodule Atmosphere do
           visibility: String.t()
         }
 
+  def decode_humidity(value) when is_binary(value), do: value
+  def decode_humidity(_), do: {:error, "Unexpected type when decoding Atmosphere.humidity"}
+
+  def encode_humidity(value) when is_binary(value), do: value
+  def encode_humidity(_), do: {:error, "Unexpected type when encoding Atmosphere.humidity"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Atmosphere.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Atmosphere.pressure"}
+
+  def decode_rising(value) when is_binary(value), do: value
+  def decode_rising(_), do: {:error, "Unexpected type when decoding Atmosphere.rising"}
+
+  def encode_rising(value) when is_binary(value), do: value
+  def encode_rising(_), do: {:error, "Unexpected type when encoding Atmosphere.rising"}
+
+  def decode_visibility(value) when is_binary(value), do: value
+  def decode_visibility(_), do: {:error, "Unexpected type when decoding Atmosphere.visibility"}
+
+  def encode_visibility(value) when is_binary(value), do: value
+  def encode_visibility(_), do: {:error, "Unexpected type when encoding Atmosphere.visibility"}
+
   def from_map(m) do
     %Atmosphere{
-      humidity: m["humidity"],
-      pressure: m["pressure"],
-      rising: m["rising"],
-      visibility: m["visibility"],
+      humidity: decode_humidity(m["humidity"]),
+      pressure: decode_pressure(m["pressure"]),
+      rising: decode_rising(m["rising"]),
+      visibility: decode_visibility(m["visibility"]),
     }
   end
 
@@ -95,13 +131,43 @@ defmodule Image do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Image.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Image.height"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Image.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Image.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Image.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Image.title"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Image.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Image.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Image.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Image.width"}
+
   def from_map(m) do
     %Image{
-      height: m["height"],
-      link: m["link"],
-      title: m["title"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      link: decode_link(m["link"]),
+      title: decode_title(m["title"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -139,12 +205,36 @@ defmodule Condition do
           text: String.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Condition.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Condition.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Condition.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Condition.date"}
+
+  def decode_temp(value) when is_binary(value), do: value
+  def decode_temp(_), do: {:error, "Unexpected type when decoding Condition.temp"}
+
+  def encode_temp(value) when is_binary(value), do: value
+  def encode_temp(_), do: {:error, "Unexpected type when encoding Condition.temp"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Condition.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Condition.text"}
+
   def from_map(m) do
     %Condition{
-      code: m["code"],
-      date: m["date"],
-      temp: m["temp"],
-      text: m["text"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      temp: decode_temp(m["temp"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -228,13 +318,43 @@ defmodule Forecast do
           text: Text.t()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Forecast.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Forecast.code"}
+
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding Forecast.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding Forecast.date"}
+
+  def decode_day(value) when is_binary(value), do: value
+  def decode_day(_), do: {:error, "Unexpected type when decoding Forecast.day"}
+
+  def encode_day(value) when is_binary(value), do: value
+  def encode_day(_), do: {:error, "Unexpected type when encoding Forecast.day"}
+
+  def decode_high(value) when is_binary(value), do: value
+  def decode_high(_), do: {:error, "Unexpected type when decoding Forecast.high"}
+
+  def encode_high(value) when is_binary(value), do: value
+  def encode_high(_), do: {:error, "Unexpected type when encoding Forecast.high"}
+
+  def decode_low(value) when is_binary(value), do: value
+  def decode_low(_), do: {:error, "Unexpected type when decoding Forecast.low"}
+
+  def encode_low(value) when is_binary(value), do: value
+  def encode_low(_), do: {:error, "Unexpected type when encoding Forecast.low"}
+
   def from_map(m) do
     %Forecast{
-      code: m["code"],
-      date: m["date"],
-      day: m["day"],
-      high: m["high"],
-      low: m["low"],
+      code: decode_code(m["code"]),
+      date: decode_date(m["date"]),
+      day: decode_day(m["day"]),
+      high: decode_high(m["high"]),
+      low: decode_low(m["low"]),
       text: Text.decode(m["text"]),
     }
   end
@@ -271,9 +391,15 @@ defmodule GUID do
           is_perma_link: String.t()
         }
 
+  def decode_is_perma_link(value) when is_binary(value), do: value
+  def decode_is_perma_link(_), do: {:error, "Unexpected type when decoding GUID.is_perma_link"}
+
+  def encode_is_perma_link(value) when is_binary(value), do: value
+  def encode_is_perma_link(_), do: {:error, "Unexpected type when encoding GUID.is_perma_link"}
+
   def from_map(m) do
     %GUID{
-      is_perma_link: m["isPermaLink"],
+      is_perma_link: decode_is_perma_link(m["isPermaLink"]),
     }
   end
 
@@ -312,17 +438,59 @@ defmodule Item do
           title: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Item.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Item.description"}
+
+  def decode_forecast(value) when is_list(value), do: value
+  def decode_forecast(_), do: {:error, "Unexpected type when decoding Item.forecast"}
+
+  def encode_forecast(value) when is_list(value), do: value
+  def encode_forecast(_), do: {:error, "Unexpected type when encoding Item.forecast"}
+
+  def decode_lat(value) when is_binary(value), do: value
+  def decode_lat(_), do: {:error, "Unexpected type when decoding Item.lat"}
+
+  def encode_lat(value) when is_binary(value), do: value
+  def encode_lat(_), do: {:error, "Unexpected type when encoding Item.lat"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Item.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Item.link"}
+
+  def decode_long(value) when is_binary(value), do: value
+  def decode_long(_), do: {:error, "Unexpected type when decoding Item.long"}
+
+  def encode_long(value) when is_binary(value), do: value
+  def encode_long(_), do: {:error, "Unexpected type when encoding Item.long"}
+
+  def decode_pub_date(value) when is_binary(value), do: value
+  def decode_pub_date(_), do: {:error, "Unexpected type when decoding Item.pub_date"}
+
+  def encode_pub_date(value) when is_binary(value), do: value
+  def encode_pub_date(_), do: {:error, "Unexpected type when encoding Item.pub_date"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Item.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Item.title"}
+
   def from_map(m) do
     %Item{
       condition: Condition.from_map(m["condition"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       forecast: Enum.map(m["forecast"], &Forecast.from_map/1),
       guid: GUID.from_map(m["guid"]),
-      lat: m["lat"],
-      link: m["link"],
-      long: m["long"],
-      pub_date: m["pubDate"],
-      title: m["title"],
+      lat: decode_lat(m["lat"]),
+      link: decode_link(m["link"]),
+      long: decode_long(m["long"]),
+      pub_date: decode_pub_date(m["pubDate"]),
+      title: decode_title(m["title"]),
     }
   end
 
@@ -363,11 +531,29 @@ defmodule Location do
           region: String.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding Location.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding Location.city"}
+
+  def decode_country(value) when is_binary(value), do: value
+  def decode_country(_), do: {:error, "Unexpected type when decoding Location.country"}
+
+  def encode_country(value) when is_binary(value), do: value
+  def encode_country(_), do: {:error, "Unexpected type when encoding Location.country"}
+
+  def decode_region(value) when is_binary(value), do: value
+  def decode_region(_), do: {:error, "Unexpected type when decoding Location.region"}
+
+  def encode_region(value) when is_binary(value), do: value
+  def encode_region(_), do: {:error, "Unexpected type when encoding Location.region"}
+
   def from_map(m) do
     %Location{
-      city: m["city"],
-      country: m["country"],
-      region: m["region"],
+      city: decode_city(m["city"]),
+      country: decode_country(m["country"]),
+      region: decode_region(m["region"]),
     }
   end
 
@@ -403,12 +589,36 @@ defmodule Units do
           temperature: String.t()
         }
 
+  def decode_distance(value) when is_binary(value), do: value
+  def decode_distance(_), do: {:error, "Unexpected type when decoding Units.distance"}
+
+  def encode_distance(value) when is_binary(value), do: value
+  def encode_distance(_), do: {:error, "Unexpected type when encoding Units.distance"}
+
+  def decode_pressure(value) when is_binary(value), do: value
+  def decode_pressure(_), do: {:error, "Unexpected type when decoding Units.pressure"}
+
+  def encode_pressure(value) when is_binary(value), do: value
+  def encode_pressure(_), do: {:error, "Unexpected type when encoding Units.pressure"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Units.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Units.speed"}
+
+  def decode_temperature(value) when is_binary(value), do: value
+  def decode_temperature(_), do: {:error, "Unexpected type when decoding Units.temperature"}
+
+  def encode_temperature(value) when is_binary(value), do: value
+  def encode_temperature(_), do: {:error, "Unexpected type when encoding Units.temperature"}
+
   def from_map(m) do
     %Units{
-      distance: m["distance"],
-      pressure: m["pressure"],
-      speed: m["speed"],
-      temperature: m["temperature"],
+      distance: decode_distance(m["distance"]),
+      pressure: decode_pressure(m["pressure"]),
+      speed: decode_speed(m["speed"]),
+      temperature: decode_temperature(m["temperature"]),
     }
   end
 
@@ -444,11 +654,29 @@ defmodule Wind do
           speed: String.t()
         }
 
+  def decode_chill(value) when is_binary(value), do: value
+  def decode_chill(_), do: {:error, "Unexpected type when decoding Wind.chill"}
+
+  def encode_chill(value) when is_binary(value), do: value
+  def encode_chill(_), do: {:error, "Unexpected type when encoding Wind.chill"}
+
+  def decode_direction(value) when is_binary(value), do: value
+  def decode_direction(_), do: {:error, "Unexpected type when decoding Wind.direction"}
+
+  def encode_direction(value) when is_binary(value), do: value
+  def encode_direction(_), do: {:error, "Unexpected type when encoding Wind.direction"}
+
+  def decode_speed(value) when is_binary(value), do: value
+  def decode_speed(_), do: {:error, "Unexpected type when decoding Wind.speed"}
+
+  def encode_speed(value) when is_binary(value), do: value
+  def encode_speed(_), do: {:error, "Unexpected type when encoding Wind.speed"}
+
   def from_map(m) do
     %Wind{
-      chill: m["chill"],
-      direction: m["direction"],
-      speed: m["speed"],
+      chill: decode_chill(m["chill"]),
+      direction: decode_direction(m["direction"]),
+      speed: decode_speed(m["speed"]),
     }
   end
 
@@ -493,19 +721,55 @@ defmodule Channel do
           wind: Wind.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Channel.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Channel.description"}
+
+  def decode_language(value) when is_binary(value), do: value
+  def decode_language(_), do: {:error, "Unexpected type when decoding Channel.language"}
+
+  def encode_language(value) when is_binary(value), do: value
+  def encode_language(_), do: {:error, "Unexpected type when encoding Channel.language"}
+
+  def decode_last_build_date(value) when is_binary(value), do: value
+  def decode_last_build_date(_), do: {:error, "Unexpected type when decoding Channel.last_build_date"}
+
+  def encode_last_build_date(value) when is_binary(value), do: value
+  def encode_last_build_date(_), do: {:error, "Unexpected type when encoding Channel.last_build_date"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Channel.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Channel.link"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Channel.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Channel.title"}
+
+  def decode_ttl(value) when is_binary(value), do: value
+  def decode_ttl(_), do: {:error, "Unexpected type when decoding Channel.ttl"}
+
+  def encode_ttl(value) when is_binary(value), do: value
+  def encode_ttl(_), do: {:error, "Unexpected type when encoding Channel.ttl"}
+
   def from_map(m) do
     %Channel{
       astronomy: Astronomy.from_map(m["astronomy"]),
       atmosphere: Atmosphere.from_map(m["atmosphere"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       image: Image.from_map(m["image"]),
       item: Item.from_map(m["item"]),
-      language: m["language"],
-      last_build_date: m["lastBuildDate"],
-      link: m["link"],
+      language: decode_language(m["language"]),
+      last_build_date: decode_last_build_date(m["lastBuildDate"]),
+      link: decode_link(m["link"]),
       location: Location.from_map(m["location"]),
-      title: m["title"],
-      ttl: m["ttl"],
+      title: decode_title(m["title"]),
+      ttl: decode_ttl(m["ttl"]),
       units: Units.from_map(m["units"]),
       wind: Wind.from_map(m["wind"]),
     }
@@ -586,11 +850,29 @@ defmodule Query do
           results: Results.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Query.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Query.count"}
+
+  def decode_created(value) when is_binary(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding Query.created"}
+
+  def encode_created(value) when is_binary(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding Query.created"}
+
+  def decode_lang(value) when is_binary(value), do: value
+  def decode_lang(_), do: {:error, "Unexpected type when decoding Query.lang"}
+
+  def encode_lang(value) when is_binary(value), do: value
+  def encode_lang(_), do: {:error, "Unexpected type when encoding Query.lang"}
+
   def from_map(m) do
     %Query{
-      count: m["count"],
-      created: m["created"],
-      lang: m["lang"],
+      count: decode_count(m["count"]),
+      created: decode_created(m["created"]),
+      lang: decode_lang(m["lang"]),
       results: Results.from_map(m["results"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/e2a58.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/e2a58.json/default/QuickType.ex
index 2ee60c4..2dc09f2 100644
--- a/base/elixir/test/inputs/json/misc/e2a58.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/e2a58.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule TopLevelElement do
           stop_and_search: [String.t()]
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevelElement.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevelElement.date"}
+
+  def decode_stop_and_search(value) when is_list(value), do: value
+  def decode_stop_and_search(_), do: {:error, "Unexpected type when decoding TopLevelElement.stop_and_search"}
+
+  def encode_stop_and_search(value) when is_list(value), do: value
+  def encode_stop_and_search(_), do: {:error, "Unexpected type when encoding TopLevelElement.stop_and_search"}
+
   def from_map(m) do
     %TopLevelElement{
-      date: m["date"],
-      stop_and_search: m["stop-and-search"],
+      date: decode_date(m["date"]),
+      stop_and_search: decode_stop_and_search(m["stop-and-search"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/e324e.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/e324e.json/default/QuickType.ex
index bc2f621..898bae5 100644
--- a/base/elixir/test/inputs/json/misc/e324e.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/e324e.json/default/QuickType.ex
@@ -59,9 +59,15 @@ defmodule Property do
           type: Type.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Property.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Property.description"}
+
   def from_map(m) do
     %Property{
-      description: m["description"],
+      description: decode_description(m["description"]),
       type: Type.decode(m["type"]),
     }
   end
@@ -164,11 +170,29 @@ defmodule Info do
           version: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Info.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Info.description"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Info.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Info.title"}
+
+  def decode_version(value) when is_binary(value), do: value
+  def decode_version(_), do: {:error, "Unexpected type when decoding Info.version"}
+
+  def encode_version(value) when is_binary(value), do: value
+  def encode_version(_), do: {:error, "Unexpected type when encoding Info.version"}
+
   def from_map(m) do
     %Info{
-      description: m["description"],
-      title: m["title"],
-      version: m["version"],
+      description: decode_description(m["description"]),
+      title: decode_title(m["title"]),
+      version: decode_version(m["version"]),
     }
   end
 
@@ -206,13 +230,37 @@ defmodule Parameter do
           type: Type.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Parameter.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Parameter.description"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Parameter.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Parameter.name"}
+
+  def decode_parameter_in(value) when is_binary(value), do: value
+  def decode_parameter_in(_), do: {:error, "Unexpected type when decoding Parameter.parameter_in"}
+
+  def encode_parameter_in(value) when is_binary(value), do: value
+  def encode_parameter_in(_), do: {:error, "Unexpected type when encoding Parameter.parameter_in"}
+
+  def decode_required(value) when is_boolean(value), do: value
+  def decode_required(_), do: {:error, "Unexpected type when decoding Parameter.required"}
+
+  def encode_required(value) when is_boolean(value), do: value
+  def encode_required(_), do: {:error, "Unexpected type when encoding Parameter.required"}
+
   def from_map(m) do
     %Parameter{
-      description: m["description"],
+      description: decode_description(m["description"]),
       format: Type.decode(m["format"]),
-      name: m["name"],
-      parameter_in: m["in"],
-      required: m["required"],
+      name: decode_name(m["name"]),
+      parameter_in: decode_parameter_in(m["in"]),
+      required: decode_required(m["required"]),
       type: Type.decode(m["type"]),
     }
   end
@@ -249,9 +297,15 @@ defmodule Items do
           ref: String.t()
         }
 
+  def decode_ref(value) when is_binary(value), do: value
+  def decode_ref(_), do: {:error, "Unexpected type when decoding Items.ref"}
+
+  def encode_ref(value) when is_binary(value), do: value
+  def encode_ref(_), do: {:error, "Unexpected type when encoding Items.ref"}
+
   def from_map(m) do
     %Items{
-      ref: m["$ref"],
+      ref: decode_ref(m["$ref"]),
     }
   end
 
@@ -283,10 +337,16 @@ defmodule Schema do
           type: String.t()
         }
 
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Schema.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Schema.type"}
+
   def from_map(m) do
     %Schema{
       items: Items.from_map(m["items"]),
-      type: m["type"],
+      type: decode_type(m["type"]),
     }
   end
 
@@ -319,9 +379,15 @@ defmodule The200N do
           schema: Schema.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding The200N.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding The200N.description"}
+
   def from_map(m) do
     %The200N{
-      description: m["description"],
+      description: decode_description(m["description"]),
       schema: Schema.from_map(m["schema"]),
     }
   end
@@ -391,13 +457,37 @@ defmodule Get do
           tags: [String.t()]
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Get.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Get.description"}
+
+  def decode_parameters(value) when is_list(value), do: value
+  def decode_parameters(_), do: {:error, "Unexpected type when decoding Get.parameters"}
+
+  def encode_parameters(value) when is_list(value), do: value
+  def encode_parameters(_), do: {:error, "Unexpected type when encoding Get.parameters"}
+
+  def decode_summary(value) when is_binary(value), do: value
+  def decode_summary(_), do: {:error, "Unexpected type when decoding Get.summary"}
+
+  def encode_summary(value) when is_binary(value), do: value
+  def encode_summary(_), do: {:error, "Unexpected type when encoding Get.summary"}
+
+  def decode_tags(value) when is_list(value), do: value
+  def decode_tags(_), do: {:error, "Unexpected type when decoding Get.tags"}
+
+  def encode_tags(value) when is_list(value), do: value
+  def encode_tags(_), do: {:error, "Unexpected type when encoding Get.tags"}
+
   def from_map(m) do
     %Get{
-      description: m["description"],
+      description: decode_description(m["description"]),
       parameters: Enum.map(m["parameters"], &Parameter.from_map/1),
       responses: Responses.from_map(m["responses"]),
-      summary: m["summary"],
-      tags: m["tags"],
+      summary: decode_summary(m["summary"]),
+      tags: decode_tags(m["tags"]),
     }
   end
 
@@ -505,16 +595,46 @@ defmodule TopLevel do
           swagger: String.t()
         }
 
+  def decode_base_path(value) when is_binary(value), do: value
+  def decode_base_path(_), do: {:error, "Unexpected type when decoding TopLevel.base_path"}
+
+  def encode_base_path(value) when is_binary(value), do: value
+  def encode_base_path(_), do: {:error, "Unexpected type when encoding TopLevel.base_path"}
+
+  def decode_host(value) when is_binary(value), do: value
+  def decode_host(_), do: {:error, "Unexpected type when decoding TopLevel.host"}
+
+  def encode_host(value) when is_binary(value), do: value
+  def encode_host(_), do: {:error, "Unexpected type when encoding TopLevel.host"}
+
+  def decode_produces(value) when is_list(value), do: value
+  def decode_produces(_), do: {:error, "Unexpected type when decoding TopLevel.produces"}
+
+  def encode_produces(value) when is_list(value), do: value
+  def encode_produces(_), do: {:error, "Unexpected type when encoding TopLevel.produces"}
+
+  def decode_schemes(value) when is_list(value), do: value
+  def decode_schemes(_), do: {:error, "Unexpected type when decoding TopLevel.schemes"}
+
+  def encode_schemes(value) when is_list(value), do: value
+  def encode_schemes(_), do: {:error, "Unexpected type when encoding TopLevel.schemes"}
+
+  def decode_swagger(value) when is_binary(value), do: value
+  def decode_swagger(_), do: {:error, "Unexpected type when decoding TopLevel.swagger"}
+
+  def encode_swagger(value) when is_binary(value), do: value
+  def encode_swagger(_), do: {:error, "Unexpected type when encoding TopLevel.swagger"}
+
   def from_map(m) do
     %TopLevel{
-      base_path: m["basePath"],
+      base_path: decode_base_path(m["basePath"]),
       definitions: Definitions.from_map(m["definitions"]),
-      host: m["host"],
+      host: decode_host(m["host"]),
       info: Info.from_map(m["info"]),
       paths: Paths.from_map(m["paths"]),
-      produces: m["produces"],
-      schemes: m["schemes"],
-      swagger: m["swagger"],
+      produces: decode_produces(m["produces"]),
+      schemes: decode_schemes(m["schemes"]),
+      swagger: decode_swagger(m["swagger"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/e53b5.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/e53b5.json/default/QuickType.ex
index e5d2b34..f82a0fd 100644
--- a/base/elixir/test/inputs/json/misc/e53b5.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/e53b5.json/default/QuickType.ex
@@ -145,13 +145,31 @@ defmodule TopLevel1 do
           value: String.t()
         }
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel1.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel1.date"}
+
+  def decode_decimal(value) when is_binary(value), do: value
+  def decode_decimal(_), do: {:error, "Unexpected type when decoding TopLevel1.decimal"}
+
+  def encode_decimal(value) when is_binary(value), do: value
+  def encode_decimal(_), do: {:error, "Unexpected type when encoding TopLevel1.decimal"}
+
+  def decode_value(value) when is_binary(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding TopLevel1.value"}
+
+  def encode_value(value) when is_binary(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding TopLevel1.value"}
+
   def from_map(m) do
     %TopLevel1{
       country: Country.from_map(m["country"]),
-      date: m["date"],
-      decimal: m["decimal"],
+      date: decode_date(m["date"]),
+      decimal: decode_decimal(m["decimal"]),
       indicator: Country.from_map(m["indicator"]),
-      value: m["value"],
+      value: decode_value(m["value"]),
     }
   end
 
@@ -189,12 +207,36 @@ defmodule TopLevel2 do
           total: integer()
         }
 
+  def decode_page(value) when is_integer(value), do: value
+  def decode_page(_), do: {:error, "Unexpected type when decoding TopLevel2.page"}
+
+  def encode_page(value) when is_integer(value), do: value
+  def encode_page(_), do: {:error, "Unexpected type when encoding TopLevel2.page"}
+
+  def decode_pages(value) when is_integer(value), do: value
+  def decode_pages(_), do: {:error, "Unexpected type when decoding TopLevel2.pages"}
+
+  def encode_pages(value) when is_integer(value), do: value
+  def encode_pages(_), do: {:error, "Unexpected type when encoding TopLevel2.pages"}
+
+  def decode_per_page(value) when is_binary(value), do: value
+  def decode_per_page(_), do: {:error, "Unexpected type when decoding TopLevel2.per_page"}
+
+  def encode_per_page(value) when is_binary(value), do: value
+  def encode_per_page(_), do: {:error, "Unexpected type when encoding TopLevel2.per_page"}
+
+  def decode_total(value) when is_integer(value), do: value
+  def decode_total(_), do: {:error, "Unexpected type when decoding TopLevel2.total"}
+
+  def encode_total(value) when is_integer(value), do: value
+  def encode_total(_), do: {:error, "Unexpected type when encoding TopLevel2.total"}
+
   def from_map(m) do
     %TopLevel2{
-      page: m["page"],
-      pages: m["pages"],
-      per_page: m["per_page"],
-      total: m["total"],
+      page: decode_page(m["page"]),
+      pages: decode_pages(m["pages"]),
+      per_page: decode_per_page(m["per_page"]),
+      total: decode_total(m["total"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/e64a0.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/e64a0.json/default/QuickType.ex
index 19b0349..96c683d 100644
--- a/base/elixir/test/inputs/json/misc/e64a0.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/e64a0.json/default/QuickType.ex
@@ -45,12 +45,36 @@ defmodule Headers do
           user_agent: String.t()
         }
 
+  def decode_accept_encoding(value) when is_binary(value), do: value
+  def decode_accept_encoding(_), do: {:error, "Unexpected type when decoding Headers.accept_encoding"}
+
+  def encode_accept_encoding(value) when is_binary(value), do: value
+  def encode_accept_encoding(_), do: {:error, "Unexpected type when encoding Headers.accept_encoding"}
+
+  def decode_connection(value) when is_binary(value), do: value
+  def decode_connection(_), do: {:error, "Unexpected type when decoding Headers.connection"}
+
+  def encode_connection(value) when is_binary(value), do: value
+  def encode_connection(_), do: {:error, "Unexpected type when encoding Headers.connection"}
+
+  def decode_host(value) when is_binary(value), do: value
+  def decode_host(_), do: {:error, "Unexpected type when decoding Headers.host"}
+
+  def encode_host(value) when is_binary(value), do: value
+  def encode_host(_), do: {:error, "Unexpected type when encoding Headers.host"}
+
+  def decode_user_agent(value) when is_binary(value), do: value
+  def decode_user_agent(_), do: {:error, "Unexpected type when decoding Headers.user_agent"}
+
+  def encode_user_agent(value) when is_binary(value), do: value
+  def encode_user_agent(_), do: {:error, "Unexpected type when encoding Headers.user_agent"}
+
   def from_map(m) do
     %Headers{
-      accept_encoding: m["Accept-Encoding"],
-      connection: m["Connection"],
-      host: m["Host"],
-      user_agent: m["User-Agent"],
+      accept_encoding: decode_accept_encoding(m["Accept-Encoding"]),
+      connection: decode_connection(m["Connection"]),
+      host: decode_host(m["Host"]),
+      user_agent: decode_user_agent(m["User-Agent"]),
     }
   end
 
@@ -87,12 +111,24 @@ defmodule TopLevel do
           url: String.t()
         }
 
+  def decode_origin(value) when is_binary(value), do: value
+  def decode_origin(_), do: {:error, "Unexpected type when decoding TopLevel.origin"}
+
+  def encode_origin(value) when is_binary(value), do: value
+  def encode_origin(_), do: {:error, "Unexpected type when encoding TopLevel.origin"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding TopLevel.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding TopLevel.url"}
+
   def from_map(m) do
     %TopLevel{
       args: Args.from_map(m["args"]),
       headers: Headers.from_map(m["headers"]),
-      origin: m["origin"],
-      url: m["url"],
+      origin: decode_origin(m["origin"]),
+      url: decode_url(m["url"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/e8a0b.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/e8a0b.json/default/QuickType.ex
index 193f7cc..81e4144 100644
--- a/base/elixir/test/inputs/json/misc/e8a0b.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/e8a0b.json/default/QuickType.ex
@@ -63,14 +63,44 @@ defmodule TopLevelElement do
           year: integer()
         }
 
+  def decode_age(value) when is_integer(value), do: value
+  def decode_age(_), do: {:error, "Unexpected type when decoding TopLevelElement.age"}
+
+  def encode_age(value) when is_integer(value), do: value
+  def encode_age(_), do: {:error, "Unexpected type when encoding TopLevelElement.age"}
+
+  def decode_females(value) when is_integer(value), do: value
+  def decode_females(_), do: {:error, "Unexpected type when decoding TopLevelElement.females"}
+
+  def encode_females(value) when is_integer(value), do: value
+  def encode_females(_), do: {:error, "Unexpected type when encoding TopLevelElement.females"}
+
+  def decode_males(value) when is_integer(value), do: value
+  def decode_males(_), do: {:error, "Unexpected type when decoding TopLevelElement.males"}
+
+  def encode_males(value) when is_integer(value), do: value
+  def encode_males(_), do: {:error, "Unexpected type when encoding TopLevelElement.males"}
+
+  def decode_total(value) when is_integer(value), do: value
+  def decode_total(_), do: {:error, "Unexpected type when decoding TopLevelElement.total"}
+
+  def encode_total(value) when is_integer(value), do: value
+  def encode_total(_), do: {:error, "Unexpected type when encoding TopLevelElement.total"}
+
+  def decode_year(value) when is_integer(value), do: value
+  def decode_year(_), do: {:error, "Unexpected type when decoding TopLevelElement.year"}
+
+  def encode_year(value) when is_integer(value), do: value
+  def encode_year(_), do: {:error, "Unexpected type when encoding TopLevelElement.year"}
+
   def from_map(m) do
     %TopLevelElement{
-      age: m["age"],
+      age: decode_age(m["age"]),
       country: Country.decode(m["country"]),
-      females: m["females"],
-      males: m["males"],
-      total: m["total"],
-      year: m["year"],
+      females: decode_females(m["females"]),
+      males: decode_males(m["males"]),
+      total: decode_total(m["total"]),
+      year: decode_year(m["year"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/e8b04.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/e8b04.json/default/QuickType.ex
index 594be04..c5a40b7 100644
--- a/base/elixir/test/inputs/json/misc/e8b04.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/e8b04.json/default/QuickType.ex
@@ -200,10 +200,22 @@ defmodule Grant do
           type: GrantType.t()
         }
 
+  def decode_flags(value) when is_list(value), do: value
+  def decode_flags(_), do: {:error, "Unexpected type when decoding Grant.flags"}
+
+  def encode_flags(value) when is_list(value), do: value
+  def encode_flags(_), do: {:error, "Unexpected type when encoding Grant.flags"}
+
+  def decode_inherited(value) when is_boolean(value), do: value
+  def decode_inherited(_), do: {:error, "Unexpected type when decoding Grant.inherited"}
+
+  def encode_inherited(value) when is_boolean(value), do: value
+  def encode_inherited(_), do: {:error, "Unexpected type when encoding Grant.inherited"}
+
   def from_map(m) do
     %Grant{
       flags: Enum.map(m["flags"], &GrantFlag.decode/1),
-      inherited: m["inherited"],
+      inherited: decode_inherited(m["inherited"]),
       type: GrantType.decode(m["type"]),
     }
   end
@@ -237,9 +249,15 @@ defmodule Test do
           cfpb1: String.t()
         }
 
+  def decode_cfpb1(value) when is_binary(value), do: value
+  def decode_cfpb1(_), do: {:error, "Unexpected type when decoding Test.cfpb1"}
+
+  def encode_cfpb1(value) when is_binary(value), do: value
+  def encode_cfpb1(_), do: {:error, "Unexpected type when encoding Test.cfpb1"}
+
   def from_map(m) do
     %Test{
-      cfpb1: m["CFPB1"],
+      cfpb1: decode_cfpb1(m["CFPB1"]),
     }
   end
 
@@ -303,9 +321,15 @@ defmodule Group do
           column_field_name: String.t()
         }
 
+  def decode_column_field_name(value) when is_binary(value), do: value
+  def decode_column_field_name(_), do: {:error, "Unexpected type when decoding Group.column_field_name"}
+
+  def encode_column_field_name(value) when is_binary(value), do: value
+  def encode_column_field_name(_), do: {:error, "Unexpected type when encoding Group.column_field_name"}
+
   def from_map(m) do
     %Group{
-      column_field_name: m["columnFieldName"],
+      column_field_name: decode_column_field_name(m["columnFieldName"]),
     }
   end
 
@@ -384,9 +408,15 @@ defmodule Order do
           column_field_name: OrderColumnFieldName.t()
         }
 
+  def decode_ascending(value) when is_boolean(value), do: value
+  def decode_ascending(_), do: {:error, "Unexpected type when decoding Order.ascending"}
+
+  def encode_ascending(value) when is_boolean(value), do: value
+  def encode_ascending(_), do: {:error, "Unexpected type when encoding Order.ascending"}
+
   def from_map(m) do
     %Order{
-      ascending: m["ascending"],
+      ascending: decode_ascending(m["ascending"]),
       column_field_name: OrderColumnFieldName.decode(m["columnFieldName"]),
     }
   end
@@ -420,10 +450,16 @@ defmodule Select do
           column_field_name: String.t()
         }
 
+  def decode_column_field_name(value) when is_binary(value), do: value
+  def decode_column_field_name(_), do: {:error, "Unexpected type when decoding Select.column_field_name"}
+
+  def encode_column_field_name(value) when is_binary(value), do: value
+  def encode_column_field_name(_), do: {:error, "Unexpected type when encoding Select.column_field_name"}
+
   def from_map(m) do
     %Select{
       aggregate: m["aggregate"],
-      column_field_name: m["columnFieldName"],
+      column_field_name: decode_column_field_name(m["columnFieldName"]),
     }
   end
 
@@ -549,9 +585,15 @@ defmodule TableColumnID do
           the_2819740: integer()
         }
 
+  def decode_the_2819740(value) when is_integer(value), do: value
+  def decode_the_2819740(_), do: {:error, "Unexpected type when decoding TableColumnID.the_2819740"}
+
+  def encode_the_2819740(value) when is_integer(value), do: value
+  def encode_the_2819740(_), do: {:error, "Unexpected type when encoding TableColumnID.the_2819740"}
+
   def from_map(m) do
     %TableColumnID{
-      the_2819740: m["2819740"],
+      the_2819740: decode_the_2819740(m["2819740"]),
     }
   end
 
@@ -964,9 +1006,15 @@ defmodule Field do
           type: FieldType.t()
         }
 
+  def decode_table_column_id(value) when is_integer(value), do: value
+  def decode_table_column_id(_), do: {:error, "Unexpected type when decoding Field.table_column_id"}
+
+  def encode_table_column_id(value) when is_integer(value), do: value
+  def encode_table_column_id(_), do: {:error, "Unexpected type when encoding Field.table_column_id"}
+
   def from_map(m) do
     %Field{
-      table_column_id: m["tableColumnId"],
+      table_column_id: decode_table_column_id(m["tableColumnId"]),
       type: FieldType.decode(m["type"]),
     }
   end
@@ -999,6 +1047,12 @@ defmodule Row do
           fields: [Field.t()]
         }
 
+  def decode_fields(value) when is_list(value), do: value
+  def decode_fields(_), do: {:error, "Unexpected type when decoding Row.fields"}
+
+  def encode_fields(value) when is_list(value), do: value
+  def encode_fields(_), do: {:error, "Unexpected type when encoding Row.fields"}
+
   def from_map(m) do
     %Row{
       fields: Enum.map(m["fields"], &Field.from_map/1),
@@ -1114,6 +1168,12 @@ defmodule Column do
           styles: Styles.t()
         }
 
+  def decode_rows(value) when is_list(value), do: value
+  def decode_rows(_), do: {:error, "Unexpected type when decoding Column.rows"}
+
+  def encode_rows(value) when is_list(value), do: value
+  def encode_rows(_), do: {:error, "Unexpected type when encoding Column.rows"}
+
   def from_map(m) do
     %Column{
       rows: Enum.map(m["rows"], &Row.from_map/1),
@@ -1149,6 +1209,12 @@ defmodule FatRow do
           columns: [Column.t()]
         }
 
+  def decode_columns(value) when is_list(value), do: value
+  def decode_columns(_), do: {:error, "Unexpected type when decoding FatRow.columns"}
+
+  def encode_columns(value) when is_list(value), do: value
+  def encode_columns(_), do: {:error, "Unexpected type when encoding FatRow.columns"}
+
   def from_map(m) do
     %FatRow{
       columns: Enum.map(m["columns"], &Column.from_map/1),
@@ -1215,9 +1281,15 @@ defmodule AccessPoints do
           new_view: String.t()
         }
 
+  def decode_new_view(value) when is_binary(value), do: value
+  def decode_new_view(_), do: {:error, "Unexpected type when decoding AccessPoints.new_view"}
+
+  def encode_new_view(value) when is_binary(value), do: value
+  def encode_new_view(_), do: {:error, "Unexpected type when encoding AccessPoints.new_view"}
+
   def from_map(m) do
     %AccessPoints{
-      new_view: m["new_view"],
+      new_view: decode_new_view(m["new_view"]),
     }
   end
 
@@ -1248,9 +1320,15 @@ defmodule Visible2 do
           href: boolean()
         }
 
+  def decode_href(value) when is_boolean(value), do: value
+  def decode_href(_), do: {:error, "Unexpected type when decoding Visible2.href"}
+
+  def encode_href(value) when is_boolean(value), do: value
+  def encode_href(_), do: {:error, "Unexpected type when encoding Visible2.href"}
+
   def from_map(m) do
     %Visible2{
-      href: m["href"],
+      href: decode_href(m["href"]),
     }
   end
 
@@ -1316,10 +1394,16 @@ defmodule V1ArchivedProperties do
           render_type_config: V1ArchivedPropertiesRenderTypeConfig.t()
         }
 
+  def decode_blist_id(value) when is_binary(value), do: value
+  def decode_blist_id(_), do: {:error, "Unexpected type when decoding V1ArchivedProperties.blist_id"}
+
+  def encode_blist_id(value) when is_binary(value), do: value
+  def encode_blist_id(_), do: {:error, "Unexpected type when encoding V1ArchivedProperties.blist_id"}
+
   def from_map(m) do
     %V1ArchivedProperties{
       access_points: AccessPoints.from_map(m["accessPoints"]),
-      blist_id: m["blist_id"],
+      blist_id: decode_blist_id(m["blist_id"]),
       render_type_config: V1ArchivedPropertiesRenderTypeConfig.from_map(m["renderTypeConfig"]),
     }
   end
@@ -1512,18 +1596,36 @@ defmodule Owner do
           screen_name: String.t()
         }
 
+  def decode_display_name(value) when is_binary(value), do: value
+  def decode_display_name(_), do: {:error, "Unexpected type when decoding Owner.display_name"}
+
+  def encode_display_name(value) when is_binary(value), do: value
+  def encode_display_name(_), do: {:error, "Unexpected type when encoding Owner.display_name"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Owner.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Owner.id"}
+
+  def decode_screen_name(value) when is_binary(value), do: value
+  def decode_screen_name(_), do: {:error, "Unexpected type when decoding Owner.screen_name"}
+
+  def encode_screen_name(value) when is_binary(value), do: value
+  def encode_screen_name(_), do: {:error, "Unexpected type when encoding Owner.screen_name"}
+
   def from_map(m) do
     %Owner{
-      display_name: m["displayName"],
+      display_name: decode_display_name(m["displayName"]),
       flags: m["flags"],
-      id: m["id"],
+      id: decode_id(m["id"]),
       last_notification_seen_at: m["lastNotificationSeenAt"],
       profile_image_url_large: m["profileImageUrlLarge"],
       profile_image_url_medium: m["profileImageUrlMedium"],
       profile_image_url_small: m["profileImageUrlSmall"],
       rights: m["rights"],
       role_name: m["roleName"] && RoleName.decode(m["roleName"]),
-      screen_name: m["screenName"],
+      screen_name: decode_screen_name(m["screenName"]),
     }
   end
 
@@ -1653,9 +1755,15 @@ defmodule Ratings do
           rating: integer()
         }
 
+  def decode_rating(value) when is_integer(value), do: value
+  def decode_rating(_), do: {:error, "Unexpected type when decoding Ratings.rating"}
+
+  def encode_rating(value) when is_integer(value), do: value
+  def encode_rating(_), do: {:error, "Unexpected type when encoding Ratings.rating"}
+
   def from_map(m) do
     %Ratings{
-      rating: m["rating"],
+      rating: decode_rating(m["rating"]),
     }
   end
 
@@ -1783,13 +1891,31 @@ defmodule TableAuthor do
           screen_name: String.t()
         }
 
+  def decode_display_name(value) when is_binary(value), do: value
+  def decode_display_name(_), do: {:error, "Unexpected type when decoding TableAuthor.display_name"}
+
+  def encode_display_name(value) when is_binary(value), do: value
+  def encode_display_name(_), do: {:error, "Unexpected type when encoding TableAuthor.display_name"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TableAuthor.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TableAuthor.id"}
+
+  def decode_screen_name(value) when is_binary(value), do: value
+  def decode_screen_name(_), do: {:error, "Unexpected type when decoding TableAuthor.screen_name"}
+
+  def encode_screen_name(value) when is_binary(value), do: value
+  def encode_screen_name(_), do: {:error, "Unexpected type when encoding TableAuthor.screen_name"}
+
   def from_map(m) do
     %TableAuthor{
-      display_name: m["displayName"],
-      id: m["id"],
+      display_name: decode_display_name(m["displayName"]),
+      id: decode_id(m["id"]),
       rights: m["rights"],
       role_name: m["roleName"] && RoleName.decode(m["roleName"]),
-      screen_name: m["screenName"],
+      screen_name: decode_screen_name(m["screenName"]),
     }
   end
 
@@ -1908,33 +2034,147 @@ defmodule TopLevelElement do
           view_type: ViewType.t()
         }
 
+  def decode_average_rating(value) when is_integer(value), do: value
+  def decode_average_rating(_), do: {:error, "Unexpected type when decoding TopLevelElement.average_rating"}
+
+  def encode_average_rating(value) when is_integer(value), do: value
+  def encode_average_rating(_), do: {:error, "Unexpected type when encoding TopLevelElement.average_rating"}
+
+  def decode_created_at(value) when is_integer(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding TopLevelElement.created_at"}
+
+  def encode_created_at(value) when is_integer(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding TopLevelElement.created_at"}
+
+  def decode_download_count(value) when is_integer(value), do: value
+  def decode_download_count(_), do: {:error, "Unexpected type when decoding TopLevelElement.download_count"}
+
+  def encode_download_count(value) when is_integer(value), do: value
+  def encode_download_count(_), do: {:error, "Unexpected type when encoding TopLevelElement.download_count"}
+
+  def decode_grants(value) when is_list(value), do: value
+  def decode_grants(_), do: {:error, "Unexpected type when decoding TopLevelElement.grants"}
+
+  def encode_grants(value) when is_list(value), do: value
+  def encode_grants(_), do: {:error, "Unexpected type when encoding TopLevelElement.grants"}
+
+  def decode_hide_from_catalog(value) when is_boolean(value), do: value
+  def decode_hide_from_catalog(_), do: {:error, "Unexpected type when decoding TopLevelElement.hide_from_catalog"}
+
+  def encode_hide_from_catalog(value) when is_boolean(value), do: value
+  def encode_hide_from_catalog(_), do: {:error, "Unexpected type when encoding TopLevelElement.hide_from_catalog"}
+
+  def decode_hide_from_data_json(value) when is_boolean(value), do: value
+  def decode_hide_from_data_json(_), do: {:error, "Unexpected type when decoding TopLevelElement.hide_from_data_json"}
+
+  def encode_hide_from_data_json(value) when is_boolean(value), do: value
+  def encode_hide_from_data_json(_), do: {:error, "Unexpected type when encoding TopLevelElement.hide_from_data_json"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_locale(value) when is_binary(value), do: value
+  def decode_locale(_), do: {:error, "Unexpected type when decoding TopLevelElement.locale"}
+
+  def encode_locale(value) when is_binary(value), do: value
+  def encode_locale(_), do: {:error, "Unexpected type when encoding TopLevelElement.locale"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.name"}
+
+  def decode_new_backend(value) when is_boolean(value), do: value
+  def decode_new_backend(_), do: {:error, "Unexpected type when decoding TopLevelElement.new_backend"}
+
+  def encode_new_backend(value) when is_boolean(value), do: value
+  def encode_new_backend(_), do: {:error, "Unexpected type when encoding TopLevelElement.new_backend"}
+
+  def decode_number_of_comments(value) when is_integer(value), do: value
+  def decode_number_of_comments(_), do: {:error, "Unexpected type when decoding TopLevelElement.number_of_comments"}
+
+  def encode_number_of_comments(value) when is_integer(value), do: value
+  def encode_number_of_comments(_), do: {:error, "Unexpected type when encoding TopLevelElement.number_of_comments"}
+
+  def decode_oid(value) when is_integer(value), do: value
+  def decode_oid(_), do: {:error, "Unexpected type when decoding TopLevelElement.oid"}
+
+  def encode_oid(value) when is_integer(value), do: value
+  def encode_oid(_), do: {:error, "Unexpected type when encoding TopLevelElement.oid"}
+
+  def decode_publication_append_enabled(value) when is_boolean(value), do: value
+  def decode_publication_append_enabled(_), do: {:error, "Unexpected type when decoding TopLevelElement.publication_append_enabled"}
+
+  def encode_publication_append_enabled(value) when is_boolean(value), do: value
+  def encode_publication_append_enabled(_), do: {:error, "Unexpected type when encoding TopLevelElement.publication_append_enabled"}
+
+  def decode_publication_group(value) when is_integer(value), do: value
+  def decode_publication_group(_), do: {:error, "Unexpected type when decoding TopLevelElement.publication_group"}
+
+  def encode_publication_group(value) when is_integer(value), do: value
+  def encode_publication_group(_), do: {:error, "Unexpected type when encoding TopLevelElement.publication_group"}
+
+  def decode_rights(value) when is_list(value), do: value
+  def decode_rights(_), do: {:error, "Unexpected type when decoding TopLevelElement.rights"}
+
+  def encode_rights(value) when is_list(value), do: value
+  def encode_rights(_), do: {:error, "Unexpected type when encoding TopLevelElement.rights"}
+
+  def decode_table_id(value) when is_integer(value), do: value
+  def decode_table_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.table_id"}
+
+  def encode_table_id(value) when is_integer(value), do: value
+  def encode_table_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.table_id"}
+
+  def decode_total_times_rated(value) when is_integer(value), do: value
+  def decode_total_times_rated(_), do: {:error, "Unexpected type when decoding TopLevelElement.total_times_rated"}
+
+  def encode_total_times_rated(value) when is_integer(value), do: value
+  def encode_total_times_rated(_), do: {:error, "Unexpected type when encoding TopLevelElement.total_times_rated"}
+
+  def decode_view_count(value) when is_integer(value), do: value
+  def decode_view_count(_), do: {:error, "Unexpected type when decoding TopLevelElement.view_count"}
+
+  def encode_view_count(value) when is_integer(value), do: value
+  def encode_view_count(_), do: {:error, "Unexpected type when encoding TopLevelElement.view_count"}
+
+  def decode_view_last_modified(value) when is_integer(value), do: value
+  def decode_view_last_modified(_), do: {:error, "Unexpected type when decoding TopLevelElement.view_last_modified"}
+
+  def encode_view_last_modified(value) when is_integer(value), do: value
+  def encode_view_last_modified(_), do: {:error, "Unexpected type when encoding TopLevelElement.view_last_modified"}
+
   def from_map(m) do
     %TopLevelElement{
-      average_rating: m["averageRating"],
+      average_rating: decode_average_rating(m["averageRating"]),
       category: m["category"],
-      created_at: m["createdAt"],
+      created_at: decode_created_at(m["createdAt"]),
       description: m["description"],
       display_type: m["displayType"] && DisplayType.decode(m["displayType"]),
-      download_count: m["downloadCount"],
+      download_count: decode_download_count(m["downloadCount"]),
       flags: m["flags"] && Enum.map(m["flags"], &TopLevelFlag.decode/1),
       grants: Enum.map(m["grants"], &Grant.from_map/1),
-      hide_from_catalog: m["hideFromCatalog"],
-      hide_from_data_json: m["hideFromDataJson"],
-      id: m["id"],
+      hide_from_catalog: decode_hide_from_catalog(m["hideFromCatalog"]),
+      hide_from_data_json: decode_hide_from_data_json(m["hideFromDataJson"]),
+      id: decode_id(m["id"]),
       index_updated_at: m["indexUpdatedAt"],
-      locale: m["locale"],
+      locale: decode_locale(m["locale"]),
       metadata: TopLevelMetadata.from_map(m["metadata"]),
       moderation_status: m["moderationStatus"],
       modifying_view_uid: m["modifyingViewUid"] && ModifyingViewUid.decode(m["modifyingViewUid"]),
-      name: m["name"],
-      new_backend: m["newBackend"],
-      number_of_comments: m["numberOfComments"],
-      oid: m["oid"],
+      name: decode_name(m["name"]),
+      new_backend: decode_new_backend(m["newBackend"]),
+      number_of_comments: decode_number_of_comments(m["numberOfComments"]),
+      oid: decode_oid(m["oid"]),
       owner: Owner.from_map(m["owner"]),
       provenance: Provenance.decode(m["provenance"]),
-      publication_append_enabled: m["publicationAppendEnabled"],
+      publication_append_enabled: decode_publication_append_enabled(m["publicationAppendEnabled"]),
       publication_date: m["publicationDate"],
-      publication_group: m["publicationGroup"],
+      publication_group: decode_publication_group(m["publicationGroup"]),
       publication_stage: PublicationStage.decode(m["publicationStage"]),
       ratings: m["ratings"] && Ratings.from_map(m["ratings"]),
       resource_name: m["resourceName"],
@@ -1944,11 +2184,11 @@ defmodule TopLevelElement do
       rows_updated_at: m["rowsUpdatedAt"],
       rows_updated_by: m["rowsUpdatedBy"] && RowsUpdatedBy.decode(m["rowsUpdatedBy"]),
       table_author: TableAuthor.from_map(m["tableAuthor"]),
-      table_id: m["tableId"],
+      table_id: decode_table_id(m["tableId"]),
       tags: m["tags"],
-      total_times_rated: m["totalTimesRated"],
-      view_count: m["viewCount"],
-      view_last_modified: m["viewLastModified"],
+      total_times_rated: decode_total_times_rated(m["totalTimesRated"]),
+      view_count: decode_view_count(m["viewCount"]),
+      view_last_modified: decode_view_last_modified(m["viewLastModified"]),
       view_type: ViewType.decode(m["viewType"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/f22f5.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/f22f5.json/default/QuickType.ex
index 49d9d07..2624684 100644
--- a/base/elixir/test/inputs/json/misc/f22f5.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/f22f5.json/default/QuickType.ex
@@ -281,68 +281,384 @@ defmodule ChildData do
           visited: boolean()
         }
 
+  def decode_approved_at_utc(value) when is_nil(value), do: value
+  def decode_approved_at_utc(_), do: {:error, "Unexpected type when decoding ChildData.approved_at_utc"}
+
+  def encode_approved_at_utc(value) when is_nil(value), do: value
+  def encode_approved_at_utc(_), do: {:error, "Unexpected type when encoding ChildData.approved_at_utc"}
+
+  def decode_approved_by(value) when is_nil(value), do: value
+  def decode_approved_by(_), do: {:error, "Unexpected type when decoding ChildData.approved_by"}
+
+  def encode_approved_by(value) when is_nil(value), do: value
+  def encode_approved_by(_), do: {:error, "Unexpected type when encoding ChildData.approved_by"}
+
+  def decode_archived(value) when is_boolean(value), do: value
+  def decode_archived(_), do: {:error, "Unexpected type when decoding ChildData.archived"}
+
+  def encode_archived(value) when is_boolean(value), do: value
+  def encode_archived(_), do: {:error, "Unexpected type when encoding ChildData.archived"}
+
+  def decode_author(value) when is_binary(value), do: value
+  def decode_author(_), do: {:error, "Unexpected type when decoding ChildData.author"}
+
+  def encode_author(value) when is_binary(value), do: value
+  def encode_author(_), do: {:error, "Unexpected type when encoding ChildData.author"}
+
+  def decode_author_flair_css_class(value) when is_nil(value), do: value
+  def decode_author_flair_css_class(_), do: {:error, "Unexpected type when decoding ChildData.author_flair_css_class"}
+
+  def encode_author_flair_css_class(value) when is_nil(value), do: value
+  def encode_author_flair_css_class(_), do: {:error, "Unexpected type when encoding ChildData.author_flair_css_class"}
+
+  def decode_author_flair_text(value) when is_nil(value), do: value
+  def decode_author_flair_text(_), do: {:error, "Unexpected type when decoding ChildData.author_flair_text"}
+
+  def encode_author_flair_text(value) when is_nil(value), do: value
+  def encode_author_flair_text(_), do: {:error, "Unexpected type when encoding ChildData.author_flair_text"}
+
+  def decode_banned_at_utc(value) when is_nil(value), do: value
+  def decode_banned_at_utc(_), do: {:error, "Unexpected type when decoding ChildData.banned_at_utc"}
+
+  def encode_banned_at_utc(value) when is_nil(value), do: value
+  def encode_banned_at_utc(_), do: {:error, "Unexpected type when encoding ChildData.banned_at_utc"}
+
+  def decode_banned_by(value) when is_nil(value), do: value
+  def decode_banned_by(_), do: {:error, "Unexpected type when decoding ChildData.banned_by"}
+
+  def encode_banned_by(value) when is_nil(value), do: value
+  def encode_banned_by(_), do: {:error, "Unexpected type when encoding ChildData.banned_by"}
+
+  def decode_brand_safe(value) when is_boolean(value), do: value
+  def decode_brand_safe(_), do: {:error, "Unexpected type when decoding ChildData.brand_safe"}
+
+  def encode_brand_safe(value) when is_boolean(value), do: value
+  def encode_brand_safe(_), do: {:error, "Unexpected type when encoding ChildData.brand_safe"}
+
+  def decode_can_gild(value) when is_boolean(value), do: value
+  def decode_can_gild(_), do: {:error, "Unexpected type when decoding ChildData.can_gild"}
+
+  def encode_can_gild(value) when is_boolean(value), do: value
+  def encode_can_gild(_), do: {:error, "Unexpected type when encoding ChildData.can_gild"}
+
+  def decode_can_mod_post(value) when is_boolean(value), do: value
+  def decode_can_mod_post(_), do: {:error, "Unexpected type when decoding ChildData.can_mod_post"}
+
+  def encode_can_mod_post(value) when is_boolean(value), do: value
+  def encode_can_mod_post(_), do: {:error, "Unexpected type when encoding ChildData.can_mod_post"}
+
+  def decode_clicked(value) when is_boolean(value), do: value
+  def decode_clicked(_), do: {:error, "Unexpected type when decoding ChildData.clicked"}
+
+  def encode_clicked(value) when is_boolean(value), do: value
+  def encode_clicked(_), do: {:error, "Unexpected type when encoding ChildData.clicked"}
+
+  def decode_contest_mode(value) when is_boolean(value), do: value
+  def decode_contest_mode(_), do: {:error, "Unexpected type when decoding ChildData.contest_mode"}
+
+  def encode_contest_mode(value) when is_boolean(value), do: value
+  def encode_contest_mode(_), do: {:error, "Unexpected type when encoding ChildData.contest_mode"}
+
+  def decode_created(value) when is_float(value), do: value
+  def decode_created(value) when is_integer(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding ChildData.created"}
+
+  def encode_created(value) when is_float(value), do: value
+  def encode_created(value) when is_integer(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding ChildData.created"}
+
+  def decode_created_utc(value) when is_float(value), do: value
+  def decode_created_utc(value) when is_integer(value), do: value
+  def decode_created_utc(_), do: {:error, "Unexpected type when decoding ChildData.created_utc"}
+
+  def encode_created_utc(value) when is_float(value), do: value
+  def encode_created_utc(value) when is_integer(value), do: value
+  def encode_created_utc(_), do: {:error, "Unexpected type when encoding ChildData.created_utc"}
+
+  def decode_distinguished(value) when is_nil(value), do: value
+  def decode_distinguished(_), do: {:error, "Unexpected type when decoding ChildData.distinguished"}
+
+  def encode_distinguished(value) when is_nil(value), do: value
+  def encode_distinguished(_), do: {:error, "Unexpected type when encoding ChildData.distinguished"}
+
+  def decode_domain(value) when is_binary(value), do: value
+  def decode_domain(_), do: {:error, "Unexpected type when decoding ChildData.domain"}
+
+  def encode_domain(value) when is_binary(value), do: value
+  def encode_domain(_), do: {:error, "Unexpected type when encoding ChildData.domain"}
+
+  def decode_downs(value) when is_integer(value), do: value
+  def decode_downs(_), do: {:error, "Unexpected type when decoding ChildData.downs"}
+
+  def encode_downs(value) when is_integer(value), do: value
+  def encode_downs(_), do: {:error, "Unexpected type when encoding ChildData.downs"}
+
+  def decode_edited(value) when is_boolean(value), do: value
+  def decode_edited(_), do: {:error, "Unexpected type when decoding ChildData.edited"}
+
+  def encode_edited(value) when is_boolean(value), do: value
+  def encode_edited(_), do: {:error, "Unexpected type when encoding ChildData.edited"}
+
+  def decode_gilded(value) when is_integer(value), do: value
+  def decode_gilded(_), do: {:error, "Unexpected type when decoding ChildData.gilded"}
+
+  def encode_gilded(value) when is_integer(value), do: value
+  def encode_gilded(_), do: {:error, "Unexpected type when encoding ChildData.gilded"}
+
+  def decode_hidden(value) when is_boolean(value), do: value
+  def decode_hidden(_), do: {:error, "Unexpected type when decoding ChildData.hidden"}
+
+  def encode_hidden(value) when is_boolean(value), do: value
+  def encode_hidden(_), do: {:error, "Unexpected type when encoding ChildData.hidden"}
+
+  def decode_hide_score(value) when is_boolean(value), do: value
+  def decode_hide_score(_), do: {:error, "Unexpected type when decoding ChildData.hide_score"}
+
+  def encode_hide_score(value) when is_boolean(value), do: value
+  def encode_hide_score(_), do: {:error, "Unexpected type when encoding ChildData.hide_score"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding ChildData.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding ChildData.id"}
+
+  def decode_is_self(value) when is_boolean(value), do: value
+  def decode_is_self(_), do: {:error, "Unexpected type when decoding ChildData.is_self"}
+
+  def encode_is_self(value) when is_boolean(value), do: value
+  def encode_is_self(_), do: {:error, "Unexpected type when encoding ChildData.is_self"}
+
+  def decode_is_video(value) when is_boolean(value), do: value
+  def decode_is_video(_), do: {:error, "Unexpected type when decoding ChildData.is_video"}
+
+  def encode_is_video(value) when is_boolean(value), do: value
+  def encode_is_video(_), do: {:error, "Unexpected type when encoding ChildData.is_video"}
+
+  def decode_likes(value) when is_nil(value), do: value
+  def decode_likes(_), do: {:error, "Unexpected type when decoding ChildData.likes"}
+
+  def encode_likes(value) when is_nil(value), do: value
+  def encode_likes(_), do: {:error, "Unexpected type when encoding ChildData.likes"}
+
+  def decode_locked(value) when is_boolean(value), do: value
+  def decode_locked(_), do: {:error, "Unexpected type when decoding ChildData.locked"}
+
+  def encode_locked(value) when is_boolean(value), do: value
+  def encode_locked(_), do: {:error, "Unexpected type when encoding ChildData.locked"}
+
+  def decode_media(value) when is_nil(value), do: value
+  def decode_media(_), do: {:error, "Unexpected type when decoding ChildData.media"}
+
+  def encode_media(value) when is_nil(value), do: value
+  def encode_media(_), do: {:error, "Unexpected type when encoding ChildData.media"}
+
+  def decode_mod_reports(value) when is_list(value), do: value
+  def decode_mod_reports(_), do: {:error, "Unexpected type when decoding ChildData.mod_reports"}
+
+  def encode_mod_reports(value) when is_list(value), do: value
+  def encode_mod_reports(_), do: {:error, "Unexpected type when encoding ChildData.mod_reports"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding ChildData.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding ChildData.name"}
+
+  def decode_num_comments(value) when is_integer(value), do: value
+  def decode_num_comments(_), do: {:error, "Unexpected type when decoding ChildData.num_comments"}
+
+  def encode_num_comments(value) when is_integer(value), do: value
+  def encode_num_comments(_), do: {:error, "Unexpected type when encoding ChildData.num_comments"}
+
+  def decode_num_reports(value) when is_nil(value), do: value
+  def decode_num_reports(_), do: {:error, "Unexpected type when decoding ChildData.num_reports"}
+
+  def encode_num_reports(value) when is_nil(value), do: value
+  def encode_num_reports(_), do: {:error, "Unexpected type when encoding ChildData.num_reports"}
+
+  def decode_over_18(value) when is_boolean(value), do: value
+  def decode_over_18(_), do: {:error, "Unexpected type when decoding ChildData.over_18"}
+
+  def encode_over_18(value) when is_boolean(value), do: value
+  def encode_over_18(_), do: {:error, "Unexpected type when encoding ChildData.over_18"}
+
+  def decode_permalink(value) when is_binary(value), do: value
+  def decode_permalink(_), do: {:error, "Unexpected type when decoding ChildData.permalink"}
+
+  def encode_permalink(value) when is_binary(value), do: value
+  def encode_permalink(_), do: {:error, "Unexpected type when encoding ChildData.permalink"}
+
+  def decode_quarantine(value) when is_boolean(value), do: value
+  def decode_quarantine(_), do: {:error, "Unexpected type when decoding ChildData.quarantine"}
+
+  def encode_quarantine(value) when is_boolean(value), do: value
+  def encode_quarantine(_), do: {:error, "Unexpected type when encoding ChildData.quarantine"}
+
+  def decode_removal_reason(value) when is_nil(value), do: value
+  def decode_removal_reason(_), do: {:error, "Unexpected type when decoding ChildData.removal_reason"}
+
+  def encode_removal_reason(value) when is_nil(value), do: value
+  def encode_removal_reason(_), do: {:error, "Unexpected type when encoding ChildData.removal_reason"}
+
+  def decode_report_reasons(value) when is_nil(value), do: value
+  def decode_report_reasons(_), do: {:error, "Unexpected type when decoding ChildData.report_reasons"}
+
+  def encode_report_reasons(value) when is_nil(value), do: value
+  def encode_report_reasons(_), do: {:error, "Unexpected type when encoding ChildData.report_reasons"}
+
+  def decode_saved(value) when is_boolean(value), do: value
+  def decode_saved(_), do: {:error, "Unexpected type when decoding ChildData.saved"}
+
+  def encode_saved(value) when is_boolean(value), do: value
+  def encode_saved(_), do: {:error, "Unexpected type when encoding ChildData.saved"}
+
+  def decode_score(value) when is_integer(value), do: value
+  def decode_score(_), do: {:error, "Unexpected type when decoding ChildData.score"}
+
+  def encode_score(value) when is_integer(value), do: value
+  def encode_score(_), do: {:error, "Unexpected type when encoding ChildData.score"}
+
+  def decode_secure_media(value) when is_nil(value), do: value
+  def decode_secure_media(_), do: {:error, "Unexpected type when decoding ChildData.secure_media"}
+
+  def encode_secure_media(value) when is_nil(value), do: value
+  def encode_secure_media(_), do: {:error, "Unexpected type when encoding ChildData.secure_media"}
+
+  def decode_selftext(value) when is_binary(value), do: value
+  def decode_selftext(_), do: {:error, "Unexpected type when decoding ChildData.selftext"}
+
+  def encode_selftext(value) when is_binary(value), do: value
+  def encode_selftext(_), do: {:error, "Unexpected type when encoding ChildData.selftext"}
+
+  def decode_selftext_html(value) when is_nil(value), do: value
+  def decode_selftext_html(_), do: {:error, "Unexpected type when decoding ChildData.selftext_html"}
+
+  def encode_selftext_html(value) when is_nil(value), do: value
+  def encode_selftext_html(_), do: {:error, "Unexpected type when encoding ChildData.selftext_html"}
+
+  def decode_spoiler(value) when is_boolean(value), do: value
+  def decode_spoiler(_), do: {:error, "Unexpected type when decoding ChildData.spoiler"}
+
+  def encode_spoiler(value) when is_boolean(value), do: value
+  def encode_spoiler(_), do: {:error, "Unexpected type when encoding ChildData.spoiler"}
+
+  def decode_stickied(value) when is_boolean(value), do: value
+  def decode_stickied(_), do: {:error, "Unexpected type when decoding ChildData.stickied"}
+
+  def encode_stickied(value) when is_boolean(value), do: value
+  def encode_stickied(_), do: {:error, "Unexpected type when encoding ChildData.stickied"}
+
+  def decode_suggested_sort(value) when is_nil(value), do: value
+  def decode_suggested_sort(_), do: {:error, "Unexpected type when decoding ChildData.suggested_sort"}
+
+  def encode_suggested_sort(value) when is_nil(value), do: value
+  def encode_suggested_sort(_), do: {:error, "Unexpected type when encoding ChildData.suggested_sort"}
+
+  def decode_thumbnail(value) when is_binary(value), do: value
+  def decode_thumbnail(_), do: {:error, "Unexpected type when decoding ChildData.thumbnail"}
+
+  def encode_thumbnail(value) when is_binary(value), do: value
+  def encode_thumbnail(_), do: {:error, "Unexpected type when encoding ChildData.thumbnail"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding ChildData.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding ChildData.title"}
+
+  def decode_ups(value) when is_integer(value), do: value
+  def decode_ups(_), do: {:error, "Unexpected type when decoding ChildData.ups"}
+
+  def encode_ups(value) when is_integer(value), do: value
+  def encode_ups(_), do: {:error, "Unexpected type when encoding ChildData.ups"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding ChildData.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding ChildData.url"}
+
+  def decode_user_reports(value) when is_list(value), do: value
+  def decode_user_reports(_), do: {:error, "Unexpected type when decoding ChildData.user_reports"}
+
+  def encode_user_reports(value) when is_list(value), do: value
+  def encode_user_reports(_), do: {:error, "Unexpected type when encoding ChildData.user_reports"}
+
+  def decode_view_count(value) when is_nil(value), do: value
+  def decode_view_count(_), do: {:error, "Unexpected type when decoding ChildData.view_count"}
+
+  def encode_view_count(value) when is_nil(value), do: value
+  def encode_view_count(_), do: {:error, "Unexpected type when encoding ChildData.view_count"}
+
+  def decode_visited(value) when is_boolean(value), do: value
+  def decode_visited(_), do: {:error, "Unexpected type when decoding ChildData.visited"}
+
+  def encode_visited(value) when is_boolean(value), do: value
+  def encode_visited(_), do: {:error, "Unexpected type when encoding ChildData.visited"}
+
   def from_map(m) do
     %ChildData{
-      approved_at_utc: m["approved_at_utc"],
-      approved_by: m["approved_by"],
-      archived: m["archived"],
-      author: m["author"],
-      author_flair_css_class: m["author_flair_css_class"],
-      author_flair_text: m["author_flair_text"],
-      banned_at_utc: m["banned_at_utc"],
-      banned_by: m["banned_by"],
-      brand_safe: m["brand_safe"],
-      can_gild: m["can_gild"],
-      can_mod_post: m["can_mod_post"],
-      clicked: m["clicked"],
-      contest_mode: m["contest_mode"],
-      created: m["created"],
-      created_utc: m["created_utc"],
-      distinguished: m["distinguished"],
-      domain: m["domain"],
-      downs: m["downs"],
-      edited: m["edited"],
-      gilded: m["gilded"],
-      hidden: m["hidden"],
-      hide_score: m["hide_score"],
-      id: m["id"],
-      is_self: m["is_self"],
-      is_video: m["is_video"],
-      likes: m["likes"],
+      approved_at_utc: decode_approved_at_utc(m["approved_at_utc"]),
+      approved_by: decode_approved_by(m["approved_by"]),
+      archived: decode_archived(m["archived"]),
+      author: decode_author(m["author"]),
+      author_flair_css_class: decode_author_flair_css_class(m["author_flair_css_class"]),
+      author_flair_text: decode_author_flair_text(m["author_flair_text"]),
+      banned_at_utc: decode_banned_at_utc(m["banned_at_utc"]),
+      banned_by: decode_banned_by(m["banned_by"]),
+      brand_safe: decode_brand_safe(m["brand_safe"]),
+      can_gild: decode_can_gild(m["can_gild"]),
+      can_mod_post: decode_can_mod_post(m["can_mod_post"]),
+      clicked: decode_clicked(m["clicked"]),
+      contest_mode: decode_contest_mode(m["contest_mode"]),
+      created: decode_created(m["created"]),
+      created_utc: decode_created_utc(m["created_utc"]),
+      distinguished: decode_distinguished(m["distinguished"]),
+      domain: decode_domain(m["domain"]),
+      downs: decode_downs(m["downs"]),
+      edited: decode_edited(m["edited"]),
+      gilded: decode_gilded(m["gilded"]),
+      hidden: decode_hidden(m["hidden"]),
+      hide_score: decode_hide_score(m["hide_score"]),
+      id: decode_id(m["id"]),
+      is_self: decode_is_self(m["is_self"]),
+      is_video: decode_is_video(m["is_video"]),
+      likes: decode_likes(m["likes"]),
       link_flair_css_class: m["link_flair_css_class"],
       link_flair_text: m["link_flair_text"],
-      locked: m["locked"],
-      media: m["media"],
+      locked: decode_locked(m["locked"]),
+      media: decode_media(m["media"]),
       media_embed: MediaEmbed.from_map(m["media_embed"]),
-      mod_reports: m["mod_reports"],
-      name: m["name"],
-      num_comments: m["num_comments"],
-      num_reports: m["num_reports"],
-      over_18: m["over_18"],
-      permalink: m["permalink"],
-      quarantine: m["quarantine"],
-      removal_reason: m["removal_reason"],
-      report_reasons: m["report_reasons"],
-      saved: m["saved"],
-      score: m["score"],
-      secure_media: m["secure_media"],
+      mod_reports: decode_mod_reports(m["mod_reports"]),
+      name: decode_name(m["name"]),
+      num_comments: decode_num_comments(m["num_comments"]),
+      num_reports: decode_num_reports(m["num_reports"]),
+      over_18: decode_over_18(m["over_18"]),
+      permalink: decode_permalink(m["permalink"]),
+      quarantine: decode_quarantine(m["quarantine"]),
+      removal_reason: decode_removal_reason(m["removal_reason"]),
+      report_reasons: decode_report_reasons(m["report_reasons"]),
+      saved: decode_saved(m["saved"]),
+      score: decode_score(m["score"]),
+      secure_media: decode_secure_media(m["secure_media"]),
       secure_media_embed: MediaEmbed.from_map(m["secure_media_embed"]),
-      selftext: m["selftext"],
-      selftext_html: m["selftext_html"],
-      spoiler: m["spoiler"],
-      stickied: m["stickied"],
+      selftext: decode_selftext(m["selftext"]),
+      selftext_html: decode_selftext_html(m["selftext_html"]),
+      spoiler: decode_spoiler(m["spoiler"]),
+      stickied: decode_stickied(m["stickied"]),
       subreddit: Subreddit.decode(m["subreddit"]),
       subreddit_id: SubredditID.decode(m["subreddit_id"]),
       subreddit_name_prefixed: SubredditNamePrefixed.decode(m["subreddit_name_prefixed"]),
       subreddit_type: SubredditType.decode(m["subreddit_type"]),
-      suggested_sort: m["suggested_sort"],
-      thumbnail: m["thumbnail"],
-      title: m["title"],
-      ups: m["ups"],
-      url: m["url"],
-      user_reports: m["user_reports"],
-      view_count: m["view_count"],
-      visited: m["visited"],
+      suggested_sort: decode_suggested_sort(m["suggested_sort"]),
+      thumbnail: decode_thumbnail(m["thumbnail"]),
+      title: decode_title(m["title"]),
+      ups: decode_ups(m["ups"]),
+      url: decode_url(m["url"]),
+      user_reports: decode_user_reports(m["user_reports"]),
+      view_count: decode_view_count(m["view_count"]),
+      visited: decode_visited(m["visited"]),
     }
   end
 
@@ -516,12 +832,36 @@ defmodule TopLevelData do
           modhash: String.t()
         }
 
+  def decode_before(value) when is_nil(value), do: value
+  def decode_before(_), do: {:error, "Unexpected type when decoding TopLevelData.before"}
+
+  def encode_before(value) when is_nil(value), do: value
+  def encode_before(_), do: {:error, "Unexpected type when encoding TopLevelData.before"}
+
+  def decode_children(value) when is_list(value), do: value
+  def decode_children(_), do: {:error, "Unexpected type when decoding TopLevelData.children"}
+
+  def encode_children(value) when is_list(value), do: value
+  def encode_children(_), do: {:error, "Unexpected type when encoding TopLevelData.children"}
+
+  def decode_data_after(value) when is_binary(value), do: value
+  def decode_data_after(_), do: {:error, "Unexpected type when decoding TopLevelData.data_after"}
+
+  def encode_data_after(value) when is_binary(value), do: value
+  def encode_data_after(_), do: {:error, "Unexpected type when encoding TopLevelData.data_after"}
+
+  def decode_modhash(value) when is_binary(value), do: value
+  def decode_modhash(_), do: {:error, "Unexpected type when decoding TopLevelData.modhash"}
+
+  def encode_modhash(value) when is_binary(value), do: value
+  def encode_modhash(_), do: {:error, "Unexpected type when encoding TopLevelData.modhash"}
+
   def from_map(m) do
     %TopLevelData{
-      before: m["before"],
+      before: decode_before(m["before"]),
       children: Enum.map(m["children"], &Child.from_map/1),
-      data_after: m["after"],
-      modhash: m["modhash"],
+      data_after: decode_data_after(m["after"]),
+      modhash: decode_modhash(m["modhash"]),
     }
   end
 
@@ -556,10 +896,16 @@ defmodule TopLevel do
           kind: String.t()
         }
 
+  def decode_kind(value) when is_binary(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding TopLevel.kind"}
+
+  def encode_kind(value) when is_binary(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding TopLevel.kind"}
+
   def from_map(m) do
     %TopLevel{
       data: TopLevelData.from_map(m["data"]),
-      kind: m["kind"],
+      kind: decode_kind(m["kind"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/f3139.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/f3139.json/default/QuickType.ex
index 1b22fd2..c51be35 100644
--- a/base/elixir/test/inputs/json/misc/f3139.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/f3139.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule TopLevelElement do
           name: String.t()
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelElement.name"}
+
   def from_map(m) do
     %TopLevelElement{
-      id: m["id"],
-      name: m["name"],
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/f3edf.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/f3edf.json/default/QuickType.ex
index 193f7cc..81e4144 100644
--- a/base/elixir/test/inputs/json/misc/f3edf.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/f3edf.json/default/QuickType.ex
@@ -63,14 +63,44 @@ defmodule TopLevelElement do
           year: integer()
         }
 
+  def decode_age(value) when is_integer(value), do: value
+  def decode_age(_), do: {:error, "Unexpected type when decoding TopLevelElement.age"}
+
+  def encode_age(value) when is_integer(value), do: value
+  def encode_age(_), do: {:error, "Unexpected type when encoding TopLevelElement.age"}
+
+  def decode_females(value) when is_integer(value), do: value
+  def decode_females(_), do: {:error, "Unexpected type when decoding TopLevelElement.females"}
+
+  def encode_females(value) when is_integer(value), do: value
+  def encode_females(_), do: {:error, "Unexpected type when encoding TopLevelElement.females"}
+
+  def decode_males(value) when is_integer(value), do: value
+  def decode_males(_), do: {:error, "Unexpected type when decoding TopLevelElement.males"}
+
+  def encode_males(value) when is_integer(value), do: value
+  def encode_males(_), do: {:error, "Unexpected type when encoding TopLevelElement.males"}
+
+  def decode_total(value) when is_integer(value), do: value
+  def decode_total(_), do: {:error, "Unexpected type when decoding TopLevelElement.total"}
+
+  def encode_total(value) when is_integer(value), do: value
+  def encode_total(_), do: {:error, "Unexpected type when encoding TopLevelElement.total"}
+
+  def decode_year(value) when is_integer(value), do: value
+  def decode_year(_), do: {:error, "Unexpected type when decoding TopLevelElement.year"}
+
+  def encode_year(value) when is_integer(value), do: value
+  def encode_year(_), do: {:error, "Unexpected type when encoding TopLevelElement.year"}
+
   def from_map(m) do
     %TopLevelElement{
-      age: m["age"],
+      age: decode_age(m["age"]),
       country: Country.decode(m["country"]),
-      females: m["females"],
-      males: m["males"],
-      total: m["total"],
-      year: m["year"],
+      females: decode_females(m["females"]),
+      males: decode_males(m["males"]),
+      total: decode_total(m["total"]),
+      year: decode_year(m["year"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/f466a.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/f466a.json/default/QuickType.ex
index 193f7cc..81e4144 100644
--- a/base/elixir/test/inputs/json/misc/f466a.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/f466a.json/default/QuickType.ex
@@ -63,14 +63,44 @@ defmodule TopLevelElement do
           year: integer()
         }
 
+  def decode_age(value) when is_integer(value), do: value
+  def decode_age(_), do: {:error, "Unexpected type when decoding TopLevelElement.age"}
+
+  def encode_age(value) when is_integer(value), do: value
+  def encode_age(_), do: {:error, "Unexpected type when encoding TopLevelElement.age"}
+
+  def decode_females(value) when is_integer(value), do: value
+  def decode_females(_), do: {:error, "Unexpected type when decoding TopLevelElement.females"}
+
+  def encode_females(value) when is_integer(value), do: value
+  def encode_females(_), do: {:error, "Unexpected type when encoding TopLevelElement.females"}
+
+  def decode_males(value) when is_integer(value), do: value
+  def decode_males(_), do: {:error, "Unexpected type when decoding TopLevelElement.males"}
+
+  def encode_males(value) when is_integer(value), do: value
+  def encode_males(_), do: {:error, "Unexpected type when encoding TopLevelElement.males"}
+
+  def decode_total(value) when is_integer(value), do: value
+  def decode_total(_), do: {:error, "Unexpected type when decoding TopLevelElement.total"}
+
+  def encode_total(value) when is_integer(value), do: value
+  def encode_total(_), do: {:error, "Unexpected type when encoding TopLevelElement.total"}
+
+  def decode_year(value) when is_integer(value), do: value
+  def decode_year(_), do: {:error, "Unexpected type when decoding TopLevelElement.year"}
+
+  def encode_year(value) when is_integer(value), do: value
+  def encode_year(_), do: {:error, "Unexpected type when encoding TopLevelElement.year"}
+
   def from_map(m) do
     %TopLevelElement{
-      age: m["age"],
+      age: decode_age(m["age"]),
       country: Country.decode(m["country"]),
-      females: m["females"],
-      males: m["males"],
-      total: m["total"],
-      year: m["year"],
+      females: decode_females(m["females"]),
+      males: decode_males(m["males"]),
+      total: decode_total(m["total"]),
+      year: decode_year(m["year"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/f6a65.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/f6a65.json/default/QuickType.ex
index ce8ce33..86b7911 100644
--- a/base/elixir/test/inputs/json/misc/f6a65.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/f6a65.json/default/QuickType.ex
@@ -16,12 +16,30 @@ defmodule The480_WStill do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding The480_WStill.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding The480_WStill.height"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding The480_WStill.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding The480_WStill.url"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding The480_WStill.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding The480_WStill.width"}
+
   def from_map(m) do
     %The480_WStill{
-      height: m["height"],
+      height: decode_height(m["height"]),
       size: m["size"],
-      url: m["url"],
-      width: m["width"],
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -58,12 +76,36 @@ defmodule DownsizedSmall do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding DownsizedSmall.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding DownsizedSmall.height"}
+
+  def decode_mp4(value) when is_binary(value), do: value
+  def decode_mp4(_), do: {:error, "Unexpected type when decoding DownsizedSmall.mp4"}
+
+  def encode_mp4(value) when is_binary(value), do: value
+  def encode_mp4(_), do: {:error, "Unexpected type when encoding DownsizedSmall.mp4"}
+
+  def decode_mp4_size(value) when is_binary(value), do: value
+  def decode_mp4_size(_), do: {:error, "Unexpected type when decoding DownsizedSmall.mp4_size"}
+
+  def encode_mp4_size(value) when is_binary(value), do: value
+  def encode_mp4_size(_), do: {:error, "Unexpected type when encoding DownsizedSmall.mp4_size"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding DownsizedSmall.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding DownsizedSmall.width"}
+
   def from_map(m) do
     %DownsizedSmall{
-      height: m["height"],
-      mp4: m["mp4"],
-      mp4_size: m["mp4_size"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      mp4: decode_mp4(m["mp4"]),
+      mp4_size: decode_mp4_size(m["mp4_size"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -106,18 +148,54 @@ defmodule FixedHeight do
           width: String.t()
         }
 
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding FixedHeight.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding FixedHeight.height"}
+
+  def decode_size(value) when is_binary(value), do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding FixedHeight.size"}
+
+  def encode_size(value) when is_binary(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding FixedHeight.size"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding FixedHeight.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding FixedHeight.url"}
+
+  def decode_webp(value) when is_binary(value), do: value
+  def decode_webp(_), do: {:error, "Unexpected type when decoding FixedHeight.webp"}
+
+  def encode_webp(value) when is_binary(value), do: value
+  def encode_webp(_), do: {:error, "Unexpected type when encoding FixedHeight.webp"}
+
+  def decode_webp_size(value) when is_binary(value), do: value
+  def decode_webp_size(_), do: {:error, "Unexpected type when decoding FixedHeight.webp_size"}
+
+  def encode_webp_size(value) when is_binary(value), do: value
+  def encode_webp_size(_), do: {:error, "Unexpected type when encoding FixedHeight.webp_size"}
+
+  def decode_width(value) when is_binary(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding FixedHeight.width"}
+
+  def encode_width(value) when is_binary(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding FixedHeight.width"}
+
   def from_map(m) do
     %FixedHeight{
       frames: m["frames"],
       hash: m["hash"],
-      height: m["height"],
+      height: decode_height(m["height"]),
       mp4: m["mp4"],
       mp4_size: m["mp4_size"],
-      size: m["size"],
-      url: m["url"],
-      webp: m["webp"],
-      webp_size: m["webp_size"],
-      width: m["width"],
+      size: decode_size(m["size"]),
+      url: decode_url(m["url"]),
+      webp: decode_webp(m["webp"]),
+      webp_size: decode_webp_size(m["webp_size"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -158,10 +236,22 @@ defmodule Looping do
           mp4_size: String.t()
         }
 
+  def decode_mp4(value) when is_binary(value), do: value
+  def decode_mp4(_), do: {:error, "Unexpected type when decoding Looping.mp4"}
+
+  def encode_mp4(value) when is_binary(value), do: value
+  def encode_mp4(_), do: {:error, "Unexpected type when encoding Looping.mp4"}
+
+  def decode_mp4_size(value) when is_binary(value), do: value
+  def decode_mp4_size(_), do: {:error, "Unexpected type when decoding Looping.mp4_size"}
+
+  def encode_mp4_size(value) when is_binary(value), do: value
+  def encode_mp4_size(_), do: {:error, "Unexpected type when encoding Looping.mp4_size"}
+
   def from_map(m) do
     %Looping{
-      mp4: m["mp4"],
-      mp4_size: m["mp4_size"],
+      mp4: decode_mp4(m["mp4"]),
+      mp4_size: decode_mp4_size(m["mp4_size"]),
     }
   end
 
@@ -438,13 +528,43 @@ defmodule User do
           username: Username.t()
         }
 
+  def decode_avatar_url(value) when is_binary(value), do: value
+  def decode_avatar_url(_), do: {:error, "Unexpected type when decoding User.avatar_url"}
+
+  def encode_avatar_url(value) when is_binary(value), do: value
+  def encode_avatar_url(_), do: {:error, "Unexpected type when encoding User.avatar_url"}
+
+  def decode_banner_url(value) when is_binary(value), do: value
+  def decode_banner_url(_), do: {:error, "Unexpected type when decoding User.banner_url"}
+
+  def encode_banner_url(value) when is_binary(value), do: value
+  def encode_banner_url(_), do: {:error, "Unexpected type when encoding User.banner_url"}
+
+  def decode_display_name(value) when is_binary(value), do: value
+  def decode_display_name(_), do: {:error, "Unexpected type when decoding User.display_name"}
+
+  def encode_display_name(value) when is_binary(value), do: value
+  def encode_display_name(_), do: {:error, "Unexpected type when encoding User.display_name"}
+
+  def decode_profile_url(value) when is_binary(value), do: value
+  def decode_profile_url(_), do: {:error, "Unexpected type when decoding User.profile_url"}
+
+  def encode_profile_url(value) when is_binary(value), do: value
+  def encode_profile_url(_), do: {:error, "Unexpected type when encoding User.profile_url"}
+
+  def decode_twitter(value) when is_binary(value), do: value
+  def decode_twitter(_), do: {:error, "Unexpected type when decoding User.twitter"}
+
+  def encode_twitter(value) when is_binary(value), do: value
+  def encode_twitter(_), do: {:error, "Unexpected type when encoding User.twitter"}
+
   def from_map(m) do
     %User{
-      avatar_url: m["avatar_url"],
-      banner_url: m["banner_url"],
-      display_name: m["display_name"],
-      profile_url: m["profile_url"],
-      twitter: m["twitter"],
+      avatar_url: decode_avatar_url(m["avatar_url"]),
+      banner_url: decode_banner_url(m["banner_url"]),
+      display_name: decode_display_name(m["display_name"]),
+      profile_url: decode_profile_url(m["profile_url"]),
+      twitter: decode_twitter(m["twitter"]),
       username: Username.decode(m["username"]),
     }
   end
@@ -498,24 +618,102 @@ defmodule Datum do
           username: Username.t()
         }
 
+  def decode_bitly_gif_url(value) when is_binary(value), do: value
+  def decode_bitly_gif_url(_), do: {:error, "Unexpected type when decoding Datum.bitly_gif_url"}
+
+  def encode_bitly_gif_url(value) when is_binary(value), do: value
+  def encode_bitly_gif_url(_), do: {:error, "Unexpected type when encoding Datum.bitly_gif_url"}
+
+  def decode_bitly_url(value) when is_binary(value), do: value
+  def decode_bitly_url(_), do: {:error, "Unexpected type when decoding Datum.bitly_url"}
+
+  def encode_bitly_url(value) when is_binary(value), do: value
+  def encode_bitly_url(_), do: {:error, "Unexpected type when encoding Datum.bitly_url"}
+
+  def decode_content_url(value) when is_binary(value), do: value
+  def decode_content_url(_), do: {:error, "Unexpected type when decoding Datum.content_url"}
+
+  def encode_content_url(value) when is_binary(value), do: value
+  def encode_content_url(_), do: {:error, "Unexpected type when encoding Datum.content_url"}
+
+  def decode_embed_url(value) when is_binary(value), do: value
+  def decode_embed_url(_), do: {:error, "Unexpected type when decoding Datum.embed_url"}
+
+  def encode_embed_url(value) when is_binary(value), do: value
+  def encode_embed_url(_), do: {:error, "Unexpected type when encoding Datum.embed_url"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Datum.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Datum.id"}
+
+  def decode_import_datetime(value) when is_binary(value), do: value
+  def decode_import_datetime(_), do: {:error, "Unexpected type when decoding Datum.import_datetime"}
+
+  def encode_import_datetime(value) when is_binary(value), do: value
+  def encode_import_datetime(_), do: {:error, "Unexpected type when encoding Datum.import_datetime"}
+
+  def decode_is_indexable(value) when is_integer(value), do: value
+  def decode_is_indexable(_), do: {:error, "Unexpected type when decoding Datum.is_indexable"}
+
+  def encode_is_indexable(value) when is_integer(value), do: value
+  def encode_is_indexable(_), do: {:error, "Unexpected type when encoding Datum.is_indexable"}
+
+  def decode_slug(value) when is_binary(value), do: value
+  def decode_slug(_), do: {:error, "Unexpected type when decoding Datum.slug"}
+
+  def encode_slug(value) when is_binary(value), do: value
+  def encode_slug(_), do: {:error, "Unexpected type when encoding Datum.slug"}
+
+  def decode_source(value) when is_binary(value), do: value
+  def decode_source(_), do: {:error, "Unexpected type when decoding Datum.source"}
+
+  def encode_source(value) when is_binary(value), do: value
+  def encode_source(_), do: {:error, "Unexpected type when encoding Datum.source"}
+
+  def decode_source_post_url(value) when is_binary(value), do: value
+  def decode_source_post_url(_), do: {:error, "Unexpected type when decoding Datum.source_post_url"}
+
+  def encode_source_post_url(value) when is_binary(value), do: value
+  def encode_source_post_url(_), do: {:error, "Unexpected type when encoding Datum.source_post_url"}
+
+  def decode_source_tld(value) when is_binary(value), do: value
+  def decode_source_tld(_), do: {:error, "Unexpected type when decoding Datum.source_tld"}
+
+  def encode_source_tld(value) when is_binary(value), do: value
+  def encode_source_tld(_), do: {:error, "Unexpected type when encoding Datum.source_tld"}
+
+  def decode_trending_datetime(value) when is_binary(value), do: value
+  def decode_trending_datetime(_), do: {:error, "Unexpected type when decoding Datum.trending_datetime"}
+
+  def encode_trending_datetime(value) when is_binary(value), do: value
+  def encode_trending_datetime(_), do: {:error, "Unexpected type when encoding Datum.trending_datetime"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Datum.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Datum.url"}
+
   def from_map(m) do
     %Datum{
-      bitly_gif_url: m["bitly_gif_url"],
-      bitly_url: m["bitly_url"],
-      content_url: m["content_url"],
-      embed_url: m["embed_url"],
-      id: m["id"],
+      bitly_gif_url: decode_bitly_gif_url(m["bitly_gif_url"]),
+      bitly_url: decode_bitly_url(m["bitly_url"]),
+      content_url: decode_content_url(m["content_url"]),
+      embed_url: decode_embed_url(m["embed_url"]),
+      id: decode_id(m["id"]),
       images: Images.from_map(m["images"]),
-      import_datetime: m["import_datetime"],
-      is_indexable: m["is_indexable"],
+      import_datetime: decode_import_datetime(m["import_datetime"]),
+      is_indexable: decode_is_indexable(m["is_indexable"]),
       rating: Rating.decode(m["rating"]),
-      slug: m["slug"],
-      source: m["source"],
-      source_post_url: m["source_post_url"],
-      source_tld: m["source_tld"],
-      trending_datetime: m["trending_datetime"],
+      slug: decode_slug(m["slug"]),
+      source: decode_source(m["source"]),
+      source_post_url: decode_source_post_url(m["source_post_url"]),
+      source_tld: decode_source_tld(m["source_tld"]),
+      trending_datetime: decode_trending_datetime(m["trending_datetime"]),
       type: Type.decode(m["type"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
       user: m["user"] && User.from_map(m["user"]),
       username: Username.decode(m["username"]),
     }
@@ -567,11 +765,29 @@ defmodule Meta do
           status: integer()
         }
 
+  def decode_msg(value) when is_binary(value), do: value
+  def decode_msg(_), do: {:error, "Unexpected type when decoding Meta.msg"}
+
+  def encode_msg(value) when is_binary(value), do: value
+  def encode_msg(_), do: {:error, "Unexpected type when encoding Meta.msg"}
+
+  def decode_response_id(value) when is_binary(value), do: value
+  def decode_response_id(_), do: {:error, "Unexpected type when decoding Meta.response_id"}
+
+  def encode_response_id(value) when is_binary(value), do: value
+  def encode_response_id(_), do: {:error, "Unexpected type when encoding Meta.response_id"}
+
+  def decode_status(value) when is_integer(value), do: value
+  def decode_status(_), do: {:error, "Unexpected type when decoding Meta.status"}
+
+  def encode_status(value) when is_integer(value), do: value
+  def encode_status(_), do: {:error, "Unexpected type when encoding Meta.status"}
+
   def from_map(m) do
     %Meta{
-      msg: m["msg"],
-      response_id: m["response_id"],
-      status: m["status"],
+      msg: decode_msg(m["msg"]),
+      response_id: decode_response_id(m["response_id"]),
+      status: decode_status(m["status"]),
     }
   end
 
@@ -606,11 +822,29 @@ defmodule Pagination do
           total_count: integer()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Pagination.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Pagination.count"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding Pagination.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding Pagination.offset"}
+
+  def decode_total_count(value) when is_integer(value), do: value
+  def decode_total_count(_), do: {:error, "Unexpected type when decoding Pagination.total_count"}
+
+  def encode_total_count(value) when is_integer(value), do: value
+  def encode_total_count(_), do: {:error, "Unexpected type when encoding Pagination.total_count"}
+
   def from_map(m) do
     %Pagination{
-      count: m["count"],
-      offset: m["offset"],
-      total_count: m["total_count"],
+      count: decode_count(m["count"]),
+      offset: decode_offset(m["offset"]),
+      total_count: decode_total_count(m["total_count"]),
     }
   end
 
@@ -645,6 +879,12 @@ defmodule TopLevel do
           pagination: Pagination.t()
         }
 
+  def decode_data(value) when is_list(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data(value) when is_list(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
   def from_map(m) do
     %TopLevel{
       data: Enum.map(m["data"], &Datum.from_map/1),
diff --git a/base/elixir/test/inputs/json/misc/f74d5.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/f74d5.json/default/QuickType.ex
index 22e8efb..91f9e42 100644
--- a/base/elixir/test/inputs/json/misc/f74d5.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/f74d5.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Top do
           item: String.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Top.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Top.count"}
+
+  def decode_item(value) when is_binary(value), do: value
+  def decode_item(_), do: {:error, "Unexpected type when decoding Top.item"}
+
+  def encode_item(value) when is_binary(value), do: value
+  def encode_item(_), do: {:error, "Unexpected type when encoding Top.item"}
+
   def from_map(m) do
     %Top{
-      count: m["count"],
-      item: m["item"],
+      count: decode_count(m["count"]),
+      item: decode_item(m["item"]),
     }
   end
 
@@ -55,13 +67,43 @@ defmodule CachedContents do
           top: [Top.t()]
         }
 
+  def decode_largest(value) when is_binary(value), do: value
+  def decode_largest(_), do: {:error, "Unexpected type when decoding CachedContents.largest"}
+
+  def encode_largest(value) when is_binary(value), do: value
+  def encode_largest(_), do: {:error, "Unexpected type when encoding CachedContents.largest"}
+
+  def decode_non_null(value) when is_integer(value), do: value
+  def decode_non_null(_), do: {:error, "Unexpected type when decoding CachedContents.non_null"}
+
+  def encode_non_null(value) when is_integer(value), do: value
+  def encode_non_null(_), do: {:error, "Unexpected type when encoding CachedContents.non_null"}
+
+  def decode_null(value) when is_integer(value), do: value
+  def decode_null(_), do: {:error, "Unexpected type when decoding CachedContents.null"}
+
+  def encode_null(value) when is_integer(value), do: value
+  def encode_null(_), do: {:error, "Unexpected type when encoding CachedContents.null"}
+
+  def decode_smallest(value) when is_binary(value), do: value
+  def decode_smallest(_), do: {:error, "Unexpected type when decoding CachedContents.smallest"}
+
+  def encode_smallest(value) when is_binary(value), do: value
+  def encode_smallest(_), do: {:error, "Unexpected type when encoding CachedContents.smallest"}
+
+  def decode_top(value) when is_list(value), do: value
+  def decode_top(_), do: {:error, "Unexpected type when decoding CachedContents.top"}
+
+  def encode_top(value) when is_list(value), do: value
+  def encode_top(_), do: {:error, "Unexpected type when encoding CachedContents.top"}
+
   def from_map(m) do
     %CachedContents{
       average: m["average"],
-      largest: m["largest"],
-      non_null: m["non_null"],
-      null: m["null"],
-      smallest: m["smallest"],
+      largest: decode_largest(m["largest"]),
+      non_null: decode_non_null(m["non_null"]),
+      null: decode_null(m["null"]),
+      smallest: decode_smallest(m["smallest"]),
       sum: m["sum"],
       top: Enum.map(m["top"], &Top.from_map/1),
     }
@@ -186,16 +228,40 @@ defmodule Column do
           width: integer() | nil
         }
 
+  def decode_field_name(value) when is_binary(value), do: value
+  def decode_field_name(_), do: {:error, "Unexpected type when decoding Column.field_name"}
+
+  def encode_field_name(value) when is_binary(value), do: value
+  def encode_field_name(_), do: {:error, "Unexpected type when encoding Column.field_name"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Column.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Column.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Column.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Column.name"}
+
+  def decode_position(value) when is_integer(value), do: value
+  def decode_position(_), do: {:error, "Unexpected type when decoding Column.position"}
+
+  def encode_position(value) when is_integer(value), do: value
+  def encode_position(_), do: {:error, "Unexpected type when encoding Column.position"}
+
   def from_map(m) do
     %Column{
       cached_contents: m["cachedContents"] && CachedContents.from_map(m["cachedContents"]),
       data_type_name: TypeName.decode(m["dataTypeName"]),
-      field_name: m["fieldName"],
+      field_name: decode_field_name(m["fieldName"]),
       flags: m["flags"],
       format: Query.from_map(m["format"]),
-      id: m["id"],
-      name: m["name"],
-      position: m["position"],
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
+      position: decode_position(m["position"]),
       render_type_name: TypeName.decode(m["renderTypeName"]),
       table_column_id: m["tableColumnId"],
       width: m["width"],
@@ -241,11 +307,29 @@ defmodule Grant do
           type: String.t()
         }
 
+  def decode_flags(value) when is_list(value), do: value
+  def decode_flags(_), do: {:error, "Unexpected type when decoding Grant.flags"}
+
+  def encode_flags(value) when is_list(value), do: value
+  def encode_flags(_), do: {:error, "Unexpected type when encoding Grant.flags"}
+
+  def decode_inherited(value) when is_boolean(value), do: value
+  def decode_inherited(_), do: {:error, "Unexpected type when decoding Grant.inherited"}
+
+  def encode_inherited(value) when is_boolean(value), do: value
+  def encode_inherited(_), do: {:error, "Unexpected type when encoding Grant.inherited"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Grant.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Grant.type"}
+
   def from_map(m) do
     %Grant{
-      flags: m["flags"],
-      inherited: m["inherited"],
-      type: m["type"],
+      flags: decode_flags(m["flags"]),
+      inherited: decode_inherited(m["inherited"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -278,9 +362,15 @@ defmodule License do
           name: String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding License.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding License.name"}
+
   def from_map(m) do
     %License{
-      name: m["name"],
+      name: decode_name(m["name"]),
     }
   end
 
@@ -311,9 +401,15 @@ defmodule Visible do
           table: boolean()
         }
 
+  def decode_table(value) when is_boolean(value), do: value
+  def decode_table(_), do: {:error, "Unexpected type when decoding Visible.table"}
+
+  def encode_table(value) when is_boolean(value), do: value
+  def encode_table(_), do: {:error, "Unexpected type when encoding Visible.table"}
+
   def from_map(m) do
     %Visible{
-      table: m["table"],
+      table: decode_table(m["table"]),
     }
   end
 
@@ -381,13 +477,37 @@ defmodule Metadata do
           row_identifier: String.t()
         }
 
+  def decode_available_display_types(value) when is_list(value), do: value
+  def decode_available_display_types(_), do: {:error, "Unexpected type when decoding Metadata.available_display_types"}
+
+  def encode_available_display_types(value) when is_list(value), do: value
+  def encode_available_display_types(_), do: {:error, "Unexpected type when encoding Metadata.available_display_types"}
+
+  def decode_rdf_class(value) when is_binary(value), do: value
+  def decode_rdf_class(_), do: {:error, "Unexpected type when decoding Metadata.rdf_class"}
+
+  def encode_rdf_class(value) when is_binary(value), do: value
+  def encode_rdf_class(_), do: {:error, "Unexpected type when encoding Metadata.rdf_class"}
+
+  def decode_rdf_subject(value) when is_binary(value), do: value
+  def decode_rdf_subject(_), do: {:error, "Unexpected type when decoding Metadata.rdf_subject"}
+
+  def encode_rdf_subject(value) when is_binary(value), do: value
+  def encode_rdf_subject(_), do: {:error, "Unexpected type when encoding Metadata.rdf_subject"}
+
+  def decode_row_identifier(value) when is_binary(value), do: value
+  def decode_row_identifier(_), do: {:error, "Unexpected type when decoding Metadata.row_identifier"}
+
+  def encode_row_identifier(value) when is_binary(value), do: value
+  def encode_row_identifier(_), do: {:error, "Unexpected type when encoding Metadata.row_identifier"}
+
   def from_map(m) do
     %Metadata{
-      available_display_types: m["availableDisplayTypes"],
-      rdf_class: m["rdfClass"],
-      rdf_subject: m["rdfSubject"],
+      available_display_types: decode_available_display_types(m["availableDisplayTypes"]),
+      rdf_class: decode_rdf_class(m["rdfClass"]),
+      rdf_subject: decode_rdf_subject(m["rdfSubject"]),
       render_type_config: RenderTypeConfig.from_map(m["renderTypeConfig"]),
-      row_identifier: m["rowIdentifier"],
+      row_identifier: decode_row_identifier(m["rowIdentifier"]),
     }
   end
 
@@ -424,11 +544,29 @@ defmodule Owner do
           screen_name: String.t()
         }
 
+  def decode_display_name(value) when is_binary(value), do: value
+  def decode_display_name(_), do: {:error, "Unexpected type when decoding Owner.display_name"}
+
+  def encode_display_name(value) when is_binary(value), do: value
+  def encode_display_name(_), do: {:error, "Unexpected type when encoding Owner.display_name"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Owner.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Owner.id"}
+
+  def decode_screen_name(value) when is_binary(value), do: value
+  def decode_screen_name(_), do: {:error, "Unexpected type when decoding Owner.screen_name"}
+
+  def encode_screen_name(value) when is_binary(value), do: value
+  def encode_screen_name(_), do: {:error, "Unexpected type when encoding Owner.screen_name"}
+
   def from_map(m) do
     %Owner{
-      display_name: m["displayName"],
-      id: m["id"],
-      screen_name: m["screenName"],
+      display_name: decode_display_name(m["displayName"]),
+      id: decode_id(m["id"]),
+      screen_name: decode_screen_name(m["screenName"]),
     }
   end
 
@@ -497,45 +635,237 @@ defmodule View do
           view_type: String.t()
         }
 
+  def decode_average_rating(value) when is_integer(value), do: value
+  def decode_average_rating(_), do: {:error, "Unexpected type when decoding View.average_rating"}
+
+  def encode_average_rating(value) when is_integer(value), do: value
+  def encode_average_rating(_), do: {:error, "Unexpected type when encoding View.average_rating"}
+
+  def decode_category(value) when is_binary(value), do: value
+  def decode_category(_), do: {:error, "Unexpected type when decoding View.category"}
+
+  def encode_category(value) when is_binary(value), do: value
+  def encode_category(_), do: {:error, "Unexpected type when encoding View.category"}
+
+  def decode_columns(value) when is_list(value), do: value
+  def decode_columns(_), do: {:error, "Unexpected type when decoding View.columns"}
+
+  def encode_columns(value) when is_list(value), do: value
+  def encode_columns(_), do: {:error, "Unexpected type when encoding View.columns"}
+
+  def decode_created_at(value) when is_integer(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding View.created_at"}
+
+  def encode_created_at(value) when is_integer(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding View.created_at"}
+
+  def decode_display_type(value) when is_binary(value), do: value
+  def decode_display_type(_), do: {:error, "Unexpected type when decoding View.display_type"}
+
+  def encode_display_type(value) when is_binary(value), do: value
+  def encode_display_type(_), do: {:error, "Unexpected type when encoding View.display_type"}
+
+  def decode_download_count(value) when is_integer(value), do: value
+  def decode_download_count(_), do: {:error, "Unexpected type when decoding View.download_count"}
+
+  def encode_download_count(value) when is_integer(value), do: value
+  def encode_download_count(_), do: {:error, "Unexpected type when encoding View.download_count"}
+
+  def decode_flags(value) when is_list(value), do: value
+  def decode_flags(_), do: {:error, "Unexpected type when decoding View.flags"}
+
+  def encode_flags(value) when is_list(value), do: value
+  def encode_flags(_), do: {:error, "Unexpected type when encoding View.flags"}
+
+  def decode_grants(value) when is_list(value), do: value
+  def decode_grants(_), do: {:error, "Unexpected type when decoding View.grants"}
+
+  def encode_grants(value) when is_list(value), do: value
+  def encode_grants(_), do: {:error, "Unexpected type when encoding View.grants"}
+
+  def decode_hide_from_catalog(value) when is_boolean(value), do: value
+  def decode_hide_from_catalog(_), do: {:error, "Unexpected type when decoding View.hide_from_catalog"}
+
+  def encode_hide_from_catalog(value) when is_boolean(value), do: value
+  def encode_hide_from_catalog(_), do: {:error, "Unexpected type when encoding View.hide_from_catalog"}
+
+  def decode_hide_from_data_json(value) when is_boolean(value), do: value
+  def decode_hide_from_data_json(_), do: {:error, "Unexpected type when decoding View.hide_from_data_json"}
+
+  def encode_hide_from_data_json(value) when is_boolean(value), do: value
+  def encode_hide_from_data_json(_), do: {:error, "Unexpected type when encoding View.hide_from_data_json"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding View.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding View.id"}
+
+  def decode_index_updated_at(value) when is_integer(value), do: value
+  def decode_index_updated_at(_), do: {:error, "Unexpected type when decoding View.index_updated_at"}
+
+  def encode_index_updated_at(value) when is_integer(value), do: value
+  def encode_index_updated_at(_), do: {:error, "Unexpected type when encoding View.index_updated_at"}
+
+  def decode_license_id(value) when is_binary(value), do: value
+  def decode_license_id(_), do: {:error, "Unexpected type when decoding View.license_id"}
+
+  def encode_license_id(value) when is_binary(value), do: value
+  def encode_license_id(_), do: {:error, "Unexpected type when encoding View.license_id"}
+
+  def decode_locale(value) when is_binary(value), do: value
+  def decode_locale(_), do: {:error, "Unexpected type when decoding View.locale"}
+
+  def encode_locale(value) when is_binary(value), do: value
+  def encode_locale(_), do: {:error, "Unexpected type when encoding View.locale"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding View.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding View.name"}
+
+  def decode_new_backend(value) when is_boolean(value), do: value
+  def decode_new_backend(_), do: {:error, "Unexpected type when decoding View.new_backend"}
+
+  def encode_new_backend(value) when is_boolean(value), do: value
+  def encode_new_backend(_), do: {:error, "Unexpected type when encoding View.new_backend"}
+
+  def decode_number_of_comments(value) when is_integer(value), do: value
+  def decode_number_of_comments(_), do: {:error, "Unexpected type when decoding View.number_of_comments"}
+
+  def encode_number_of_comments(value) when is_integer(value), do: value
+  def encode_number_of_comments(_), do: {:error, "Unexpected type when encoding View.number_of_comments"}
+
+  def decode_oid(value) when is_integer(value), do: value
+  def decode_oid(_), do: {:error, "Unexpected type when decoding View.oid"}
+
+  def encode_oid(value) when is_integer(value), do: value
+  def encode_oid(_), do: {:error, "Unexpected type when encoding View.oid"}
+
+  def decode_provenance(value) when is_binary(value), do: value
+  def decode_provenance(_), do: {:error, "Unexpected type when decoding View.provenance"}
+
+  def encode_provenance(value) when is_binary(value), do: value
+  def encode_provenance(_), do: {:error, "Unexpected type when encoding View.provenance"}
+
+  def decode_publication_append_enabled(value) when is_boolean(value), do: value
+  def decode_publication_append_enabled(_), do: {:error, "Unexpected type when decoding View.publication_append_enabled"}
+
+  def encode_publication_append_enabled(value) when is_boolean(value), do: value
+  def encode_publication_append_enabled(_), do: {:error, "Unexpected type when encoding View.publication_append_enabled"}
+
+  def decode_publication_date(value) when is_integer(value), do: value
+  def decode_publication_date(_), do: {:error, "Unexpected type when decoding View.publication_date"}
+
+  def encode_publication_date(value) when is_integer(value), do: value
+  def encode_publication_date(_), do: {:error, "Unexpected type when encoding View.publication_date"}
+
+  def decode_publication_group(value) when is_integer(value), do: value
+  def decode_publication_group(_), do: {:error, "Unexpected type when decoding View.publication_group"}
+
+  def encode_publication_group(value) when is_integer(value), do: value
+  def encode_publication_group(_), do: {:error, "Unexpected type when encoding View.publication_group"}
+
+  def decode_publication_stage(value) when is_binary(value), do: value
+  def decode_publication_stage(_), do: {:error, "Unexpected type when decoding View.publication_stage"}
+
+  def encode_publication_stage(value) when is_binary(value), do: value
+  def encode_publication_stage(_), do: {:error, "Unexpected type when encoding View.publication_stage"}
+
+  def decode_rights(value) when is_list(value), do: value
+  def decode_rights(_), do: {:error, "Unexpected type when decoding View.rights"}
+
+  def encode_rights(value) when is_list(value), do: value
+  def encode_rights(_), do: {:error, "Unexpected type when encoding View.rights"}
+
+  def decode_row_class(value) when is_binary(value), do: value
+  def decode_row_class(_), do: {:error, "Unexpected type when decoding View.row_class"}
+
+  def encode_row_class(value) when is_binary(value), do: value
+  def encode_row_class(_), do: {:error, "Unexpected type when encoding View.row_class"}
+
+  def decode_rows_updated_at(value) when is_integer(value), do: value
+  def decode_rows_updated_at(_), do: {:error, "Unexpected type when decoding View.rows_updated_at"}
+
+  def encode_rows_updated_at(value) when is_integer(value), do: value
+  def encode_rows_updated_at(_), do: {:error, "Unexpected type when encoding View.rows_updated_at"}
+
+  def decode_rows_updated_by(value) when is_binary(value), do: value
+  def decode_rows_updated_by(_), do: {:error, "Unexpected type when decoding View.rows_updated_by"}
+
+  def encode_rows_updated_by(value) when is_binary(value), do: value
+  def encode_rows_updated_by(_), do: {:error, "Unexpected type when encoding View.rows_updated_by"}
+
+  def decode_table_id(value) when is_integer(value), do: value
+  def decode_table_id(_), do: {:error, "Unexpected type when decoding View.table_id"}
+
+  def encode_table_id(value) when is_integer(value), do: value
+  def encode_table_id(_), do: {:error, "Unexpected type when encoding View.table_id"}
+
+  def decode_total_times_rated(value) when is_integer(value), do: value
+  def decode_total_times_rated(_), do: {:error, "Unexpected type when decoding View.total_times_rated"}
+
+  def encode_total_times_rated(value) when is_integer(value), do: value
+  def encode_total_times_rated(_), do: {:error, "Unexpected type when encoding View.total_times_rated"}
+
+  def decode_view_count(value) when is_integer(value), do: value
+  def decode_view_count(_), do: {:error, "Unexpected type when decoding View.view_count"}
+
+  def encode_view_count(value) when is_integer(value), do: value
+  def encode_view_count(_), do: {:error, "Unexpected type when encoding View.view_count"}
+
+  def decode_view_last_modified(value) when is_integer(value), do: value
+  def decode_view_last_modified(_), do: {:error, "Unexpected type when decoding View.view_last_modified"}
+
+  def encode_view_last_modified(value) when is_integer(value), do: value
+  def encode_view_last_modified(_), do: {:error, "Unexpected type when encoding View.view_last_modified"}
+
+  def decode_view_type(value) when is_binary(value), do: value
+  def decode_view_type(_), do: {:error, "Unexpected type when decoding View.view_type"}
+
+  def encode_view_type(value) when is_binary(value), do: value
+  def encode_view_type(_), do: {:error, "Unexpected type when encoding View.view_type"}
+
   def from_map(m) do
     %View{
-      average_rating: m["averageRating"],
-      category: m["category"],
+      average_rating: decode_average_rating(m["averageRating"]),
+      category: decode_category(m["category"]),
       columns: Enum.map(m["columns"], &Column.from_map/1),
-      created_at: m["createdAt"],
-      display_type: m["displayType"],
-      download_count: m["downloadCount"],
-      flags: m["flags"],
+      created_at: decode_created_at(m["createdAt"]),
+      display_type: decode_display_type(m["displayType"]),
+      download_count: decode_download_count(m["downloadCount"]),
+      flags: decode_flags(m["flags"]),
       grants: Enum.map(m["grants"], &Grant.from_map/1),
-      hide_from_catalog: m["hideFromCatalog"],
-      hide_from_data_json: m["hideFromDataJson"],
-      id: m["id"],
-      index_updated_at: m["indexUpdatedAt"],
+      hide_from_catalog: decode_hide_from_catalog(m["hideFromCatalog"]),
+      hide_from_data_json: decode_hide_from_data_json(m["hideFromDataJson"]),
+      id: decode_id(m["id"]),
+      index_updated_at: decode_index_updated_at(m["indexUpdatedAt"]),
       license: License.from_map(m["license"]),
-      license_id: m["licenseId"],
-      locale: m["locale"],
+      license_id: decode_license_id(m["licenseId"]),
+      locale: decode_locale(m["locale"]),
       metadata: Metadata.from_map(m["metadata"]),
-      name: m["name"],
-      new_backend: m["newBackend"],
-      number_of_comments: m["numberOfComments"],
-      oid: m["oid"],
+      name: decode_name(m["name"]),
+      new_backend: decode_new_backend(m["newBackend"]),
+      number_of_comments: decode_number_of_comments(m["numberOfComments"]),
+      oid: decode_oid(m["oid"]),
       owner: Owner.from_map(m["owner"]),
-      provenance: m["provenance"],
-      publication_append_enabled: m["publicationAppendEnabled"],
-      publication_date: m["publicationDate"],
-      publication_group: m["publicationGroup"],
-      publication_stage: m["publicationStage"],
+      provenance: decode_provenance(m["provenance"]),
+      publication_append_enabled: decode_publication_append_enabled(m["publicationAppendEnabled"]),
+      publication_date: decode_publication_date(m["publicationDate"]),
+      publication_group: decode_publication_group(m["publicationGroup"]),
+      publication_stage: decode_publication_stage(m["publicationStage"]),
       query: Query.from_map(m["query"]),
-      rights: m["rights"],
-      row_class: m["rowClass"],
-      rows_updated_at: m["rowsUpdatedAt"],
-      rows_updated_by: m["rowsUpdatedBy"],
+      rights: decode_rights(m["rights"]),
+      row_class: decode_row_class(m["rowClass"]),
+      rows_updated_at: decode_rows_updated_at(m["rowsUpdatedAt"]),
+      rows_updated_by: decode_rows_updated_by(m["rowsUpdatedBy"]),
       table_author: Owner.from_map(m["tableAuthor"]),
-      table_id: m["tableId"],
-      total_times_rated: m["totalTimesRated"],
-      view_count: m["viewCount"],
-      view_last_modified: m["viewLastModified"],
-      view_type: m["viewType"],
+      table_id: decode_table_id(m["tableId"]),
+      total_times_rated: decode_total_times_rated(m["totalTimesRated"]),
+      view_count: decode_view_count(m["viewCount"]),
+      view_last_modified: decode_view_last_modified(m["viewLastModified"]),
+      view_type: decode_view_type(m["viewType"]),
     }
   end
 
@@ -636,9 +966,15 @@ defmodule TopLevel do
           meta: Meta.t()
         }
 
+  def decode_data(value) when is_list(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data(value) when is_list(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
   def from_map(m) do
     %TopLevel{
-      data: m["data"],
+      data: decode_data(m["data"]),
       meta: Meta.from_map(m["meta"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/f82d9.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/f82d9.json/default/QuickType.ex
index de20290..c6803ad 100644
--- a/base/elixir/test/inputs/json/misc/f82d9.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/f82d9.json/default/QuickType.ex
@@ -59,9 +59,15 @@ defmodule ClickURL do
           type: Type.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding ClickURL.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding ClickURL.description"}
+
   def from_map(m) do
     %ClickURL{
-      description: m["description"],
+      description: decode_description(m["description"]),
       type: Type.decode(m["type"]),
     }
   end
@@ -222,11 +228,29 @@ defmodule Info do
           version: String.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Info.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Info.description"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Info.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Info.title"}
+
+  def decode_version(value) when is_binary(value), do: value
+  def decode_version(_), do: {:error, "Unexpected type when decoding Info.version"}
+
+  def encode_version(value) when is_binary(value), do: value
+  def encode_version(_), do: {:error, "Unexpected type when encoding Info.version"}
+
   def from_map(m) do
     %Info{
-      description: m["description"],
-      title: m["title"],
-      version: m["version"],
+      description: decode_description(m["description"]),
+      title: decode_title(m["title"]),
+      version: decode_version(m["version"]),
     }
   end
 
@@ -264,13 +288,37 @@ defmodule Parameter do
           type: Type.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Parameter.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Parameter.description"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Parameter.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Parameter.name"}
+
+  def decode_parameter_in(value) when is_binary(value), do: value
+  def decode_parameter_in(_), do: {:error, "Unexpected type when decoding Parameter.parameter_in"}
+
+  def encode_parameter_in(value) when is_binary(value), do: value
+  def encode_parameter_in(_), do: {:error, "Unexpected type when encoding Parameter.parameter_in"}
+
+  def decode_required(value) when is_boolean(value), do: value
+  def decode_required(_), do: {:error, "Unexpected type when decoding Parameter.required"}
+
+  def encode_required(value) when is_boolean(value), do: value
+  def encode_required(_), do: {:error, "Unexpected type when encoding Parameter.required"}
+
   def from_map(m) do
     %Parameter{
-      description: m["description"],
+      description: decode_description(m["description"]),
       format: Type.decode(m["format"]),
-      name: m["name"],
-      parameter_in: m["in"],
-      required: m["required"],
+      name: decode_name(m["name"]),
+      parameter_in: decode_parameter_in(m["in"]),
+      required: decode_required(m["required"]),
       type: Type.decode(m["type"]),
     }
   end
@@ -307,9 +355,15 @@ defmodule Items do
           ref: String.t()
         }
 
+  def decode_ref(value) when is_binary(value), do: value
+  def decode_ref(_), do: {:error, "Unexpected type when decoding Items.ref"}
+
+  def encode_ref(value) when is_binary(value), do: value
+  def encode_ref(_), do: {:error, "Unexpected type when encoding Items.ref"}
+
   def from_map(m) do
     %Items{
-      ref: m["$ref"],
+      ref: decode_ref(m["$ref"]),
     }
   end
 
@@ -341,10 +395,16 @@ defmodule Schema do
           type: String.t()
         }
 
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Schema.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Schema.type"}
+
   def from_map(m) do
     %Schema{
       items: Items.from_map(m["items"]),
-      type: m["type"],
+      type: decode_type(m["type"]),
     }
   end
 
@@ -377,9 +437,15 @@ defmodule The200N do
           schema: Schema.t()
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding The200N.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding The200N.description"}
+
   def from_map(m) do
     %The200N{
-      description: m["description"],
+      description: decode_description(m["description"]),
       schema: Schema.from_map(m["schema"]),
     }
   end
@@ -449,13 +515,37 @@ defmodule Get do
           tags: [String.t()]
         }
 
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Get.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Get.description"}
+
+  def decode_parameters(value) when is_list(value), do: value
+  def decode_parameters(_), do: {:error, "Unexpected type when decoding Get.parameters"}
+
+  def encode_parameters(value) when is_list(value), do: value
+  def encode_parameters(_), do: {:error, "Unexpected type when encoding Get.parameters"}
+
+  def decode_summary(value) when is_binary(value), do: value
+  def decode_summary(_), do: {:error, "Unexpected type when decoding Get.summary"}
+
+  def encode_summary(value) when is_binary(value), do: value
+  def encode_summary(_), do: {:error, "Unexpected type when encoding Get.summary"}
+
+  def decode_tags(value) when is_list(value), do: value
+  def decode_tags(_), do: {:error, "Unexpected type when decoding Get.tags"}
+
+  def encode_tags(value) when is_list(value), do: value
+  def encode_tags(_), do: {:error, "Unexpected type when encoding Get.tags"}
+
   def from_map(m) do
     %Get{
-      description: m["description"],
+      description: decode_description(m["description"]),
       parameters: Enum.map(m["parameters"], &Parameter.from_map/1),
       responses: Responses.from_map(m["responses"]),
-      summary: m["summary"],
-      tags: m["tags"],
+      summary: decode_summary(m["summary"]),
+      tags: decode_tags(m["tags"]),
     }
   end
 
@@ -563,16 +653,46 @@ defmodule TopLevel do
           swagger: String.t()
         }
 
+  def decode_base_path(value) when is_binary(value), do: value
+  def decode_base_path(_), do: {:error, "Unexpected type when decoding TopLevel.base_path"}
+
+  def encode_base_path(value) when is_binary(value), do: value
+  def encode_base_path(_), do: {:error, "Unexpected type when encoding TopLevel.base_path"}
+
+  def decode_host(value) when is_binary(value), do: value
+  def decode_host(_), do: {:error, "Unexpected type when decoding TopLevel.host"}
+
+  def encode_host(value) when is_binary(value), do: value
+  def encode_host(_), do: {:error, "Unexpected type when encoding TopLevel.host"}
+
+  def decode_produces(value) when is_list(value), do: value
+  def decode_produces(_), do: {:error, "Unexpected type when decoding TopLevel.produces"}
+
+  def encode_produces(value) when is_list(value), do: value
+  def encode_produces(_), do: {:error, "Unexpected type when encoding TopLevel.produces"}
+
+  def decode_schemes(value) when is_list(value), do: value
+  def decode_schemes(_), do: {:error, "Unexpected type when decoding TopLevel.schemes"}
+
+  def encode_schemes(value) when is_list(value), do: value
+  def encode_schemes(_), do: {:error, "Unexpected type when encoding TopLevel.schemes"}
+
+  def decode_swagger(value) when is_binary(value), do: value
+  def decode_swagger(_), do: {:error, "Unexpected type when decoding TopLevel.swagger"}
+
+  def encode_swagger(value) when is_binary(value), do: value
+  def encode_swagger(_), do: {:error, "Unexpected type when encoding TopLevel.swagger"}
+
   def from_map(m) do
     %TopLevel{
-      base_path: m["basePath"],
+      base_path: decode_base_path(m["basePath"]),
       definitions: Definitions.from_map(m["definitions"]),
-      host: m["host"],
+      host: decode_host(m["host"]),
       info: Info.from_map(m["info"]),
       paths: Paths.from_map(m["paths"]),
-      produces: m["produces"],
-      schemes: m["schemes"],
-      swagger: m["swagger"],
+      produces: decode_produces(m["produces"]),
+      schemes: decode_schemes(m["schemes"]),
+      swagger: decode_swagger(m["swagger"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/f974d.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/f974d.json/default/QuickType.ex
index 474700a..0c83b4d 100644
--- a/base/elixir/test/inputs/json/misc/f974d.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/f974d.json/default/QuickType.ex
@@ -17,13 +17,43 @@ defmodule TopLevel do
           tx_indexes: [integer()]
         }
 
+  def decode_block_index(value) when is_integer(value), do: value
+  def decode_block_index(_), do: {:error, "Unexpected type when decoding TopLevel.block_index"}
+
+  def encode_block_index(value) when is_integer(value), do: value
+  def encode_block_index(_), do: {:error, "Unexpected type when encoding TopLevel.block_index"}
+
+  def decode_hash(value) when is_binary(value), do: value
+  def decode_hash(_), do: {:error, "Unexpected type when decoding TopLevel.hash"}
+
+  def encode_hash(value) when is_binary(value), do: value
+  def encode_hash(_), do: {:error, "Unexpected type when encoding TopLevel.hash"}
+
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding TopLevel.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding TopLevel.height"}
+
+  def decode_time(value) when is_integer(value), do: value
+  def decode_time(_), do: {:error, "Unexpected type when decoding TopLevel.time"}
+
+  def encode_time(value) when is_integer(value), do: value
+  def encode_time(_), do: {:error, "Unexpected type when encoding TopLevel.time"}
+
+  def decode_tx_indexes(value) when is_list(value), do: value
+  def decode_tx_indexes(_), do: {:error, "Unexpected type when decoding TopLevel.tx_indexes"}
+
+  def encode_tx_indexes(value) when is_list(value), do: value
+  def encode_tx_indexes(_), do: {:error, "Unexpected type when encoding TopLevel.tx_indexes"}
+
   def from_map(m) do
     %TopLevel{
-      block_index: m["block_index"],
-      hash: m["hash"],
-      height: m["height"],
-      time: m["time"],
-      tx_indexes: m["txIndexes"],
+      block_index: decode_block_index(m["block_index"]),
+      hash: decode_hash(m["hash"]),
+      height: decode_height(m["height"]),
+      time: decode_time(m["time"]),
+      tx_indexes: decode_tx_indexes(m["txIndexes"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/faff5.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/faff5.json/default/QuickType.ex
index d096c6f..813ae65 100644
--- a/base/elixir/test/inputs/json/misc/faff5.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/faff5.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Response do
           result: integer()
         }
 
+  def decode_player_count(value) when is_integer(value), do: value
+  def decode_player_count(_), do: {:error, "Unexpected type when decoding Response.player_count"}
+
+  def encode_player_count(value) when is_integer(value), do: value
+  def encode_player_count(_), do: {:error, "Unexpected type when encoding Response.player_count"}
+
+  def decode_result(value) when is_integer(value), do: value
+  def decode_result(_), do: {:error, "Unexpected type when decoding Response.result"}
+
+  def encode_result(value) when is_integer(value), do: value
+  def encode_result(_), do: {:error, "Unexpected type when encoding Response.result"}
+
   def from_map(m) do
     %Response{
-      player_count: m["player_count"],
-      result: m["result"],
+      player_count: decode_player_count(m["player_count"]),
+      result: decode_result(m["result"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/misc/fcca3.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/fcca3.json/default/QuickType.ex
index b9bff11..512aa25 100644
--- a/base/elixir/test/inputs/json/misc/fcca3.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/fcca3.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Top do
           item: String.t()
         }
 
+  def decode_count(value) when is_integer(value), do: value
+  def decode_count(_), do: {:error, "Unexpected type when decoding Top.count"}
+
+  def encode_count(value) when is_integer(value), do: value
+  def encode_count(_), do: {:error, "Unexpected type when encoding Top.count"}
+
+  def decode_item(value) when is_binary(value), do: value
+  def decode_item(_), do: {:error, "Unexpected type when decoding Top.item"}
+
+  def encode_item(value) when is_binary(value), do: value
+  def encode_item(_), do: {:error, "Unexpected type when encoding Top.item"}
+
   def from_map(m) do
     %Top{
-      count: m["count"],
-      item: m["item"],
+      count: decode_count(m["count"]),
+      item: decode_item(m["item"]),
     }
   end
 
@@ -55,13 +67,43 @@ defmodule CachedContents do
           top: [Top.t()]
         }
 
+  def decode_largest(value) when is_binary(value), do: value
+  def decode_largest(_), do: {:error, "Unexpected type when decoding CachedContents.largest"}
+
+  def encode_largest(value) when is_binary(value), do: value
+  def encode_largest(_), do: {:error, "Unexpected type when encoding CachedContents.largest"}
+
+  def decode_non_null(value) when is_integer(value), do: value
+  def decode_non_null(_), do: {:error, "Unexpected type when decoding CachedContents.non_null"}
+
+  def encode_non_null(value) when is_integer(value), do: value
+  def encode_non_null(_), do: {:error, "Unexpected type when encoding CachedContents.non_null"}
+
+  def decode_null(value) when is_integer(value), do: value
+  def decode_null(_), do: {:error, "Unexpected type when decoding CachedContents.null"}
+
+  def encode_null(value) when is_integer(value), do: value
+  def encode_null(_), do: {:error, "Unexpected type when encoding CachedContents.null"}
+
+  def decode_smallest(value) when is_binary(value), do: value
+  def decode_smallest(_), do: {:error, "Unexpected type when decoding CachedContents.smallest"}
+
+  def encode_smallest(value) when is_binary(value), do: value
+  def encode_smallest(_), do: {:error, "Unexpected type when encoding CachedContents.smallest"}
+
+  def decode_top(value) when is_list(value), do: value
+  def decode_top(_), do: {:error, "Unexpected type when decoding CachedContents.top"}
+
+  def encode_top(value) when is_list(value), do: value
+  def encode_top(_), do: {:error, "Unexpected type when encoding CachedContents.top"}
+
   def from_map(m) do
     %CachedContents{
       average: m["average"],
-      largest: m["largest"],
-      non_null: m["non_null"],
-      null: m["null"],
-      smallest: m["smallest"],
+      largest: decode_largest(m["largest"]),
+      non_null: decode_non_null(m["non_null"]),
+      null: decode_null(m["null"]),
+      smallest: decode_smallest(m["smallest"]),
       sum: m["sum"],
       top: Enum.map(m["top"], &Top.from_map/1),
     }
@@ -196,17 +238,41 @@ defmodule Column do
           width: integer() | nil
         }
 
+  def decode_field_name(value) when is_binary(value), do: value
+  def decode_field_name(_), do: {:error, "Unexpected type when decoding Column.field_name"}
+
+  def encode_field_name(value) when is_binary(value), do: value
+  def encode_field_name(_), do: {:error, "Unexpected type when encoding Column.field_name"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Column.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Column.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Column.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Column.name"}
+
+  def decode_position(value) when is_integer(value), do: value
+  def decode_position(_), do: {:error, "Unexpected type when decoding Column.position"}
+
+  def encode_position(value) when is_integer(value), do: value
+  def encode_position(_), do: {:error, "Unexpected type when encoding Column.position"}
+
   def from_map(m) do
     %Column{
       cached_contents: m["cachedContents"] && CachedContents.from_map(m["cachedContents"]),
       data_type_name: TypeName.decode(m["dataTypeName"]),
       description: m["description"],
-      field_name: m["fieldName"],
+      field_name: decode_field_name(m["fieldName"]),
       flags: m["flags"],
       format: Format.from_map(m["format"]),
-      id: m["id"],
-      name: m["name"],
-      position: m["position"],
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
+      position: decode_position(m["position"]),
       render_type_name: TypeName.decode(m["renderTypeName"]),
       table_column_id: m["tableColumnId"],
       width: m["width"],
@@ -253,11 +319,29 @@ defmodule Grant do
           type: String.t()
         }
 
+  def decode_flags(value) when is_list(value), do: value
+  def decode_flags(_), do: {:error, "Unexpected type when decoding Grant.flags"}
+
+  def encode_flags(value) when is_list(value), do: value
+  def encode_flags(_), do: {:error, "Unexpected type when encoding Grant.flags"}
+
+  def decode_inherited(value) when is_boolean(value), do: value
+  def decode_inherited(_), do: {:error, "Unexpected type when decoding Grant.inherited"}
+
+  def encode_inherited(value) when is_boolean(value), do: value
+  def encode_inherited(_), do: {:error, "Unexpected type when encoding Grant.inherited"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Grant.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Grant.type"}
+
   def from_map(m) do
     %Grant{
-      flags: m["flags"],
-      inherited: m["inherited"],
-      type: m["type"],
+      flags: decode_flags(m["flags"]),
+      inherited: decode_inherited(m["inherited"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -293,12 +377,36 @@ defmodule Attachment do
           name: String.t()
         }
 
+  def decode_asset_id(value) when is_binary(value), do: value
+  def decode_asset_id(_), do: {:error, "Unexpected type when decoding Attachment.asset_id"}
+
+  def encode_asset_id(value) when is_binary(value), do: value
+  def encode_asset_id(_), do: {:error, "Unexpected type when encoding Attachment.asset_id"}
+
+  def decode_blob_id(value) when is_binary(value), do: value
+  def decode_blob_id(_), do: {:error, "Unexpected type when decoding Attachment.blob_id"}
+
+  def encode_blob_id(value) when is_binary(value), do: value
+  def encode_blob_id(_), do: {:error, "Unexpected type when encoding Attachment.blob_id"}
+
+  def decode_filename(value) when is_binary(value), do: value
+  def decode_filename(_), do: {:error, "Unexpected type when decoding Attachment.filename"}
+
+  def encode_filename(value) when is_binary(value), do: value
+  def encode_filename(_), do: {:error, "Unexpected type when encoding Attachment.filename"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Attachment.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Attachment.name"}
+
   def from_map(m) do
     %Attachment{
-      asset_id: m["assetId"],
-      blob_id: m["blobId"],
-      filename: m["filename"],
-      name: m["name"],
+      asset_id: decode_asset_id(m["assetId"]),
+      blob_id: decode_blob_id(m["blobId"]),
+      filename: decode_filename(m["filename"]),
+      name: decode_name(m["name"]),
     }
   end
 
@@ -334,11 +442,29 @@ defmodule CommonCore do
           publisher: String.t()
         }
 
+  def decode_contact_email(value) when is_binary(value), do: value
+  def decode_contact_email(_), do: {:error, "Unexpected type when decoding CommonCore.contact_email"}
+
+  def encode_contact_email(value) when is_binary(value), do: value
+  def encode_contact_email(_), do: {:error, "Unexpected type when encoding CommonCore.contact_email"}
+
+  def decode_contact_name(value) when is_binary(value), do: value
+  def decode_contact_name(_), do: {:error, "Unexpected type when decoding CommonCore.contact_name"}
+
+  def encode_contact_name(value) when is_binary(value), do: value
+  def encode_contact_name(_), do: {:error, "Unexpected type when encoding CommonCore.contact_name"}
+
+  def decode_publisher(value) when is_binary(value), do: value
+  def decode_publisher(_), do: {:error, "Unexpected type when decoding CommonCore.publisher"}
+
+  def encode_publisher(value) when is_binary(value), do: value
+  def encode_publisher(_), do: {:error, "Unexpected type when encoding CommonCore.publisher"}
+
   def from_map(m) do
     %CommonCore{
-      contact_email: m["Contact Email"],
-      contact_name: m["Contact Name"],
-      publisher: m["Publisher"],
+      contact_email: decode_contact_email(m["Contact Email"]),
+      contact_name: decode_contact_name(m["Contact Name"]),
+      publisher: decode_publisher(m["Publisher"]),
     }
   end
 
@@ -371,9 +497,15 @@ defmodule DatasetInformation do
           agency: String.t()
         }
 
+  def decode_agency(value) when is_binary(value), do: value
+  def decode_agency(_), do: {:error, "Unexpected type when decoding DatasetInformation.agency"}
+
+  def encode_agency(value) when is_binary(value), do: value
+  def encode_agency(_), do: {:error, "Unexpected type when encoding DatasetInformation.agency"}
+
   def from_map(m) do
     %DatasetInformation{
-      agency: m["Agency"],
+      agency: decode_agency(m["Agency"]),
     }
   end
 
@@ -409,14 +541,50 @@ defmodule DatasetSummary do
           time_period: String.t()
         }
 
+  def decode_contact_information(value) when is_binary(value), do: value
+  def decode_contact_information(_), do: {:error, "Unexpected type when decoding DatasetSummary.contact_information"}
+
+  def encode_contact_information(value) when is_binary(value), do: value
+  def encode_contact_information(_), do: {:error, "Unexpected type when encoding DatasetSummary.contact_information"}
+
+  def decode_coverage(value) when is_binary(value), do: value
+  def decode_coverage(_), do: {:error, "Unexpected type when decoding DatasetSummary.coverage"}
+
+  def encode_coverage(value) when is_binary(value), do: value
+  def encode_coverage(_), do: {:error, "Unexpected type when encoding DatasetSummary.coverage"}
+
+  def decode_granularity(value) when is_binary(value), do: value
+  def decode_granularity(_), do: {:error, "Unexpected type when decoding DatasetSummary.granularity"}
+
+  def encode_granularity(value) when is_binary(value), do: value
+  def encode_granularity(_), do: {:error, "Unexpected type when encoding DatasetSummary.granularity"}
+
+  def decode_organization(value) when is_binary(value), do: value
+  def decode_organization(_), do: {:error, "Unexpected type when decoding DatasetSummary.organization"}
+
+  def encode_organization(value) when is_binary(value), do: value
+  def encode_organization(_), do: {:error, "Unexpected type when encoding DatasetSummary.organization"}
+
+  def decode_posting_frequency(value) when is_binary(value), do: value
+  def decode_posting_frequency(_), do: {:error, "Unexpected type when decoding DatasetSummary.posting_frequency"}
+
+  def encode_posting_frequency(value) when is_binary(value), do: value
+  def encode_posting_frequency(_), do: {:error, "Unexpected type when encoding DatasetSummary.posting_frequency"}
+
+  def decode_time_period(value) when is_binary(value), do: value
+  def decode_time_period(_), do: {:error, "Unexpected type when decoding DatasetSummary.time_period"}
+
+  def encode_time_period(value) when is_binary(value), do: value
+  def encode_time_period(_), do: {:error, "Unexpected type when encoding DatasetSummary.time_period"}
+
   def from_map(m) do
     %DatasetSummary{
-      contact_information: m["Contact Information"],
-      coverage: m["Coverage"],
-      granularity: m["Granularity"],
-      organization: m["Organization"],
-      posting_frequency: m["Posting Frequency"],
-      time_period: m["Time Period"],
+      contact_information: decode_contact_information(m["Contact Information"]),
+      coverage: decode_coverage(m["Coverage"]),
+      granularity: decode_granularity(m["Granularity"]),
+      organization: decode_organization(m["Organization"]),
+      posting_frequency: decode_posting_frequency(m["Posting Frequency"]),
+      time_period: decode_time_period(m["Time Period"]),
     }
   end
 
@@ -453,10 +621,22 @@ defmodule Disclaimers do
           limitations: String.t()
         }
 
+  def decode_disclaimer(value) when is_binary(value), do: value
+  def decode_disclaimer(_), do: {:error, "Unexpected type when decoding Disclaimers.disclaimer"}
+
+  def encode_disclaimer(value) when is_binary(value), do: value
+  def encode_disclaimer(_), do: {:error, "Unexpected type when encoding Disclaimers.disclaimer"}
+
+  def decode_limitations(value) when is_binary(value), do: value
+  def decode_limitations(_), do: {:error, "Unexpected type when decoding Disclaimers.limitations"}
+
+  def encode_limitations(value) when is_binary(value), do: value
+  def encode_limitations(_), do: {:error, "Unexpected type when encoding Disclaimers.limitations"}
+
   def from_map(m) do
     %Disclaimers{
-      disclaimer: m["Disclaimer"],
-      limitations: m["Limitations"],
+      disclaimer: decode_disclaimer(m["Disclaimer"]),
+      limitations: decode_limitations(m["Limitations"]),
     }
   end
 
@@ -530,9 +710,15 @@ defmodule TableColumnID do
           the_703610: integer()
         }
 
+  def decode_the_703610(value) when is_integer(value), do: value
+  def decode_the_703610(_), do: {:error, "Unexpected type when decoding TableColumnID.the_703610"}
+
+  def encode_the_703610(value) when is_integer(value), do: value
+  def encode_the_703610(_), do: {:error, "Unexpected type when encoding TableColumnID.the_703610"}
+
   def from_map(m) do
     %TableColumnID{
-      the_703610: m["703610"],
+      the_703610: decode_the_703610(m["703610"]),
     }
   end
 
@@ -565,10 +751,22 @@ defmodule ChildMetadata do
           table_column_id: TableColumnID.t()
         }
 
+  def decode_custom_values(value) when is_list(value), do: value
+  def decode_custom_values(_), do: {:error, "Unexpected type when decoding ChildMetadata.custom_values"}
+
+  def encode_custom_values(value) when is_list(value), do: value
+  def encode_custom_values(_), do: {:error, "Unexpected type when encoding ChildMetadata.custom_values"}
+
+  def decode_operator(value) when is_binary(value), do: value
+  def decode_operator(_), do: {:error, "Unexpected type when decoding ChildMetadata.operator"}
+
+  def encode_operator(value) when is_binary(value), do: value
+  def encode_operator(_), do: {:error, "Unexpected type when encoding ChildMetadata.operator"}
+
   def from_map(m) do
     %ChildMetadata{
-      custom_values: m["customValues"],
-      operator: m["operator"],
+      custom_values: decode_custom_values(m["customValues"]),
+      operator: decode_operator(m["operator"]),
       table_column_id: TableColumnID.from_map(m["tableColumnId"]),
     }
   end
@@ -604,11 +802,23 @@ defmodule Child do
           value: String.t()
         }
 
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Child.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Child.type"}
+
+  def decode_value(value) when is_binary(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding Child.value"}
+
+  def encode_value(value) when is_binary(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding Child.value"}
+
   def from_map(m) do
     %Child{
       metadata: ChildMetadata.from_map(m["metadata"]),
-      type: m["type"],
-      value: m["value"],
+      type: decode_type(m["type"]),
+      value: decode_value(m["value"]),
     }
   end
 
@@ -642,10 +852,22 @@ defmodule FilterConditionMetadata do
           unified_version: integer()
         }
 
+  def decode_advanced(value) when is_boolean(value), do: value
+  def decode_advanced(_), do: {:error, "Unexpected type when decoding FilterConditionMetadata.advanced"}
+
+  def encode_advanced(value) when is_boolean(value), do: value
+  def encode_advanced(_), do: {:error, "Unexpected type when encoding FilterConditionMetadata.advanced"}
+
+  def decode_unified_version(value) when is_integer(value), do: value
+  def decode_unified_version(_), do: {:error, "Unexpected type when decoding FilterConditionMetadata.unified_version"}
+
+  def encode_unified_version(value) when is_integer(value), do: value
+  def encode_unified_version(_), do: {:error, "Unexpected type when encoding FilterConditionMetadata.unified_version"}
+
   def from_map(m) do
     %FilterConditionMetadata{
-      advanced: m["advanced"],
-      unified_version: m["unifiedVersion"],
+      advanced: decode_advanced(m["advanced"]),
+      unified_version: decode_unified_version(m["unifiedVersion"]),
     }
   end
 
@@ -680,12 +902,30 @@ defmodule FilterCondition do
           value: String.t()
         }
 
+  def decode_children(value) when is_list(value), do: value
+  def decode_children(_), do: {:error, "Unexpected type when decoding FilterCondition.children"}
+
+  def encode_children(value) when is_list(value), do: value
+  def encode_children(_), do: {:error, "Unexpected type when encoding FilterCondition.children"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding FilterCondition.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding FilterCondition.type"}
+
+  def decode_value(value) when is_binary(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding FilterCondition.value"}
+
+  def encode_value(value) when is_binary(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding FilterCondition.value"}
+
   def from_map(m) do
     %FilterCondition{
       children: Enum.map(m["children"], &Child.from_map/1),
       metadata: FilterConditionMetadata.from_map(m["metadata"]),
-      type: m["type"],
-      value: m["value"],
+      type: decode_type(m["type"]),
+      value: decode_value(m["value"]),
     }
   end
 
@@ -720,10 +960,22 @@ defmodule Order do
           column_field_name: String.t()
         }
 
+  def decode_ascending(value) when is_boolean(value), do: value
+  def decode_ascending(_), do: {:error, "Unexpected type when decoding Order.ascending"}
+
+  def encode_ascending(value) when is_boolean(value), do: value
+  def encode_ascending(_), do: {:error, "Unexpected type when encoding Order.ascending"}
+
+  def decode_column_field_name(value) when is_binary(value), do: value
+  def decode_column_field_name(_), do: {:error, "Unexpected type when decoding Order.column_field_name"}
+
+  def encode_column_field_name(value) when is_binary(value), do: value
+  def encode_column_field_name(_), do: {:error, "Unexpected type when encoding Order.column_field_name"}
+
   def from_map(m) do
     %Order{
-      ascending: m["ascending"],
-      column_field_name: m["columnFieldName"],
+      ascending: decode_ascending(m["ascending"]),
+      column_field_name: decode_column_field_name(m["columnFieldName"]),
     }
   end
 
@@ -755,6 +1007,12 @@ defmodule JSONQuery do
           order: [Order.t()]
         }
 
+  def decode_order(value) when is_list(value), do: value
+  def decode_order(_), do: {:error, "Unexpected type when decoding JSONQuery.order"}
+
+  def encode_order(value) when is_list(value), do: value
+  def encode_order(_), do: {:error, "Unexpected type when encoding JSONQuery.order"}
+
   def from_map(m) do
     %JSONQuery{
       order: Enum.map(m["order"], &Order.from_map/1),
@@ -788,9 +1046,15 @@ defmodule Visible do
           table: boolean()
         }
 
+  def decode_table(value) when is_boolean(value), do: value
+  def decode_table(_), do: {:error, "Unexpected type when decoding Visible.table"}
+
+  def encode_table(value) when is_boolean(value), do: value
+  def encode_table(_), do: {:error, "Unexpected type when encoding Visible.table"}
+
   def from_map(m) do
     %Visible{
-      table: m["table"],
+      table: decode_table(m["table"]),
     }
   end
 
@@ -861,16 +1125,40 @@ defmodule ViewMetadata do
           row_label: String.t()
         }
 
+  def decode_attachments(value) when is_list(value), do: value
+  def decode_attachments(_), do: {:error, "Unexpected type when decoding ViewMetadata.attachments"}
+
+  def encode_attachments(value) when is_list(value), do: value
+  def encode_attachments(_), do: {:error, "Unexpected type when encoding ViewMetadata.attachments"}
+
+  def decode_available_display_types(value) when is_list(value), do: value
+  def decode_available_display_types(_), do: {:error, "Unexpected type when decoding ViewMetadata.available_display_types"}
+
+  def encode_available_display_types(value) when is_list(value), do: value
+  def encode_available_display_types(_), do: {:error, "Unexpected type when encoding ViewMetadata.available_display_types"}
+
+  def decode_rdf_subject(value) when is_binary(value), do: value
+  def decode_rdf_subject(_), do: {:error, "Unexpected type when decoding ViewMetadata.rdf_subject"}
+
+  def encode_rdf_subject(value) when is_binary(value), do: value
+  def encode_rdf_subject(_), do: {:error, "Unexpected type when encoding ViewMetadata.rdf_subject"}
+
+  def decode_row_label(value) when is_binary(value), do: value
+  def decode_row_label(_), do: {:error, "Unexpected type when decoding ViewMetadata.row_label"}
+
+  def encode_row_label(value) when is_binary(value), do: value
+  def encode_row_label(_), do: {:error, "Unexpected type when encoding ViewMetadata.row_label"}
+
   def from_map(m) do
     %ViewMetadata{
       attachments: Enum.map(m["attachments"], &Attachment.from_map/1),
-      available_display_types: m["availableDisplayTypes"],
+      available_display_types: decode_available_display_types(m["availableDisplayTypes"]),
       custom_fields: CustomFields.from_map(m["custom_fields"]),
       filter_condition: FilterCondition.from_map(m["filterCondition"]),
       json_query: JSONQuery.from_map(m["jsonQuery"]),
-      rdf_subject: m["rdfSubject"],
+      rdf_subject: decode_rdf_subject(m["rdfSubject"]),
       render_type_config: RenderTypeConfig.from_map(m["renderTypeConfig"]),
-      row_label: m["rowLabel"],
+      row_label: decode_row_label(m["rowLabel"]),
     }
   end
 
@@ -915,16 +1203,64 @@ defmodule Owner do
           screen_name: String.t()
         }
 
+  def decode_display_name(value) when is_binary(value), do: value
+  def decode_display_name(_), do: {:error, "Unexpected type when decoding Owner.display_name"}
+
+  def encode_display_name(value) when is_binary(value), do: value
+  def encode_display_name(_), do: {:error, "Unexpected type when encoding Owner.display_name"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Owner.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Owner.id"}
+
+  def decode_profile_image_url_large(value) when is_binary(value), do: value
+  def decode_profile_image_url_large(_), do: {:error, "Unexpected type when decoding Owner.profile_image_url_large"}
+
+  def encode_profile_image_url_large(value) when is_binary(value), do: value
+  def encode_profile_image_url_large(_), do: {:error, "Unexpected type when encoding Owner.profile_image_url_large"}
+
+  def decode_profile_image_url_medium(value) when is_binary(value), do: value
+  def decode_profile_image_url_medium(_), do: {:error, "Unexpected type when decoding Owner.profile_image_url_medium"}
+
+  def encode_profile_image_url_medium(value) when is_binary(value), do: value
+  def encode_profile_image_url_medium(_), do: {:error, "Unexpected type when encoding Owner.profile_image_url_medium"}
+
+  def decode_profile_image_url_small(value) when is_binary(value), do: value
+  def decode_profile_image_url_small(_), do: {:error, "Unexpected type when decoding Owner.profile_image_url_small"}
+
+  def encode_profile_image_url_small(value) when is_binary(value), do: value
+  def encode_profile_image_url_small(_), do: {:error, "Unexpected type when encoding Owner.profile_image_url_small"}
+
+  def decode_rights(value) when is_list(value), do: value
+  def decode_rights(_), do: {:error, "Unexpected type when decoding Owner.rights"}
+
+  def encode_rights(value) when is_list(value), do: value
+  def encode_rights(_), do: {:error, "Unexpected type when encoding Owner.rights"}
+
+  def decode_role_name(value) when is_binary(value), do: value
+  def decode_role_name(_), do: {:error, "Unexpected type when decoding Owner.role_name"}
+
+  def encode_role_name(value) when is_binary(value), do: value
+  def encode_role_name(_), do: {:error, "Unexpected type when encoding Owner.role_name"}
+
+  def decode_screen_name(value) when is_binary(value), do: value
+  def decode_screen_name(_), do: {:error, "Unexpected type when decoding Owner.screen_name"}
+
+  def encode_screen_name(value) when is_binary(value), do: value
+  def encode_screen_name(_), do: {:error, "Unexpected type when encoding Owner.screen_name"}
+
   def from_map(m) do
     %Owner{
-      display_name: m["displayName"],
-      id: m["id"],
-      profile_image_url_large: m["profileImageUrlLarge"],
-      profile_image_url_medium: m["profileImageUrlMedium"],
-      profile_image_url_small: m["profileImageUrlSmall"],
-      rights: m["rights"],
-      role_name: m["roleName"],
-      screen_name: m["screenName"],
+      display_name: decode_display_name(m["displayName"]),
+      id: decode_id(m["id"]),
+      profile_image_url_large: decode_profile_image_url_large(m["profileImageUrlLarge"]),
+      profile_image_url_medium: decode_profile_image_url_medium(m["profileImageUrlMedium"]),
+      profile_image_url_small: decode_profile_image_url_small(m["profileImageUrlSmall"]),
+      rights: decode_rights(m["rights"]),
+      role_name: decode_role_name(m["roleName"]),
+      screen_name: decode_screen_name(m["screenName"]),
     }
   end
 
@@ -963,10 +1299,22 @@ defmodule Expression do
           type: String.t()
         }
 
+  def decode_column_id(value) when is_integer(value), do: value
+  def decode_column_id(_), do: {:error, "Unexpected type when decoding Expression.column_id"}
+
+  def encode_column_id(value) when is_integer(value), do: value
+  def encode_column_id(_), do: {:error, "Unexpected type when encoding Expression.column_id"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Expression.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Expression.type"}
+
   def from_map(m) do
     %Expression{
-      column_id: m["columnId"],
-      type: m["type"],
+      column_id: decode_column_id(m["columnId"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -999,9 +1347,15 @@ defmodule OrderBy do
           expression: Expression.t()
         }
 
+  def decode_ascending(value) when is_boolean(value), do: value
+  def decode_ascending(_), do: {:error, "Unexpected type when decoding OrderBy.ascending"}
+
+  def encode_ascending(value) when is_boolean(value), do: value
+  def encode_ascending(_), do: {:error, "Unexpected type when encoding OrderBy.ascending"}
+
   def from_map(m) do
     %OrderBy{
-      ascending: m["ascending"],
+      ascending: decode_ascending(m["ascending"]),
       expression: Expression.from_map(m["expression"]),
     }
   end
@@ -1034,6 +1388,12 @@ defmodule Query do
           order_bys: [OrderBy.t()]
         }
 
+  def decode_order_bys(value) when is_list(value), do: value
+  def decode_order_bys(_), do: {:error, "Unexpected type when decoding Query.order_bys"}
+
+  def encode_order_bys(value) when is_list(value), do: value
+  def encode_order_bys(_), do: {:error, "Unexpected type when encoding Query.order_bys"}
+
   def from_map(m) do
     %Query{
       order_bys: Enum.map(m["orderBys"], &OrderBy.from_map/1),
@@ -1103,45 +1463,243 @@ defmodule View do
           view_type: String.t()
         }
 
+  def decode_attribution(value) when is_binary(value), do: value
+  def decode_attribution(_), do: {:error, "Unexpected type when decoding View.attribution"}
+
+  def encode_attribution(value) when is_binary(value), do: value
+  def encode_attribution(_), do: {:error, "Unexpected type when encoding View.attribution"}
+
+  def decode_average_rating(value) when is_integer(value), do: value
+  def decode_average_rating(_), do: {:error, "Unexpected type when decoding View.average_rating"}
+
+  def encode_average_rating(value) when is_integer(value), do: value
+  def encode_average_rating(_), do: {:error, "Unexpected type when encoding View.average_rating"}
+
+  def decode_category(value) when is_binary(value), do: value
+  def decode_category(_), do: {:error, "Unexpected type when decoding View.category"}
+
+  def encode_category(value) when is_binary(value), do: value
+  def encode_category(_), do: {:error, "Unexpected type when encoding View.category"}
+
+  def decode_columns(value) when is_list(value), do: value
+  def decode_columns(_), do: {:error, "Unexpected type when decoding View.columns"}
+
+  def encode_columns(value) when is_list(value), do: value
+  def encode_columns(_), do: {:error, "Unexpected type when encoding View.columns"}
+
+  def decode_created_at(value) when is_integer(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding View.created_at"}
+
+  def encode_created_at(value) when is_integer(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding View.created_at"}
+
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding View.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding View.description"}
+
+  def decode_display_type(value) when is_binary(value), do: value
+  def decode_display_type(_), do: {:error, "Unexpected type when decoding View.display_type"}
+
+  def encode_display_type(value) when is_binary(value), do: value
+  def encode_display_type(_), do: {:error, "Unexpected type when encoding View.display_type"}
+
+  def decode_download_count(value) when is_integer(value), do: value
+  def decode_download_count(_), do: {:error, "Unexpected type when decoding View.download_count"}
+
+  def encode_download_count(value) when is_integer(value), do: value
+  def encode_download_count(_), do: {:error, "Unexpected type when encoding View.download_count"}
+
+  def decode_flags(value) when is_list(value), do: value
+  def decode_flags(_), do: {:error, "Unexpected type when decoding View.flags"}
+
+  def encode_flags(value) when is_list(value), do: value
+  def encode_flags(_), do: {:error, "Unexpected type when encoding View.flags"}
+
+  def decode_grants(value) when is_list(value), do: value
+  def decode_grants(_), do: {:error, "Unexpected type when decoding View.grants"}
+
+  def encode_grants(value) when is_list(value), do: value
+  def encode_grants(_), do: {:error, "Unexpected type when encoding View.grants"}
+
+  def decode_hide_from_catalog(value) when is_boolean(value), do: value
+  def decode_hide_from_catalog(_), do: {:error, "Unexpected type when decoding View.hide_from_catalog"}
+
+  def encode_hide_from_catalog(value) when is_boolean(value), do: value
+  def encode_hide_from_catalog(_), do: {:error, "Unexpected type when encoding View.hide_from_catalog"}
+
+  def decode_hide_from_data_json(value) when is_boolean(value), do: value
+  def decode_hide_from_data_json(_), do: {:error, "Unexpected type when decoding View.hide_from_data_json"}
+
+  def encode_hide_from_data_json(value) when is_boolean(value), do: value
+  def encode_hide_from_data_json(_), do: {:error, "Unexpected type when encoding View.hide_from_data_json"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding View.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding View.id"}
+
+  def decode_index_updated_at(value) when is_integer(value), do: value
+  def decode_index_updated_at(_), do: {:error, "Unexpected type when decoding View.index_updated_at"}
+
+  def encode_index_updated_at(value) when is_integer(value), do: value
+  def encode_index_updated_at(_), do: {:error, "Unexpected type when encoding View.index_updated_at"}
+
+  def decode_locale(value) when is_binary(value), do: value
+  def decode_locale(_), do: {:error, "Unexpected type when decoding View.locale"}
+
+  def encode_locale(value) when is_binary(value), do: value
+  def encode_locale(_), do: {:error, "Unexpected type when encoding View.locale"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding View.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding View.name"}
+
+  def decode_new_backend(value) when is_boolean(value), do: value
+  def decode_new_backend(_), do: {:error, "Unexpected type when decoding View.new_backend"}
+
+  def encode_new_backend(value) when is_boolean(value), do: value
+  def encode_new_backend(_), do: {:error, "Unexpected type when encoding View.new_backend"}
+
+  def decode_number_of_comments(value) when is_integer(value), do: value
+  def decode_number_of_comments(_), do: {:error, "Unexpected type when decoding View.number_of_comments"}
+
+  def encode_number_of_comments(value) when is_integer(value), do: value
+  def encode_number_of_comments(_), do: {:error, "Unexpected type when encoding View.number_of_comments"}
+
+  def decode_oid(value) when is_integer(value), do: value
+  def decode_oid(_), do: {:error, "Unexpected type when decoding View.oid"}
+
+  def encode_oid(value) when is_integer(value), do: value
+  def encode_oid(_), do: {:error, "Unexpected type when encoding View.oid"}
+
+  def decode_provenance(value) when is_binary(value), do: value
+  def decode_provenance(_), do: {:error, "Unexpected type when decoding View.provenance"}
+
+  def encode_provenance(value) when is_binary(value), do: value
+  def encode_provenance(_), do: {:error, "Unexpected type when encoding View.provenance"}
+
+  def decode_publication_append_enabled(value) when is_boolean(value), do: value
+  def decode_publication_append_enabled(_), do: {:error, "Unexpected type when decoding View.publication_append_enabled"}
+
+  def encode_publication_append_enabled(value) when is_boolean(value), do: value
+  def encode_publication_append_enabled(_), do: {:error, "Unexpected type when encoding View.publication_append_enabled"}
+
+  def decode_publication_date(value) when is_integer(value), do: value
+  def decode_publication_date(_), do: {:error, "Unexpected type when decoding View.publication_date"}
+
+  def encode_publication_date(value) when is_integer(value), do: value
+  def encode_publication_date(_), do: {:error, "Unexpected type when encoding View.publication_date"}
+
+  def decode_publication_group(value) when is_integer(value), do: value
+  def decode_publication_group(_), do: {:error, "Unexpected type when decoding View.publication_group"}
+
+  def encode_publication_group(value) when is_integer(value), do: value
+  def encode_publication_group(_), do: {:error, "Unexpected type when encoding View.publication_group"}
+
+  def decode_publication_stage(value) when is_binary(value), do: value
+  def decode_publication_stage(_), do: {:error, "Unexpected type when decoding View.publication_stage"}
+
+  def encode_publication_stage(value) when is_binary(value), do: value
+  def encode_publication_stage(_), do: {:error, "Unexpected type when encoding View.publication_stage"}
+
+  def decode_rights(value) when is_list(value), do: value
+  def decode_rights(_), do: {:error, "Unexpected type when decoding View.rights"}
+
+  def encode_rights(value) when is_list(value), do: value
+  def encode_rights(_), do: {:error, "Unexpected type when encoding View.rights"}
+
+  def decode_rows_updated_at(value) when is_integer(value), do: value
+  def decode_rows_updated_at(_), do: {:error, "Unexpected type when decoding View.rows_updated_at"}
+
+  def encode_rows_updated_at(value) when is_integer(value), do: value
+  def encode_rows_updated_at(_), do: {:error, "Unexpected type when encoding View.rows_updated_at"}
+
+  def decode_rows_updated_by(value) when is_binary(value), do: value
+  def decode_rows_updated_by(_), do: {:error, "Unexpected type when decoding View.rows_updated_by"}
+
+  def encode_rows_updated_by(value) when is_binary(value), do: value
+  def encode_rows_updated_by(_), do: {:error, "Unexpected type when encoding View.rows_updated_by"}
+
+  def decode_table_id(value) when is_integer(value), do: value
+  def decode_table_id(_), do: {:error, "Unexpected type when decoding View.table_id"}
+
+  def encode_table_id(value) when is_integer(value), do: value
+  def encode_table_id(_), do: {:error, "Unexpected type when encoding View.table_id"}
+
+  def decode_tags(value) when is_list(value), do: value
+  def decode_tags(_), do: {:error, "Unexpected type when decoding View.tags"}
+
+  def encode_tags(value) when is_list(value), do: value
+  def encode_tags(_), do: {:error, "Unexpected type when encoding View.tags"}
+
+  def decode_total_times_rated(value) when is_integer(value), do: value
+  def decode_total_times_rated(_), do: {:error, "Unexpected type when decoding View.total_times_rated"}
+
+  def encode_total_times_rated(value) when is_integer(value), do: value
+  def encode_total_times_rated(_), do: {:error, "Unexpected type when encoding View.total_times_rated"}
+
+  def decode_view_count(value) when is_integer(value), do: value
+  def decode_view_count(_), do: {:error, "Unexpected type when decoding View.view_count"}
+
+  def encode_view_count(value) when is_integer(value), do: value
+  def encode_view_count(_), do: {:error, "Unexpected type when encoding View.view_count"}
+
+  def decode_view_last_modified(value) when is_integer(value), do: value
+  def decode_view_last_modified(_), do: {:error, "Unexpected type when decoding View.view_last_modified"}
+
+  def encode_view_last_modified(value) when is_integer(value), do: value
+  def encode_view_last_modified(_), do: {:error, "Unexpected type when encoding View.view_last_modified"}
+
+  def decode_view_type(value) when is_binary(value), do: value
+  def decode_view_type(_), do: {:error, "Unexpected type when decoding View.view_type"}
+
+  def encode_view_type(value) when is_binary(value), do: value
+  def encode_view_type(_), do: {:error, "Unexpected type when encoding View.view_type"}
+
   def from_map(m) do
     %View{
-      attribution: m["attribution"],
-      average_rating: m["averageRating"],
-      category: m["category"],
+      attribution: decode_attribution(m["attribution"]),
+      average_rating: decode_average_rating(m["averageRating"]),
+      category: decode_category(m["category"]),
       columns: Enum.map(m["columns"], &Column.from_map/1),
-      created_at: m["createdAt"],
-      description: m["description"],
-      display_type: m["displayType"],
-      download_count: m["downloadCount"],
-      flags: m["flags"],
+      created_at: decode_created_at(m["createdAt"]),
+      description: decode_description(m["description"]),
+      display_type: decode_display_type(m["displayType"]),
+      download_count: decode_download_count(m["downloadCount"]),
+      flags: decode_flags(m["flags"]),
       grants: Enum.map(m["grants"], &Grant.from_map/1),
-      hide_from_catalog: m["hideFromCatalog"],
-      hide_from_data_json: m["hideFromDataJson"],
-      id: m["id"],
-      index_updated_at: m["indexUpdatedAt"],
-      locale: m["locale"],
+      hide_from_catalog: decode_hide_from_catalog(m["hideFromCatalog"]),
+      hide_from_data_json: decode_hide_from_data_json(m["hideFromDataJson"]),
+      id: decode_id(m["id"]),
+      index_updated_at: decode_index_updated_at(m["indexUpdatedAt"]),
+      locale: decode_locale(m["locale"]),
       metadata: ViewMetadata.from_map(m["metadata"]),
-      name: m["name"],
-      new_backend: m["newBackend"],
-      number_of_comments: m["numberOfComments"],
-      oid: m["oid"],
+      name: decode_name(m["name"]),
+      new_backend: decode_new_backend(m["newBackend"]),
+      number_of_comments: decode_number_of_comments(m["numberOfComments"]),
+      oid: decode_oid(m["oid"]),
       owner: Owner.from_map(m["owner"]),
-      provenance: m["provenance"],
-      publication_append_enabled: m["publicationAppendEnabled"],
-      publication_date: m["publicationDate"],
-      publication_group: m["publicationGroup"],
-      publication_stage: m["publicationStage"],
+      provenance: decode_provenance(m["provenance"]),
+      publication_append_enabled: decode_publication_append_enabled(m["publicationAppendEnabled"]),
+      publication_date: decode_publication_date(m["publicationDate"]),
+      publication_group: decode_publication_group(m["publicationGroup"]),
+      publication_stage: decode_publication_stage(m["publicationStage"]),
       query: Query.from_map(m["query"]),
-      rights: m["rights"],
-      rows_updated_at: m["rowsUpdatedAt"],
-      rows_updated_by: m["rowsUpdatedBy"],
+      rights: decode_rights(m["rights"]),
+      rows_updated_at: decode_rows_updated_at(m["rowsUpdatedAt"]),
+      rows_updated_by: decode_rows_updated_by(m["rowsUpdatedBy"]),
       table_author: Owner.from_map(m["tableAuthor"]),
-      table_id: m["tableId"],
-      tags: m["tags"],
-      total_times_rated: m["totalTimesRated"],
-      view_count: m["viewCount"],
-      view_last_modified: m["viewLastModified"],
-      view_type: m["viewType"],
+      table_id: decode_table_id(m["tableId"]),
+      tags: decode_tags(m["tags"]),
+      total_times_rated: decode_total_times_rated(m["totalTimesRated"]),
+      view_count: decode_view_count(m["viewCount"]),
+      view_last_modified: decode_view_last_modified(m["viewLastModified"]),
+      view_type: decode_view_type(m["viewType"]),
     }
   end
 
@@ -1242,9 +1800,15 @@ defmodule TopLevel do
           meta: Meta.t()
         }
 
+  def decode_data(value) when is_list(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data(value) when is_list(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
   def from_map(m) do
     %TopLevel{
-      data: m["data"],
+      data: decode_data(m["data"]),
       meta: Meta.from_map(m["meta"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/misc/fd329.json/default/QuickType.ex b/head/elixir/test/inputs/json/misc/fd329.json/default/QuickType.ex
index e9923e5..bc204fb 100644
--- a/base/elixir/test/inputs/json/misc/fd329.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/misc/fd329.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Datum do
           value: String.t()
         }
 
+  def decode_anomaly(value) when is_binary(value), do: value
+  def decode_anomaly(_), do: {:error, "Unexpected type when decoding Datum.anomaly"}
+
+  def encode_anomaly(value) when is_binary(value), do: value
+  def encode_anomaly(_), do: {:error, "Unexpected type when encoding Datum.anomaly"}
+
+  def decode_value(value) when is_binary(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding Datum.value"}
+
+  def encode_value(value) when is_binary(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding Datum.value"}
+
   def from_map(m) do
     %Datum{
-      anomaly: m["anomaly"],
-      value: m["value"],
+      anomaly: decode_anomaly(m["anomaly"]),
+      value: decode_value(m["value"]),
     }
   end
 
@@ -52,12 +64,36 @@ defmodule Description do
           units: String.t()
         }
 
+  def decode_base_period(value) when is_binary(value), do: value
+  def decode_base_period(_), do: {:error, "Unexpected type when decoding Description.base_period"}
+
+  def encode_base_period(value) when is_binary(value), do: value
+  def encode_base_period(_), do: {:error, "Unexpected type when encoding Description.base_period"}
+
+  def decode_missing(value) when is_integer(value), do: value
+  def decode_missing(_), do: {:error, "Unexpected type when decoding Description.missing"}
+
+  def encode_missing(value) when is_integer(value), do: value
+  def encode_missing(_), do: {:error, "Unexpected type when encoding Description.missing"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Description.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Description.title"}
+
+  def decode_units(value) when is_binary(value), do: value
+  def decode_units(_), do: {:error, "Unexpected type when decoding Description.units"}
+
+  def encode_units(value) when is_binary(value), do: value
+  def encode_units(_), do: {:error, "Unexpected type when encoding Description.units"}
+
   def from_map(m) do
     %Description{
-      base_period: m["base_period"],
-      missing: m["missing"],
-      title: m["title"],
-      units: m["units"],
+      base_period: decode_base_period(m["base_period"]),
+      missing: decode_missing(m["missing"]),
+      title: decode_title(m["title"]),
+      units: decode_units(m["units"]),
     }
   end
 
@@ -94,7 +130,8 @@ defmodule TopLevel do
 
   def from_map(m) do
     %TopLevel{
-      data: m["data"],
+      data: m["data"]
+      |> Map.new(fn {key, value} -> {key, Datum.from_map(value)} end),
       description: Description.from_map(m["description"]),
     }
   end
@@ -107,7 +144,8 @@ defmodule TopLevel do
 
   def to_map(struct) do
     %{
-      "data" => struct.data,
+      "data" => struct.data
+      |> Map.new(fn {key, value} -> {key, Datum.to_map(value)} end),
       "description" => Description.to_map(struct.description),
     }
   end
diff --git a/base/elixir/test/inputs/json/priority/bug2037.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/bug2037.json/default/QuickType.ex
index 28e3a3e..d580119 100644
--- a/base/elixir/test/inputs/json/priority/bug2037.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/bug2037.json/default/QuickType.ex
@@ -44,7 +44,8 @@ defmodule Objective do
 
   def from_map(m) do
     %Objective{
-      rewards: m["rewards"],
+      rewards: m["rewards"]
+      |> Map.new(fn {key, value} -> {key, Reward.from_map(value)} end),
     }
   end
 
@@ -56,7 +57,8 @@ defmodule Objective do
 
   def to_map(struct) do
     %{
-      "rewards" => struct.rewards,
+      "rewards" => struct.rewards
+      |> Map.new(fn {key, value} -> {key, Reward.to_map(value)} end),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/bug2521.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/bug2521.json/default/QuickType.ex
index 3134915..18cff7f 100644
--- a/base/elixir/test/inputs/json/priority/bug2521.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/bug2521.json/default/QuickType.ex
@@ -14,10 +14,16 @@ defmodule Option do
           name: String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Option.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Option.name"}
+
   def from_map(m) do
     %Option{
       foo: m["foo"],
-      name: m["name"],
+      name: decode_name(m["name"]),
     }
   end
 
@@ -49,6 +55,12 @@ defmodule TopLevel do
           options: [Option.t()]
         }
 
+  def decode_options(value) when is_list(value), do: value
+  def decode_options(_), do: {:error, "Unexpected type when decoding TopLevel.options"}
+
+  def encode_options(value) when is_list(value), do: value
+  def encode_options(_), do: {:error, "Unexpected type when encoding TopLevel.options"}
+
   def from_map(m) do
     %TopLevel{
       options: Enum.map(m["options"], &Option.from_map/1),
diff --git a/base/elixir/test/inputs/json/priority/bug2590.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/bug2590.json/default/QuickType.ex
index df2b41f..8ca0e3f 100644
--- a/base/elixir/test/inputs/json/priority/bug2590.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/bug2590.json/default/QuickType.ex
@@ -15,11 +15,17 @@ defmodule Invoice do
           name: String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Invoice.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Invoice.name"}
+
   def from_map(m) do
     %Invoice{
       created_at: m["createdAt"],
       due_date: m["dueDate"],
-      name: m["name"],
+      name: decode_name(m["name"]),
     }
   end
 
@@ -52,6 +58,12 @@ defmodule TopLevel do
           invoices: [Invoice.t()]
         }
 
+  def decode_invoices(value) when is_list(value), do: value
+  def decode_invoices(_), do: {:error, "Unexpected type when decoding TopLevel.invoices"}
+
+  def encode_invoices(value) when is_list(value), do: value
+  def encode_invoices(_), do: {:error, "Unexpected type when encoding TopLevel.invoices"}
+
   def from_map(m) do
     %TopLevel{
       invoices: Enum.map(m["invoices"], &Invoice.from_map/1),
diff --git a/base/elixir/test/inputs/json/priority/bug2663.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/bug2663.json/default/QuickType.ex
index e602046..bc5b7b2 100644
--- a/base/elixir/test/inputs/json/priority/bug2663.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/bug2663.json/default/QuickType.ex
@@ -15,11 +15,29 @@ defmodule TopLevel do
           name: String.t()
         }
 
+  def decode_birthday(value) when is_binary(value), do: value
+  def decode_birthday(_), do: {:error, "Unexpected type when decoding TopLevel.birthday"}
+
+  def encode_birthday(value) when is_binary(value), do: value
+  def encode_birthday(_), do: {:error, "Unexpected type when encoding TopLevel.birthday"}
+
+  def decode_last_seen(value) when is_binary(value), do: value
+  def decode_last_seen(_), do: {:error, "Unexpected type when decoding TopLevel.last_seen"}
+
+  def encode_last_seen(value) when is_binary(value), do: value
+  def encode_last_seen(_), do: {:error, "Unexpected type when encoding TopLevel.last_seen"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
   def from_map(m) do
     %TopLevel{
-      birthday: m["birthday"],
-      last_seen: m["lastSeen"],
-      name: m["name"],
+      birthday: decode_birthday(m["birthday"]),
+      last_seen: decode_last_seen(m["lastSeen"]),
+      name: decode_name(m["name"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/bug2793.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/bug2793.json/default/QuickType.ex
index eac66ea..419d442 100644
--- a/base/elixir/test/inputs/json/priority/bug2793.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/bug2793.json/default/QuickType.ex
@@ -43,10 +43,22 @@ defmodule Labels do
           title: String.t()
         }
 
+  def decode_account_number(value) when is_binary(value), do: value
+  def decode_account_number(_), do: {:error, "Unexpected type when decoding Labels.account_number"}
+
+  def encode_account_number(value) when is_binary(value), do: value
+  def encode_account_number(_), do: {:error, "Unexpected type when encoding Labels.account_number"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Labels.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Labels.title"}
+
   def from_map(m) do
     %Labels{
-      account_number: m["AccountNumber"],
-      title: m["Title"],
+      account_number: decode_account_number(m["AccountNumber"]),
+      title: decode_title(m["Title"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/bug427.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/bug427.json/default/QuickType.ex
index 709a5da..9a98e55 100644
--- a/base/elixir/test/inputs/json/priority/bug427.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/bug427.json/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule Comment1 do
           short_text: String.t()
         }
 
+  def decode_short_text(value) when is_binary(value), do: value
+  def decode_short_text(_), do: {:error, "Unexpected type when decoding Comment1.short_text"}
+
+  def encode_short_text(value) when is_binary(value), do: value
+  def encode_short_text(_), do: {:error, "Unexpected type when encoding Comment1.short_text"}
+
   def from_map(m) do
     %Comment1{
-      short_text: m["shortText"],
+      short_text: decode_short_text(m["shortText"]),
     }
   end
 
@@ -347,9 +353,15 @@ defmodule Comment2 do
           text: String.t()
         }
 
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Comment2.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Comment2.text"}
+
   def from_map(m) do
     %Comment2{
-      text: m["text"],
+      text: decode_text(m["text"]),
     }
   end
 
@@ -471,11 +483,23 @@ defmodule Source do
           line: integer()
         }
 
+  def decode_character(value) when is_integer(value), do: value
+  def decode_character(_), do: {:error, "Unexpected type when decoding Source.character"}
+
+  def encode_character(value) when is_integer(value), do: value
+  def encode_character(_), do: {:error, "Unexpected type when encoding Source.character"}
+
+  def decode_line(value) when is_integer(value), do: value
+  def decode_line(_), do: {:error, "Unexpected type when decoding Source.line"}
+
+  def encode_line(value) when is_integer(value), do: value
+  def encode_line(_), do: {:error, "Unexpected type when encoding Source.line"}
+
   def from_map(m) do
     %Source{
-      character: m["character"],
+      character: decode_character(m["character"]),
       file_name: FileName.decode(m["fileName"]),
-      line: m["line"],
+      line: decode_line(m["line"]),
     }
   end
 
@@ -548,11 +572,29 @@ defmodule Group do
           title: String.t()
         }
 
+  def decode_children(value) when is_list(value), do: value
+  def decode_children(_), do: {:error, "Unexpected type when decoding Group.children"}
+
+  def encode_children(value) when is_list(value), do: value
+  def encode_children(_), do: {:error, "Unexpected type when encoding Group.children"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Group.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Group.kind"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Group.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Group.title"}
+
   def from_map(m) do
     %Group{
-      children: m["children"],
-      kind: m["kind"],
-      title: m["title"],
+      children: decode_children(m["children"]),
+      kind: decode_kind(m["kind"]),
+      title: decode_title(m["title"]),
     }
   end
 
@@ -748,14 +790,32 @@ defmodule GetSignatureParameter do
           type: Type2.t()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding GetSignatureParameter.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding GetSignatureParameter.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding GetSignatureParameter.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding GetSignatureParameter.kind"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding GetSignatureParameter.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding GetSignatureParameter.name"}
+
   def from_map(m) do
     %GetSignatureParameter{
       comment: m["comment"] && Comment3.from_map(m["comment"]),
       flags: Flags3.from_map(m["flags"]),
-      id: m["id"],
-      kind: m["kind"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
       kind_string: ParameterKindString.decode(m["kindString"]),
-      name: m["name"],
+      name: decode_name(m["name"]),
       type: Type2.from_map(m["type"]),
     }
   end
@@ -841,13 +901,37 @@ defmodule IndexSignatureElement do
           type: Type1.t()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding IndexSignatureElement.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding IndexSignatureElement.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding IndexSignatureElement.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding IndexSignatureElement.kind"}
+
+  def decode_kind_string(value) when is_binary(value), do: value
+  def decode_kind_string(_), do: {:error, "Unexpected type when decoding IndexSignatureElement.kind_string"}
+
+  def encode_kind_string(value) when is_binary(value), do: value
+  def encode_kind_string(_), do: {:error, "Unexpected type when encoding IndexSignatureElement.kind_string"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding IndexSignatureElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding IndexSignatureElement.name"}
+
   def from_map(m) do
     %IndexSignatureElement{
       flags: GetSignatureFlags.from_map(m["flags"]),
-      id: m["id"],
-      kind: m["kind"],
-      kind_string: m["kindString"],
-      name: m["name"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
+      kind_string: decode_kind_string(m["kindString"]),
+      name: decode_name(m["name"]),
       parameters: m["parameters"] && Enum.map(m["parameters"], &GetSignature.from_map/1),
       type: Type1.from_map(m["type"]),
     }
@@ -932,14 +1016,38 @@ defmodule GetSignatureChild do
           type: Type1.t()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding GetSignatureChild.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding GetSignatureChild.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding GetSignatureChild.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding GetSignatureChild.kind"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding GetSignatureChild.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding GetSignatureChild.name"}
+
+  def decode_sources(value) when is_list(value), do: value
+  def decode_sources(_), do: {:error, "Unexpected type when decoding GetSignatureChild.sources"}
+
+  def encode_sources(value) when is_list(value), do: value
+  def encode_sources(_), do: {:error, "Unexpected type when encoding GetSignatureChild.sources"}
+
   def from_map(m) do
     %GetSignatureChild{
       comment: m["comment"] && Comment2.from_map(m["comment"]),
       flags: Flags2.from_map(m["flags"]),
-      id: m["id"],
-      kind: m["kind"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
       kind_string: KindString1.decode(m["kindString"]),
-      name: m["name"],
+      name: decode_name(m["name"]),
       sources: Enum.map(m["sources"], &Source.from_map/1),
       type: Type1.from_map(m["type"]),
     }
@@ -992,6 +1100,30 @@ defmodule GetSignature do
           type_parameter: [GetSignature.t()] | nil
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding GetSignature.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding GetSignature.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding GetSignature.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding GetSignature.kind"}
+
+  def decode_kind_string(value) when is_binary(value), do: value
+  def decode_kind_string(_), do: {:error, "Unexpected type when decoding GetSignature.kind_string"}
+
+  def encode_kind_string(value) when is_binary(value), do: value
+  def encode_kind_string(_), do: {:error, "Unexpected type when encoding GetSignature.kind_string"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding GetSignature.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding GetSignature.name"}
+
   def from_map(m) do
     %GetSignature{
       children: m["children"] && Enum.map(m["children"], &GetSignatureChild.from_map/1),
@@ -999,10 +1131,10 @@ defmodule GetSignature do
       default_value: m["defaultValue"],
       flags: GetSignatureFlags.from_map(m["flags"]),
       groups: m["groups"] && Enum.map(m["groups"], &Group.from_map/1),
-      id: m["id"],
-      kind: m["kind"],
-      kind_string: m["kindString"],
-      name: m["name"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
+      kind_string: decode_kind_string(m["kindString"]),
+      name: decode_name(m["name"]),
       parameters: m["parameters"] && Enum.map(m["parameters"], &GetSignatureParameter.from_map/1),
       signatures: m["signatures"] && Enum.map(m["signatures"], &IndexSignatureElement.from_map/1),
       sources: m["sources"] && Enum.map(m["sources"], &Source.from_map/1),
@@ -1057,15 +1189,51 @@ defmodule Declaration1 do
           name: String.t()
         }
 
+  def decode_children(value) when is_list(value), do: value
+  def decode_children(_), do: {:error, "Unexpected type when decoding Declaration1.children"}
+
+  def encode_children(value) when is_list(value), do: value
+  def encode_children(_), do: {:error, "Unexpected type when encoding Declaration1.children"}
+
+  def decode_groups(value) when is_list(value), do: value
+  def decode_groups(_), do: {:error, "Unexpected type when decoding Declaration1.groups"}
+
+  def encode_groups(value) when is_list(value), do: value
+  def encode_groups(_), do: {:error, "Unexpected type when encoding Declaration1.groups"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Declaration1.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Declaration1.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Declaration1.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Declaration1.kind"}
+
+  def decode_kind_string(value) when is_binary(value), do: value
+  def decode_kind_string(_), do: {:error, "Unexpected type when decoding Declaration1.kind_string"}
+
+  def encode_kind_string(value) when is_binary(value), do: value
+  def encode_kind_string(_), do: {:error, "Unexpected type when encoding Declaration1.kind_string"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Declaration1.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Declaration1.name"}
+
   def from_map(m) do
     %Declaration1{
       children: Enum.map(m["children"], &GetSignature.from_map/1),
       flags: GetSignatureFlags.from_map(m["flags"]),
       groups: Enum.map(m["groups"], &Group.from_map/1),
-      id: m["id"],
-      kind: m["kind"],
-      kind_string: m["kindString"],
-      name: m["name"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
+      kind_string: decode_kind_string(m["kindString"]),
+      name: decode_name(m["name"]),
     }
   end
 
@@ -1148,14 +1316,38 @@ defmodule Signature1 do
           type: Type3.t()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Signature1.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Signature1.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Signature1.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Signature1.kind"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Signature1.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Signature1.name"}
+
+  def decode_parameters(value) when is_list(value), do: value
+  def decode_parameters(_), do: {:error, "Unexpected type when decoding Signature1.parameters"}
+
+  def encode_parameters(value) when is_list(value), do: value
+  def encode_parameters(_), do: {:error, "Unexpected type when encoding Signature1.parameters"}
+
   def from_map(m) do
     %Signature1{
       comment: m["comment"] && Comment1.from_map(m["comment"]),
       flags: GetSignatureFlags.from_map(m["flags"]),
-      id: m["id"],
-      kind: m["kind"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
       kind_string: SignatureKindString.decode(m["kindString"]),
-      name: m["name"],
+      name: decode_name(m["name"]),
       parameters: Enum.map(m["parameters"], &GetSignature.from_map/1),
       type: Type3.from_map(m["type"]),
     }
@@ -1249,15 +1441,39 @@ defmodule Child3 do
           type: TypeElement.t() | nil
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Child3.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Child3.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Child3.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Child3.kind"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Child3.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Child3.name"}
+
+  def decode_sources(value) when is_list(value), do: value
+  def decode_sources(_), do: {:error, "Unexpected type when decoding Child3.sources"}
+
+  def encode_sources(value) when is_list(value), do: value
+  def encode_sources(_), do: {:error, "Unexpected type when encoding Child3.sources"}
+
   def from_map(m) do
     %Child3{
       comment: m["comment"] && Comment1.from_map(m["comment"]),
       default_value: m["defaultValue"],
       flags: Flags1.from_map(m["flags"]),
-      id: m["id"],
-      kind: m["kind"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
       kind_string: KindString1.decode(m["kindString"]),
-      name: m["name"],
+      name: decode_name(m["name"]),
       signatures: m["signatures"] && Enum.map(m["signatures"], &Signature1.from_map/1),
       sources: Enum.map(m["sources"], &Source.from_map/1),
       type: m["type"] && TypeElement.from_map(m["type"]),
@@ -1301,10 +1517,22 @@ defmodule Tag do
           text: String.t()
         }
 
+  def decode_tag(value) when is_binary(value), do: value
+  def decode_tag(_), do: {:error, "Unexpected type when decoding Tag.tag"}
+
+  def encode_tag(value) when is_binary(value), do: value
+  def encode_tag(_), do: {:error, "Unexpected type when encoding Tag.tag"}
+
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Tag.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Tag.text"}
+
   def from_map(m) do
     %Tag{
-      tag: m["tag"],
-      text: m["text"],
+      tag: decode_tag(m["tag"]),
+      text: decode_text(m["text"]),
     }
   end
 
@@ -1431,11 +1659,17 @@ defmodule ExtendedBy do
           type_arguments: [ExtendedBy.t()] | nil
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding ExtendedBy.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding ExtendedBy.name"}
+
   def from_map(m) do
     %ExtendedBy{
       constraint: m["constraint"] && ExtendedBy.from_map(m["constraint"]),
       id: m["id"],
-      name: m["name"],
+      name: decode_name(m["name"]),
       type: TypeEnum.decode(m["type"]),
       type_arguments: m["typeArguments"] && Enum.map(m["typeArguments"], &ExtendedBy.from_map/1),
     }
@@ -1567,14 +1801,32 @@ defmodule Parameter1 do
           type: Type4.t()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Parameter1.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Parameter1.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Parameter1.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Parameter1.kind"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Parameter1.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Parameter1.name"}
+
   def from_map(m) do
     %Parameter1{
       comment: m["comment"] && Comment3.from_map(m["comment"]),
       flags: GetSignatureFlags.from_map(m["flags"]),
-      id: m["id"],
-      kind: m["kind"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
       kind_string: ParameterKindString.decode(m["kindString"]),
-      name: m["name"],
+      name: decode_name(m["name"]),
       type: Type4.from_map(m["type"]),
     }
   end
@@ -1623,16 +1875,34 @@ defmodule Signature2 do
           type_parameter: [GetSignature.t()] | nil
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Signature2.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Signature2.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Signature2.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Signature2.kind"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Signature2.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Signature2.name"}
+
   def from_map(m) do
     %Signature2{
       comment: m["comment"] && Comment4.from_map(m["comment"]),
       flags: Flags5.from_map(m["flags"]),
-      id: m["id"],
+      id: decode_id(m["id"]),
       implementation_of: m["implementationOf"] && ExtendedBy.from_map(m["implementationOf"]),
       inherited_from: m["inheritedFrom"] && ExtendedBy.from_map(m["inheritedFrom"]),
-      kind: m["kind"],
+      kind: decode_kind(m["kind"]),
       kind_string: SignatureKindString.decode(m["kindString"]),
-      name: m["name"],
+      name: decode_name(m["name"]),
       overwrites: m["overwrites"] && ExtendedBy.from_map(m["overwrites"]),
       parameters: m["parameters"] && Enum.map(m["parameters"], &Parameter1.from_map/1),
       type: ExtendedBy.from_map(m["type"]),
@@ -1727,14 +1997,38 @@ defmodule Child4 do
           type: Type6.t()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Child4.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Child4.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Child4.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Child4.kind"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Child4.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Child4.name"}
+
+  def decode_sources(value) when is_list(value), do: value
+  def decode_sources(_), do: {:error, "Unexpected type when decoding Child4.sources"}
+
+  def encode_sources(value) when is_list(value), do: value
+  def encode_sources(_), do: {:error, "Unexpected type when encoding Child4.sources"}
+
   def from_map(m) do
     %Child4{
       comment: m["comment"] && Comment2.from_map(m["comment"]),
       flags: Flags2.from_map(m["flags"]),
-      id: m["id"],
-      kind: m["kind"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
       kind_string: KindString1.decode(m["kindString"]),
-      name: m["name"],
+      name: decode_name(m["name"]),
       sources: Enum.map(m["sources"], &Source.from_map/1),
       type: Type6.from_map(m["type"]),
     }
@@ -1816,13 +2110,43 @@ defmodule IndexSignature do
           type: Type7.t()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding IndexSignature.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding IndexSignature.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding IndexSignature.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding IndexSignature.kind"}
+
+  def decode_kind_string(value) when is_binary(value), do: value
+  def decode_kind_string(_), do: {:error, "Unexpected type when decoding IndexSignature.kind_string"}
+
+  def encode_kind_string(value) when is_binary(value), do: value
+  def encode_kind_string(_), do: {:error, "Unexpected type when encoding IndexSignature.kind_string"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding IndexSignature.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding IndexSignature.name"}
+
+  def decode_parameters(value) when is_list(value), do: value
+  def decode_parameters(_), do: {:error, "Unexpected type when decoding IndexSignature.parameters"}
+
+  def encode_parameters(value) when is_list(value), do: value
+  def encode_parameters(_), do: {:error, "Unexpected type when encoding IndexSignature.parameters"}
+
   def from_map(m) do
     %IndexSignature{
       flags: GetSignatureFlags.from_map(m["flags"]),
-      id: m["id"],
-      kind: m["kind"],
-      kind_string: m["kindString"],
-      name: m["name"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
+      kind_string: decode_kind_string(m["kindString"]),
+      name: decode_name(m["name"]),
       parameters: Enum.map(m["parameters"], &GetSignature.from_map/1),
       type: Type7.from_map(m["type"]),
     }
@@ -1862,10 +2186,22 @@ defmodule Comment5 do
           short_text: String.t()
         }
 
+  def decode_returns(value) when is_binary(value), do: value
+  def decode_returns(_), do: {:error, "Unexpected type when decoding Comment5.returns"}
+
+  def encode_returns(value) when is_binary(value), do: value
+  def encode_returns(_), do: {:error, "Unexpected type when encoding Comment5.returns"}
+
+  def decode_short_text(value) when is_binary(value), do: value
+  def decode_short_text(_), do: {:error, "Unexpected type when decoding Comment5.short_text"}
+
+  def encode_short_text(value) when is_binary(value), do: value
+  def encode_short_text(_), do: {:error, "Unexpected type when encoding Comment5.short_text"}
+
   def from_map(m) do
     %Comment5{
-      returns: m["returns"],
-      short_text: m["shortText"],
+      returns: decode_returns(m["returns"]),
+      short_text: decode_short_text(m["shortText"]),
     }
   end
 
@@ -1904,14 +2240,38 @@ defmodule Parameter2 do
           type: ElementType.t()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Parameter2.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Parameter2.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Parameter2.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Parameter2.kind"}
+
+  def decode_kind_string(value) when is_binary(value), do: value
+  def decode_kind_string(_), do: {:error, "Unexpected type when decoding Parameter2.kind_string"}
+
+  def encode_kind_string(value) when is_binary(value), do: value
+  def encode_kind_string(_), do: {:error, "Unexpected type when encoding Parameter2.kind_string"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Parameter2.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Parameter2.name"}
+
   def from_map(m) do
     %Parameter2{
       comment: m["comment"] && Comment2.from_map(m["comment"]),
       flags: Flags2.from_map(m["flags"]),
-      id: m["id"],
-      kind: m["kind"],
-      kind_string: m["kindString"],
-      name: m["name"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
+      kind_string: decode_kind_string(m["kindString"]),
+      name: decode_name(m["name"]),
       sources: m["sources"] && Enum.map(m["sources"], &Source.from_map/1),
       type: ElementType.from_map(m["type"]),
     }
@@ -1958,14 +2318,32 @@ defmodule Signature3 do
           type: ExtendedBy.t()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Signature3.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Signature3.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Signature3.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Signature3.kind"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Signature3.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Signature3.name"}
+
   def from_map(m) do
     %Signature3{
       comment: m["comment"] && Comment5.from_map(m["comment"]),
       flags: GetSignatureFlags.from_map(m["flags"]),
-      id: m["id"],
-      kind: m["kind"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
       kind_string: SignatureKindString.decode(m["kindString"]),
-      name: m["name"],
+      name: decode_name(m["name"]),
       parameters: m["parameters"] && Enum.map(m["parameters"], &Parameter2.from_map/1),
       type: ExtendedBy.from_map(m["type"]),
     }
@@ -2014,16 +2392,46 @@ defmodule Declaration2 do
           sources: [Source.t()]
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Declaration2.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Declaration2.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Declaration2.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Declaration2.kind"}
+
+  def decode_kind_string(value) when is_binary(value), do: value
+  def decode_kind_string(_), do: {:error, "Unexpected type when decoding Declaration2.kind_string"}
+
+  def encode_kind_string(value) when is_binary(value), do: value
+  def encode_kind_string(_), do: {:error, "Unexpected type when encoding Declaration2.kind_string"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Declaration2.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Declaration2.name"}
+
+  def decode_sources(value) when is_list(value), do: value
+  def decode_sources(_), do: {:error, "Unexpected type when decoding Declaration2.sources"}
+
+  def encode_sources(value) when is_list(value), do: value
+  def encode_sources(_), do: {:error, "Unexpected type when encoding Declaration2.sources"}
+
   def from_map(m) do
     %Declaration2{
       children: m["children"] && Enum.map(m["children"], &Child4.from_map/1),
       flags: GetSignatureFlags.from_map(m["flags"]),
       groups: m["groups"] && Enum.map(m["groups"], &Group.from_map/1),
-      id: m["id"],
+      id: decode_id(m["id"]),
       index_signature: m["indexSignature"] && IndexSignature.from_map(m["indexSignature"]),
-      kind: m["kind"],
-      kind_string: m["kindString"],
-      name: m["name"],
+      kind: decode_kind(m["kind"]),
+      kind_string: decode_kind_string(m["kindString"]),
+      name: decode_name(m["name"]),
       signatures: m["signatures"] && Enum.map(m["signatures"], &Signature3.from_map/1),
       sources: Enum.map(m["sources"], &Source.from_map/1),
     }
@@ -2067,11 +2475,23 @@ defmodule TypeArgument1 do
           type: String.t()
         }
 
+  def decode_operator(value) when is_binary(value), do: value
+  def decode_operator(_), do: {:error, "Unexpected type when decoding TypeArgument1.operator"}
+
+  def encode_operator(value) when is_binary(value), do: value
+  def encode_operator(_), do: {:error, "Unexpected type when encoding TypeArgument1.operator"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding TypeArgument1.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding TypeArgument1.type"}
+
   def from_map(m) do
     %TypeArgument1{
-      operator: m["operator"],
+      operator: decode_operator(m["operator"]),
       target: ElementType.from_map(m["target"]),
-      type: m["type"],
+      type: decode_type(m["type"]),
     }
   end
 
@@ -2177,6 +2597,30 @@ defmodule Child2 do
           type: Type5.t() | nil
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Child2.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Child2.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Child2.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Child2.kind"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Child2.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Child2.name"}
+
+  def decode_sources(value) when is_list(value), do: value
+  def decode_sources(_), do: {:error, "Unexpected type when decoding Child2.sources"}
+
+  def encode_sources(value) when is_list(value), do: value
+  def encode_sources(_), do: {:error, "Unexpected type when encoding Child2.sources"}
+
   def from_map(m) do
     %Child2{
       children: m["children"] && Enum.map(m["children"], &Child3.from_map/1),
@@ -2185,12 +2629,12 @@ defmodule Child2 do
       flags: Flags4.from_map(m["flags"]),
       get_signature: m["getSignature"] && GetSignature.from_map(m["getSignature"]),
       groups: m["groups"] && Enum.map(m["groups"], &Group.from_map/1),
-      id: m["id"],
+      id: decode_id(m["id"]),
       implementation_of: m["implementationOf"] && ExtendedBy.from_map(m["implementationOf"]),
       inherited_from: m["inheritedFrom"] && ExtendedBy.from_map(m["inheritedFrom"]),
-      kind: m["kind"],
+      kind: decode_kind(m["kind"]),
       kind_string: KindString1.decode(m["kindString"]),
-      name: m["name"],
+      name: decode_name(m["name"]),
       overwrites: m["overwrites"] && ExtendedBy.from_map(m["overwrites"]),
       set_signature: m["setSignature"] && GetSignature.from_map(m["setSignature"]),
       signatures: m["signatures"] && Enum.map(m["signatures"], &Signature2.from_map/1),
@@ -2352,15 +2796,39 @@ defmodule Child5 do
           type: Type6.t()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Child5.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Child5.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Child5.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Child5.kind"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Child5.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Child5.name"}
+
+  def decode_sources(value) when is_list(value), do: value
+  def decode_sources(_), do: {:error, "Unexpected type when decoding Child5.sources"}
+
+  def encode_sources(value) when is_list(value), do: value
+  def encode_sources(_), do: {:error, "Unexpected type when encoding Child5.sources"}
+
   def from_map(m) do
     %Child5{
       comment: Comment2.from_map(m["comment"]),
       default_value: m["defaultValue"],
       flags: Flags2.from_map(m["flags"]),
-      id: m["id"],
-      kind: m["kind"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
       kind_string: KindString1.decode(m["kindString"]),
-      name: m["name"],
+      name: decode_name(m["name"]),
       sources: Enum.map(m["sources"], &Source.from_map/1),
       type: Type6.from_map(m["type"]),
     }
@@ -2410,16 +2878,46 @@ defmodule Declaration3 do
           sources: [Source.t()]
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Declaration3.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Declaration3.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Declaration3.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Declaration3.kind"}
+
+  def decode_kind_string(value) when is_binary(value), do: value
+  def decode_kind_string(_), do: {:error, "Unexpected type when decoding Declaration3.kind_string"}
+
+  def encode_kind_string(value) when is_binary(value), do: value
+  def encode_kind_string(_), do: {:error, "Unexpected type when encoding Declaration3.kind_string"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Declaration3.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Declaration3.name"}
+
+  def decode_sources(value) when is_list(value), do: value
+  def decode_sources(_), do: {:error, "Unexpected type when decoding Declaration3.sources"}
+
+  def encode_sources(value) when is_list(value), do: value
+  def encode_sources(_), do: {:error, "Unexpected type when encoding Declaration3.sources"}
+
   def from_map(m) do
     %Declaration3{
       children: m["children"] && Enum.map(m["children"], &Child5.from_map/1),
       flags: GetSignatureFlags.from_map(m["flags"]),
       groups: m["groups"] && Enum.map(m["groups"], &Group.from_map/1),
-      id: m["id"],
+      id: decode_id(m["id"]),
       index_signature: m["indexSignature"] && IndexSignatureElement.from_map(m["indexSignature"]),
-      kind: m["kind"],
-      kind_string: m["kindString"],
-      name: m["name"],
+      kind: decode_kind(m["kind"]),
+      kind_string: decode_kind_string(m["kindString"]),
+      name: decode_name(m["name"]),
       signatures: m["signatures"] && Enum.map(m["signatures"], &GetSignature.from_map/1),
       sources: Enum.map(m["sources"], &Source.from_map/1),
     }
@@ -2517,15 +3015,33 @@ defmodule Parameter3 do
           type: Type8.t()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Parameter3.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Parameter3.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Parameter3.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Parameter3.kind"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Parameter3.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Parameter3.name"}
+
   def from_map(m) do
     %Parameter3{
       comment: m["comment"] && Comment3.from_map(m["comment"]),
       default_value: m["defaultValue"],
       flags: Flags3.from_map(m["flags"]),
-      id: m["id"],
-      kind: m["kind"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
       kind_string: ParameterKindString.decode(m["kindString"]),
-      name: m["name"],
+      name: decode_name(m["name"]),
       original_name: m["originalName"],
       type: Type8.from_map(m["type"]),
     }
@@ -2619,14 +3135,32 @@ defmodule Signature4 do
           type_parameter: [GetSignature.t()] | nil
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Signature4.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Signature4.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Signature4.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Signature4.kind"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Signature4.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Signature4.name"}
+
   def from_map(m) do
     %Signature4{
       comment: Comment4.from_map(m["comment"]),
       flags: Flags5.from_map(m["flags"]),
-      id: m["id"],
-      kind: m["kind"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
       kind_string: SignatureKindString.decode(m["kindString"]),
-      name: m["name"],
+      name: decode_name(m["name"]),
       parameters: m["parameters"] && Enum.map(m["parameters"], &Parameter3.from_map/1),
       type: Type9.from_map(m["type"]),
       type_parameter: m["typeParameter"] && Enum.map(m["typeParameter"], &GetSignature.from_map/1),
@@ -2676,15 +3210,45 @@ defmodule Declaration5 do
           sources: [Source.t()]
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Declaration5.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Declaration5.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Declaration5.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Declaration5.kind"}
+
+  def decode_kind_string(value) when is_binary(value), do: value
+  def decode_kind_string(_), do: {:error, "Unexpected type when decoding Declaration5.kind_string"}
+
+  def encode_kind_string(value) when is_binary(value), do: value
+  def encode_kind_string(_), do: {:error, "Unexpected type when encoding Declaration5.kind_string"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Declaration5.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Declaration5.name"}
+
+  def decode_sources(value) when is_list(value), do: value
+  def decode_sources(_), do: {:error, "Unexpected type when decoding Declaration5.sources"}
+
+  def encode_sources(value) when is_list(value), do: value
+  def encode_sources(_), do: {:error, "Unexpected type when encoding Declaration5.sources"}
+
   def from_map(m) do
     %Declaration5{
       children: m["children"] && Enum.map(m["children"], &GetSignature.from_map/1),
       flags: GetSignatureFlags.from_map(m["flags"]),
       groups: m["groups"] && Enum.map(m["groups"], &Group.from_map/1),
-      id: m["id"],
-      kind: m["kind"],
-      kind_string: m["kindString"],
-      name: m["name"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
+      kind_string: decode_kind_string(m["kindString"]),
+      name: decode_name(m["name"]),
       signatures: m["signatures"] && Enum.map(m["signatures"], &GetSignature.from_map/1),
       sources: Enum.map(m["sources"], &Source.from_map/1),
     }
@@ -2770,13 +3334,37 @@ defmodule Child6 do
           type: Type11.t()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Child6.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Child6.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Child6.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Child6.kind"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Child6.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Child6.name"}
+
+  def decode_sources(value) when is_list(value), do: value
+  def decode_sources(_), do: {:error, "Unexpected type when decoding Child6.sources"}
+
+  def encode_sources(value) when is_list(value), do: value
+  def encode_sources(_), do: {:error, "Unexpected type when encoding Child6.sources"}
+
   def from_map(m) do
     %Child6{
       flags: Flags2.from_map(m["flags"]),
-      id: m["id"],
-      kind: m["kind"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
       kind_string: KindString1.decode(m["kindString"]),
-      name: m["name"],
+      name: decode_name(m["name"]),
       sources: Enum.map(m["sources"], &Source.from_map/1),
       type: Type11.from_map(m["type"]),
     }
@@ -2823,15 +3411,51 @@ defmodule Declaration4 do
           sources: [Source.t()]
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Declaration4.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Declaration4.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Declaration4.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Declaration4.kind"}
+
+  def decode_kind_string(value) when is_binary(value), do: value
+  def decode_kind_string(_), do: {:error, "Unexpected type when decoding Declaration4.kind_string"}
+
+  def encode_kind_string(value) when is_binary(value), do: value
+  def encode_kind_string(_), do: {:error, "Unexpected type when encoding Declaration4.kind_string"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Declaration4.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Declaration4.name"}
+
+  def decode_signatures(value) when is_list(value), do: value
+  def decode_signatures(_), do: {:error, "Unexpected type when decoding Declaration4.signatures"}
+
+  def encode_signatures(value) when is_list(value), do: value
+  def encode_signatures(_), do: {:error, "Unexpected type when encoding Declaration4.signatures"}
+
+  def decode_sources(value) when is_list(value), do: value
+  def decode_sources(_), do: {:error, "Unexpected type when decoding Declaration4.sources"}
+
+  def encode_sources(value) when is_list(value), do: value
+  def encode_sources(_), do: {:error, "Unexpected type when encoding Declaration4.sources"}
+
   def from_map(m) do
     %Declaration4{
       children: m["children"] && Enum.map(m["children"], &Child6.from_map/1),
       flags: GetSignatureFlags.from_map(m["flags"]),
       groups: m["groups"] && Enum.map(m["groups"], &Group.from_map/1),
-      id: m["id"],
-      kind: m["kind"],
-      kind_string: m["kindString"],
-      name: m["name"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
+      kind_string: decode_kind_string(m["kindString"]),
+      name: decode_name(m["name"]),
       signatures: Enum.map(m["signatures"], &GetSignature.from_map/1),
       sources: Enum.map(m["sources"], &Source.from_map/1),
     }
@@ -2873,6 +3497,12 @@ defmodule TypeArgument2 do
           types: [ElementType.t()]
         }
 
+  def decode_types(value) when is_list(value), do: value
+  def decode_types(_), do: {:error, "Unexpected type when decoding TypeArgument2.types"}
+
+  def encode_types(value) when is_list(value), do: value
+  def encode_types(_), do: {:error, "Unexpected type when encoding TypeArgument2.types"}
+
   def from_map(m) do
     %TypeArgument2{
       type: TypeEnum.decode(m["type"]),
@@ -2969,13 +3599,19 @@ defmodule Type12 do
           type: String.t()
         }
 
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Type12.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Type12.type"}
+
   def from_map(m) do
     %Type12{
       id: m["id"],
       name: m["name"] && Name.decode(m["name"]),
       operator: m["operator"],
       target: m["target"] && ElementType.from_map(m["target"]),
-      type: m["type"],
+      type: decode_type(m["type"]),
     }
   end
 
@@ -3016,14 +3652,38 @@ defmodule TypeParameter do
           type: Type12.t() | nil
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TypeParameter.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TypeParameter.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding TypeParameter.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding TypeParameter.kind"}
+
+  def decode_kind_string(value) when is_binary(value), do: value
+  def decode_kind_string(_), do: {:error, "Unexpected type when decoding TypeParameter.kind_string"}
+
+  def encode_kind_string(value) when is_binary(value), do: value
+  def encode_kind_string(_), do: {:error, "Unexpected type when encoding TypeParameter.kind_string"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TypeParameter.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TypeParameter.name"}
+
   def from_map(m) do
     %TypeParameter{
       comment: m["comment"] && Comment1.from_map(m["comment"]),
       flags: GetSignatureFlags.from_map(m["flags"]),
-      id: m["id"],
-      kind: m["kind"],
-      kind_string: m["kindString"],
-      name: m["name"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
+      kind_string: decode_kind_string(m["kindString"]),
+      name: decode_name(m["name"]),
       type: m["type"] && Type12.from_map(m["type"]),
     }
   end
@@ -3077,6 +3737,30 @@ defmodule Child1 do
           type_parameter: [TypeParameter.t()] | nil
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Child1.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Child1.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding Child1.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding Child1.kind"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Child1.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Child1.name"}
+
+  def decode_sources(value) when is_list(value), do: value
+  def decode_sources(_), do: {:error, "Unexpected type when decoding Child1.sources"}
+
+  def encode_sources(value) when is_list(value), do: value
+  def encode_sources(_), do: {:error, "Unexpected type when encoding Child1.sources"}
+
   def from_map(m) do
     %Child1{
       children: m["children"] && Enum.map(m["children"], &Child2.from_map/1),
@@ -3086,12 +3770,12 @@ defmodule Child1 do
       extended_types: m["extendedTypes"] && Enum.map(m["extendedTypes"], &ExtendedBy.from_map/1),
       flags: Flags6.from_map(m["flags"]),
       groups: m["groups"] && Enum.map(m["groups"], &Group.from_map/1),
-      id: m["id"],
+      id: decode_id(m["id"]),
       implemented_by: m["implementedBy"] && Enum.map(m["implementedBy"], &ExtendedBy.from_map/1),
       implemented_types: m["implementedTypes"] && Enum.map(m["implementedTypes"], &ExtendedBy.from_map/1),
-      kind: m["kind"],
+      kind: decode_kind(m["kind"]),
       kind_string: KindString2.decode(m["kindString"]),
-      name: m["name"],
+      name: decode_name(m["name"]),
       signatures: m["signatures"] && Enum.map(m["signatures"], &Signature4.from_map/1),
       sources: Enum.map(m["sources"], &Source.from_map/1),
       type: m["type"] && Type10.from_map(m["type"]),
@@ -3143,9 +3827,15 @@ defmodule Comment6 do
           tags: [Tag.t()] | nil
         }
 
+  def decode_short_text(value) when is_binary(value), do: value
+  def decode_short_text(_), do: {:error, "Unexpected type when decoding Comment6.short_text"}
+
+  def encode_short_text(value) when is_binary(value), do: value
+  def encode_short_text(_), do: {:error, "Unexpected type when encoding Comment6.short_text"}
+
   def from_map(m) do
     %Comment6{
-      short_text: m["shortText"],
+      short_text: decode_short_text(m["shortText"]),
       tags: m["tags"] && Enum.map(m["tags"], &Tag.from_map/1),
     }
   end
@@ -3232,17 +3922,59 @@ defmodule TopLevelChild do
           sources: [Source.t()]
         }
 
+  def decode_children(value) when is_list(value), do: value
+  def decode_children(_), do: {:error, "Unexpected type when decoding TopLevelChild.children"}
+
+  def encode_children(value) when is_list(value), do: value
+  def encode_children(_), do: {:error, "Unexpected type when encoding TopLevelChild.children"}
+
+  def decode_groups(value) when is_list(value), do: value
+  def decode_groups(_), do: {:error, "Unexpected type when decoding TopLevelChild.groups"}
+
+  def encode_groups(value) when is_list(value), do: value
+  def encode_groups(_), do: {:error, "Unexpected type when encoding TopLevelChild.groups"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelChild.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelChild.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding TopLevelChild.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding TopLevelChild.kind"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelChild.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelChild.name"}
+
+  def decode_original_name(value) when is_binary(value), do: value
+  def decode_original_name(_), do: {:error, "Unexpected type when decoding TopLevelChild.original_name"}
+
+  def encode_original_name(value) when is_binary(value), do: value
+  def encode_original_name(_), do: {:error, "Unexpected type when encoding TopLevelChild.original_name"}
+
+  def decode_sources(value) when is_list(value), do: value
+  def decode_sources(_), do: {:error, "Unexpected type when decoding TopLevelChild.sources"}
+
+  def encode_sources(value) when is_list(value), do: value
+  def encode_sources(_), do: {:error, "Unexpected type when encoding TopLevelChild.sources"}
+
   def from_map(m) do
     %TopLevelChild{
       children: Enum.map(m["children"], &Child1.from_map/1),
       comment: m["comment"] && Comment6.from_map(m["comment"]),
       flags: Flags1.from_map(m["flags"]),
       groups: Enum.map(m["groups"], &Group.from_map/1),
-      id: m["id"],
-      kind: m["kind"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
       kind_string: KindString3.decode(m["kindString"]),
-      name: m["name"],
-      original_name: m["originalName"],
+      name: decode_name(m["name"]),
+      original_name: decode_original_name(m["originalName"]),
       sources: Enum.map(m["sources"], &Source.from_map/1),
     }
   end
@@ -3288,14 +4020,44 @@ defmodule TopLevel do
           name: String.t()
         }
 
+  def decode_children(value) when is_list(value), do: value
+  def decode_children(_), do: {:error, "Unexpected type when decoding TopLevel.children"}
+
+  def encode_children(value) when is_list(value), do: value
+  def encode_children(_), do: {:error, "Unexpected type when encoding TopLevel.children"}
+
+  def decode_groups(value) when is_list(value), do: value
+  def decode_groups(_), do: {:error, "Unexpected type when decoding TopLevel.groups"}
+
+  def encode_groups(value) when is_list(value), do: value
+  def encode_groups(_), do: {:error, "Unexpected type when encoding TopLevel.groups"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevel.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevel.id"}
+
+  def decode_kind(value) when is_integer(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding TopLevel.kind"}
+
+  def encode_kind(value) when is_integer(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding TopLevel.kind"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
   def from_map(m) do
     %TopLevel{
       children: Enum.map(m["children"], &TopLevelChild.from_map/1),
       flags: GetSignatureFlags.from_map(m["flags"]),
       groups: Enum.map(m["groups"], &Group.from_map/1),
-      id: m["id"],
-      kind: m["kind"],
-      name: m["name"],
+      id: decode_id(m["id"]),
+      kind: decode_kind(m["kind"]),
+      name: decode_name(m["name"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/bug790.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/bug790.json/default/QuickType.ex
index 9e014b3..913751f 100644
--- a/base/elixir/test/inputs/json/priority/bug790.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/bug790.json/default/QuickType.ex
@@ -20,16 +20,64 @@ defmodule TopLevel do
           product_count: integer()
         }
 
+  def decode_children_data(value) when is_list(value), do: value
+  def decode_children_data(_), do: {:error, "Unexpected type when decoding TopLevel.children_data"}
+
+  def encode_children_data(value) when is_list(value), do: value
+  def encode_children_data(_), do: {:error, "Unexpected type when encoding TopLevel.children_data"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevel.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevel.id"}
+
+  def decode_is_active(value) when is_boolean(value), do: value
+  def decode_is_active(_), do: {:error, "Unexpected type when decoding TopLevel.is_active"}
+
+  def encode_is_active(value) when is_boolean(value), do: value
+  def encode_is_active(_), do: {:error, "Unexpected type when encoding TopLevel.is_active"}
+
+  def decode_level(value) when is_integer(value), do: value
+  def decode_level(_), do: {:error, "Unexpected type when decoding TopLevel.level"}
+
+  def encode_level(value) when is_integer(value), do: value
+  def encode_level(_), do: {:error, "Unexpected type when encoding TopLevel.level"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_parent_id(value) when is_integer(value), do: value
+  def decode_parent_id(_), do: {:error, "Unexpected type when decoding TopLevel.parent_id"}
+
+  def encode_parent_id(value) when is_integer(value), do: value
+  def encode_parent_id(_), do: {:error, "Unexpected type when encoding TopLevel.parent_id"}
+
+  def decode_position(value) when is_integer(value), do: value
+  def decode_position(_), do: {:error, "Unexpected type when decoding TopLevel.position"}
+
+  def encode_position(value) when is_integer(value), do: value
+  def encode_position(_), do: {:error, "Unexpected type when encoding TopLevel.position"}
+
+  def decode_product_count(value) when is_integer(value), do: value
+  def decode_product_count(_), do: {:error, "Unexpected type when decoding TopLevel.product_count"}
+
+  def encode_product_count(value) when is_integer(value), do: value
+  def encode_product_count(_), do: {:error, "Unexpected type when encoding TopLevel.product_count"}
+
   def from_map(m) do
     %TopLevel{
       children_data: Enum.map(m["children_data"], &TopLevel.from_map/1),
-      id: m["id"],
-      is_active: m["is_active"],
-      level: m["level"],
-      name: m["name"],
-      parent_id: m["parent_id"],
-      position: m["position"],
-      product_count: m["product_count"],
+      id: decode_id(m["id"]),
+      is_active: decode_is_active(m["is_active"]),
+      level: decode_level(m["level"]),
+      name: decode_name(m["name"]),
+      parent_id: decode_parent_id(m["parent_id"]),
+      position: decode_position(m["position"]),
+      product_count: decode_product_count(m["product_count"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/bug855-short.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/bug855-short.json/default/QuickType.ex
index d273895..7c3ed40 100644
--- a/base/elixir/test/inputs/json/priority/bug855-short.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/bug855-short.json/default/QuickType.ex
@@ -17,13 +17,43 @@ defmodule TopLevelValue do
           id: integer()
         }
 
+  def decode_channel_id(value) when is_binary(value), do: value
+  def decode_channel_id(_), do: {:error, "Unexpected type when decoding TopLevelValue.channel_id"}
+
+  def encode_channel_id(value) when is_binary(value), do: value
+  def encode_channel_id(_), do: {:error, "Unexpected type when encoding TopLevelValue.channel_id"}
+
+  def decode_channel_name(value) when is_binary(value), do: value
+  def decode_channel_name(_), do: {:error, "Unexpected type when decoding TopLevelValue.channel_name"}
+
+  def encode_channel_name(value) when is_binary(value), do: value
+  def encode_channel_name(_), do: {:error, "Unexpected type when encoding TopLevelValue.channel_name"}
+
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding TopLevelValue.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding TopLevelValue.code"}
+
+  def decode_emoticon_set(value) when is_integer(value), do: value
+  def decode_emoticon_set(_), do: {:error, "Unexpected type when decoding TopLevelValue.emoticon_set"}
+
+  def encode_emoticon_set(value) when is_integer(value), do: value
+  def encode_emoticon_set(_), do: {:error, "Unexpected type when encoding TopLevelValue.emoticon_set"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelValue.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelValue.id"}
+
   def from_map(m) do
     %TopLevelValue{
-      channel_id: m["channel_id"],
-      channel_name: m["channel_name"],
-      code: m["code"],
-      emoticon_set: m["emoticon_set"],
-      id: m["id"],
+      channel_id: decode_channel_id(m["channel_id"]),
+      channel_name: decode_channel_name(m["channel_name"]),
+      code: decode_code(m["code"]),
+      emoticon_set: decode_emoticon_set(m["emoticon_set"]),
+      id: decode_id(m["id"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/bug863.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/bug863.json/default/QuickType.ex
index ba2c3ef..71c74ec 100644
--- a/base/elixir/test/inputs/json/priority/bug863.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/bug863.json/default/QuickType.ex
@@ -309,23 +309,89 @@ defmodule TopLevel1 do
           sex: Sex.t()
         }
 
+  def decode_alienlevel(value) when is_integer(value), do: value
+  def decode_alienlevel(_), do: {:error, "Unexpected type when decoding TopLevel1.alienlevel"}
+
+  def encode_alienlevel(value) when is_integer(value), do: value
+  def encode_alienlevel(_), do: {:error, "Unexpected type when encoding TopLevel1.alienlevel"}
+
+  def decode_char_dimension(value) when is_integer(value), do: value
+  def decode_char_dimension(_), do: {:error, "Unexpected type when decoding TopLevel1.char_dimension"}
+
+  def encode_char_dimension(value) when is_integer(value), do: value
+  def encode_char_dimension(_), do: {:error, "Unexpected type when encoding TopLevel1.char_dimension"}
+
+  def decode_char_instance(value) when is_integer(value), do: value
+  def decode_char_instance(_), do: {:error, "Unexpected type when decoding TopLevel1.char_instance"}
+
+  def encode_char_instance(value) when is_integer(value), do: value
+  def encode_char_instance(_), do: {:error, "Unexpected type when encoding TopLevel1.char_instance"}
+
+  def decode_defender_rank_title(value) when is_binary(value), do: value
+  def decode_defender_rank_title(_), do: {:error, "Unexpected type when decoding TopLevel1.defender_rank_title"}
+
+  def encode_defender_rank_title(value) when is_binary(value), do: value
+  def encode_defender_rank_title(_), do: {:error, "Unexpected type when encoding TopLevel1.defender_rank_title"}
+
+  def decode_headid(value) when is_integer(value), do: value
+  def decode_headid(_), do: {:error, "Unexpected type when decoding TopLevel1.headid"}
+
+  def encode_headid(value) when is_integer(value), do: value
+  def encode_headid(_), do: {:error, "Unexpected type when encoding TopLevel1.headid"}
+
+  def decode_levelx(value) when is_integer(value), do: value
+  def decode_levelx(_), do: {:error, "Unexpected type when decoding TopLevel1.levelx"}
+
+  def encode_levelx(value) when is_integer(value), do: value
+  def encode_levelx(_), do: {:error, "Unexpected type when encoding TopLevel1.levelx"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel1.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel1.name"}
+
+  def decode_prof(value) when is_binary(value), do: value
+  def decode_prof(_), do: {:error, "Unexpected type when decoding TopLevel1.prof"}
+
+  def encode_prof(value) when is_binary(value), do: value
+  def encode_prof(_), do: {:error, "Unexpected type when encoding TopLevel1.prof"}
+
+  def decode_prof_title(value) when is_binary(value), do: value
+  def decode_prof_title(_), do: {:error, "Unexpected type when decoding TopLevel1.prof_title"}
+
+  def encode_prof_title(value) when is_binary(value), do: value
+  def encode_prof_title(_), do: {:error, "Unexpected type when encoding TopLevel1.prof_title"}
+
+  def decode_pvprating(value) when is_integer(value), do: value
+  def decode_pvprating(_), do: {:error, "Unexpected type when decoding TopLevel1.pvprating"}
+
+  def encode_pvprating(value) when is_integer(value), do: value
+  def encode_pvprating(_), do: {:error, "Unexpected type when encoding TopLevel1.pvprating"}
+
+  def decode_rank(value) when is_integer(value), do: value
+  def decode_rank(_), do: {:error, "Unexpected type when decoding TopLevel1.rank"}
+
+  def encode_rank(value) when is_integer(value), do: value
+  def encode_rank(_), do: {:error, "Unexpected type when encoding TopLevel1.rank"}
+
   def from_map(m) do
     %TopLevel1{
-      alienlevel: m["ALIENLEVEL"],
+      alienlevel: decode_alienlevel(m["ALIENLEVEL"]),
       breed: Breed.decode(m["BREED"]),
-      char_dimension: m["CHAR_DIMENSION"],
-      char_instance: m["CHAR_INSTANCE"],
-      defender_rank_title: m["DEFENDER_RANK_TITLE"],
+      char_dimension: decode_char_dimension(m["CHAR_DIMENSION"]),
+      char_instance: decode_char_instance(m["CHAR_INSTANCE"]),
+      defender_rank_title: decode_defender_rank_title(m["DEFENDER_RANK_TITLE"]),
       firstname: Firstname.decode(m["FIRSTNAME"]),
-      headid: m["HEADID"],
+      headid: decode_headid(m["HEADID"]),
       lastname: Lastname.decode(m["LASTNAME"]),
-      levelx: m["LEVELX"],
-      name: m["NAME"],
-      prof: m["PROF"],
-      prof_title: m["PROF_TITLE"],
-      pvprating: m["PVPRATING"],
+      levelx: decode_levelx(m["LEVELX"]),
+      name: decode_name(m["NAME"]),
+      prof: decode_prof(m["PROF"]),
+      prof_title: decode_prof_title(m["PROF_TITLE"]),
+      pvprating: decode_pvprating(m["PVPRATING"]),
       pvptitle: Pvptitle.decode(m["PVPTITLE"]),
-      rank: m["RANK"],
+      rank: decode_rank(m["RANK"]),
       rank_title: RankTitle.decode(m["RANK_TITLE"]),
       sex: Sex.decode(m["SEX"]),
     }
@@ -408,43 +474,255 @@ defmodule TopLevel2 do
           tradercount: integer()
         }
 
+  def decode_adventurercount(value) when is_integer(value), do: value
+  def decode_adventurercount(_), do: {:error, "Unexpected type when decoding TopLevel2.adventurercount"}
+
+  def encode_adventurercount(value) when is_integer(value), do: value
+  def encode_adventurercount(_), do: {:error, "Unexpected type when encoding TopLevel2.adventurercount"}
+
+  def decode_agentcount(value) when is_integer(value), do: value
+  def decode_agentcount(_), do: {:error, "Unexpected type when decoding TopLevel2.agentcount"}
+
+  def encode_agentcount(value) when is_integer(value), do: value
+  def encode_agentcount(_), do: {:error, "Unexpected type when encoding TopLevel2.agentcount"}
+
+  def decode_atroxcount(value) when is_integer(value), do: value
+  def decode_atroxcount(_), do: {:error, "Unexpected type when decoding TopLevel2.atroxcount"}
+
+  def encode_atroxcount(value) when is_integer(value), do: value
+  def encode_atroxcount(_), do: {:error, "Unexpected type when encoding TopLevel2.atroxcount"}
+
+  def decode_avglvl(value) when is_float(value), do: value
+  def decode_avglvl(value) when is_integer(value), do: value
+  def decode_avglvl(_), do: {:error, "Unexpected type when decoding TopLevel2.avglvl"}
+
+  def encode_avglvl(value) when is_float(value), do: value
+  def encode_avglvl(value) when is_integer(value), do: value
+  def encode_avglvl(_), do: {:error, "Unexpected type when encoding TopLevel2.avglvl"}
+
+  def decode_btcount(value) when is_integer(value), do: value
+  def decode_btcount(_), do: {:error, "Unexpected type when decoding TopLevel2.btcount"}
+
+  def encode_btcount(value) when is_integer(value), do: value
+  def encode_btcount(_), do: {:error, "Unexpected type when encoding TopLevel2.btcount"}
+
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding TopLevel2.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding TopLevel2.description"}
+
+  def decode_doctorcount(value) when is_integer(value), do: value
+  def decode_doctorcount(_), do: {:error, "Unexpected type when decoding TopLevel2.doctorcount"}
+
+  def encode_doctorcount(value) when is_integer(value), do: value
+  def encode_doctorcount(_), do: {:error, "Unexpected type when encoding TopLevel2.doctorcount"}
+
+  def decode_enfcount(value) when is_integer(value), do: value
+  def decode_enfcount(_), do: {:error, "Unexpected type when decoding TopLevel2.enfcount"}
+
+  def encode_enfcount(value) when is_integer(value), do: value
+  def encode_enfcount(_), do: {:error, "Unexpected type when encoding TopLevel2.enfcount"}
+
+  def decode_engineeercount(value) when is_integer(value), do: value
+  def decode_engineeercount(_), do: {:error, "Unexpected type when decoding TopLevel2.engineeercount"}
+
+  def encode_engineeercount(value) when is_integer(value), do: value
+  def encode_engineeercount(_), do: {:error, "Unexpected type when encoding TopLevel2.engineeercount"}
+
+  def decode_femalecount(value) when is_integer(value), do: value
+  def decode_femalecount(_), do: {:error, "Unexpected type when decoding TopLevel2.femalecount"}
+
+  def encode_femalecount(value) when is_integer(value), do: value
+  def encode_femalecount(_), do: {:error, "Unexpected type when encoding TopLevel2.femalecount"}
+
+  def decode_fixercount(value) when is_integer(value), do: value
+  def decode_fixercount(_), do: {:error, "Unexpected type when decoding TopLevel2.fixercount"}
+
+  def encode_fixercount(value) when is_integer(value), do: value
+  def encode_fixercount(_), do: {:error, "Unexpected type when encoding TopLevel2.fixercount"}
+
+  def decode_governingname(value) when is_binary(value), do: value
+  def decode_governingname(_), do: {:error, "Unexpected type when decoding TopLevel2.governingname"}
+
+  def encode_governingname(value) when is_binary(value), do: value
+  def encode_governingname(_), do: {:error, "Unexpected type when encoding TopLevel2.governingname"}
+
+  def decode_history(value) when is_binary(value), do: value
+  def decode_history(_), do: {:error, "Unexpected type when decoding TopLevel2.history"}
+
+  def encode_history(value) when is_binary(value), do: value
+  def encode_history(_), do: {:error, "Unexpected type when encoding TopLevel2.history"}
+
+  def decode_keepercount(value) when is_integer(value), do: value
+  def decode_keepercount(_), do: {:error, "Unexpected type when decoding TopLevel2.keepercount"}
+
+  def encode_keepercount(value) when is_integer(value), do: value
+  def encode_keepercount(_), do: {:error, "Unexpected type when encoding TopLevel2.keepercount"}
+
+  def decode_macount(value) when is_integer(value), do: value
+  def decode_macount(_), do: {:error, "Unexpected type when decoding TopLevel2.macount"}
+
+  def encode_macount(value) when is_integer(value), do: value
+  def encode_macount(_), do: {:error, "Unexpected type when encoding TopLevel2.macount"}
+
+  def decode_malecount(value) when is_integer(value), do: value
+  def decode_malecount(_), do: {:error, "Unexpected type when decoding TopLevel2.malecount"}
+
+  def encode_malecount(value) when is_integer(value), do: value
+  def encode_malecount(_), do: {:error, "Unexpected type when encoding TopLevel2.malecount"}
+
+  def decode_maxlvl(value) when is_integer(value), do: value
+  def decode_maxlvl(_), do: {:error, "Unexpected type when decoding TopLevel2.maxlvl"}
+
+  def encode_maxlvl(value) when is_integer(value), do: value
+  def encode_maxlvl(_), do: {:error, "Unexpected type when encoding TopLevel2.maxlvl"}
+
+  def decode_metacount(value) when is_integer(value), do: value
+  def decode_metacount(_), do: {:error, "Unexpected type when decoding TopLevel2.metacount"}
+
+  def encode_metacount(value) when is_integer(value), do: value
+  def encode_metacount(_), do: {:error, "Unexpected type when encoding TopLevel2.metacount"}
+
+  def decode_minlvl(value) when is_integer(value), do: value
+  def decode_minlvl(_), do: {:error, "Unexpected type when decoding TopLevel2.minlvl"}
+
+  def encode_minlvl(value) when is_integer(value), do: value
+  def encode_minlvl(_), do: {:error, "Unexpected type when encoding TopLevel2.minlvl"}
+
+  def decode_monstercount(value) when is_integer(value), do: value
+  def decode_monstercount(_), do: {:error, "Unexpected type when decoding TopLevel2.monstercount"}
+
+  def encode_monstercount(value) when is_integer(value), do: value
+  def encode_monstercount(_), do: {:error, "Unexpected type when encoding TopLevel2.monstercount"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel2.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel2.name"}
+
+  def decode_nanocount(value) when is_integer(value), do: value
+  def decode_nanocount(_), do: {:error, "Unexpected type when decoding TopLevel2.nanocount"}
+
+  def encode_nanocount(value) when is_integer(value), do: value
+  def encode_nanocount(_), do: {:error, "Unexpected type when encoding TopLevel2.nanocount"}
+
+  def decode_nanoracecount(value) when is_integer(value), do: value
+  def decode_nanoracecount(_), do: {:error, "Unexpected type when decoding TopLevel2.nanoracecount"}
+
+  def encode_nanoracecount(value) when is_integer(value), do: value
+  def encode_nanoracecount(_), do: {:error, "Unexpected type when encoding TopLevel2.nanoracecount"}
+
+  def decode_neutercount(value) when is_integer(value), do: value
+  def decode_neutercount(_), do: {:error, "Unexpected type when decoding TopLevel2.neutercount"}
+
+  def encode_neutercount(value) when is_integer(value), do: value
+  def encode_neutercount(_), do: {:error, "Unexpected type when encoding TopLevel2.neutercount"}
+
+  def decode_nummembers(value) when is_integer(value), do: value
+  def decode_nummembers(_), do: {:error, "Unexpected type when decoding TopLevel2.nummembers"}
+
+  def encode_nummembers(value) when is_integer(value), do: value
+  def encode_nummembers(_), do: {:error, "Unexpected type when encoding TopLevel2.nummembers"}
+
+  def decode_objective(value) when is_binary(value), do: value
+  def decode_objective(_), do: {:error, "Unexpected type when decoding TopLevel2.objective"}
+
+  def encode_objective(value) when is_binary(value), do: value
+  def encode_objective(_), do: {:error, "Unexpected type when encoding TopLevel2.objective"}
+
+  def decode_opifexcount(value) when is_integer(value), do: value
+  def decode_opifexcount(_), do: {:error, "Unexpected type when decoding TopLevel2.opifexcount"}
+
+  def encode_opifexcount(value) when is_integer(value), do: value
+  def encode_opifexcount(_), do: {:error, "Unexpected type when encoding TopLevel2.opifexcount"}
+
+  def decode_org_dimension(value) when is_integer(value), do: value
+  def decode_org_dimension(_), do: {:error, "Unexpected type when decoding TopLevel2.org_dimension"}
+
+  def encode_org_dimension(value) when is_integer(value), do: value
+  def encode_org_dimension(_), do: {:error, "Unexpected type when encoding TopLevel2.org_dimension"}
+
+  def decode_org_instance(value) when is_integer(value), do: value
+  def decode_org_instance(_), do: {:error, "Unexpected type when decoding TopLevel2.org_instance"}
+
+  def encode_org_instance(value) when is_integer(value), do: value
+  def encode_org_instance(_), do: {:error, "Unexpected type when encoding TopLevel2.org_instance"}
+
+  def decode_shadecount(value) when is_integer(value), do: value
+  def decode_shadecount(_), do: {:error, "Unexpected type when decoding TopLevel2.shadecount"}
+
+  def encode_shadecount(value) when is_integer(value), do: value
+  def encode_shadecount(_), do: {:error, "Unexpected type when encoding TopLevel2.shadecount"}
+
+  def decode_side(value) when is_integer(value), do: value
+  def decode_side(_), do: {:error, "Unexpected type when decoding TopLevel2.side"}
+
+  def encode_side(value) when is_integer(value), do: value
+  def encode_side(_), do: {:error, "Unexpected type when encoding TopLevel2.side"}
+
+  def decode_side_name(value) when is_binary(value), do: value
+  def decode_side_name(_), do: {:error, "Unexpected type when decoding TopLevel2.side_name"}
+
+  def encode_side_name(value) when is_binary(value), do: value
+  def encode_side_name(_), do: {:error, "Unexpected type when encoding TopLevel2.side_name"}
+
+  def decode_solidercount(value) when is_integer(value), do: value
+  def decode_solidercount(_), do: {:error, "Unexpected type when decoding TopLevel2.solidercount"}
+
+  def encode_solidercount(value) when is_integer(value), do: value
+  def encode_solidercount(_), do: {:error, "Unexpected type when encoding TopLevel2.solidercount"}
+
+  def decode_solituscount(value) when is_integer(value), do: value
+  def decode_solituscount(_), do: {:error, "Unexpected type when decoding TopLevel2.solituscount"}
+
+  def encode_solituscount(value) when is_integer(value), do: value
+  def encode_solituscount(_), do: {:error, "Unexpected type when encoding TopLevel2.solituscount"}
+
+  def decode_tradercount(value) when is_integer(value), do: value
+  def decode_tradercount(_), do: {:error, "Unexpected type when decoding TopLevel2.tradercount"}
+
+  def encode_tradercount(value) when is_integer(value), do: value
+  def encode_tradercount(_), do: {:error, "Unexpected type when encoding TopLevel2.tradercount"}
+
   def from_map(m) do
     %TopLevel2{
-      adventurercount: m["ADVENTURERCOUNT"],
-      agentcount: m["AGENTCOUNT"],
-      atroxcount: m["ATROXCOUNT"],
-      avglvl: m["AVGLVL"],
-      btcount: m["BTCOUNT"],
-      description: m["DESCRIPTION"],
-      doctorcount: m["DOCTORCOUNT"],
-      enfcount: m["ENFCOUNT"],
-      engineeercount: m["ENGINEEERCOUNT"],
-      femalecount: m["FEMALECOUNT"],
-      fixercount: m["FIXERCOUNT"],
-      governingname: m["GOVERNINGNAME"],
-      history: m["HISTORY"],
-      keepercount: m["KEEPERCOUNT"],
-      macount: m["MACOUNT"],
-      malecount: m["MALECOUNT"],
-      maxlvl: m["MAXLVL"],
-      metacount: m["METACOUNT"],
-      minlvl: m["MINLVL"],
-      monstercount: m["MONSTERCOUNT"],
-      name: m["NAME"],
-      nanocount: m["NANOCOUNT"],
-      nanoracecount: m["NANORACECOUNT"],
-      neutercount: m["NEUTERCOUNT"],
-      nummembers: m["NUMMEMBERS"],
-      objective: m["OBJECTIVE"],
-      opifexcount: m["OPIFEXCOUNT"],
-      org_dimension: m["ORG_DIMENSION"],
-      org_instance: m["ORG_INSTANCE"],
-      shadecount: m["SHADECOUNT"],
-      side: m["SIDE"],
-      side_name: m["SIDE_NAME"],
-      solidercount: m["SOLIDERCOUNT"],
-      solituscount: m["SOLITUSCOUNT"],
-      tradercount: m["TRADERCOUNT"],
+      adventurercount: decode_adventurercount(m["ADVENTURERCOUNT"]),
+      agentcount: decode_agentcount(m["AGENTCOUNT"]),
+      atroxcount: decode_atroxcount(m["ATROXCOUNT"]),
+      avglvl: decode_avglvl(m["AVGLVL"]),
+      btcount: decode_btcount(m["BTCOUNT"]),
+      description: decode_description(m["DESCRIPTION"]),
+      doctorcount: decode_doctorcount(m["DOCTORCOUNT"]),
+      enfcount: decode_enfcount(m["ENFCOUNT"]),
+      engineeercount: decode_engineeercount(m["ENGINEEERCOUNT"]),
+      femalecount: decode_femalecount(m["FEMALECOUNT"]),
+      fixercount: decode_fixercount(m["FIXERCOUNT"]),
+      governingname: decode_governingname(m["GOVERNINGNAME"]),
+      history: decode_history(m["HISTORY"]),
+      keepercount: decode_keepercount(m["KEEPERCOUNT"]),
+      macount: decode_macount(m["MACOUNT"]),
+      malecount: decode_malecount(m["MALECOUNT"]),
+      maxlvl: decode_maxlvl(m["MAXLVL"]),
+      metacount: decode_metacount(m["METACOUNT"]),
+      minlvl: decode_minlvl(m["MINLVL"]),
+      monstercount: decode_monstercount(m["MONSTERCOUNT"]),
+      name: decode_name(m["NAME"]),
+      nanocount: decode_nanocount(m["NANOCOUNT"]),
+      nanoracecount: decode_nanoracecount(m["NANORACECOUNT"]),
+      neutercount: decode_neutercount(m["NEUTERCOUNT"]),
+      nummembers: decode_nummembers(m["NUMMEMBERS"]),
+      objective: decode_objective(m["OBJECTIVE"]),
+      opifexcount: decode_opifexcount(m["OPIFEXCOUNT"]),
+      org_dimension: decode_org_dimension(m["ORG_DIMENSION"]),
+      org_instance: decode_org_instance(m["ORG_INSTANCE"]),
+      shadecount: decode_shadecount(m["SHADECOUNT"]),
+      side: decode_side(m["SIDE"]),
+      side_name: decode_side_name(m["SIDE_NAME"]),
+      solidercount: decode_solidercount(m["SOLIDERCOUNT"]),
+      solituscount: decode_solituscount(m["SOLITUSCOUNT"]),
+      tradercount: decode_tradercount(m["TRADERCOUNT"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/coin-pairs.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/coin-pairs.json/default/QuickType.ex
index 7d91aeb..a9d5a91 100644
--- a/base/elixir/test/inputs/json/priority/coin-pairs.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/coin-pairs.json/default/QuickType.ex
@@ -20,16 +20,72 @@ defmodule Pair do
           min_total: float()
         }
 
+  def decode_decimal_places(value) when is_integer(value), do: value
+  def decode_decimal_places(_), do: {:error, "Unexpected type when decoding Pair.decimal_places"}
+
+  def encode_decimal_places(value) when is_integer(value), do: value
+  def encode_decimal_places(_), do: {:error, "Unexpected type when encoding Pair.decimal_places"}
+
+  def decode_fee(value) when is_float(value), do: value
+  def decode_fee(value) when is_integer(value), do: value
+  def decode_fee(_), do: {:error, "Unexpected type when decoding Pair.fee"}
+
+  def encode_fee(value) when is_float(value), do: value
+  def encode_fee(value) when is_integer(value), do: value
+  def encode_fee(_), do: {:error, "Unexpected type when encoding Pair.fee"}
+
+  def decode_hidden(value) when is_integer(value), do: value
+  def decode_hidden(_), do: {:error, "Unexpected type when decoding Pair.hidden"}
+
+  def encode_hidden(value) when is_integer(value), do: value
+  def encode_hidden(_), do: {:error, "Unexpected type when encoding Pair.hidden"}
+
+  def decode_max_amount(value) when is_integer(value), do: value
+  def decode_max_amount(_), do: {:error, "Unexpected type when decoding Pair.max_amount"}
+
+  def encode_max_amount(value) when is_integer(value), do: value
+  def encode_max_amount(_), do: {:error, "Unexpected type when encoding Pair.max_amount"}
+
+  def decode_max_price(value) when is_integer(value), do: value
+  def decode_max_price(_), do: {:error, "Unexpected type when decoding Pair.max_price"}
+
+  def encode_max_price(value) when is_integer(value), do: value
+  def encode_max_price(_), do: {:error, "Unexpected type when encoding Pair.max_price"}
+
+  def decode_min_amount(value) when is_float(value), do: value
+  def decode_min_amount(value) when is_integer(value), do: value
+  def decode_min_amount(_), do: {:error, "Unexpected type when decoding Pair.min_amount"}
+
+  def encode_min_amount(value) when is_float(value), do: value
+  def encode_min_amount(value) when is_integer(value), do: value
+  def encode_min_amount(_), do: {:error, "Unexpected type when encoding Pair.min_amount"}
+
+  def decode_min_price(value) when is_float(value), do: value
+  def decode_min_price(value) when is_integer(value), do: value
+  def decode_min_price(_), do: {:error, "Unexpected type when decoding Pair.min_price"}
+
+  def encode_min_price(value) when is_float(value), do: value
+  def encode_min_price(value) when is_integer(value), do: value
+  def encode_min_price(_), do: {:error, "Unexpected type when encoding Pair.min_price"}
+
+  def decode_min_total(value) when is_float(value), do: value
+  def decode_min_total(value) when is_integer(value), do: value
+  def decode_min_total(_), do: {:error, "Unexpected type when decoding Pair.min_total"}
+
+  def encode_min_total(value) when is_float(value), do: value
+  def encode_min_total(value) when is_integer(value), do: value
+  def encode_min_total(_), do: {:error, "Unexpected type when encoding Pair.min_total"}
+
   def from_map(m) do
     %Pair{
-      decimal_places: m["decimal_places"],
-      fee: m["fee"],
-      hidden: m["hidden"],
-      max_amount: m["max_amount"],
-      max_price: m["max_price"],
-      min_amount: m["min_amount"],
-      min_price: m["min_price"],
-      min_total: m["min_total"],
+      decimal_places: decode_decimal_places(m["decimal_places"]),
+      fee: decode_fee(m["fee"]),
+      hidden: decode_hidden(m["hidden"]),
+      max_amount: decode_max_amount(m["max_amount"]),
+      max_price: decode_max_price(m["max_price"]),
+      min_amount: decode_min_amount(m["min_amount"]),
+      min_price: decode_min_price(m["min_price"]),
+      min_total: decode_min_total(m["min_total"]),
     }
   end
 
@@ -68,10 +124,17 @@ defmodule TopLevel do
           server_time: integer()
         }
 
+  def decode_server_time(value) when is_integer(value), do: value
+  def decode_server_time(_), do: {:error, "Unexpected type when decoding TopLevel.server_time"}
+
+  def encode_server_time(value) when is_integer(value), do: value
+  def encode_server_time(_), do: {:error, "Unexpected type when encoding TopLevel.server_time"}
+
   def from_map(m) do
     %TopLevel{
-      pairs: m["pairs"],
-      server_time: m["server_time"],
+      pairs: m["pairs"]
+      |> Map.new(fn {key, value} -> {key, Pair.from_map(value)} end),
+      server_time: decode_server_time(m["server_time"]),
     }
   end
 
@@ -83,7 +146,8 @@ defmodule TopLevel do
 
   def to_map(struct) do
     %{
-      "pairs" => struct.pairs,
+      "pairs" => struct.pairs
+      |> Map.new(fn {key, value} -> {key, Pair.to_map(value)} end),
       "server_time" => struct.server_time,
     }
   end
diff --git a/base/elixir/test/inputs/json/priority/combinations1.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/combinations1.json/default/QuickType.ex
index a9b467c..b594d36 100644
--- a/base/elixir/test/inputs/json/priority/combinations1.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/combinations1.json/default/QuickType.ex
@@ -32,28 +32,148 @@ defmodule CerographClass do
           unriveting: nil
         }
 
+  def decode_apotropaion(value) when is_nil(value), do: value
+  def decode_apotropaion(_), do: {:error, "Unexpected type when decoding CerographClass.apotropaion"}
+
+  def encode_apotropaion(value) when is_nil(value), do: value
+  def encode_apotropaion(_), do: {:error, "Unexpected type when encoding CerographClass.apotropaion"}
+
+  def decode_casuary(value) when is_nil(value), do: value
+  def decode_casuary(_), do: {:error, "Unexpected type when decoding CerographClass.casuary"}
+
+  def encode_casuary(value) when is_nil(value), do: value
+  def encode_casuary(_), do: {:error, "Unexpected type when encoding CerographClass.casuary"}
+
+  def decode_creaker(value) when is_nil(value), do: value
+  def decode_creaker(_), do: {:error, "Unexpected type when decoding CerographClass.creaker"}
+
+  def encode_creaker(value) when is_nil(value), do: value
+  def encode_creaker(_), do: {:error, "Unexpected type when encoding CerographClass.creaker"}
+
+  def decode_disqualification(value) when is_nil(value), do: value
+  def decode_disqualification(_), do: {:error, "Unexpected type when decoding CerographClass.disqualification"}
+
+  def encode_disqualification(value) when is_nil(value), do: value
+  def encode_disqualification(_), do: {:error, "Unexpected type when encoding CerographClass.disqualification"}
+
+  def decode_imperatorious(value) when is_nil(value), do: value
+  def decode_imperatorious(_), do: {:error, "Unexpected type when decoding CerographClass.imperatorious"}
+
+  def encode_imperatorious(value) when is_nil(value), do: value
+  def encode_imperatorious(_), do: {:error, "Unexpected type when encoding CerographClass.imperatorious"}
+
+  def decode_impermeabilize(value) when is_nil(value), do: value
+  def decode_impermeabilize(_), do: {:error, "Unexpected type when decoding CerographClass.impermeabilize"}
+
+  def encode_impermeabilize(value) when is_nil(value), do: value
+  def encode_impermeabilize(_), do: {:error, "Unexpected type when encoding CerographClass.impermeabilize"}
+
+  def decode_metastoma(value) when is_nil(value), do: value
+  def decode_metastoma(_), do: {:error, "Unexpected type when decoding CerographClass.metastoma"}
+
+  def encode_metastoma(value) when is_nil(value), do: value
+  def encode_metastoma(_), do: {:error, "Unexpected type when encoding CerographClass.metastoma"}
+
+  def decode_noctidiurnal(value) when is_nil(value), do: value
+  def decode_noctidiurnal(_), do: {:error, "Unexpected type when decoding CerographClass.noctidiurnal"}
+
+  def encode_noctidiurnal(value) when is_nil(value), do: value
+  def encode_noctidiurnal(_), do: {:error, "Unexpected type when encoding CerographClass.noctidiurnal"}
+
+  def decode_nonreserve(value) when is_nil(value), do: value
+  def decode_nonreserve(_), do: {:error, "Unexpected type when decoding CerographClass.nonreserve"}
+
+  def encode_nonreserve(value) when is_nil(value), do: value
+  def encode_nonreserve(_), do: {:error, "Unexpected type when encoding CerographClass.nonreserve"}
+
+  def decode_ophthalmotonometry(value) when is_nil(value), do: value
+  def decode_ophthalmotonometry(_), do: {:error, "Unexpected type when decoding CerographClass.ophthalmotonometry"}
+
+  def encode_ophthalmotonometry(value) when is_nil(value), do: value
+  def encode_ophthalmotonometry(_), do: {:error, "Unexpected type when encoding CerographClass.ophthalmotonometry"}
+
+  def decode_pailful(value) when is_nil(value), do: value
+  def decode_pailful(_), do: {:error, "Unexpected type when decoding CerographClass.pailful"}
+
+  def encode_pailful(value) when is_nil(value), do: value
+  def encode_pailful(_), do: {:error, "Unexpected type when encoding CerographClass.pailful"}
+
+  def decode_pigfish(value) when is_nil(value), do: value
+  def decode_pigfish(_), do: {:error, "Unexpected type when decoding CerographClass.pigfish"}
+
+  def encode_pigfish(value) when is_nil(value), do: value
+  def encode_pigfish(_), do: {:error, "Unexpected type when encoding CerographClass.pigfish"}
+
+  def decode_pongee(value) when is_nil(value), do: value
+  def decode_pongee(_), do: {:error, "Unexpected type when decoding CerographClass.pongee"}
+
+  def encode_pongee(value) when is_nil(value), do: value
+  def encode_pongee(_), do: {:error, "Unexpected type when encoding CerographClass.pongee"}
+
+  def decode_prosodical(value) when is_nil(value), do: value
+  def decode_prosodical(_), do: {:error, "Unexpected type when decoding CerographClass.prosodical"}
+
+  def encode_prosodical(value) when is_nil(value), do: value
+  def encode_prosodical(_), do: {:error, "Unexpected type when encoding CerographClass.prosodical"}
+
+  def decode_scrofuloderm(value) when is_nil(value), do: value
+  def decode_scrofuloderm(_), do: {:error, "Unexpected type when decoding CerographClass.scrofuloderm"}
+
+  def encode_scrofuloderm(value) when is_nil(value), do: value
+  def encode_scrofuloderm(_), do: {:error, "Unexpected type when encoding CerographClass.scrofuloderm"}
+
+  def decode_storekeeping(value) when is_nil(value), do: value
+  def decode_storekeeping(_), do: {:error, "Unexpected type when decoding CerographClass.storekeeping"}
+
+  def encode_storekeeping(value) when is_nil(value), do: value
+  def encode_storekeeping(_), do: {:error, "Unexpected type when encoding CerographClass.storekeeping"}
+
+  def decode_therologist(value) when is_nil(value), do: value
+  def decode_therologist(_), do: {:error, "Unexpected type when decoding CerographClass.therologist"}
+
+  def encode_therologist(value) when is_nil(value), do: value
+  def encode_therologist(_), do: {:error, "Unexpected type when encoding CerographClass.therologist"}
+
+  def decode_tolowa(value) when is_nil(value), do: value
+  def decode_tolowa(_), do: {:error, "Unexpected type when decoding CerographClass.tolowa"}
+
+  def encode_tolowa(value) when is_nil(value), do: value
+  def encode_tolowa(_), do: {:error, "Unexpected type when encoding CerographClass.tolowa"}
+
+  def decode_tradeful(value) when is_nil(value), do: value
+  def decode_tradeful(_), do: {:error, "Unexpected type when decoding CerographClass.tradeful"}
+
+  def encode_tradeful(value) when is_nil(value), do: value
+  def encode_tradeful(_), do: {:error, "Unexpected type when encoding CerographClass.tradeful"}
+
+  def decode_unriveting(value) when is_nil(value), do: value
+  def decode_unriveting(_), do: {:error, "Unexpected type when decoding CerographClass.unriveting"}
+
+  def encode_unriveting(value) when is_nil(value), do: value
+  def encode_unriveting(_), do: {:error, "Unexpected type when encoding CerographClass.unriveting"}
+
   def from_map(m) do
     %CerographClass{
-      apotropaion: m["apotropaion"],
-      casuary: m["casuary"],
-      creaker: m["creaker"],
-      disqualification: m["disqualification"],
-      imperatorious: m["imperatorious"],
-      impermeabilize: m["impermeabilize"],
-      metastoma: m["metastoma"],
-      noctidiurnal: m["noctidiurnal"],
-      nonreserve: m["nonreserve"],
-      ophthalmotonometry: m["ophthalmotonometry"],
-      pailful: m["pailful"],
-      pigfish: m["pigfish"],
-      pongee: m["pongee"],
-      prosodical: m["prosodical"],
-      scrofuloderm: m["scrofuloderm"],
-      storekeeping: m["storekeeping"],
-      therologist: m["therologist"],
-      tolowa: m["Tolowa"],
-      tradeful: m["tradeful"],
-      unriveting: m["unriveting"],
+      apotropaion: decode_apotropaion(m["apotropaion"]),
+      casuary: decode_casuary(m["casuary"]),
+      creaker: decode_creaker(m["creaker"]),
+      disqualification: decode_disqualification(m["disqualification"]),
+      imperatorious: decode_imperatorious(m["imperatorious"]),
+      impermeabilize: decode_impermeabilize(m["impermeabilize"]),
+      metastoma: decode_metastoma(m["metastoma"]),
+      noctidiurnal: decode_noctidiurnal(m["noctidiurnal"]),
+      nonreserve: decode_nonreserve(m["nonreserve"]),
+      ophthalmotonometry: decode_ophthalmotonometry(m["ophthalmotonometry"]),
+      pailful: decode_pailful(m["pailful"]),
+      pigfish: decode_pigfish(m["pigfish"]),
+      pongee: decode_pongee(m["pongee"]),
+      prosodical: decode_prosodical(m["prosodical"]),
+      scrofuloderm: decode_scrofuloderm(m["scrofuloderm"]),
+      storekeeping: decode_storekeeping(m["storekeeping"]),
+      therologist: decode_therologist(m["therologist"]),
+      tolowa: decode_tolowa(m["Tolowa"]),
+      tradeful: decode_tradeful(m["tradeful"]),
+      unriveting: decode_unriveting(m["unriveting"]),
     }
   end
 
@@ -211,13 +331,45 @@ defmodule CimeliaClass do
           nonbookish: nil
         }
 
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding CimeliaClass.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding CimeliaClass.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding CimeliaClass.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding CimeliaClass.chirotherium"}
+
+  def decode_disdiapason(value) when is_binary(value), do: value
+  def decode_disdiapason(_), do: {:error, "Unexpected type when decoding CimeliaClass.disdiapason"}
+
+  def encode_disdiapason(value) when is_binary(value), do: value
+  def encode_disdiapason(_), do: {:error, "Unexpected type when encoding CimeliaClass.disdiapason"}
+
+  def decode_homocerc(value) when is_boolean(value), do: value
+  def decode_homocerc(_), do: {:error, "Unexpected type when decoding CimeliaClass.homocerc"}
+
+  def encode_homocerc(value) when is_boolean(value), do: value
+  def encode_homocerc(_), do: {:error, "Unexpected type when encoding CimeliaClass.homocerc"}
+
+  def decode_nonbookish(value) when is_nil(value), do: value
+  def decode_nonbookish(_), do: {:error, "Unexpected type when decoding CimeliaClass.nonbookish"}
+
+  def encode_nonbookish(value) when is_nil(value), do: value
+  def encode_nonbookish(_), do: {:error, "Unexpected type when encoding CimeliaClass.nonbookish"}
+
   def from_map(m) do
     %CimeliaClass{
-      catharticalness: m["catharticalness"],
-      chirotherium: m["Chirotherium"],
-      disdiapason: m["disdiapason"],
-      homocerc: m["homocerc"],
-      nonbookish: m["nonbookish"],
+      catharticalness: decode_catharticalness(m["catharticalness"]),
+      chirotherium: decode_chirotherium(m["Chirotherium"]),
+      disdiapason: decode_disdiapason(m["disdiapason"]),
+      homocerc: decode_homocerc(m["homocerc"]),
+      nonbookish: decode_nonbookish(m["nonbookish"]),
     }
   end
 
@@ -375,28 +527,148 @@ defmodule CredulityClass do
           wharp: nil
         }
 
+  def decode_ammonolytic(value) when is_nil(value), do: value
+  def decode_ammonolytic(_), do: {:error, "Unexpected type when decoding CredulityClass.ammonolytic"}
+
+  def encode_ammonolytic(value) when is_nil(value), do: value
+  def encode_ammonolytic(_), do: {:error, "Unexpected type when encoding CredulityClass.ammonolytic"}
+
+  def decode_bushmaster(value) when is_nil(value), do: value
+  def decode_bushmaster(_), do: {:error, "Unexpected type when decoding CredulityClass.bushmaster"}
+
+  def encode_bushmaster(value) when is_nil(value), do: value
+  def encode_bushmaster(_), do: {:error, "Unexpected type when encoding CredulityClass.bushmaster"}
+
+  def decode_considering(value) when is_nil(value), do: value
+  def decode_considering(_), do: {:error, "Unexpected type when decoding CredulityClass.considering"}
+
+  def encode_considering(value) when is_nil(value), do: value
+  def encode_considering(_), do: {:error, "Unexpected type when encoding CredulityClass.considering"}
+
+  def decode_consuetudinary(value) when is_nil(value), do: value
+  def decode_consuetudinary(_), do: {:error, "Unexpected type when decoding CredulityClass.consuetudinary"}
+
+  def encode_consuetudinary(value) when is_nil(value), do: value
+  def encode_consuetudinary(_), do: {:error, "Unexpected type when encoding CredulityClass.consuetudinary"}
+
+  def decode_embarras(value) when is_nil(value), do: value
+  def decode_embarras(_), do: {:error, "Unexpected type when decoding CredulityClass.embarras"}
+
+  def encode_embarras(value) when is_nil(value), do: value
+  def encode_embarras(_), do: {:error, "Unexpected type when encoding CredulityClass.embarras"}
+
+  def decode_fineness(value) when is_nil(value), do: value
+  def decode_fineness(_), do: {:error, "Unexpected type when decoding CredulityClass.fineness"}
+
+  def encode_fineness(value) when is_nil(value), do: value
+  def encode_fineness(_), do: {:error, "Unexpected type when encoding CredulityClass.fineness"}
+
+  def decode_flaithship(value) when is_nil(value), do: value
+  def decode_flaithship(_), do: {:error, "Unexpected type when decoding CredulityClass.flaithship"}
+
+  def encode_flaithship(value) when is_nil(value), do: value
+  def encode_flaithship(_), do: {:error, "Unexpected type when encoding CredulityClass.flaithship"}
+
+  def decode_flavia(value) when is_nil(value), do: value
+  def decode_flavia(_), do: {:error, "Unexpected type when decoding CredulityClass.flavia"}
+
+  def encode_flavia(value) when is_nil(value), do: value
+  def encode_flavia(_), do: {:error, "Unexpected type when encoding CredulityClass.flavia"}
+
+  def decode_gruffly(value) when is_nil(value), do: value
+  def decode_gruffly(_), do: {:error, "Unexpected type when decoding CredulityClass.gruffly"}
+
+  def encode_gruffly(value) when is_nil(value), do: value
+  def encode_gruffly(_), do: {:error, "Unexpected type when encoding CredulityClass.gruffly"}
+
+  def decode_hedychium(value) when is_nil(value), do: value
+  def decode_hedychium(_), do: {:error, "Unexpected type when decoding CredulityClass.hedychium"}
+
+  def encode_hedychium(value) when is_nil(value), do: value
+  def encode_hedychium(_), do: {:error, "Unexpected type when encoding CredulityClass.hedychium"}
+
+  def decode_leadwort(value) when is_nil(value), do: value
+  def decode_leadwort(_), do: {:error, "Unexpected type when decoding CredulityClass.leadwort"}
+
+  def encode_leadwort(value) when is_nil(value), do: value
+  def encode_leadwort(_), do: {:error, "Unexpected type when encoding CredulityClass.leadwort"}
+
+  def decode_overseriously(value) when is_nil(value), do: value
+  def decode_overseriously(_), do: {:error, "Unexpected type when decoding CredulityClass.overseriously"}
+
+  def encode_overseriously(value) when is_nil(value), do: value
+  def encode_overseriously(_), do: {:error, "Unexpected type when encoding CredulityClass.overseriously"}
+
+  def decode_parabola(value) when is_nil(value), do: value
+  def decode_parabola(_), do: {:error, "Unexpected type when decoding CredulityClass.parabola"}
+
+  def encode_parabola(value) when is_nil(value), do: value
+  def encode_parabola(_), do: {:error, "Unexpected type when encoding CredulityClass.parabola"}
+
+  def decode_pectinatodenticulate(value) when is_nil(value), do: value
+  def decode_pectinatodenticulate(_), do: {:error, "Unexpected type when decoding CredulityClass.pectinatodenticulate"}
+
+  def encode_pectinatodenticulate(value) when is_nil(value), do: value
+  def encode_pectinatodenticulate(_), do: {:error, "Unexpected type when encoding CredulityClass.pectinatodenticulate"}
+
+  def decode_popean(value) when is_nil(value), do: value
+  def decode_popean(_), do: {:error, "Unexpected type when decoding CredulityClass.popean"}
+
+  def encode_popean(value) when is_nil(value), do: value
+  def encode_popean(_), do: {:error, "Unexpected type when encoding CredulityClass.popean"}
+
+  def decode_pornocrat(value) when is_nil(value), do: value
+  def decode_pornocrat(_), do: {:error, "Unexpected type when decoding CredulityClass.pornocrat"}
+
+  def encode_pornocrat(value) when is_nil(value), do: value
+  def encode_pornocrat(_), do: {:error, "Unexpected type when encoding CredulityClass.pornocrat"}
+
+  def decode_quadrisect(value) when is_nil(value), do: value
+  def decode_quadrisect(_), do: {:error, "Unexpected type when decoding CredulityClass.quadrisect"}
+
+  def encode_quadrisect(value) when is_nil(value), do: value
+  def encode_quadrisect(_), do: {:error, "Unexpected type when encoding CredulityClass.quadrisect"}
+
+  def decode_seriality(value) when is_nil(value), do: value
+  def decode_seriality(_), do: {:error, "Unexpected type when decoding CredulityClass.seriality"}
+
+  def encode_seriality(value) when is_nil(value), do: value
+  def encode_seriality(_), do: {:error, "Unexpected type when encoding CredulityClass.seriality"}
+
+  def decode_vamphorn(value) when is_nil(value), do: value
+  def decode_vamphorn(_), do: {:error, "Unexpected type when decoding CredulityClass.vamphorn"}
+
+  def encode_vamphorn(value) when is_nil(value), do: value
+  def encode_vamphorn(_), do: {:error, "Unexpected type when encoding CredulityClass.vamphorn"}
+
+  def decode_wharp(value) when is_nil(value), do: value
+  def decode_wharp(_), do: {:error, "Unexpected type when decoding CredulityClass.wharp"}
+
+  def encode_wharp(value) when is_nil(value), do: value
+  def encode_wharp(_), do: {:error, "Unexpected type when encoding CredulityClass.wharp"}
+
   def from_map(m) do
     %CredulityClass{
-      ammonolytic: m["ammonolytic"],
-      bushmaster: m["bushmaster"],
-      considering: m["considering"],
-      consuetudinary: m["consuetudinary"],
-      embarras: m["embarras"],
-      fineness: m["fineness"],
-      flaithship: m["flaithship"],
-      flavia: m["Flavia"],
-      gruffly: m["gruffly"],
-      hedychium: m["Hedychium"],
-      leadwort: m["leadwort"],
-      overseriously: m["overseriously"],
-      parabola: m["parabola"],
-      pectinatodenticulate: m["pectinatodenticulate"],
-      popean: m["Popean"],
-      pornocrat: m["pornocrat"],
-      quadrisect: m["quadrisect"],
-      seriality: m["seriality"],
-      vamphorn: m["vamphorn"],
-      wharp: m["wharp"],
+      ammonolytic: decode_ammonolytic(m["ammonolytic"]),
+      bushmaster: decode_bushmaster(m["bushmaster"]),
+      considering: decode_considering(m["considering"]),
+      consuetudinary: decode_consuetudinary(m["consuetudinary"]),
+      embarras: decode_embarras(m["embarras"]),
+      fineness: decode_fineness(m["fineness"]),
+      flaithship: decode_flaithship(m["flaithship"]),
+      flavia: decode_flavia(m["Flavia"]),
+      gruffly: decode_gruffly(m["gruffly"]),
+      hedychium: decode_hedychium(m["Hedychium"]),
+      leadwort: decode_leadwort(m["leadwort"]),
+      overseriously: decode_overseriously(m["overseriously"]),
+      parabola: decode_parabola(m["parabola"]),
+      pectinatodenticulate: decode_pectinatodenticulate(m["pectinatodenticulate"]),
+      popean: decode_popean(m["Popean"]),
+      pornocrat: decode_pornocrat(m["pornocrat"]),
+      quadrisect: decode_quadrisect(m["quadrisect"]),
+      seriality: decode_seriality(m["seriality"]),
+      vamphorn: decode_vamphorn(m["vamphorn"]),
+      wharp: decode_wharp(m["wharp"]),
     }
   end
 
@@ -465,28 +737,148 @@ defmodule DeruralizeClass do
           windfirm: nil
         }
 
+  def decode_bockerel(value) when is_nil(value), do: value
+  def decode_bockerel(_), do: {:error, "Unexpected type when decoding DeruralizeClass.bockerel"}
+
+  def encode_bockerel(value) when is_nil(value), do: value
+  def encode_bockerel(_), do: {:error, "Unexpected type when encoding DeruralizeClass.bockerel"}
+
+  def decode_boulder(value) when is_nil(value), do: value
+  def decode_boulder(_), do: {:error, "Unexpected type when decoding DeruralizeClass.boulder"}
+
+  def encode_boulder(value) when is_nil(value), do: value
+  def encode_boulder(_), do: {:error, "Unexpected type when encoding DeruralizeClass.boulder"}
+
+  def decode_churrus(value) when is_nil(value), do: value
+  def decode_churrus(_), do: {:error, "Unexpected type when decoding DeruralizeClass.churrus"}
+
+  def encode_churrus(value) when is_nil(value), do: value
+  def encode_churrus(_), do: {:error, "Unexpected type when encoding DeruralizeClass.churrus"}
+
+  def decode_counterdigged(value) when is_nil(value), do: value
+  def decode_counterdigged(_), do: {:error, "Unexpected type when decoding DeruralizeClass.counterdigged"}
+
+  def encode_counterdigged(value) when is_nil(value), do: value
+  def encode_counterdigged(_), do: {:error, "Unexpected type when encoding DeruralizeClass.counterdigged"}
+
+  def decode_dialogite(value) when is_nil(value), do: value
+  def decode_dialogite(_), do: {:error, "Unexpected type when decoding DeruralizeClass.dialogite"}
+
+  def encode_dialogite(value) when is_nil(value), do: value
+  def encode_dialogite(_), do: {:error, "Unexpected type when encoding DeruralizeClass.dialogite"}
+
+  def decode_digenic(value) when is_nil(value), do: value
+  def decode_digenic(_), do: {:error, "Unexpected type when decoding DeruralizeClass.digenic"}
+
+  def encode_digenic(value) when is_nil(value), do: value
+  def encode_digenic(_), do: {:error, "Unexpected type when encoding DeruralizeClass.digenic"}
+
+  def decode_dunbird(value) when is_nil(value), do: value
+  def decode_dunbird(_), do: {:error, "Unexpected type when decoding DeruralizeClass.dunbird"}
+
+  def encode_dunbird(value) when is_nil(value), do: value
+  def encode_dunbird(_), do: {:error, "Unexpected type when encoding DeruralizeClass.dunbird"}
+
+  def decode_ergatogyne(value) when is_nil(value), do: value
+  def decode_ergatogyne(_), do: {:error, "Unexpected type when decoding DeruralizeClass.ergatogyne"}
+
+  def encode_ergatogyne(value) when is_nil(value), do: value
+  def encode_ergatogyne(_), do: {:error, "Unexpected type when encoding DeruralizeClass.ergatogyne"}
+
+  def decode_fiendful(value) when is_nil(value), do: value
+  def decode_fiendful(_), do: {:error, "Unexpected type when decoding DeruralizeClass.fiendful"}
+
+  def encode_fiendful(value) when is_nil(value), do: value
+  def encode_fiendful(_), do: {:error, "Unexpected type when encoding DeruralizeClass.fiendful"}
+
+  def decode_jackrod(value) when is_nil(value), do: value
+  def decode_jackrod(_), do: {:error, "Unexpected type when decoding DeruralizeClass.jackrod"}
+
+  def encode_jackrod(value) when is_nil(value), do: value
+  def encode_jackrod(_), do: {:error, "Unexpected type when encoding DeruralizeClass.jackrod"}
+
+  def decode_jehovistic(value) when is_nil(value), do: value
+  def decode_jehovistic(_), do: {:error, "Unexpected type when decoding DeruralizeClass.jehovistic"}
+
+  def encode_jehovistic(value) when is_nil(value), do: value
+  def encode_jehovistic(_), do: {:error, "Unexpected type when encoding DeruralizeClass.jehovistic"}
+
+  def decode_paninean(value) when is_nil(value), do: value
+  def decode_paninean(_), do: {:error, "Unexpected type when decoding DeruralizeClass.paninean"}
+
+  def encode_paninean(value) when is_nil(value), do: value
+  def encode_paninean(_), do: {:error, "Unexpected type when encoding DeruralizeClass.paninean"}
+
+  def decode_panther(value) when is_nil(value), do: value
+  def decode_panther(_), do: {:error, "Unexpected type when decoding DeruralizeClass.panther"}
+
+  def encode_panther(value) when is_nil(value), do: value
+  def encode_panther(_), do: {:error, "Unexpected type when encoding DeruralizeClass.panther"}
+
+  def decode_placentigerous(value) when is_nil(value), do: value
+  def decode_placentigerous(_), do: {:error, "Unexpected type when decoding DeruralizeClass.placentigerous"}
+
+  def encode_placentigerous(value) when is_nil(value), do: value
+  def encode_placentigerous(_), do: {:error, "Unexpected type when encoding DeruralizeClass.placentigerous"}
+
+  def decode_romney(value) when is_nil(value), do: value
+  def decode_romney(_), do: {:error, "Unexpected type when decoding DeruralizeClass.romney"}
+
+  def encode_romney(value) when is_nil(value), do: value
+  def encode_romney(_), do: {:error, "Unexpected type when encoding DeruralizeClass.romney"}
+
+  def decode_sparm(value) when is_nil(value), do: value
+  def decode_sparm(_), do: {:error, "Unexpected type when decoding DeruralizeClass.sparm"}
+
+  def encode_sparm(value) when is_nil(value), do: value
+  def encode_sparm(_), do: {:error, "Unexpected type when encoding DeruralizeClass.sparm"}
+
+  def decode_tocsin(value) when is_nil(value), do: value
+  def decode_tocsin(_), do: {:error, "Unexpected type when decoding DeruralizeClass.tocsin"}
+
+  def encode_tocsin(value) when is_nil(value), do: value
+  def encode_tocsin(_), do: {:error, "Unexpected type when encoding DeruralizeClass.tocsin"}
+
+  def decode_unnicked(value) when is_nil(value), do: value
+  def decode_unnicked(_), do: {:error, "Unexpected type when decoding DeruralizeClass.unnicked"}
+
+  def encode_unnicked(value) when is_nil(value), do: value
+  def encode_unnicked(_), do: {:error, "Unexpected type when encoding DeruralizeClass.unnicked"}
+
+  def decode_unstavable(value) when is_nil(value), do: value
+  def decode_unstavable(_), do: {:error, "Unexpected type when decoding DeruralizeClass.unstavable"}
+
+  def encode_unstavable(value) when is_nil(value), do: value
+  def encode_unstavable(_), do: {:error, "Unexpected type when encoding DeruralizeClass.unstavable"}
+
+  def decode_windfirm(value) when is_nil(value), do: value
+  def decode_windfirm(_), do: {:error, "Unexpected type when decoding DeruralizeClass.windfirm"}
+
+  def encode_windfirm(value) when is_nil(value), do: value
+  def encode_windfirm(_), do: {:error, "Unexpected type when encoding DeruralizeClass.windfirm"}
+
   def from_map(m) do
     %DeruralizeClass{
-      bockerel: m["bockerel"],
-      boulder: m["boulder"],
-      churrus: m["churrus"],
-      counterdigged: m["counterdigged"],
-      dialogite: m["dialogite"],
-      digenic: m["digenic"],
-      dunbird: m["dunbird"],
-      ergatogyne: m["ergatogyne"],
-      fiendful: m["fiendful"],
-      jackrod: m["jackrod"],
-      jehovistic: m["Jehovistic"],
-      paninean: m["Paninean"],
-      panther: m["panther"],
-      placentigerous: m["placentigerous"],
-      romney: m["Romney"],
-      sparm: m["sparm"],
-      tocsin: m["tocsin"],
-      unnicked: m["unnicked"],
-      unstavable: m["unstavable"],
-      windfirm: m["windfirm"],
+      bockerel: decode_bockerel(m["bockerel"]),
+      boulder: decode_boulder(m["boulder"]),
+      churrus: decode_churrus(m["churrus"]),
+      counterdigged: decode_counterdigged(m["counterdigged"]),
+      dialogite: decode_dialogite(m["dialogite"]),
+      digenic: decode_digenic(m["digenic"]),
+      dunbird: decode_dunbird(m["dunbird"]),
+      ergatogyne: decode_ergatogyne(m["ergatogyne"]),
+      fiendful: decode_fiendful(m["fiendful"]),
+      jackrod: decode_jackrod(m["jackrod"]),
+      jehovistic: decode_jehovistic(m["Jehovistic"]),
+      paninean: decode_paninean(m["Paninean"]),
+      panther: decode_panther(m["panther"]),
+      placentigerous: decode_placentigerous(m["placentigerous"]),
+      romney: decode_romney(m["Romney"]),
+      sparm: decode_sparm(m["sparm"]),
+      tocsin: decode_tocsin(m["tocsin"]),
+      unnicked: decode_unnicked(m["unnicked"]),
+      unstavable: decode_unstavable(m["unstavable"]),
+      windfirm: decode_windfirm(m["windfirm"]),
     }
   end
 
@@ -555,28 +947,148 @@ defmodule DiaereseClass do
           subobscure: nil
         }
 
+  def decode_amoreuxia(value) when is_nil(value), do: value
+  def decode_amoreuxia(_), do: {:error, "Unexpected type when decoding DiaereseClass.amoreuxia"}
+
+  def encode_amoreuxia(value) when is_nil(value), do: value
+  def encode_amoreuxia(_), do: {:error, "Unexpected type when encoding DiaereseClass.amoreuxia"}
+
+  def decode_ani(value) when is_nil(value), do: value
+  def decode_ani(_), do: {:error, "Unexpected type when decoding DiaereseClass.ani"}
+
+  def encode_ani(value) when is_nil(value), do: value
+  def encode_ani(_), do: {:error, "Unexpected type when encoding DiaereseClass.ani"}
+
+  def decode_bernicle(value) when is_nil(value), do: value
+  def decode_bernicle(_), do: {:error, "Unexpected type when decoding DiaereseClass.bernicle"}
+
+  def encode_bernicle(value) when is_nil(value), do: value
+  def encode_bernicle(_), do: {:error, "Unexpected type when encoding DiaereseClass.bernicle"}
+
+  def decode_blackwasher(value) when is_nil(value), do: value
+  def decode_blackwasher(_), do: {:error, "Unexpected type when decoding DiaereseClass.blackwasher"}
+
+  def encode_blackwasher(value) when is_nil(value), do: value
+  def encode_blackwasher(_), do: {:error, "Unexpected type when encoding DiaereseClass.blackwasher"}
+
+  def decode_blowhard(value) when is_nil(value), do: value
+  def decode_blowhard(_), do: {:error, "Unexpected type when decoding DiaereseClass.blowhard"}
+
+  def encode_blowhard(value) when is_nil(value), do: value
+  def encode_blowhard(_), do: {:error, "Unexpected type when encoding DiaereseClass.blowhard"}
+
+  def decode_broma(value) when is_nil(value), do: value
+  def decode_broma(_), do: {:error, "Unexpected type when decoding DiaereseClass.broma"}
+
+  def encode_broma(value) when is_nil(value), do: value
+  def encode_broma(_), do: {:error, "Unexpected type when encoding DiaereseClass.broma"}
+
+  def decode_closecross(value) when is_nil(value), do: value
+  def decode_closecross(_), do: {:error, "Unexpected type when decoding DiaereseClass.closecross"}
+
+  def encode_closecross(value) when is_nil(value), do: value
+  def encode_closecross(_), do: {:error, "Unexpected type when encoding DiaereseClass.closecross"}
+
+  def decode_congregationalism(value) when is_nil(value), do: value
+  def decode_congregationalism(_), do: {:error, "Unexpected type when decoding DiaereseClass.congregationalism"}
+
+  def encode_congregationalism(value) when is_nil(value), do: value
+  def encode_congregationalism(_), do: {:error, "Unexpected type when encoding DiaereseClass.congregationalism"}
+
+  def decode_grayly(value) when is_nil(value), do: value
+  def decode_grayly(_), do: {:error, "Unexpected type when decoding DiaereseClass.grayly"}
+
+  def encode_grayly(value) when is_nil(value), do: value
+  def encode_grayly(_), do: {:error, "Unexpected type when encoding DiaereseClass.grayly"}
+
+  def decode_historically(value) when is_nil(value), do: value
+  def decode_historically(_), do: {:error, "Unexpected type when decoding DiaereseClass.historically"}
+
+  def encode_historically(value) when is_nil(value), do: value
+  def encode_historically(_), do: {:error, "Unexpected type when encoding DiaereseClass.historically"}
+
+  def decode_hoast(value) when is_nil(value), do: value
+  def decode_hoast(_), do: {:error, "Unexpected type when decoding DiaereseClass.hoast"}
+
+  def encode_hoast(value) when is_nil(value), do: value
+  def encode_hoast(_), do: {:error, "Unexpected type when encoding DiaereseClass.hoast"}
+
+  def decode_irretentive(value) when is_nil(value), do: value
+  def decode_irretentive(_), do: {:error, "Unexpected type when decoding DiaereseClass.irretentive"}
+
+  def encode_irretentive(value) when is_nil(value), do: value
+  def encode_irretentive(_), do: {:error, "Unexpected type when encoding DiaereseClass.irretentive"}
+
+  def decode_parcener(value) when is_nil(value), do: value
+  def decode_parcener(_), do: {:error, "Unexpected type when decoding DiaereseClass.parcener"}
+
+  def encode_parcener(value) when is_nil(value), do: value
+  def encode_parcener(_), do: {:error, "Unexpected type when encoding DiaereseClass.parcener"}
+
+  def decode_pedder(value) when is_nil(value), do: value
+  def decode_pedder(_), do: {:error, "Unexpected type when decoding DiaereseClass.pedder"}
+
+  def encode_pedder(value) when is_nil(value), do: value
+  def encode_pedder(_), do: {:error, "Unexpected type when encoding DiaereseClass.pedder"}
+
+  def decode_pseudoanatomic(value) when is_nil(value), do: value
+  def decode_pseudoanatomic(_), do: {:error, "Unexpected type when decoding DiaereseClass.pseudoanatomic"}
+
+  def encode_pseudoanatomic(value) when is_nil(value), do: value
+  def encode_pseudoanatomic(_), do: {:error, "Unexpected type when encoding DiaereseClass.pseudoanatomic"}
+
+  def decode_rhizocarpian(value) when is_nil(value), do: value
+  def decode_rhizocarpian(_), do: {:error, "Unexpected type when decoding DiaereseClass.rhizocarpian"}
+
+  def encode_rhizocarpian(value) when is_nil(value), do: value
+  def encode_rhizocarpian(_), do: {:error, "Unexpected type when encoding DiaereseClass.rhizocarpian"}
+
+  def decode_samel(value) when is_nil(value), do: value
+  def decode_samel(_), do: {:error, "Unexpected type when decoding DiaereseClass.samel"}
+
+  def encode_samel(value) when is_nil(value), do: value
+  def encode_samel(_), do: {:error, "Unexpected type when encoding DiaereseClass.samel"}
+
+  def decode_silker(value) when is_nil(value), do: value
+  def decode_silker(_), do: {:error, "Unexpected type when decoding DiaereseClass.silker"}
+
+  def encode_silker(value) when is_nil(value), do: value
+  def encode_silker(_), do: {:error, "Unexpected type when encoding DiaereseClass.silker"}
+
+  def decode_subdentated(value) when is_nil(value), do: value
+  def decode_subdentated(_), do: {:error, "Unexpected type when decoding DiaereseClass.subdentated"}
+
+  def encode_subdentated(value) when is_nil(value), do: value
+  def encode_subdentated(_), do: {:error, "Unexpected type when encoding DiaereseClass.subdentated"}
+
+  def decode_subobscure(value) when is_nil(value), do: value
+  def decode_subobscure(_), do: {:error, "Unexpected type when decoding DiaereseClass.subobscure"}
+
+  def encode_subobscure(value) when is_nil(value), do: value
+  def encode_subobscure(_), do: {:error, "Unexpected type when encoding DiaereseClass.subobscure"}
+
   def from_map(m) do
     %DiaereseClass{
-      amoreuxia: m["Amoreuxia"],
-      ani: m["ani"],
-      bernicle: m["bernicle"],
-      blackwasher: m["blackwasher"],
-      blowhard: m["blowhard"],
-      broma: m["broma"],
-      closecross: m["closecross"],
-      congregationalism: m["congregationalism"],
-      grayly: m["grayly"],
-      historically: m["historically"],
-      hoast: m["hoast"],
-      irretentive: m["irretentive"],
-      parcener: m["parcener"],
-      pedder: m["pedder"],
-      pseudoanatomic: m["pseudoanatomic"],
-      rhizocarpian: m["rhizocarpian"],
-      samel: m["samel"],
-      silker: m["silker"],
-      subdentated: m["subdentated"],
-      subobscure: m["subobscure"],
+      amoreuxia: decode_amoreuxia(m["Amoreuxia"]),
+      ani: decode_ani(m["ani"]),
+      bernicle: decode_bernicle(m["bernicle"]),
+      blackwasher: decode_blackwasher(m["blackwasher"]),
+      blowhard: decode_blowhard(m["blowhard"]),
+      broma: decode_broma(m["broma"]),
+      closecross: decode_closecross(m["closecross"]),
+      congregationalism: decode_congregationalism(m["congregationalism"]),
+      grayly: decode_grayly(m["grayly"]),
+      historically: decode_historically(m["historically"]),
+      hoast: decode_hoast(m["hoast"]),
+      irretentive: decode_irretentive(m["irretentive"]),
+      parcener: decode_parcener(m["parcener"]),
+      pedder: decode_pedder(m["pedder"]),
+      pseudoanatomic: decode_pseudoanatomic(m["pseudoanatomic"]),
+      rhizocarpian: decode_rhizocarpian(m["rhizocarpian"]),
+      samel: decode_samel(m["samel"]),
+      silker: decode_silker(m["silker"]),
+      subdentated: decode_subdentated(m["subdentated"]),
+      subobscure: decode_subobscure(m["subobscure"]),
     }
   end
 
@@ -645,28 +1157,148 @@ defmodule Encrust do
           woodenware: nil
         }
 
+  def decode_comradely(value) when is_nil(value), do: value
+  def decode_comradely(_), do: {:error, "Unexpected type when decoding Encrust.comradely"}
+
+  def encode_comradely(value) when is_nil(value), do: value
+  def encode_comradely(_), do: {:error, "Unexpected type when encoding Encrust.comradely"}
+
+  def decode_diacanthous(value) when is_nil(value), do: value
+  def decode_diacanthous(_), do: {:error, "Unexpected type when decoding Encrust.diacanthous"}
+
+  def encode_diacanthous(value) when is_nil(value), do: value
+  def encode_diacanthous(_), do: {:error, "Unexpected type when encoding Encrust.diacanthous"}
+
+  def decode_feminineness(value) when is_nil(value), do: value
+  def decode_feminineness(_), do: {:error, "Unexpected type when decoding Encrust.feminineness"}
+
+  def encode_feminineness(value) when is_nil(value), do: value
+  def encode_feminineness(_), do: {:error, "Unexpected type when encoding Encrust.feminineness"}
+
+  def decode_gossamered(value) when is_nil(value), do: value
+  def decode_gossamered(_), do: {:error, "Unexpected type when decoding Encrust.gossamered"}
+
+  def encode_gossamered(value) when is_nil(value), do: value
+  def encode_gossamered(_), do: {:error, "Unexpected type when encoding Encrust.gossamered"}
+
+  def decode_hibernia(value) when is_nil(value), do: value
+  def decode_hibernia(_), do: {:error, "Unexpected type when decoding Encrust.hibernia"}
+
+  def encode_hibernia(value) when is_nil(value), do: value
+  def encode_hibernia(_), do: {:error, "Unexpected type when encoding Encrust.hibernia"}
+
+  def decode_hibiscus(value) when is_nil(value), do: value
+  def decode_hibiscus(_), do: {:error, "Unexpected type when decoding Encrust.hibiscus"}
+
+  def encode_hibiscus(value) when is_nil(value), do: value
+  def encode_hibiscus(_), do: {:error, "Unexpected type when encoding Encrust.hibiscus"}
+
+  def decode_lepidosauria(value) when is_nil(value), do: value
+  def decode_lepidosauria(_), do: {:error, "Unexpected type when decoding Encrust.lepidosauria"}
+
+  def encode_lepidosauria(value) when is_nil(value), do: value
+  def encode_lepidosauria(_), do: {:error, "Unexpected type when encoding Encrust.lepidosauria"}
+
+  def decode_lollingly(value) when is_nil(value), do: value
+  def decode_lollingly(_), do: {:error, "Unexpected type when decoding Encrust.lollingly"}
+
+  def encode_lollingly(value) when is_nil(value), do: value
+  def encode_lollingly(_), do: {:error, "Unexpected type when encoding Encrust.lollingly"}
+
+  def decode_manager(value) when is_nil(value), do: value
+  def decode_manager(_), do: {:error, "Unexpected type when decoding Encrust.manager"}
+
+  def encode_manager(value) when is_nil(value), do: value
+  def encode_manager(_), do: {:error, "Unexpected type when encoding Encrust.manager"}
+
+  def decode_mechanic(value) when is_nil(value), do: value
+  def decode_mechanic(_), do: {:error, "Unexpected type when decoding Encrust.mechanic"}
+
+  def encode_mechanic(value) when is_nil(value), do: value
+  def encode_mechanic(_), do: {:error, "Unexpected type when encoding Encrust.mechanic"}
+
+  def decode_overminuteness(value) when is_nil(value), do: value
+  def decode_overminuteness(_), do: {:error, "Unexpected type when decoding Encrust.overminuteness"}
+
+  def encode_overminuteness(value) when is_nil(value), do: value
+  def encode_overminuteness(_), do: {:error, "Unexpected type when encoding Encrust.overminuteness"}
+
+  def decode_papelonne(value) when is_nil(value), do: value
+  def decode_papelonne(_), do: {:error, "Unexpected type when decoding Encrust.papelonne"}
+
+  def encode_papelonne(value) when is_nil(value), do: value
+  def encode_papelonne(_), do: {:error, "Unexpected type when encoding Encrust.papelonne"}
+
+  def decode_plebification(value) when is_nil(value), do: value
+  def decode_plebification(_), do: {:error, "Unexpected type when decoding Encrust.plebification"}
+
+  def encode_plebification(value) when is_nil(value), do: value
+  def encode_plebification(_), do: {:error, "Unexpected type when encoding Encrust.plebification"}
+
+  def decode_pugmiller(value) when is_nil(value), do: value
+  def decode_pugmiller(_), do: {:error, "Unexpected type when decoding Encrust.pugmiller"}
+
+  def encode_pugmiller(value) when is_nil(value), do: value
+  def encode_pugmiller(_), do: {:error, "Unexpected type when encoding Encrust.pugmiller"}
+
+  def decode_recoveror(value) when is_nil(value), do: value
+  def decode_recoveror(_), do: {:error, "Unexpected type when decoding Encrust.recoveror"}
+
+  def encode_recoveror(value) when is_nil(value), do: value
+  def encode_recoveror(_), do: {:error, "Unexpected type when encoding Encrust.recoveror"}
+
+  def decode_spermatoblastic(value) when is_nil(value), do: value
+  def decode_spermatoblastic(_), do: {:error, "Unexpected type when decoding Encrust.spermatoblastic"}
+
+  def encode_spermatoblastic(value) when is_nil(value), do: value
+  def encode_spermatoblastic(_), do: {:error, "Unexpected type when encoding Encrust.spermatoblastic"}
+
+  def decode_syllidae(value) when is_nil(value), do: value
+  def decode_syllidae(_), do: {:error, "Unexpected type when decoding Encrust.syllidae"}
+
+  def encode_syllidae(value) when is_nil(value), do: value
+  def encode_syllidae(_), do: {:error, "Unexpected type when encoding Encrust.syllidae"}
+
+  def decode_ungyved(value) when is_nil(value), do: value
+  def decode_ungyved(_), do: {:error, "Unexpected type when decoding Encrust.ungyved"}
+
+  def encode_ungyved(value) when is_nil(value), do: value
+  def encode_ungyved(_), do: {:error, "Unexpected type when encoding Encrust.ungyved"}
+
+  def decode_whirlabout(value) when is_nil(value), do: value
+  def decode_whirlabout(_), do: {:error, "Unexpected type when decoding Encrust.whirlabout"}
+
+  def encode_whirlabout(value) when is_nil(value), do: value
+  def encode_whirlabout(_), do: {:error, "Unexpected type when encoding Encrust.whirlabout"}
+
+  def decode_woodenware(value) when is_nil(value), do: value
+  def decode_woodenware(_), do: {:error, "Unexpected type when decoding Encrust.woodenware"}
+
+  def encode_woodenware(value) when is_nil(value), do: value
+  def encode_woodenware(_), do: {:error, "Unexpected type when encoding Encrust.woodenware"}
+
   def from_map(m) do
     %Encrust{
-      comradely: m["comradely"],
-      diacanthous: m["diacanthous"],
-      feminineness: m["feminineness"],
-      gossamered: m["gossamered"],
-      hibernia: m["Hibernia"],
-      hibiscus: m["Hibiscus"],
-      lepidosauria: m["Lepidosauria"],
-      lollingly: m["lollingly"],
-      manager: m["manager"],
-      mechanic: m["mechanic"],
-      overminuteness: m["overminuteness"],
-      papelonne: m["papelonne"],
-      plebification: m["plebification"],
-      pugmiller: m["pugmiller"],
-      recoveror: m["recoveror"],
-      spermatoblastic: m["spermatoblastic"],
-      syllidae: m["Syllidae"],
-      ungyved: m["ungyved"],
-      whirlabout: m["whirlabout"],
-      woodenware: m["woodenware"],
+      comradely: decode_comradely(m["comradely"]),
+      diacanthous: decode_diacanthous(m["diacanthous"]),
+      feminineness: decode_feminineness(m["feminineness"]),
+      gossamered: decode_gossamered(m["gossamered"]),
+      hibernia: decode_hibernia(m["Hibernia"]),
+      hibiscus: decode_hibiscus(m["Hibiscus"]),
+      lepidosauria: decode_lepidosauria(m["Lepidosauria"]),
+      lollingly: decode_lollingly(m["lollingly"]),
+      manager: decode_manager(m["manager"]),
+      mechanic: decode_mechanic(m["mechanic"]),
+      overminuteness: decode_overminuteness(m["overminuteness"]),
+      papelonne: decode_papelonne(m["papelonne"]),
+      plebification: decode_plebification(m["plebification"]),
+      pugmiller: decode_pugmiller(m["pugmiller"]),
+      recoveror: decode_recoveror(m["recoveror"]),
+      spermatoblastic: decode_spermatoblastic(m["spermatoblastic"]),
+      syllidae: decode_syllidae(m["Syllidae"]),
+      ungyved: decode_ungyved(m["ungyved"]),
+      whirlabout: decode_whirlabout(m["whirlabout"]),
+      woodenware: decode_woodenware(m["woodenware"]),
     }
   end
 
@@ -735,28 +1367,148 @@ defmodule FagginglyClass do
           unmillinered: nil
         }
 
+  def decode_abranchian(value) when is_nil(value), do: value
+  def decode_abranchian(_), do: {:error, "Unexpected type when decoding FagginglyClass.abranchian"}
+
+  def encode_abranchian(value) when is_nil(value), do: value
+  def encode_abranchian(_), do: {:error, "Unexpected type when encoding FagginglyClass.abranchian"}
+
+  def decode_aculeiform(value) when is_nil(value), do: value
+  def decode_aculeiform(_), do: {:error, "Unexpected type when decoding FagginglyClass.aculeiform"}
+
+  def encode_aculeiform(value) when is_nil(value), do: value
+  def encode_aculeiform(_), do: {:error, "Unexpected type when encoding FagginglyClass.aculeiform"}
+
+  def decode_adiaphoristic(value) when is_nil(value), do: value
+  def decode_adiaphoristic(_), do: {:error, "Unexpected type when decoding FagginglyClass.adiaphoristic"}
+
+  def encode_adiaphoristic(value) when is_nil(value), do: value
+  def encode_adiaphoristic(_), do: {:error, "Unexpected type when encoding FagginglyClass.adiaphoristic"}
+
+  def decode_adoptionism(value) when is_nil(value), do: value
+  def decode_adoptionism(_), do: {:error, "Unexpected type when decoding FagginglyClass.adoptionism"}
+
+  def encode_adoptionism(value) when is_nil(value), do: value
+  def encode_adoptionism(_), do: {:error, "Unexpected type when encoding FagginglyClass.adoptionism"}
+
+  def decode_anglic(value) when is_nil(value), do: value
+  def decode_anglic(_), do: {:error, "Unexpected type when decoding FagginglyClass.anglic"}
+
+  def encode_anglic(value) when is_nil(value), do: value
+  def encode_anglic(_), do: {:error, "Unexpected type when encoding FagginglyClass.anglic"}
+
+  def decode_antrotomy(value) when is_nil(value), do: value
+  def decode_antrotomy(_), do: {:error, "Unexpected type when decoding FagginglyClass.antrotomy"}
+
+  def encode_antrotomy(value) when is_nil(value), do: value
+  def encode_antrotomy(_), do: {:error, "Unexpected type when encoding FagginglyClass.antrotomy"}
+
+  def decode_coerciveness(value) when is_nil(value), do: value
+  def decode_coerciveness(_), do: {:error, "Unexpected type when decoding FagginglyClass.coerciveness"}
+
+  def encode_coerciveness(value) when is_nil(value), do: value
+  def encode_coerciveness(_), do: {:error, "Unexpected type when encoding FagginglyClass.coerciveness"}
+
+  def decode_decorist(value) when is_nil(value), do: value
+  def decode_decorist(_), do: {:error, "Unexpected type when decoding FagginglyClass.decorist"}
+
+  def encode_decorist(value) when is_nil(value), do: value
+  def encode_decorist(_), do: {:error, "Unexpected type when encoding FagginglyClass.decorist"}
+
+  def decode_duckhood(value) when is_nil(value), do: value
+  def decode_duckhood(_), do: {:error, "Unexpected type when decoding FagginglyClass.duckhood"}
+
+  def encode_duckhood(value) when is_nil(value), do: value
+  def encode_duckhood(_), do: {:error, "Unexpected type when encoding FagginglyClass.duckhood"}
+
+  def decode_heteromeri(value) when is_nil(value), do: value
+  def decode_heteromeri(_), do: {:error, "Unexpected type when decoding FagginglyClass.heteromeri"}
+
+  def encode_heteromeri(value) when is_nil(value), do: value
+  def encode_heteromeri(_), do: {:error, "Unexpected type when encoding FagginglyClass.heteromeri"}
+
+  def decode_hypochnose(value) when is_nil(value), do: value
+  def decode_hypochnose(_), do: {:error, "Unexpected type when decoding FagginglyClass.hypochnose"}
+
+  def encode_hypochnose(value) when is_nil(value), do: value
+  def encode_hypochnose(_), do: {:error, "Unexpected type when encoding FagginglyClass.hypochnose"}
+
+  def decode_lochage(value) when is_nil(value), do: value
+  def decode_lochage(_), do: {:error, "Unexpected type when decoding FagginglyClass.lochage"}
+
+  def encode_lochage(value) when is_nil(value), do: value
+  def encode_lochage(_), do: {:error, "Unexpected type when encoding FagginglyClass.lochage"}
+
+  def decode_melee(value) when is_nil(value), do: value
+  def decode_melee(_), do: {:error, "Unexpected type when decoding FagginglyClass.melee"}
+
+  def encode_melee(value) when is_nil(value), do: value
+  def encode_melee(_), do: {:error, "Unexpected type when encoding FagginglyClass.melee"}
+
+  def decode_nonconformitant(value) when is_nil(value), do: value
+  def decode_nonconformitant(_), do: {:error, "Unexpected type when decoding FagginglyClass.nonconformitant"}
+
+  def encode_nonconformitant(value) when is_nil(value), do: value
+  def encode_nonconformitant(_), do: {:error, "Unexpected type when encoding FagginglyClass.nonconformitant"}
+
+  def decode_poinsettia(value) when is_nil(value), do: value
+  def decode_poinsettia(_), do: {:error, "Unexpected type when decoding FagginglyClass.poinsettia"}
+
+  def encode_poinsettia(value) when is_nil(value), do: value
+  def encode_poinsettia(_), do: {:error, "Unexpected type when encoding FagginglyClass.poinsettia"}
+
+  def decode_putatively(value) when is_nil(value), do: value
+  def decode_putatively(_), do: {:error, "Unexpected type when decoding FagginglyClass.putatively"}
+
+  def encode_putatively(value) when is_nil(value), do: value
+  def encode_putatively(_), do: {:error, "Unexpected type when encoding FagginglyClass.putatively"}
+
+  def decode_semivolatile(value) when is_nil(value), do: value
+  def decode_semivolatile(_), do: {:error, "Unexpected type when decoding FagginglyClass.semivolatile"}
+
+  def encode_semivolatile(value) when is_nil(value), do: value
+  def encode_semivolatile(_), do: {:error, "Unexpected type when encoding FagginglyClass.semivolatile"}
+
+  def decode_soleas(value) when is_nil(value), do: value
+  def decode_soleas(_), do: {:error, "Unexpected type when decoding FagginglyClass.soleas"}
+
+  def encode_soleas(value) when is_nil(value), do: value
+  def encode_soleas(_), do: {:error, "Unexpected type when encoding FagginglyClass.soleas"}
+
+  def decode_unfastenable(value) when is_nil(value), do: value
+  def decode_unfastenable(_), do: {:error, "Unexpected type when decoding FagginglyClass.unfastenable"}
+
+  def encode_unfastenable(value) when is_nil(value), do: value
+  def encode_unfastenable(_), do: {:error, "Unexpected type when encoding FagginglyClass.unfastenable"}
+
+  def decode_unmillinered(value) when is_nil(value), do: value
+  def decode_unmillinered(_), do: {:error, "Unexpected type when decoding FagginglyClass.unmillinered"}
+
+  def encode_unmillinered(value) when is_nil(value), do: value
+  def encode_unmillinered(_), do: {:error, "Unexpected type when encoding FagginglyClass.unmillinered"}
+
   def from_map(m) do
     %FagginglyClass{
-      abranchian: m["abranchian"],
-      aculeiform: m["aculeiform"],
-      adiaphoristic: m["adiaphoristic"],
-      adoptionism: m["adoptionism"],
-      anglic: m["Anglic"],
-      antrotomy: m["antrotomy"],
-      coerciveness: m["coerciveness"],
-      decorist: m["decorist"],
-      duckhood: m["duckhood"],
-      heteromeri: m["Heteromeri"],
-      hypochnose: m["hypochnose"],
-      lochage: m["lochage"],
-      melee: m["melee"],
-      nonconformitant: m["nonconformitant"],
-      poinsettia: m["Poinsettia"],
-      putatively: m["putatively"],
-      semivolatile: m["semivolatile"],
-      soleas: m["soleas"],
-      unfastenable: m["unfastenable"],
-      unmillinered: m["unmillinered"],
+      abranchian: decode_abranchian(m["abranchian"]),
+      aculeiform: decode_aculeiform(m["aculeiform"]),
+      adiaphoristic: decode_adiaphoristic(m["adiaphoristic"]),
+      adoptionism: decode_adoptionism(m["adoptionism"]),
+      anglic: decode_anglic(m["Anglic"]),
+      antrotomy: decode_antrotomy(m["antrotomy"]),
+      coerciveness: decode_coerciveness(m["coerciveness"]),
+      decorist: decode_decorist(m["decorist"]),
+      duckhood: decode_duckhood(m["duckhood"]),
+      heteromeri: decode_heteromeri(m["Heteromeri"]),
+      hypochnose: decode_hypochnose(m["hypochnose"]),
+      lochage: decode_lochage(m["lochage"]),
+      melee: decode_melee(m["melee"]),
+      nonconformitant: decode_nonconformitant(m["nonconformitant"]),
+      poinsettia: decode_poinsettia(m["Poinsettia"]),
+      putatively: decode_putatively(m["putatively"]),
+      semivolatile: decode_semivolatile(m["semivolatile"]),
+      soleas: decode_soleas(m["soleas"]),
+      unfastenable: decode_unfastenable(m["unfastenable"]),
+      unmillinered: decode_unmillinered(m["unmillinered"]),
     }
   end
 
@@ -825,28 +1577,148 @@ defmodule FenkClass do
           undermountain: nil
         }
 
+  def decode_apoise(value) when is_nil(value), do: value
+  def decode_apoise(_), do: {:error, "Unexpected type when decoding FenkClass.apoise"}
+
+  def encode_apoise(value) when is_nil(value), do: value
+  def encode_apoise(_), do: {:error, "Unexpected type when encoding FenkClass.apoise"}
+
+  def decode_astronomize(value) when is_nil(value), do: value
+  def decode_astronomize(_), do: {:error, "Unexpected type when decoding FenkClass.astronomize"}
+
+  def encode_astronomize(value) when is_nil(value), do: value
+  def encode_astronomize(_), do: {:error, "Unexpected type when encoding FenkClass.astronomize"}
+
+  def decode_cockhorse(value) when is_nil(value), do: value
+  def decode_cockhorse(_), do: {:error, "Unexpected type when decoding FenkClass.cockhorse"}
+
+  def encode_cockhorse(value) when is_nil(value), do: value
+  def encode_cockhorse(_), do: {:error, "Unexpected type when encoding FenkClass.cockhorse"}
+
+  def decode_copular(value) when is_nil(value), do: value
+  def decode_copular(_), do: {:error, "Unexpected type when decoding FenkClass.copular"}
+
+  def encode_copular(value) when is_nil(value), do: value
+  def encode_copular(_), do: {:error, "Unexpected type when encoding FenkClass.copular"}
+
+  def decode_dagomba(value) when is_nil(value), do: value
+  def decode_dagomba(_), do: {:error, "Unexpected type when decoding FenkClass.dagomba"}
+
+  def encode_dagomba(value) when is_nil(value), do: value
+  def encode_dagomba(_), do: {:error, "Unexpected type when encoding FenkClass.dagomba"}
+
+  def decode_draffy(value) when is_nil(value), do: value
+  def decode_draffy(_), do: {:error, "Unexpected type when decoding FenkClass.draffy"}
+
+  def encode_draffy(value) when is_nil(value), do: value
+  def encode_draffy(_), do: {:error, "Unexpected type when encoding FenkClass.draffy"}
+
+  def decode_foreigner(value) when is_nil(value), do: value
+  def decode_foreigner(_), do: {:error, "Unexpected type when decoding FenkClass.foreigner"}
+
+  def encode_foreigner(value) when is_nil(value), do: value
+  def encode_foreigner(_), do: {:error, "Unexpected type when encoding FenkClass.foreigner"}
+
+  def decode_guyandot(value) when is_nil(value), do: value
+  def decode_guyandot(_), do: {:error, "Unexpected type when decoding FenkClass.guyandot"}
+
+  def encode_guyandot(value) when is_nil(value), do: value
+  def encode_guyandot(_), do: {:error, "Unexpected type when encoding FenkClass.guyandot"}
+
+  def decode_neurogliosis(value) when is_nil(value), do: value
+  def decode_neurogliosis(_), do: {:error, "Unexpected type when decoding FenkClass.neurogliosis"}
+
+  def encode_neurogliosis(value) when is_nil(value), do: value
+  def encode_neurogliosis(_), do: {:error, "Unexpected type when encoding FenkClass.neurogliosis"}
+
+  def decode_osmious(value) when is_nil(value), do: value
+  def decode_osmious(_), do: {:error, "Unexpected type when decoding FenkClass.osmious"}
+
+  def encode_osmious(value) when is_nil(value), do: value
+  def encode_osmious(_), do: {:error, "Unexpected type when encoding FenkClass.osmious"}
+
+  def decode_palpitate(value) when is_nil(value), do: value
+  def decode_palpitate(_), do: {:error, "Unexpected type when decoding FenkClass.palpitate"}
+
+  def encode_palpitate(value) when is_nil(value), do: value
+  def encode_palpitate(_), do: {:error, "Unexpected type when encoding FenkClass.palpitate"}
+
+  def decode_rebukeable(value) when is_nil(value), do: value
+  def decode_rebukeable(_), do: {:error, "Unexpected type when decoding FenkClass.rebukeable"}
+
+  def encode_rebukeable(value) when is_nil(value), do: value
+  def encode_rebukeable(_), do: {:error, "Unexpected type when encoding FenkClass.rebukeable"}
+
+  def decode_reinwardtia(value) when is_nil(value), do: value
+  def decode_reinwardtia(_), do: {:error, "Unexpected type when decoding FenkClass.reinwardtia"}
+
+  def encode_reinwardtia(value) when is_nil(value), do: value
+  def encode_reinwardtia(_), do: {:error, "Unexpected type when encoding FenkClass.reinwardtia"}
+
+  def decode_reservatory(value) when is_nil(value), do: value
+  def decode_reservatory(_), do: {:error, "Unexpected type when decoding FenkClass.reservatory"}
+
+  def encode_reservatory(value) when is_nil(value), do: value
+  def encode_reservatory(_), do: {:error, "Unexpected type when encoding FenkClass.reservatory"}
+
+  def decode_scalt(value) when is_nil(value), do: value
+  def decode_scalt(_), do: {:error, "Unexpected type when decoding FenkClass.scalt"}
+
+  def encode_scalt(value) when is_nil(value), do: value
+  def encode_scalt(_), do: {:error, "Unexpected type when encoding FenkClass.scalt"}
+
+  def decode_scripturalize(value) when is_nil(value), do: value
+  def decode_scripturalize(_), do: {:error, "Unexpected type when decoding FenkClass.scripturalize"}
+
+  def encode_scripturalize(value) when is_nil(value), do: value
+  def encode_scripturalize(_), do: {:error, "Unexpected type when encoding FenkClass.scripturalize"}
+
+  def decode_tintometer(value) when is_nil(value), do: value
+  def decode_tintometer(_), do: {:error, "Unexpected type when decoding FenkClass.tintometer"}
+
+  def encode_tintometer(value) when is_nil(value), do: value
+  def encode_tintometer(_), do: {:error, "Unexpected type when encoding FenkClass.tintometer"}
+
+  def decode_tritoness(value) when is_nil(value), do: value
+  def decode_tritoness(_), do: {:error, "Unexpected type when decoding FenkClass.tritoness"}
+
+  def encode_tritoness(value) when is_nil(value), do: value
+  def encode_tritoness(_), do: {:error, "Unexpected type when encoding FenkClass.tritoness"}
+
+  def decode_undergrade(value) when is_nil(value), do: value
+  def decode_undergrade(_), do: {:error, "Unexpected type when decoding FenkClass.undergrade"}
+
+  def encode_undergrade(value) when is_nil(value), do: value
+  def encode_undergrade(_), do: {:error, "Unexpected type when encoding FenkClass.undergrade"}
+
+  def decode_undermountain(value) when is_nil(value), do: value
+  def decode_undermountain(_), do: {:error, "Unexpected type when decoding FenkClass.undermountain"}
+
+  def encode_undermountain(value) when is_nil(value), do: value
+  def encode_undermountain(_), do: {:error, "Unexpected type when encoding FenkClass.undermountain"}
+
   def from_map(m) do
     %FenkClass{
-      apoise: m["apoise"],
-      astronomize: m["astronomize"],
-      cockhorse: m["cockhorse"],
-      copular: m["copular"],
-      dagomba: m["Dagomba"],
-      draffy: m["draffy"],
-      foreigner: m["foreigner"],
-      guyandot: m["Guyandot"],
-      neurogliosis: m["neurogliosis"],
-      osmious: m["osmious"],
-      palpitate: m["palpitate"],
-      rebukeable: m["rebukeable"],
-      reinwardtia: m["Reinwardtia"],
-      reservatory: m["reservatory"],
-      scalt: m["scalt"],
-      scripturalize: m["scripturalize"],
-      tintometer: m["tintometer"],
-      tritoness: m["Tritoness"],
-      undergrade: m["undergrade"],
-      undermountain: m["undermountain"],
+      apoise: decode_apoise(m["apoise"]),
+      astronomize: decode_astronomize(m["astronomize"]),
+      cockhorse: decode_cockhorse(m["cockhorse"]),
+      copular: decode_copular(m["copular"]),
+      dagomba: decode_dagomba(m["Dagomba"]),
+      draffy: decode_draffy(m["draffy"]),
+      foreigner: decode_foreigner(m["foreigner"]),
+      guyandot: decode_guyandot(m["Guyandot"]),
+      neurogliosis: decode_neurogliosis(m["neurogliosis"]),
+      osmious: decode_osmious(m["osmious"]),
+      palpitate: decode_palpitate(m["palpitate"]),
+      rebukeable: decode_rebukeable(m["rebukeable"]),
+      reinwardtia: decode_reinwardtia(m["Reinwardtia"]),
+      reservatory: decode_reservatory(m["reservatory"]),
+      scalt: decode_scalt(m["scalt"]),
+      scripturalize: decode_scripturalize(m["scripturalize"]),
+      tintometer: decode_tintometer(m["tintometer"]),
+      tritoness: decode_tritoness(m["Tritoness"]),
+      undergrade: decode_undergrade(m["undergrade"]),
+      undermountain: decode_undermountain(m["undermountain"]),
     }
   end
 
@@ -915,28 +1787,148 @@ defmodule FlagmakingClass do
           unrenounceable: nil
         }
 
+  def decode_albarco(value) when is_nil(value), do: value
+  def decode_albarco(_), do: {:error, "Unexpected type when decoding FlagmakingClass.albarco"}
+
+  def encode_albarco(value) when is_nil(value), do: value
+  def encode_albarco(_), do: {:error, "Unexpected type when encoding FlagmakingClass.albarco"}
+
+  def decode_bunodonta(value) when is_nil(value), do: value
+  def decode_bunodonta(_), do: {:error, "Unexpected type when decoding FlagmakingClass.bunodonta"}
+
+  def encode_bunodonta(value) when is_nil(value), do: value
+  def encode_bunodonta(_), do: {:error, "Unexpected type when encoding FlagmakingClass.bunodonta"}
+
+  def decode_hornify(value) when is_nil(value), do: value
+  def decode_hornify(_), do: {:error, "Unexpected type when decoding FlagmakingClass.hornify"}
+
+  def encode_hornify(value) when is_nil(value), do: value
+  def encode_hornify(_), do: {:error, "Unexpected type when encoding FlagmakingClass.hornify"}
+
+  def decode_hydrocorisae(value) when is_nil(value), do: value
+  def decode_hydrocorisae(_), do: {:error, "Unexpected type when decoding FlagmakingClass.hydrocorisae"}
+
+  def encode_hydrocorisae(value) when is_nil(value), do: value
+  def encode_hydrocorisae(_), do: {:error, "Unexpected type when encoding FlagmakingClass.hydrocorisae"}
+
+  def decode_hypoglossus(value) when is_nil(value), do: value
+  def decode_hypoglossus(_), do: {:error, "Unexpected type when decoding FlagmakingClass.hypoglossus"}
+
+  def encode_hypoglossus(value) when is_nil(value), do: value
+  def encode_hypoglossus(_), do: {:error, "Unexpected type when encoding FlagmakingClass.hypoglossus"}
+
+  def decode_inexpiably(value) when is_nil(value), do: value
+  def decode_inexpiably(_), do: {:error, "Unexpected type when decoding FlagmakingClass.inexpiably"}
+
+  def encode_inexpiably(value) when is_nil(value), do: value
+  def encode_inexpiably(_), do: {:error, "Unexpected type when encoding FlagmakingClass.inexpiably"}
+
+  def decode_ingratitude(value) when is_nil(value), do: value
+  def decode_ingratitude(_), do: {:error, "Unexpected type when decoding FlagmakingClass.ingratitude"}
+
+  def encode_ingratitude(value) when is_nil(value), do: value
+  def encode_ingratitude(_), do: {:error, "Unexpected type when encoding FlagmakingClass.ingratitude"}
+
+  def decode_ladyfly(value) when is_nil(value), do: value
+  def decode_ladyfly(_), do: {:error, "Unexpected type when decoding FlagmakingClass.ladyfly"}
+
+  def encode_ladyfly(value) when is_nil(value), do: value
+  def encode_ladyfly(_), do: {:error, "Unexpected type when encoding FlagmakingClass.ladyfly"}
+
+  def decode_medicament(value) when is_nil(value), do: value
+  def decode_medicament(_), do: {:error, "Unexpected type when decoding FlagmakingClass.medicament"}
+
+  def encode_medicament(value) when is_nil(value), do: value
+  def encode_medicament(_), do: {:error, "Unexpected type when encoding FlagmakingClass.medicament"}
+
+  def decode_monogrammatic(value) when is_nil(value), do: value
+  def decode_monogrammatic(_), do: {:error, "Unexpected type when decoding FlagmakingClass.monogrammatic"}
+
+  def encode_monogrammatic(value) when is_nil(value), do: value
+  def encode_monogrammatic(_), do: {:error, "Unexpected type when encoding FlagmakingClass.monogrammatic"}
+
+  def decode_nobbut(value) when is_nil(value), do: value
+  def decode_nobbut(_), do: {:error, "Unexpected type when decoding FlagmakingClass.nobbut"}
+
+  def encode_nobbut(value) when is_nil(value), do: value
+  def encode_nobbut(_), do: {:error, "Unexpected type when encoding FlagmakingClass.nobbut"}
+
+  def decode_notacanthidae(value) when is_nil(value), do: value
+  def decode_notacanthidae(_), do: {:error, "Unexpected type when decoding FlagmakingClass.notacanthidae"}
+
+  def encode_notacanthidae(value) when is_nil(value), do: value
+  def encode_notacanthidae(_), do: {:error, "Unexpected type when encoding FlagmakingClass.notacanthidae"}
+
+  def decode_polyplacophore(value) when is_nil(value), do: value
+  def decode_polyplacophore(_), do: {:error, "Unexpected type when decoding FlagmakingClass.polyplacophore"}
+
+  def encode_polyplacophore(value) when is_nil(value), do: value
+  def encode_polyplacophore(_), do: {:error, "Unexpected type when encoding FlagmakingClass.polyplacophore"}
+
+  def decode_proexercise(value) when is_nil(value), do: value
+  def decode_proexercise(_), do: {:error, "Unexpected type when decoding FlagmakingClass.proexercise"}
+
+  def encode_proexercise(value) when is_nil(value), do: value
+  def encode_proexercise(_), do: {:error, "Unexpected type when encoding FlagmakingClass.proexercise"}
+
+  def decode_protoplast(value) when is_nil(value), do: value
+  def decode_protoplast(_), do: {:error, "Unexpected type when decoding FlagmakingClass.protoplast"}
+
+  def encode_protoplast(value) when is_nil(value), do: value
+  def encode_protoplast(_), do: {:error, "Unexpected type when encoding FlagmakingClass.protoplast"}
+
+  def decode_puzzling(value) when is_nil(value), do: value
+  def decode_puzzling(_), do: {:error, "Unexpected type when decoding FlagmakingClass.puzzling"}
+
+  def encode_puzzling(value) when is_nil(value), do: value
+  def encode_puzzling(_), do: {:error, "Unexpected type when encoding FlagmakingClass.puzzling"}
+
+  def decode_splanchnoskeleton(value) when is_nil(value), do: value
+  def decode_splanchnoskeleton(_), do: {:error, "Unexpected type when decoding FlagmakingClass.splanchnoskeleton"}
+
+  def encode_splanchnoskeleton(value) when is_nil(value), do: value
+  def encode_splanchnoskeleton(_), do: {:error, "Unexpected type when encoding FlagmakingClass.splanchnoskeleton"}
+
+  def decode_unloveliness(value) when is_nil(value), do: value
+  def decode_unloveliness(_), do: {:error, "Unexpected type when decoding FlagmakingClass.unloveliness"}
+
+  def encode_unloveliness(value) when is_nil(value), do: value
+  def encode_unloveliness(_), do: {:error, "Unexpected type when encoding FlagmakingClass.unloveliness"}
+
+  def decode_unquarantined(value) when is_nil(value), do: value
+  def decode_unquarantined(_), do: {:error, "Unexpected type when decoding FlagmakingClass.unquarantined"}
+
+  def encode_unquarantined(value) when is_nil(value), do: value
+  def encode_unquarantined(_), do: {:error, "Unexpected type when encoding FlagmakingClass.unquarantined"}
+
+  def decode_unrenounceable(value) when is_nil(value), do: value
+  def decode_unrenounceable(_), do: {:error, "Unexpected type when decoding FlagmakingClass.unrenounceable"}
+
+  def encode_unrenounceable(value) when is_nil(value), do: value
+  def encode_unrenounceable(_), do: {:error, "Unexpected type when encoding FlagmakingClass.unrenounceable"}
+
   def from_map(m) do
     %FlagmakingClass{
-      albarco: m["albarco"],
-      bunodonta: m["Bunodonta"],
-      hornify: m["hornify"],
-      hydrocorisae: m["Hydrocorisae"],
-      hypoglossus: m["hypoglossus"],
-      inexpiably: m["inexpiably"],
-      ingratitude: m["ingratitude"],
-      ladyfly: m["ladyfly"],
-      medicament: m["medicament"],
-      monogrammatic: m["monogrammatic"],
-      nobbut: m["nobbut"],
-      notacanthidae: m["Notacanthidae"],
-      polyplacophore: m["polyplacophore"],
-      proexercise: m["proexercise"],
-      protoplast: m["protoplast"],
-      puzzling: m["puzzling"],
-      splanchnoskeleton: m["splanchnoskeleton"],
-      unloveliness: m["unloveliness"],
-      unquarantined: m["unquarantined"],
-      unrenounceable: m["unrenounceable"],
+      albarco: decode_albarco(m["albarco"]),
+      bunodonta: decode_bunodonta(m["Bunodonta"]),
+      hornify: decode_hornify(m["hornify"]),
+      hydrocorisae: decode_hydrocorisae(m["Hydrocorisae"]),
+      hypoglossus: decode_hypoglossus(m["hypoglossus"]),
+      inexpiably: decode_inexpiably(m["inexpiably"]),
+      ingratitude: decode_ingratitude(m["ingratitude"]),
+      ladyfly: decode_ladyfly(m["ladyfly"]),
+      medicament: decode_medicament(m["medicament"]),
+      monogrammatic: decode_monogrammatic(m["monogrammatic"]),
+      nobbut: decode_nobbut(m["nobbut"]),
+      notacanthidae: decode_notacanthidae(m["Notacanthidae"]),
+      polyplacophore: decode_polyplacophore(m["polyplacophore"]),
+      proexercise: decode_proexercise(m["proexercise"]),
+      protoplast: decode_protoplast(m["protoplast"]),
+      puzzling: decode_puzzling(m["puzzling"]),
+      splanchnoskeleton: decode_splanchnoskeleton(m["splanchnoskeleton"]),
+      unloveliness: decode_unloveliness(m["unloveliness"]),
+      unquarantined: decode_unquarantined(m["unquarantined"]),
+      unrenounceable: decode_unrenounceable(m["unrenounceable"]),
     }
   end
 
@@ -1094,13 +2086,45 @@ defmodule Interacinar do
           untrimmed: nil
         }
 
+  def decode_assapan(value) when is_float(value), do: value
+  def decode_assapan(value) when is_integer(value), do: value
+  def decode_assapan(_), do: {:error, "Unexpected type when decoding Interacinar.assapan"}
+
+  def encode_assapan(value) when is_float(value), do: value
+  def encode_assapan(value) when is_integer(value), do: value
+  def encode_assapan(_), do: {:error, "Unexpected type when encoding Interacinar.assapan"}
+
+  def decode_benefactorship(value) when is_boolean(value), do: value
+  def decode_benefactorship(_), do: {:error, "Unexpected type when decoding Interacinar.benefactorship"}
+
+  def encode_benefactorship(value) when is_boolean(value), do: value
+  def encode_benefactorship(_), do: {:error, "Unexpected type when encoding Interacinar.benefactorship"}
+
+  def decode_triseriatim(value) when is_binary(value), do: value
+  def decode_triseriatim(_), do: {:error, "Unexpected type when decoding Interacinar.triseriatim"}
+
+  def encode_triseriatim(value) when is_binary(value), do: value
+  def encode_triseriatim(_), do: {:error, "Unexpected type when encoding Interacinar.triseriatim"}
+
+  def decode_tubbing(value) when is_integer(value), do: value
+  def decode_tubbing(_), do: {:error, "Unexpected type when decoding Interacinar.tubbing"}
+
+  def encode_tubbing(value) when is_integer(value), do: value
+  def encode_tubbing(_), do: {:error, "Unexpected type when encoding Interacinar.tubbing"}
+
+  def decode_untrimmed(value) when is_nil(value), do: value
+  def decode_untrimmed(_), do: {:error, "Unexpected type when decoding Interacinar.untrimmed"}
+
+  def encode_untrimmed(value) when is_nil(value), do: value
+  def encode_untrimmed(_), do: {:error, "Unexpected type when encoding Interacinar.untrimmed"}
+
   def from_map(m) do
     %Interacinar{
-      assapan: m["assapan"],
-      benefactorship: m["benefactorship"],
-      triseriatim: m["triseriatim"],
-      tubbing: m["tubbing"],
-      untrimmed: m["untrimmed"],
+      assapan: decode_assapan(m["assapan"]),
+      benefactorship: decode_benefactorship(m["benefactorship"]),
+      triseriatim: decode_triseriatim(m["triseriatim"]),
+      tubbing: decode_tubbing(m["tubbing"]),
+      untrimmed: decode_untrimmed(m["untrimmed"]),
     }
   end
 
@@ -1177,6 +2201,18 @@ defmodule TopLevel do
           jacutinga: [[integer()] | %{String.t() => integer() | nil}]
         }
 
+  def decode_centrodesmose(value) when is_binary(value), do: value
+  def decode_centrodesmose(_), do: {:error, "Unexpected type when decoding TopLevel.centrodesmose"}
+
+  def encode_centrodesmose(value) when is_binary(value), do: value
+  def encode_centrodesmose(_), do: {:error, "Unexpected type when encoding TopLevel.centrodesmose"}
+
+  def decode_cerograph(value) when is_list(value), do: value
+  def decode_cerograph(_), do: {:error, "Unexpected type when decoding TopLevel.cerograph"}
+
+  def encode_cerograph(value) when is_list(value), do: value
+  def encode_cerograph(_), do: {:error, "Unexpected type when encoding TopLevel.cerograph"}
+
   def decode_cerograph_element(%{"apotropaion" => _,"casuary" => _,"creaker" => _,"disqualification" => _,"imperatorious" => _,"impermeabilize" => _,"metastoma" => _,"noctidiurnal" => _,"nonreserve" => _,"ophthalmotonometry" => _,"pailful" => _,"pigfish" => _,"pongee" => _,"prosodical" => _,"scrofuloderm" => _,"storekeeping" => _,"therologist" => _,"Tolowa" => _,"tradeful" => _,"unriveting" => _,} = value), do: CerographClass.from_map(value)
   def decode_cerograph_element(value) when is_nil(value), do: value
   def decode_cerograph_element(value) when is_binary(value), do: value
@@ -1187,6 +2223,12 @@ defmodule TopLevel do
   def encode_cerograph_element(value) when is_binary(value), do: value
   def encode_cerograph_element(_), do: {:error, "Unexpected type when encoding TopLevel.cerograph"}
 
+  def decode_chemotherapeutics(value) when is_list(value), do: value
+  def decode_chemotherapeutics(_), do: {:error, "Unexpected type when decoding TopLevel.chemotherapeutics"}
+
+  def encode_chemotherapeutics(value) when is_list(value), do: value
+  def encode_chemotherapeutics(_), do: {:error, "Unexpected type when encoding TopLevel.chemotherapeutics"}
+
   def decode_chemotherapeutics_element(%{} = value), do: ChemotherapeuticClass.from_map(value)
   def decode_chemotherapeutics_element(value) when is_integer(value), do: value
   def decode_chemotherapeutics_element(_), do: {:error, "Unexpected type when decoding TopLevel.chemotherapeutics"}
@@ -1195,6 +2237,12 @@ defmodule TopLevel do
   def encode_chemotherapeutics_element(value) when is_integer(value), do: value
   def encode_chemotherapeutics_element(_), do: {:error, "Unexpected type when encoding TopLevel.chemotherapeutics"}
 
+  def decode_cimelia(value) when is_list(value), do: value
+  def decode_cimelia(_), do: {:error, "Unexpected type when decoding TopLevel.cimelia"}
+
+  def encode_cimelia(value) when is_list(value), do: value
+  def encode_cimelia(_), do: {:error, "Unexpected type when encoding TopLevel.cimelia"}
+
   def decode_cimelia_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: CimeliaClass.from_map(value)
   def decode_cimelia_element(value) when is_nil(value), do: value
   def decode_cimelia_element(value) when is_list(value), do: value
@@ -1205,6 +2253,18 @@ defmodule TopLevel do
   def encode_cimelia_element(value) when is_list(value), do: value
   def encode_cimelia_element(_), do: {:error, "Unexpected type when encoding TopLevel.cimelia"}
 
+  def decode_citrated(value) when is_integer(value), do: value
+  def decode_citrated(_), do: {:error, "Unexpected type when decoding TopLevel.citrated"}
+
+  def encode_citrated(value) when is_integer(value), do: value
+  def encode_citrated(_), do: {:error, "Unexpected type when encoding TopLevel.citrated"}
+
+  def decode_clinodome(value) when is_list(value), do: value
+  def decode_clinodome(_), do: {:error, "Unexpected type when decoding TopLevel.clinodome"}
+
+  def encode_clinodome(value) when is_list(value), do: value
+  def encode_clinodome(_), do: {:error, "Unexpected type when encoding TopLevel.clinodome"}
+
   def decode_clinodome_element(value) when is_float(value), do: value
   def decode_clinodome_element(value) when is_integer(value), do: value
   def decode_clinodome_element(value) when is_binary(value), do: value
@@ -1215,6 +2275,12 @@ defmodule TopLevel do
   def encode_clinodome_element(value) when is_binary(value), do: value
   def encode_clinodome_element(_), do: {:error, "Unexpected type when encoding TopLevel.clinodome"}
 
+  def decode_coadjust(value) when is_list(value), do: value
+  def decode_coadjust(_), do: {:error, "Unexpected type when decoding TopLevel.coadjust"}
+
+  def encode_coadjust(value) when is_list(value), do: value
+  def encode_coadjust(_), do: {:error, "Unexpected type when encoding TopLevel.coadjust"}
+
   def decode_coadjust_element(%{} = value), do: CoadjustClass.from_map(value)
   def decode_coadjust_element(value) when is_float(value), do: value
   def decode_coadjust_element(value) when is_integer(value), do: value
@@ -1225,6 +2291,12 @@ defmodule TopLevel do
   def encode_coadjust_element(value) when is_integer(value), do: value
   def encode_coadjust_element(_), do: {:error, "Unexpected type when encoding TopLevel.coadjust"}
 
+  def decode_consilience(value) when is_list(value), do: value
+  def decode_consilience(_), do: {:error, "Unexpected type when decoding TopLevel.consilience"}
+
+  def encode_consilience(value) when is_list(value), do: value
+  def encode_consilience(_), do: {:error, "Unexpected type when encoding TopLevel.consilience"}
+
   def decode_consilience_element(value) when is_float(value), do: value
   def decode_consilience_element(value) when is_integer(value), do: value
   def decode_consilience_element(value) when is_map(value), do: value
@@ -1235,6 +2307,12 @@ defmodule TopLevel do
   def encode_consilience_element(value) when is_map(value), do: value
   def encode_consilience_element(_), do: {:error, "Unexpected type when encoding TopLevel.consilience"}
 
+  def decode_constructor(value) when is_list(value), do: value
+  def decode_constructor(_), do: {:error, "Unexpected type when decoding TopLevel.constructor"}
+
+  def encode_constructor(value) when is_list(value), do: value
+  def encode_constructor(_), do: {:error, "Unexpected type when encoding TopLevel.constructor"}
+
   def decode_constructor_element(value) when is_boolean(value), do: value
   def decode_constructor_element(value) when is_map(value), do: value
   def decode_constructor_element(_), do: {:error, "Unexpected type when decoding TopLevel.constructor"}
@@ -1243,6 +2321,12 @@ defmodule TopLevel do
   def encode_constructor_element(value) when is_map(value), do: value
   def encode_constructor_element(_), do: {:error, "Unexpected type when encoding TopLevel.constructor"}
 
+  def decode_continuative(value) when is_list(value), do: value
+  def decode_continuative(_), do: {:error, "Unexpected type when decoding TopLevel.continuative"}
+
+  def encode_continuative(value) when is_list(value), do: value
+  def encode_continuative(_), do: {:error, "Unexpected type when encoding TopLevel.continuative"}
+
   def decode_continuative_element(value) when is_binary(value), do: value
   def decode_continuative_element(value) when is_map(value), do: value
   def decode_continuative_element(_), do: {:error, "Unexpected type when decoding TopLevel.continuative"}
@@ -1251,6 +2335,12 @@ defmodule TopLevel do
   def encode_continuative_element(value) when is_map(value), do: value
   def encode_continuative_element(_), do: {:error, "Unexpected type when encoding TopLevel.continuative"}
 
+  def decode_credulity(value) when is_list(value), do: value
+  def decode_credulity(_), do: {:error, "Unexpected type when decoding TopLevel.credulity"}
+
+  def encode_credulity(value) when is_list(value), do: value
+  def encode_credulity(_), do: {:error, "Unexpected type when encoding TopLevel.credulity"}
+
   def decode_credulity_element(%{"ammonolytic" => _,"bushmaster" => _,"considering" => _,"consuetudinary" => _,"embarras" => _,"fineness" => _,"flaithship" => _,"Flavia" => _,"gruffly" => _,"Hedychium" => _,"leadwort" => _,"overseriously" => _,"parabola" => _,"pectinatodenticulate" => _,"Popean" => _,"pornocrat" => _,"quadrisect" => _,"seriality" => _,"vamphorn" => _,"wharp" => _,} = value), do: CredulityClass.from_map(value)
   def decode_credulity_element(value) when is_integer(value), do: value
   def decode_credulity_element(value) when is_binary(value), do: value
@@ -1261,6 +2351,12 @@ defmodule TopLevel do
   def encode_credulity_element(value) when is_binary(value), do: value
   def encode_credulity_element(_), do: {:error, "Unexpected type when encoding TopLevel.credulity"}
 
+  def decode_creviced(value) when is_list(value), do: value
+  def decode_creviced(_), do: {:error, "Unexpected type when decoding TopLevel.creviced"}
+
+  def encode_creviced(value) when is_list(value), do: value
+  def encode_creviced(_), do: {:error, "Unexpected type when encoding TopLevel.creviced"}
+
   def decode_creviced_element(value) when is_boolean(value), do: value
   def decode_creviced_element(value) when is_binary(value), do: value
   def decode_creviced_element(value) when is_map(value), do: value
@@ -1271,6 +2367,18 @@ defmodule TopLevel do
   def encode_creviced_element(value) when is_map(value), do: value
   def encode_creviced_element(_), do: {:error, "Unexpected type when encoding TopLevel.creviced"}
 
+  def decode_cubiculum(value) when is_list(value), do: value
+  def decode_cubiculum(_), do: {:error, "Unexpected type when decoding TopLevel.cubiculum"}
+
+  def encode_cubiculum(value) when is_list(value), do: value
+  def encode_cubiculum(_), do: {:error, "Unexpected type when encoding TopLevel.cubiculum"}
+
+  def decode_deruralize(value) when is_list(value), do: value
+  def decode_deruralize(_), do: {:error, "Unexpected type when decoding TopLevel.deruralize"}
+
+  def encode_deruralize(value) when is_list(value), do: value
+  def encode_deruralize(_), do: {:error, "Unexpected type when encoding TopLevel.deruralize"}
+
   def decode_deruralize_element(%{"bockerel" => _,"boulder" => _,"churrus" => _,"counterdigged" => _,"dialogite" => _,"digenic" => _,"dunbird" => _,"ergatogyne" => _,"fiendful" => _,"jackrod" => _,"Jehovistic" => _,"Paninean" => _,"panther" => _,"placentigerous" => _,"Romney" => _,"sparm" => _,"tocsin" => _,"unnicked" => _,"unstavable" => _,"windfirm" => _,} = value), do: DeruralizeClass.from_map(value)
   def decode_deruralize_element(value) when is_boolean(value), do: value
   def decode_deruralize_element(value) when is_list(value), do: value
@@ -1281,6 +2389,12 @@ defmodule TopLevel do
   def encode_deruralize_element(value) when is_list(value), do: value
   def encode_deruralize_element(_), do: {:error, "Unexpected type when encoding TopLevel.deruralize"}
 
+  def decode_diaereses(value) when is_list(value), do: value
+  def decode_diaereses(_), do: {:error, "Unexpected type when decoding TopLevel.diaereses"}
+
+  def encode_diaereses(value) when is_list(value), do: value
+  def encode_diaereses(_), do: {:error, "Unexpected type when encoding TopLevel.diaereses"}
+
   def decode_diaereses_element(%{"Amoreuxia" => _,"ani" => _,"bernicle" => _,"blackwasher" => _,"blowhard" => _,"broma" => _,"closecross" => _,"congregationalism" => _,"grayly" => _,"historically" => _,"hoast" => _,"irretentive" => _,"parcener" => _,"pedder" => _,"pseudoanatomic" => _,"rhizocarpian" => _,"samel" => _,"silker" => _,"subdentated" => _,"subobscure" => _,} = value), do: DiaereseClass.from_map(value)
   def decode_diaereses_element(value) when is_boolean(value), do: value
   def decode_diaereses_element(value) when is_list(value), do: value
@@ -1291,6 +2405,12 @@ defmodule TopLevel do
   def encode_diaereses_element(value) when is_list(value), do: value
   def encode_diaereses_element(_), do: {:error, "Unexpected type when encoding TopLevel.diaereses"}
 
+  def decode_dissolution(value) when is_list(value), do: value
+  def decode_dissolution(_), do: {:error, "Unexpected type when decoding TopLevel.dissolution"}
+
+  def encode_dissolution(value) when is_list(value), do: value
+  def encode_dissolution(_), do: {:error, "Unexpected type when encoding TopLevel.dissolution"}
+
   def decode_dissolution_element(value) when is_nil(value), do: value
   def decode_dissolution_element(value) when is_list(value), do: value
   def decode_dissolution_element(_), do: {:error, "Unexpected type when decoding TopLevel.dissolution"}
@@ -1299,6 +2419,12 @@ defmodule TopLevel do
   def encode_dissolution_element(value) when is_list(value), do: value
   def encode_dissolution_element(_), do: {:error, "Unexpected type when encoding TopLevel.dissolution"}
 
+  def decode_downstroke(value) when is_list(value), do: value
+  def decode_downstroke(_), do: {:error, "Unexpected type when decoding TopLevel.downstroke"}
+
+  def encode_downstroke(value) when is_list(value), do: value
+  def encode_downstroke(_), do: {:error, "Unexpected type when encoding TopLevel.downstroke"}
+
   def decode_downstroke_element(value) when is_boolean(value), do: value
   def decode_downstroke_element(value) when is_binary(value), do: value
   def decode_downstroke_element(value) when is_list(value), do: value
@@ -1309,6 +2435,12 @@ defmodule TopLevel do
   def encode_downstroke_element(value) when is_list(value), do: value
   def encode_downstroke_element(_), do: {:error, "Unexpected type when encoding TopLevel.downstroke"}
 
+  def decode_electrotautomerism(value) when is_list(value), do: value
+  def decode_electrotautomerism(_), do: {:error, "Unexpected type when decoding TopLevel.electrotautomerism"}
+
+  def encode_electrotautomerism(value) when is_list(value), do: value
+  def encode_electrotautomerism(_), do: {:error, "Unexpected type when encoding TopLevel.electrotautomerism"}
+
   def decode_electrotautomerism_element(value) when is_float(value), do: value
   def decode_electrotautomerism_element(value) when is_integer(value), do: value
   def decode_electrotautomerism_element(value) when is_nil(value), do: value
@@ -1319,6 +2451,12 @@ defmodule TopLevel do
   def encode_electrotautomerism_element(value) when is_nil(value), do: value
   def encode_electrotautomerism_element(_), do: {:error, "Unexpected type when encoding TopLevel.electrotautomerism"}
 
+  def decode_eleutheromania(value) when is_list(value), do: value
+  def decode_eleutheromania(_), do: {:error, "Unexpected type when decoding TopLevel.eleutheromania"}
+
+  def encode_eleutheromania(value) when is_list(value), do: value
+  def encode_eleutheromania(_), do: {:error, "Unexpected type when encoding TopLevel.eleutheromania"}
+
   def decode_eleutheromania_element(value) when is_float(value), do: value
   def decode_eleutheromania_element(value) when is_integer(value), do: value
   def decode_eleutheromania_element(value) when is_binary(value), do: value
@@ -1331,6 +2469,12 @@ defmodule TopLevel do
   def encode_eleutheromania_element(value) when is_map(value), do: value
   def encode_eleutheromania_element(_), do: {:error, "Unexpected type when encoding TopLevel.eleutheromania"}
 
+  def decode_entomoid(value) when is_list(value), do: value
+  def decode_entomoid(_), do: {:error, "Unexpected type when decoding TopLevel.entomoid"}
+
+  def encode_entomoid(value) when is_list(value), do: value
+  def encode_entomoid(_), do: {:error, "Unexpected type when encoding TopLevel.entomoid"}
+
   def decode_entomoid_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: CimeliaClass.from_map(value)
   def decode_entomoid_element(value) when is_integer(value), do: value
   def decode_entomoid_element(_), do: {:error, "Unexpected type when decoding TopLevel.entomoid"}
@@ -1339,6 +2483,12 @@ defmodule TopLevel do
   def encode_entomoid_element(value) when is_integer(value), do: value
   def encode_entomoid_element(_), do: {:error, "Unexpected type when encoding TopLevel.entomoid"}
 
+  def decode_epipaleolithic(value) when is_list(value), do: value
+  def decode_epipaleolithic(_), do: {:error, "Unexpected type when decoding TopLevel.epipaleolithic"}
+
+  def encode_epipaleolithic(value) when is_list(value), do: value
+  def encode_epipaleolithic(_), do: {:error, "Unexpected type when encoding TopLevel.epipaleolithic"}
+
   def decode_epipaleolithic_element(value) when is_float(value), do: value
   def decode_epipaleolithic_element(value) when is_integer(value), do: value
   def decode_epipaleolithic_element(value) when is_list(value), do: value
@@ -1349,6 +2499,12 @@ defmodule TopLevel do
   def encode_epipaleolithic_element(value) when is_list(value), do: value
   def encode_epipaleolithic_element(_), do: {:error, "Unexpected type when encoding TopLevel.epipaleolithic"}
 
+  def decode_expropriable(value) when is_list(value), do: value
+  def decode_expropriable(_), do: {:error, "Unexpected type when decoding TopLevel.expropriable"}
+
+  def encode_expropriable(value) when is_list(value), do: value
+  def encode_expropriable(_), do: {:error, "Unexpected type when encoding TopLevel.expropriable"}
+
   def decode_expropriable_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: CimeliaClass.from_map(value)
   def decode_expropriable_element(value) when is_float(value), do: value
   def decode_expropriable_element(value) when is_integer(value), do: value
@@ -1361,6 +2517,12 @@ defmodule TopLevel do
   def encode_expropriable_element(value) when is_list(value), do: value
   def encode_expropriable_element(_), do: {:error, "Unexpected type when encoding TopLevel.expropriable"}
 
+  def decode_faggingly(value) when is_list(value), do: value
+  def decode_faggingly(_), do: {:error, "Unexpected type when decoding TopLevel.faggingly"}
+
+  def encode_faggingly(value) when is_list(value), do: value
+  def encode_faggingly(_), do: {:error, "Unexpected type when encoding TopLevel.faggingly"}
+
   def decode_faggingly_element(%{"abranchian" => _,"aculeiform" => _,"adiaphoristic" => _,"adoptionism" => _,"Anglic" => _,"antrotomy" => _,"coerciveness" => _,"decorist" => _,"duckhood" => _,"Heteromeri" => _,"hypochnose" => _,"lochage" => _,"melee" => _,"nonconformitant" => _,"Poinsettia" => _,"putatively" => _,"semivolatile" => _,"soleas" => _,"unfastenable" => _,"unmillinered" => _,} = value), do: FagginglyClass.from_map(value)
   def decode_faggingly_element(value) when is_float(value), do: value
   def decode_faggingly_element(value) when is_integer(value), do: value
@@ -1371,6 +2533,12 @@ defmodule TopLevel do
   def encode_faggingly_element(value) when is_integer(value), do: value
   def encode_faggingly_element(_), do: {:error, "Unexpected type when encoding TopLevel.faggingly"}
 
+  def decode_fenks(value) when is_list(value), do: value
+  def decode_fenks(_), do: {:error, "Unexpected type when decoding TopLevel.fenks"}
+
+  def encode_fenks(value) when is_list(value), do: value
+  def encode_fenks(_), do: {:error, "Unexpected type when encoding TopLevel.fenks"}
+
   def decode_fenks_element(%{"apoise" => _,"astronomize" => _,"cockhorse" => _,"copular" => _,"Dagomba" => _,"draffy" => _,"foreigner" => _,"Guyandot" => _,"neurogliosis" => _,"osmious" => _,"palpitate" => _,"rebukeable" => _,"Reinwardtia" => _,"reservatory" => _,"scalt" => _,"scripturalize" => _,"tintometer" => _,"Tritoness" => _,"undergrade" => _,"undermountain" => _,} = value), do: FenkClass.from_map(value)
   def decode_fenks_element(value) when is_binary(value), do: value
   def decode_fenks_element(_), do: {:error, "Unexpected type when decoding TopLevel.fenks"}
@@ -1379,6 +2547,12 @@ defmodule TopLevel do
   def encode_fenks_element(value) when is_binary(value), do: value
   def encode_fenks_element(_), do: {:error, "Unexpected type when encoding TopLevel.fenks"}
 
+  def decode_flagmaking(value) when is_list(value), do: value
+  def decode_flagmaking(_), do: {:error, "Unexpected type when decoding TopLevel.flagmaking"}
+
+  def encode_flagmaking(value) when is_list(value), do: value
+  def encode_flagmaking(_), do: {:error, "Unexpected type when encoding TopLevel.flagmaking"}
+
   def decode_flagmaking_element(%{"albarco" => _,"Bunodonta" => _,"hornify" => _,"Hydrocorisae" => _,"hypoglossus" => _,"inexpiably" => _,"ingratitude" => _,"ladyfly" => _,"medicament" => _,"monogrammatic" => _,"nobbut" => _,"Notacanthidae" => _,"polyplacophore" => _,"proexercise" => _,"protoplast" => _,"puzzling" => _,"splanchnoskeleton" => _,"unloveliness" => _,"unquarantined" => _,"unrenounceable" => _,} = value), do: FlagmakingClass.from_map(value)
   def decode_flagmaking_element(value) when is_boolean(value), do: value
   def decode_flagmaking_element(value) when is_float(value), do: value
@@ -1391,6 +2565,12 @@ defmodule TopLevel do
   def encode_flagmaking_element(value) when is_integer(value), do: value
   def encode_flagmaking_element(_), do: {:error, "Unexpected type when encoding TopLevel.flagmaking"}
 
+  def decode_fluorometer(value) when is_list(value), do: value
+  def decode_fluorometer(_), do: {:error, "Unexpected type when decoding TopLevel.fluorometer"}
+
+  def encode_fluorometer(value) when is_list(value), do: value
+  def encode_fluorometer(_), do: {:error, "Unexpected type when encoding TopLevel.fluorometer"}
+
   def decode_fluorometer_element(value) when is_integer(value), do: value
   def decode_fluorometer_element(value) when is_nil(value), do: value
   def decode_fluorometer_element(value) when is_binary(value), do: value
@@ -1401,6 +2581,12 @@ defmodule TopLevel do
   def encode_fluorometer_element(value) when is_binary(value), do: value
   def encode_fluorometer_element(_), do: {:error, "Unexpected type when encoding TopLevel.fluorometer"}
 
+  def decode_fulsome(value) when is_list(value), do: value
+  def decode_fulsome(_), do: {:error, "Unexpected type when decoding TopLevel.fulsome"}
+
+  def encode_fulsome(value) when is_list(value), do: value
+  def encode_fulsome(_), do: {:error, "Unexpected type when encoding TopLevel.fulsome"}
+
   def decode_fulsome_element(value) when is_integer(value), do: value
   def decode_fulsome_element(value) when is_nil(value), do: value
   def decode_fulsome_element(_), do: {:error, "Unexpected type when decoding TopLevel.fulsome"}
@@ -1409,6 +2595,12 @@ defmodule TopLevel do
   def encode_fulsome_element(value) when is_nil(value), do: value
   def encode_fulsome_element(_), do: {:error, "Unexpected type when encoding TopLevel.fulsome"}
 
+  def decode_fuzzy(value) when is_list(value), do: value
+  def decode_fuzzy(_), do: {:error, "Unexpected type when decoding TopLevel.fuzzy"}
+
+  def encode_fuzzy(value) when is_list(value), do: value
+  def encode_fuzzy(_), do: {:error, "Unexpected type when encoding TopLevel.fuzzy"}
+
   def decode_fuzzy_element(value) when is_integer(value), do: value
   def decode_fuzzy_element(value) when is_map(value), do: value
   def decode_fuzzy_element(_), do: {:error, "Unexpected type when decoding TopLevel.fuzzy"}
@@ -1417,6 +2609,12 @@ defmodule TopLevel do
   def encode_fuzzy_element(value) when is_map(value), do: value
   def encode_fuzzy_element(_), do: {:error, "Unexpected type when encoding TopLevel.fuzzy"}
 
+  def decode_gardenwards(value) when is_list(value), do: value
+  def decode_gardenwards(_), do: {:error, "Unexpected type when decoding TopLevel.gardenwards"}
+
+  def encode_gardenwards(value) when is_list(value), do: value
+  def encode_gardenwards(_), do: {:error, "Unexpected type when encoding TopLevel.gardenwards"}
+
   def decode_gardenwards_element(value) when is_boolean(value), do: value
   def decode_gardenwards_element(value) when is_binary(value), do: value
   def decode_gardenwards_element(value) when is_list(value), do: value
@@ -1427,6 +2625,12 @@ defmodule TopLevel do
   def encode_gardenwards_element(value) when is_list(value), do: value
   def encode_gardenwards_element(_), do: {:error, "Unexpected type when encoding TopLevel.gardenwards"}
 
+  def decode_generalissimo(value) when is_list(value), do: value
+  def decode_generalissimo(_), do: {:error, "Unexpected type when decoding TopLevel.generalissimo"}
+
+  def encode_generalissimo(value) when is_list(value), do: value
+  def encode_generalissimo(_), do: {:error, "Unexpected type when encoding TopLevel.generalissimo"}
+
   def decode_generalissimo_element(value) when is_boolean(value), do: value
   def decode_generalissimo_element(value) when is_nil(value), do: value
   def decode_generalissimo_element(value) when is_map(value), do: value
@@ -1437,6 +2641,12 @@ defmodule TopLevel do
   def encode_generalissimo_element(value) when is_map(value), do: value
   def encode_generalissimo_element(_), do: {:error, "Unexpected type when encoding TopLevel.generalissimo"}
 
+  def decode_habeas(value) when is_list(value), do: value
+  def decode_habeas(_), do: {:error, "Unexpected type when decoding TopLevel.habeas"}
+
+  def encode_habeas(value) when is_list(value), do: value
+  def encode_habeas(_), do: {:error, "Unexpected type when encoding TopLevel.habeas"}
+
   def decode_habeas_element(value) when is_nil(value), do: value
   def decode_habeas_element(value) when is_map(value), do: value
   def decode_habeas_element(_), do: {:error, "Unexpected type when decoding TopLevel.habeas"}
@@ -1445,6 +2655,12 @@ defmodule TopLevel do
   def encode_habeas_element(value) when is_map(value), do: value
   def encode_habeas_element(_), do: {:error, "Unexpected type when encoding TopLevel.habeas"}
 
+  def decode_hemicrystalline(value) when is_list(value), do: value
+  def decode_hemicrystalline(_), do: {:error, "Unexpected type when decoding TopLevel.hemicrystalline"}
+
+  def encode_hemicrystalline(value) when is_list(value), do: value
+  def encode_hemicrystalline(_), do: {:error, "Unexpected type when encoding TopLevel.hemicrystalline"}
+
   def decode_hemicrystalline_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: CimeliaClass.from_map(value)
   def decode_hemicrystalline_element(value) when is_binary(value), do: value
   def decode_hemicrystalline_element(_), do: {:error, "Unexpected type when decoding TopLevel.hemicrystalline"}
@@ -1453,6 +2669,12 @@ defmodule TopLevel do
   def encode_hemicrystalline_element(value) when is_binary(value), do: value
   def encode_hemicrystalline_element(_), do: {:error, "Unexpected type when encoding TopLevel.hemicrystalline"}
 
+  def decode_hemocoele(value) when is_list(value), do: value
+  def decode_hemocoele(_), do: {:error, "Unexpected type when decoding TopLevel.hemocoele"}
+
+  def encode_hemocoele(value) when is_list(value), do: value
+  def encode_hemocoele(_), do: {:error, "Unexpected type when encoding TopLevel.hemocoele"}
+
   def decode_hemocoele_element(%{} = value), do: HemocoeleClass.from_map(value)
   def decode_hemocoele_element(value) when is_list(value), do: value
   def decode_hemocoele_element(_), do: {:error, "Unexpected type when decoding TopLevel.hemocoele"}
@@ -1461,6 +2683,12 @@ defmodule TopLevel do
   def encode_hemocoele_element(value) when is_list(value), do: value
   def encode_hemocoele_element(_), do: {:error, "Unexpected type when encoding TopLevel.hemocoele"}
 
+  def decode_hoister(value) when is_list(value), do: value
+  def decode_hoister(_), do: {:error, "Unexpected type when decoding TopLevel.hoister"}
+
+  def encode_hoister(value) when is_list(value), do: value
+  def encode_hoister(_), do: {:error, "Unexpected type when encoding TopLevel.hoister"}
+
   def decode_hoister_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: CimeliaClass.from_map(value)
   def decode_hoister_element(value) when is_nil(value), do: value
   def decode_hoister_element(value) when is_binary(value), do: value
@@ -1471,6 +2699,12 @@ defmodule TopLevel do
   def encode_hoister_element(value) when is_binary(value), do: value
   def encode_hoister_element(_), do: {:error, "Unexpected type when encoding TopLevel.hoister"}
 
+  def decode_hyperpiesis(value) when is_list(value), do: value
+  def decode_hyperpiesis(_), do: {:error, "Unexpected type when decoding TopLevel.hyperpiesis"}
+
+  def encode_hyperpiesis(value) when is_list(value), do: value
+  def encode_hyperpiesis(_), do: {:error, "Unexpected type when encoding TopLevel.hyperpiesis"}
+
   def decode_hyperpiesis_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: CimeliaClass.from_map(value)
   def decode_hyperpiesis_element(value) when is_nil(value), do: value
   def decode_hyperpiesis_element(value) when is_list(value), do: value
@@ -1481,6 +2715,12 @@ defmodule TopLevel do
   def encode_hyperpiesis_element(value) when is_list(value), do: value
   def encode_hyperpiesis_element(_), do: {:error, "Unexpected type when encoding TopLevel.hyperpiesis"}
 
+  def decode_hyppish(value) when is_list(value), do: value
+  def decode_hyppish(_), do: {:error, "Unexpected type when decoding TopLevel.hyppish"}
+
+  def encode_hyppish(value) when is_list(value), do: value
+  def encode_hyppish(_), do: {:error, "Unexpected type when encoding TopLevel.hyppish"}
+
   def decode_hyppish_element(value) when is_boolean(value), do: value
   def decode_hyppish_element(value) when is_nil(value), do: value
   def decode_hyppish_element(value) when is_binary(value), do: value
@@ -1491,6 +2731,12 @@ defmodule TopLevel do
   def encode_hyppish_element(value) when is_binary(value), do: value
   def encode_hyppish_element(_), do: {:error, "Unexpected type when encoding TopLevel.hyppish"}
 
+  def decode_idealizer(value) when is_list(value), do: value
+  def decode_idealizer(_), do: {:error, "Unexpected type when decoding TopLevel.idealizer"}
+
+  def encode_idealizer(value) when is_list(value), do: value
+  def encode_idealizer(_), do: {:error, "Unexpected type when encoding TopLevel.idealizer"}
+
   def decode_idealizer_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: CimeliaClass.from_map(value)
   def decode_idealizer_element(value) when is_integer(value), do: value
   def decode_idealizer_element(value) when is_list(value), do: value
@@ -1501,6 +2747,12 @@ defmodule TopLevel do
   def encode_idealizer_element(value) when is_list(value), do: value
   def encode_idealizer_element(_), do: {:error, "Unexpected type when encoding TopLevel.idealizer"}
 
+  def decode_incrustator(value) when is_list(value), do: value
+  def decode_incrustator(_), do: {:error, "Unexpected type when decoding TopLevel.incrustator"}
+
+  def encode_incrustator(value) when is_list(value), do: value
+  def encode_incrustator(_), do: {:error, "Unexpected type when encoding TopLevel.incrustator"}
+
   def decode_incrustator_element(value) when is_integer(value), do: value
   def decode_incrustator_element(value) when is_binary(value), do: value
   def decode_incrustator_element(value) when is_list(value), do: value
@@ -1511,6 +2763,12 @@ defmodule TopLevel do
   def encode_incrustator_element(value) when is_list(value), do: value
   def encode_incrustator_element(_), do: {:error, "Unexpected type when encoding TopLevel.incrustator"}
 
+  def decode_intentiveness(value) when is_list(value), do: value
+  def decode_intentiveness(_), do: {:error, "Unexpected type when decoding TopLevel.intentiveness"}
+
+  def encode_intentiveness(value) when is_list(value), do: value
+  def encode_intentiveness(_), do: {:error, "Unexpected type when encoding TopLevel.intentiveness"}
+
   def decode_intentiveness_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: CimeliaClass.from_map(value)
   def decode_intentiveness_element(value) when is_float(value), do: value
   def decode_intentiveness_element(value) when is_integer(value), do: value
@@ -1523,6 +2781,12 @@ defmodule TopLevel do
   def encode_intentiveness_element(value) when is_binary(value), do: value
   def encode_intentiveness_element(_), do: {:error, "Unexpected type when encoding TopLevel.intentiveness"}
 
+  def decode_intercorrelation(value) when is_list(value), do: value
+  def decode_intercorrelation(_), do: {:error, "Unexpected type when decoding TopLevel.intercorrelation"}
+
+  def encode_intercorrelation(value) when is_list(value), do: value
+  def encode_intercorrelation(_), do: {:error, "Unexpected type when encoding TopLevel.intercorrelation"}
+
   def decode_intercorrelation_element(value) when is_nil(value), do: value
   def decode_intercorrelation_element(value) when is_list(value), do: value
   def decode_intercorrelation_element(_), do: {:error, "Unexpected type when decoding TopLevel.intercorrelation"}
@@ -1531,6 +2795,12 @@ defmodule TopLevel do
   def encode_intercorrelation_element(value) when is_list(value), do: value
   def encode_intercorrelation_element(_), do: {:error, "Unexpected type when encoding TopLevel.intercorrelation"}
 
+  def decode_jacutinga(value) when is_list(value), do: value
+  def decode_jacutinga(_), do: {:error, "Unexpected type when decoding TopLevel.jacutinga"}
+
+  def encode_jacutinga(value) when is_list(value), do: value
+  def encode_jacutinga(_), do: {:error, "Unexpected type when encoding TopLevel.jacutinga"}
+
   def decode_jacutinga_element(value) when is_list(value), do: value
   def decode_jacutinga_element(value) when is_map(value), do: value
   def decode_jacutinga_element(_), do: {:error, "Unexpected type when decoding TopLevel.jacutinga"}
@@ -1541,11 +2811,11 @@ defmodule TopLevel do
 
   def from_map(m) do
     %TopLevel{
-      centrodesmose: m["centrodesmose"],
+      centrodesmose: decode_centrodesmose(m["centrodesmose"]),
       cerograph: Enum.map(m["cerograph"], &decode_cerograph_element/1),
       chemotherapeutics: Enum.map(m["chemotherapeutics"], &decode_chemotherapeutics_element/1),
       cimelia: Enum.map(m["cimelia"], &decode_cimelia_element/1),
-      citrated: m["citrated"],
+      citrated: decode_citrated(m["citrated"]),
       clinodome: Enum.map(m["clinodome"], &decode_clinodome_element/1),
       coadjust: Enum.map(m["coadjust"], &decode_coadjust_element/1),
       consilience: Enum.map(m["consilience"], &decode_consilience_element/1),
@@ -1553,7 +2823,7 @@ defmodule TopLevel do
       continuative: Enum.map(m["continuative"], &decode_continuative_element/1),
       credulity: Enum.map(m["credulity"], &decode_credulity_element/1),
       creviced: Enum.map(m["creviced"], &decode_creviced_element/1),
-      cubiculum: m["cubiculum"],
+      cubiculum: decode_cubiculum(m["cubiculum"]),
       deruralize: Enum.map(m["deruralize"], &decode_deruralize_element/1),
       diaereses: Enum.map(m["diaereses"], &decode_diaereses_element/1),
       dissolution: Enum.map(m["dissolution"], &decode_dissolution_element/1),
diff --git a/base/elixir/test/inputs/json/priority/combinations2.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/combinations2.json/default/QuickType.ex
index 546a807..9a52006 100644
--- a/base/elixir/test/inputs/json/priority/combinations2.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/combinations2.json/default/QuickType.ex
@@ -32,28 +32,148 @@ defmodule AlleviateClass do
           wherewithal: nil
         }
 
+  def decode_apriori(value) when is_nil(value), do: value
+  def decode_apriori(_), do: {:error, "Unexpected type when decoding AlleviateClass.apriori"}
+
+  def encode_apriori(value) when is_nil(value), do: value
+  def encode_apriori(_), do: {:error, "Unexpected type when encoding AlleviateClass.apriori"}
+
+  def decode_beggarer(value) when is_nil(value), do: value
+  def decode_beggarer(_), do: {:error, "Unexpected type when decoding AlleviateClass.beggarer"}
+
+  def encode_beggarer(value) when is_nil(value), do: value
+  def encode_beggarer(_), do: {:error, "Unexpected type when encoding AlleviateClass.beggarer"}
+
+  def decode_brokenheartedly(value) when is_nil(value), do: value
+  def decode_brokenheartedly(_), do: {:error, "Unexpected type when decoding AlleviateClass.brokenheartedly"}
+
+  def encode_brokenheartedly(value) when is_nil(value), do: value
+  def encode_brokenheartedly(_), do: {:error, "Unexpected type when encoding AlleviateClass.brokenheartedly"}
+
+  def decode_debilitation(value) when is_nil(value), do: value
+  def decode_debilitation(_), do: {:error, "Unexpected type when decoding AlleviateClass.debilitation"}
+
+  def encode_debilitation(value) when is_nil(value), do: value
+  def encode_debilitation(_), do: {:error, "Unexpected type when encoding AlleviateClass.debilitation"}
+
+  def decode_frike(value) when is_nil(value), do: value
+  def decode_frike(_), do: {:error, "Unexpected type when decoding AlleviateClass.frike"}
+
+  def encode_frike(value) when is_nil(value), do: value
+  def encode_frike(_), do: {:error, "Unexpected type when encoding AlleviateClass.frike"}
+
+  def decode_gastrolith(value) when is_nil(value), do: value
+  def decode_gastrolith(_), do: {:error, "Unexpected type when decoding AlleviateClass.gastrolith"}
+
+  def encode_gastrolith(value) when is_nil(value), do: value
+  def encode_gastrolith(_), do: {:error, "Unexpected type when encoding AlleviateClass.gastrolith"}
+
+  def decode_hulsean(value) when is_nil(value), do: value
+  def decode_hulsean(_), do: {:error, "Unexpected type when decoding AlleviateClass.hulsean"}
+
+  def encode_hulsean(value) when is_nil(value), do: value
+  def encode_hulsean(_), do: {:error, "Unexpected type when encoding AlleviateClass.hulsean"}
+
+  def decode_orthocentric(value) when is_nil(value), do: value
+  def decode_orthocentric(_), do: {:error, "Unexpected type when decoding AlleviateClass.orthocentric"}
+
+  def encode_orthocentric(value) when is_nil(value), do: value
+  def encode_orthocentric(_), do: {:error, "Unexpected type when encoding AlleviateClass.orthocentric"}
+
+  def decode_petaly(value) when is_nil(value), do: value
+  def decode_petaly(_), do: {:error, "Unexpected type when decoding AlleviateClass.petaly"}
+
+  def encode_petaly(value) when is_nil(value), do: value
+  def encode_petaly(_), do: {:error, "Unexpected type when encoding AlleviateClass.petaly"}
+
+  def decode_probudgeting(value) when is_nil(value), do: value
+  def decode_probudgeting(_), do: {:error, "Unexpected type when decoding AlleviateClass.probudgeting"}
+
+  def encode_probudgeting(value) when is_nil(value), do: value
+  def encode_probudgeting(_), do: {:error, "Unexpected type when encoding AlleviateClass.probudgeting"}
+
+  def decode_reacquire(value) when is_nil(value), do: value
+  def decode_reacquire(_), do: {:error, "Unexpected type when decoding AlleviateClass.reacquire"}
+
+  def encode_reacquire(value) when is_nil(value), do: value
+  def encode_reacquire(_), do: {:error, "Unexpected type when encoding AlleviateClass.reacquire"}
+
+  def decode_scow(value) when is_nil(value), do: value
+  def decode_scow(_), do: {:error, "Unexpected type when decoding AlleviateClass.scow"}
+
+  def encode_scow(value) when is_nil(value), do: value
+  def encode_scow(_), do: {:error, "Unexpected type when encoding AlleviateClass.scow"}
+
+  def decode_shutoff(value) when is_nil(value), do: value
+  def decode_shutoff(_), do: {:error, "Unexpected type when decoding AlleviateClass.shutoff"}
+
+  def encode_shutoff(value) when is_nil(value), do: value
+  def encode_shutoff(_), do: {:error, "Unexpected type when encoding AlleviateClass.shutoff"}
+
+  def decode_subcontiguous(value) when is_nil(value), do: value
+  def decode_subcontiguous(_), do: {:error, "Unexpected type when decoding AlleviateClass.subcontiguous"}
+
+  def encode_subcontiguous(value) when is_nil(value), do: value
+  def encode_subcontiguous(_), do: {:error, "Unexpected type when encoding AlleviateClass.subcontiguous"}
+
+  def decode_suffumigate(value) when is_nil(value), do: value
+  def decode_suffumigate(_), do: {:error, "Unexpected type when decoding AlleviateClass.suffumigate"}
+
+  def encode_suffumigate(value) when is_nil(value), do: value
+  def encode_suffumigate(_), do: {:error, "Unexpected type when encoding AlleviateClass.suffumigate"}
+
+  def decode_transformable(value) when is_nil(value), do: value
+  def decode_transformable(_), do: {:error, "Unexpected type when decoding AlleviateClass.transformable"}
+
+  def encode_transformable(value) when is_nil(value), do: value
+  def encode_transformable(_), do: {:error, "Unexpected type when encoding AlleviateClass.transformable"}
+
+  def decode_uncoroneted(value) when is_nil(value), do: value
+  def decode_uncoroneted(_), do: {:error, "Unexpected type when decoding AlleviateClass.uncoroneted"}
+
+  def encode_uncoroneted(value) when is_nil(value), do: value
+  def encode_uncoroneted(_), do: {:error, "Unexpected type when encoding AlleviateClass.uncoroneted"}
+
+  def decode_unparking(value) when is_nil(value), do: value
+  def decode_unparking(_), do: {:error, "Unexpected type when decoding AlleviateClass.unparking"}
+
+  def encode_unparking(value) when is_nil(value), do: value
+  def encode_unparking(_), do: {:error, "Unexpected type when encoding AlleviateClass.unparking"}
+
+  def decode_unvarnishedness(value) when is_nil(value), do: value
+  def decode_unvarnishedness(_), do: {:error, "Unexpected type when decoding AlleviateClass.unvarnishedness"}
+
+  def encode_unvarnishedness(value) when is_nil(value), do: value
+  def encode_unvarnishedness(_), do: {:error, "Unexpected type when encoding AlleviateClass.unvarnishedness"}
+
+  def decode_wherewithal(value) when is_nil(value), do: value
+  def decode_wherewithal(_), do: {:error, "Unexpected type when decoding AlleviateClass.wherewithal"}
+
+  def encode_wherewithal(value) when is_nil(value), do: value
+  def encode_wherewithal(_), do: {:error, "Unexpected type when encoding AlleviateClass.wherewithal"}
+
   def from_map(m) do
     %AlleviateClass{
-      apriori: m["apriori"],
-      beggarer: m["beggarer"],
-      brokenheartedly: m["brokenheartedly"],
-      debilitation: m["debilitation"],
-      frike: m["frike"],
-      gastrolith: m["gastrolith"],
-      hulsean: m["Hulsean"],
-      orthocentric: m["orthocentric"],
-      petaly: m["petaly"],
-      probudgeting: m["probudgeting"],
-      reacquire: m["reacquire"],
-      scow: m["scow"],
-      shutoff: m["shutoff"],
-      subcontiguous: m["subcontiguous"],
-      suffumigate: m["suffumigate"],
-      transformable: m["transformable"],
-      uncoroneted: m["uncoroneted"],
-      unparking: m["unparking"],
-      unvarnishedness: m["unvarnishedness"],
-      wherewithal: m["wherewithal"],
+      apriori: decode_apriori(m["apriori"]),
+      beggarer: decode_beggarer(m["beggarer"]),
+      brokenheartedly: decode_brokenheartedly(m["brokenheartedly"]),
+      debilitation: decode_debilitation(m["debilitation"]),
+      frike: decode_frike(m["frike"]),
+      gastrolith: decode_gastrolith(m["gastrolith"]),
+      hulsean: decode_hulsean(m["Hulsean"]),
+      orthocentric: decode_orthocentric(m["orthocentric"]),
+      petaly: decode_petaly(m["petaly"]),
+      probudgeting: decode_probudgeting(m["probudgeting"]),
+      reacquire: decode_reacquire(m["reacquire"]),
+      scow: decode_scow(m["scow"]),
+      shutoff: decode_shutoff(m["shutoff"]),
+      subcontiguous: decode_subcontiguous(m["subcontiguous"]),
+      suffumigate: decode_suffumigate(m["suffumigate"]),
+      transformable: decode_transformable(m["transformable"]),
+      uncoroneted: decode_uncoroneted(m["uncoroneted"]),
+      unparking: decode_unparking(m["unparking"]),
+      unvarnishedness: decode_unvarnishedness(m["unvarnishedness"]),
+      wherewithal: decode_wherewithal(m["wherewithal"]),
     }
   end
 
@@ -107,13 +227,45 @@ defmodule Rebecca do
           nonbookish: nil
         }
 
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding Rebecca.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding Rebecca.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding Rebecca.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding Rebecca.chirotherium"}
+
+  def decode_disdiapason(value) when is_binary(value), do: value
+  def decode_disdiapason(_), do: {:error, "Unexpected type when decoding Rebecca.disdiapason"}
+
+  def encode_disdiapason(value) when is_binary(value), do: value
+  def encode_disdiapason(_), do: {:error, "Unexpected type when encoding Rebecca.disdiapason"}
+
+  def decode_homocerc(value) when is_boolean(value), do: value
+  def decode_homocerc(_), do: {:error, "Unexpected type when decoding Rebecca.homocerc"}
+
+  def encode_homocerc(value) when is_boolean(value), do: value
+  def encode_homocerc(_), do: {:error, "Unexpected type when encoding Rebecca.homocerc"}
+
+  def decode_nonbookish(value) when is_nil(value), do: value
+  def decode_nonbookish(_), do: {:error, "Unexpected type when decoding Rebecca.nonbookish"}
+
+  def encode_nonbookish(value) when is_nil(value), do: value
+  def encode_nonbookish(_), do: {:error, "Unexpected type when encoding Rebecca.nonbookish"}
+
   def from_map(m) do
     %Rebecca{
-      catharticalness: m["catharticalness"],
-      chirotherium: m["Chirotherium"],
-      disdiapason: m["disdiapason"],
-      homocerc: m["homocerc"],
-      nonbookish: m["nonbookish"],
+      catharticalness: decode_catharticalness(m["catharticalness"]),
+      chirotherium: decode_chirotherium(m["Chirotherium"]),
+      disdiapason: decode_disdiapason(m["disdiapason"]),
+      homocerc: decode_homocerc(m["homocerc"]),
+      nonbookish: decode_nonbookish(m["nonbookish"]),
     }
   end
 
@@ -271,28 +423,148 @@ defmodule AnkeeClass do
           unscratchingly: nil
         }
 
+  def decode_anomoean(value) when is_nil(value), do: value
+  def decode_anomoean(_), do: {:error, "Unexpected type when decoding AnkeeClass.anomoean"}
+
+  def encode_anomoean(value) when is_nil(value), do: value
+  def encode_anomoean(_), do: {:error, "Unexpected type when encoding AnkeeClass.anomoean"}
+
+  def decode_barleyhood(value) when is_nil(value), do: value
+  def decode_barleyhood(_), do: {:error, "Unexpected type when decoding AnkeeClass.barleyhood"}
+
+  def encode_barleyhood(value) when is_nil(value), do: value
+  def encode_barleyhood(_), do: {:error, "Unexpected type when encoding AnkeeClass.barleyhood"}
+
+  def decode_befriender(value) when is_nil(value), do: value
+  def decode_befriender(_), do: {:error, "Unexpected type when decoding AnkeeClass.befriender"}
+
+  def encode_befriender(value) when is_nil(value), do: value
+  def encode_befriender(_), do: {:error, "Unexpected type when encoding AnkeeClass.befriender"}
+
+  def decode_brutishness(value) when is_nil(value), do: value
+  def decode_brutishness(_), do: {:error, "Unexpected type when decoding AnkeeClass.brutishness"}
+
+  def encode_brutishness(value) when is_nil(value), do: value
+  def encode_brutishness(_), do: {:error, "Unexpected type when encoding AnkeeClass.brutishness"}
+
+  def decode_cephalalgy(value) when is_nil(value), do: value
+  def decode_cephalalgy(_), do: {:error, "Unexpected type when decoding AnkeeClass.cephalalgy"}
+
+  def encode_cephalalgy(value) when is_nil(value), do: value
+  def encode_cephalalgy(_), do: {:error, "Unexpected type when encoding AnkeeClass.cephalalgy"}
+
+  def decode_cirurgian(value) when is_nil(value), do: value
+  def decode_cirurgian(_), do: {:error, "Unexpected type when decoding AnkeeClass.cirurgian"}
+
+  def encode_cirurgian(value) when is_nil(value), do: value
+  def encode_cirurgian(_), do: {:error, "Unexpected type when encoding AnkeeClass.cirurgian"}
+
+  def decode_conventionally(value) when is_nil(value), do: value
+  def decode_conventionally(_), do: {:error, "Unexpected type when decoding AnkeeClass.conventionally"}
+
+  def encode_conventionally(value) when is_nil(value), do: value
+  def encode_conventionally(_), do: {:error, "Unexpected type when encoding AnkeeClass.conventionally"}
+
+  def decode_jackshay(value) when is_nil(value), do: value
+  def decode_jackshay(_), do: {:error, "Unexpected type when decoding AnkeeClass.jackshay"}
+
+  def encode_jackshay(value) when is_nil(value), do: value
+  def encode_jackshay(_), do: {:error, "Unexpected type when encoding AnkeeClass.jackshay"}
+
+  def decode_milammeter(value) when is_nil(value), do: value
+  def decode_milammeter(_), do: {:error, "Unexpected type when decoding AnkeeClass.milammeter"}
+
+  def encode_milammeter(value) when is_nil(value), do: value
+  def encode_milammeter(_), do: {:error, "Unexpected type when encoding AnkeeClass.milammeter"}
+
+  def decode_naja(value) when is_nil(value), do: value
+  def decode_naja(_), do: {:error, "Unexpected type when decoding AnkeeClass.naja"}
+
+  def encode_naja(value) when is_nil(value), do: value
+  def encode_naja(_), do: {:error, "Unexpected type when encoding AnkeeClass.naja"}
+
+  def decode_ombrological(value) when is_nil(value), do: value
+  def decode_ombrological(_), do: {:error, "Unexpected type when decoding AnkeeClass.ombrological"}
+
+  def encode_ombrological(value) when is_nil(value), do: value
+  def encode_ombrological(_), do: {:error, "Unexpected type when encoding AnkeeClass.ombrological"}
+
+  def decode_phonasthenia(value) when is_nil(value), do: value
+  def decode_phonasthenia(_), do: {:error, "Unexpected type when decoding AnkeeClass.phonasthenia"}
+
+  def encode_phonasthenia(value) when is_nil(value), do: value
+  def encode_phonasthenia(_), do: {:error, "Unexpected type when encoding AnkeeClass.phonasthenia"}
+
+  def decode_retrievableness(value) when is_nil(value), do: value
+  def decode_retrievableness(_), do: {:error, "Unexpected type when decoding AnkeeClass.retrievableness"}
+
+  def encode_retrievableness(value) when is_nil(value), do: value
+  def encode_retrievableness(_), do: {:error, "Unexpected type when encoding AnkeeClass.retrievableness"}
+
+  def decode_snakily(value) when is_nil(value), do: value
+  def decode_snakily(_), do: {:error, "Unexpected type when decoding AnkeeClass.snakily"}
+
+  def encode_snakily(value) when is_nil(value), do: value
+  def encode_snakily(_), do: {:error, "Unexpected type when encoding AnkeeClass.snakily"}
+
+  def decode_swot(value) when is_nil(value), do: value
+  def decode_swot(_), do: {:error, "Unexpected type when decoding AnkeeClass.swot"}
+
+  def encode_swot(value) when is_nil(value), do: value
+  def encode_swot(_), do: {:error, "Unexpected type when encoding AnkeeClass.swot"}
+
+  def decode_tartlet(value) when is_nil(value), do: value
+  def decode_tartlet(_), do: {:error, "Unexpected type when decoding AnkeeClass.tartlet"}
+
+  def encode_tartlet(value) when is_nil(value), do: value
+  def encode_tartlet(_), do: {:error, "Unexpected type when encoding AnkeeClass.tartlet"}
+
+  def decode_thiofuran(value) when is_nil(value), do: value
+  def decode_thiofuran(_), do: {:error, "Unexpected type when decoding AnkeeClass.thiofuran"}
+
+  def encode_thiofuran(value) when is_nil(value), do: value
+  def encode_thiofuran(_), do: {:error, "Unexpected type when encoding AnkeeClass.thiofuran"}
+
+  def decode_tracheophone(value) when is_nil(value), do: value
+  def decode_tracheophone(_), do: {:error, "Unexpected type when decoding AnkeeClass.tracheophone"}
+
+  def encode_tracheophone(value) when is_nil(value), do: value
+  def encode_tracheophone(_), do: {:error, "Unexpected type when encoding AnkeeClass.tracheophone"}
+
+  def decode_tuglike(value) when is_nil(value), do: value
+  def decode_tuglike(_), do: {:error, "Unexpected type when decoding AnkeeClass.tuglike"}
+
+  def encode_tuglike(value) when is_nil(value), do: value
+  def encode_tuglike(_), do: {:error, "Unexpected type when encoding AnkeeClass.tuglike"}
+
+  def decode_unscratchingly(value) when is_nil(value), do: value
+  def decode_unscratchingly(_), do: {:error, "Unexpected type when decoding AnkeeClass.unscratchingly"}
+
+  def encode_unscratchingly(value) when is_nil(value), do: value
+  def encode_unscratchingly(_), do: {:error, "Unexpected type when encoding AnkeeClass.unscratchingly"}
+
   def from_map(m) do
     %AnkeeClass{
-      anomoean: m["Anomoean"],
-      barleyhood: m["barleyhood"],
-      befriender: m["befriender"],
-      brutishness: m["brutishness"],
-      cephalalgy: m["cephalalgy"],
-      cirurgian: m["cirurgian"],
-      conventionally: m["conventionally"],
-      jackshay: m["jackshay"],
-      milammeter: m["milammeter"],
-      naja: m["Naja"],
-      ombrological: m["ombrological"],
-      phonasthenia: m["phonasthenia"],
-      retrievableness: m["retrievableness"],
-      snakily: m["snakily"],
-      swot: m["swot"],
-      tartlet: m["tartlet"],
-      thiofuran: m["thiofuran"],
-      tracheophone: m["tracheophone"],
-      tuglike: m["tuglike"],
-      unscratchingly: m["unscratchingly"],
+      anomoean: decode_anomoean(m["Anomoean"]),
+      barleyhood: decode_barleyhood(m["barleyhood"]),
+      befriender: decode_befriender(m["befriender"]),
+      brutishness: decode_brutishness(m["brutishness"]),
+      cephalalgy: decode_cephalalgy(m["cephalalgy"]),
+      cirurgian: decode_cirurgian(m["cirurgian"]),
+      conventionally: decode_conventionally(m["conventionally"]),
+      jackshay: decode_jackshay(m["jackshay"]),
+      milammeter: decode_milammeter(m["milammeter"]),
+      naja: decode_naja(m["Naja"]),
+      ombrological: decode_ombrological(m["ombrological"]),
+      phonasthenia: decode_phonasthenia(m["phonasthenia"]),
+      retrievableness: decode_retrievableness(m["retrievableness"]),
+      snakily: decode_snakily(m["snakily"]),
+      swot: decode_swot(m["swot"]),
+      tartlet: decode_tartlet(m["tartlet"]),
+      thiofuran: decode_thiofuran(m["thiofuran"]),
+      tracheophone: decode_tracheophone(m["tracheophone"]),
+      tuglike: decode_tuglike(m["tuglike"]),
+      unscratchingly: decode_unscratchingly(m["unscratchingly"]),
     }
   end
 
@@ -361,28 +633,148 @@ defmodule AnsarieClass do
           zincic: nil
         }
 
+  def decode_accension(value) when is_nil(value), do: value
+  def decode_accension(_), do: {:error, "Unexpected type when decoding AnsarieClass.accension"}
+
+  def encode_accension(value) when is_nil(value), do: value
+  def encode_accension(_), do: {:error, "Unexpected type when encoding AnsarieClass.accension"}
+
+  def decode_alida(value) when is_nil(value), do: value
+  def decode_alida(_), do: {:error, "Unexpected type when decoding AnsarieClass.alida"}
+
+  def encode_alida(value) when is_nil(value), do: value
+  def encode_alida(_), do: {:error, "Unexpected type when encoding AnsarieClass.alida"}
+
+  def decode_asteria(value) when is_nil(value), do: value
+  def decode_asteria(_), do: {:error, "Unexpected type when decoding AnsarieClass.asteria"}
+
+  def encode_asteria(value) when is_nil(value), do: value
+  def encode_asteria(_), do: {:error, "Unexpected type when encoding AnsarieClass.asteria"}
+
+  def decode_beriberic(value) when is_nil(value), do: value
+  def decode_beriberic(_), do: {:error, "Unexpected type when decoding AnsarieClass.beriberic"}
+
+  def encode_beriberic(value) when is_nil(value), do: value
+  def encode_beriberic(_), do: {:error, "Unexpected type when encoding AnsarieClass.beriberic"}
+
+  def decode_edgebone(value) when is_nil(value), do: value
+  def decode_edgebone(_), do: {:error, "Unexpected type when decoding AnsarieClass.edgebone"}
+
+  def encode_edgebone(value) when is_nil(value), do: value
+  def encode_edgebone(_), do: {:error, "Unexpected type when encoding AnsarieClass.edgebone"}
+
+  def decode_gastrodialysis(value) when is_nil(value), do: value
+  def decode_gastrodialysis(_), do: {:error, "Unexpected type when decoding AnsarieClass.gastrodialysis"}
+
+  def encode_gastrodialysis(value) when is_nil(value), do: value
+  def encode_gastrodialysis(_), do: {:error, "Unexpected type when encoding AnsarieClass.gastrodialysis"}
+
+  def decode_geographic(value) when is_nil(value), do: value
+  def decode_geographic(_), do: {:error, "Unexpected type when decoding AnsarieClass.geographic"}
+
+  def encode_geographic(value) when is_nil(value), do: value
+  def encode_geographic(_), do: {:error, "Unexpected type when encoding AnsarieClass.geographic"}
+
+  def decode_ictonyx(value) when is_nil(value), do: value
+  def decode_ictonyx(_), do: {:error, "Unexpected type when decoding AnsarieClass.ictonyx"}
+
+  def encode_ictonyx(value) when is_nil(value), do: value
+  def encode_ictonyx(_), do: {:error, "Unexpected type when encoding AnsarieClass.ictonyx"}
+
+  def decode_metrocele(value) when is_nil(value), do: value
+  def decode_metrocele(_), do: {:error, "Unexpected type when decoding AnsarieClass.metrocele"}
+
+  def encode_metrocele(value) when is_nil(value), do: value
+  def encode_metrocele(_), do: {:error, "Unexpected type when encoding AnsarieClass.metrocele"}
+
+  def decode_misgraft(value) when is_nil(value), do: value
+  def decode_misgraft(_), do: {:error, "Unexpected type when decoding AnsarieClass.misgraft"}
+
+  def encode_misgraft(value) when is_nil(value), do: value
+  def encode_misgraft(_), do: {:error, "Unexpected type when encoding AnsarieClass.misgraft"}
+
+  def decode_monteith(value) when is_nil(value), do: value
+  def decode_monteith(_), do: {:error, "Unexpected type when decoding AnsarieClass.monteith"}
+
+  def encode_monteith(value) when is_nil(value), do: value
+  def encode_monteith(_), do: {:error, "Unexpected type when encoding AnsarieClass.monteith"}
+
+  def decode_notcher(value) when is_nil(value), do: value
+  def decode_notcher(_), do: {:error, "Unexpected type when decoding AnsarieClass.notcher"}
+
+  def encode_notcher(value) when is_nil(value), do: value
+  def encode_notcher(_), do: {:error, "Unexpected type when encoding AnsarieClass.notcher"}
+
+  def decode_prorestriction(value) when is_nil(value), do: value
+  def decode_prorestriction(_), do: {:error, "Unexpected type when decoding AnsarieClass.prorestriction"}
+
+  def encode_prorestriction(value) when is_nil(value), do: value
+  def encode_prorestriction(_), do: {:error, "Unexpected type when encoding AnsarieClass.prorestriction"}
+
+  def decode_ramist(value) when is_nil(value), do: value
+  def decode_ramist(_), do: {:error, "Unexpected type when decoding AnsarieClass.ramist"}
+
+  def encode_ramist(value) when is_nil(value), do: value
+  def encode_ramist(_), do: {:error, "Unexpected type when encoding AnsarieClass.ramist"}
+
+  def decode_throatlet(value) when is_nil(value), do: value
+  def decode_throatlet(_), do: {:error, "Unexpected type when decoding AnsarieClass.throatlet"}
+
+  def encode_throatlet(value) when is_nil(value), do: value
+  def encode_throatlet(_), do: {:error, "Unexpected type when encoding AnsarieClass.throatlet"}
+
+  def decode_unfair(value) when is_nil(value), do: value
+  def decode_unfair(_), do: {:error, "Unexpected type when decoding AnsarieClass.unfair"}
+
+  def encode_unfair(value) when is_nil(value), do: value
+  def encode_unfair(_), do: {:error, "Unexpected type when encoding AnsarieClass.unfair"}
+
+  def decode_unsynonymous(value) when is_nil(value), do: value
+  def decode_unsynonymous(_), do: {:error, "Unexpected type when decoding AnsarieClass.unsynonymous"}
+
+  def encode_unsynonymous(value) when is_nil(value), do: value
+  def encode_unsynonymous(_), do: {:error, "Unexpected type when encoding AnsarieClass.unsynonymous"}
+
+  def decode_water(value) when is_nil(value), do: value
+  def decode_water(_), do: {:error, "Unexpected type when decoding AnsarieClass.water"}
+
+  def encode_water(value) when is_nil(value), do: value
+  def encode_water(_), do: {:error, "Unexpected type when encoding AnsarieClass.water"}
+
+  def decode_zestfully(value) when is_nil(value), do: value
+  def decode_zestfully(_), do: {:error, "Unexpected type when decoding AnsarieClass.zestfully"}
+
+  def encode_zestfully(value) when is_nil(value), do: value
+  def encode_zestfully(_), do: {:error, "Unexpected type when encoding AnsarieClass.zestfully"}
+
+  def decode_zincic(value) when is_nil(value), do: value
+  def decode_zincic(_), do: {:error, "Unexpected type when decoding AnsarieClass.zincic"}
+
+  def encode_zincic(value) when is_nil(value), do: value
+  def encode_zincic(_), do: {:error, "Unexpected type when encoding AnsarieClass.zincic"}
+
   def from_map(m) do
     %AnsarieClass{
-      accension: m["accension"],
-      alida: m["Alida"],
-      asteria: m["asteria"],
-      beriberic: m["beriberic"],
-      edgebone: m["edgebone"],
-      gastrodialysis: m["gastrodialysis"],
-      geographic: m["geographic"],
-      ictonyx: m["Ictonyx"],
-      metrocele: m["metrocele"],
-      misgraft: m["misgraft"],
-      monteith: m["monteith"],
-      notcher: m["notcher"],
-      prorestriction: m["prorestriction"],
-      ramist: m["Ramist"],
-      throatlet: m["throatlet"],
-      unfair: m["unfair"],
-      unsynonymous: m["unsynonymous"],
-      water: m["water"],
-      zestfully: m["zestfully"],
-      zincic: m["zincic"],
+      accension: decode_accension(m["accension"]),
+      alida: decode_alida(m["Alida"]),
+      asteria: decode_asteria(m["asteria"]),
+      beriberic: decode_beriberic(m["beriberic"]),
+      edgebone: decode_edgebone(m["edgebone"]),
+      gastrodialysis: decode_gastrodialysis(m["gastrodialysis"]),
+      geographic: decode_geographic(m["geographic"]),
+      ictonyx: decode_ictonyx(m["Ictonyx"]),
+      metrocele: decode_metrocele(m["metrocele"]),
+      misgraft: decode_misgraft(m["misgraft"]),
+      monteith: decode_monteith(m["monteith"]),
+      notcher: decode_notcher(m["notcher"]),
+      prorestriction: decode_prorestriction(m["prorestriction"]),
+      ramist: decode_ramist(m["Ramist"]),
+      throatlet: decode_throatlet(m["throatlet"]),
+      unfair: decode_unfair(m["unfair"]),
+      unsynonymous: decode_unsynonymous(m["unsynonymous"]),
+      water: decode_water(m["water"]),
+      zestfully: decode_zestfully(m["zestfully"]),
+      zincic: decode_zincic(m["zincic"]),
     }
   end
 
@@ -451,28 +843,148 @@ defmodule ChytridiaceaeClass do
           vorticellid: nil
         }
 
+  def decode_batidaceae(value) when is_nil(value), do: value
+  def decode_batidaceae(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.batidaceae"}
+
+  def encode_batidaceae(value) when is_nil(value), do: value
+  def encode_batidaceae(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.batidaceae"}
+
+  def decode_brechites(value) when is_nil(value), do: value
+  def decode_brechites(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.brechites"}
+
+  def encode_brechites(value) when is_nil(value), do: value
+  def encode_brechites(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.brechites"}
+
+  def decode_codespairer(value) when is_nil(value), do: value
+  def decode_codespairer(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.codespairer"}
+
+  def encode_codespairer(value) when is_nil(value), do: value
+  def encode_codespairer(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.codespairer"}
+
+  def decode_emery(value) when is_nil(value), do: value
+  def decode_emery(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.emery"}
+
+  def encode_emery(value) when is_nil(value), do: value
+  def encode_emery(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.emery"}
+
+  def decode_enervative(value) when is_nil(value), do: value
+  def decode_enervative(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.enervative"}
+
+  def encode_enervative(value) when is_nil(value), do: value
+  def encode_enervative(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.enervative"}
+
+  def decode_excriminate(value) when is_nil(value), do: value
+  def decode_excriminate(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.excriminate"}
+
+  def encode_excriminate(value) when is_nil(value), do: value
+  def encode_excriminate(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.excriminate"}
+
+  def decode_goshenite(value) when is_nil(value), do: value
+  def decode_goshenite(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.goshenite"}
+
+  def encode_goshenite(value) when is_nil(value), do: value
+  def encode_goshenite(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.goshenite"}
+
+  def decode_grime(value) when is_nil(value), do: value
+  def decode_grime(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.grime"}
+
+  def encode_grime(value) when is_nil(value), do: value
+  def encode_grime(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.grime"}
+
+  def decode_gritten(value) when is_nil(value), do: value
+  def decode_gritten(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.gritten"}
+
+  def encode_gritten(value) when is_nil(value), do: value
+  def encode_gritten(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.gritten"}
+
+  def decode_hectorly(value) when is_nil(value), do: value
+  def decode_hectorly(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.hectorly"}
+
+  def encode_hectorly(value) when is_nil(value), do: value
+  def encode_hectorly(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.hectorly"}
+
+  def decode_intermediation(value) when is_nil(value), do: value
+  def decode_intermediation(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.intermediation"}
+
+  def encode_intermediation(value) when is_nil(value), do: value
+  def encode_intermediation(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.intermediation"}
+
+  def decode_meeterly(value) when is_nil(value), do: value
+  def decode_meeterly(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.meeterly"}
+
+  def encode_meeterly(value) when is_nil(value), do: value
+  def encode_meeterly(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.meeterly"}
+
+  def decode_narraganset(value) when is_nil(value), do: value
+  def decode_narraganset(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.narraganset"}
+
+  def encode_narraganset(value) when is_nil(value), do: value
+  def encode_narraganset(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.narraganset"}
+
+  def decode_onymatic(value) when is_nil(value), do: value
+  def decode_onymatic(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.onymatic"}
+
+  def encode_onymatic(value) when is_nil(value), do: value
+  def encode_onymatic(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.onymatic"}
+
+  def decode_paddlecock(value) when is_nil(value), do: value
+  def decode_paddlecock(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.paddlecock"}
+
+  def encode_paddlecock(value) when is_nil(value), do: value
+  def encode_paddlecock(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.paddlecock"}
+
+  def decode_thana(value) when is_nil(value), do: value
+  def decode_thana(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.thana"}
+
+  def encode_thana(value) when is_nil(value), do: value
+  def encode_thana(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.thana"}
+
+  def decode_thornily(value) when is_nil(value), do: value
+  def decode_thornily(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.thornily"}
+
+  def encode_thornily(value) when is_nil(value), do: value
+  def encode_thornily(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.thornily"}
+
+  def decode_uckia(value) when is_nil(value), do: value
+  def decode_uckia(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.uckia"}
+
+  def encode_uckia(value) when is_nil(value), do: value
+  def encode_uckia(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.uckia"}
+
+  def decode_unmettle(value) when is_nil(value), do: value
+  def decode_unmettle(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.unmettle"}
+
+  def encode_unmettle(value) when is_nil(value), do: value
+  def encode_unmettle(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.unmettle"}
+
+  def decode_vorticellid(value) when is_nil(value), do: value
+  def decode_vorticellid(_), do: {:error, "Unexpected type when decoding ChytridiaceaeClass.vorticellid"}
+
+  def encode_vorticellid(value) when is_nil(value), do: value
+  def encode_vorticellid(_), do: {:error, "Unexpected type when encoding ChytridiaceaeClass.vorticellid"}
+
   def from_map(m) do
     %ChytridiaceaeClass{
-      batidaceae: m["Batidaceae"],
-      brechites: m["Brechites"],
-      codespairer: m["codespairer"],
-      emery: m["Emery"],
-      enervative: m["enervative"],
-      excriminate: m["excriminate"],
-      goshenite: m["goshenite"],
-      grime: m["grime"],
-      gritten: m["gritten"],
-      hectorly: m["hectorly"],
-      intermediation: m["intermediation"],
-      meeterly: m["meeterly"],
-      narraganset: m["Narraganset"],
-      onymatic: m["onymatic"],
-      paddlecock: m["paddlecock"],
-      thana: m["thana"],
-      thornily: m["thornily"],
-      uckia: m["uckia"],
-      unmettle: m["unmettle"],
-      vorticellid: m["vorticellid"],
+      batidaceae: decode_batidaceae(m["Batidaceae"]),
+      brechites: decode_brechites(m["Brechites"]),
+      codespairer: decode_codespairer(m["codespairer"]),
+      emery: decode_emery(m["Emery"]),
+      enervative: decode_enervative(m["enervative"]),
+      excriminate: decode_excriminate(m["excriminate"]),
+      goshenite: decode_goshenite(m["goshenite"]),
+      grime: decode_grime(m["grime"]),
+      gritten: decode_gritten(m["gritten"]),
+      hectorly: decode_hectorly(m["hectorly"]),
+      intermediation: decode_intermediation(m["intermediation"]),
+      meeterly: decode_meeterly(m["meeterly"]),
+      narraganset: decode_narraganset(m["Narraganset"]),
+      onymatic: decode_onymatic(m["onymatic"]),
+      paddlecock: decode_paddlecock(m["paddlecock"]),
+      thana: decode_thana(m["thana"]),
+      thornily: decode_thornily(m["thornily"]),
+      uckia: decode_uckia(m["uckia"]),
+      unmettle: decode_unmettle(m["unmettle"]),
+      vorticellid: decode_vorticellid(m["vorticellid"]),
     }
   end
 
@@ -645,28 +1157,148 @@ defmodule GryphosaurusClass do
           underntime: nil
         }
 
+  def decode_amissibility(value) when is_nil(value), do: value
+  def decode_amissibility(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.amissibility"}
+
+  def encode_amissibility(value) when is_nil(value), do: value
+  def encode_amissibility(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.amissibility"}
+
+  def decode_burushaski(value) when is_nil(value), do: value
+  def decode_burushaski(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.burushaski"}
+
+  def encode_burushaski(value) when is_nil(value), do: value
+  def encode_burushaski(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.burushaski"}
+
+  def decode_citronin(value) when is_nil(value), do: value
+  def decode_citronin(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.citronin"}
+
+  def encode_citronin(value) when is_nil(value), do: value
+  def encode_citronin(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.citronin"}
+
+  def decode_coplaintiff(value) when is_nil(value), do: value
+  def decode_coplaintiff(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.coplaintiff"}
+
+  def encode_coplaintiff(value) when is_nil(value), do: value
+  def encode_coplaintiff(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.coplaintiff"}
+
+  def decode_disquisitionary(value) when is_nil(value), do: value
+  def decode_disquisitionary(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.disquisitionary"}
+
+  def encode_disquisitionary(value) when is_nil(value), do: value
+  def encode_disquisitionary(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.disquisitionary"}
+
+  def decode_enoplan(value) when is_nil(value), do: value
+  def decode_enoplan(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.enoplan"}
+
+  def encode_enoplan(value) when is_nil(value), do: value
+  def encode_enoplan(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.enoplan"}
+
+  def decode_faintness(value) when is_nil(value), do: value
+  def decode_faintness(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.faintness"}
+
+  def encode_faintness(value) when is_nil(value), do: value
+  def encode_faintness(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.faintness"}
+
+  def decode_hebetomy(value) when is_nil(value), do: value
+  def decode_hebetomy(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.hebetomy"}
+
+  def encode_hebetomy(value) when is_nil(value), do: value
+  def encode_hebetomy(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.hebetomy"}
+
+  def decode_islandry(value) when is_nil(value), do: value
+  def decode_islandry(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.islandry"}
+
+  def encode_islandry(value) when is_nil(value), do: value
+  def encode_islandry(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.islandry"}
+
+  def decode_lameduck(value) when is_nil(value), do: value
+  def decode_lameduck(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.lameduck"}
+
+  def encode_lameduck(value) when is_nil(value), do: value
+  def encode_lameduck(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.lameduck"}
+
+  def decode_overbattle(value) when is_nil(value), do: value
+  def decode_overbattle(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.overbattle"}
+
+  def encode_overbattle(value) when is_nil(value), do: value
+  def encode_overbattle(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.overbattle"}
+
+  def decode_overinterested(value) when is_nil(value), do: value
+  def decode_overinterested(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.overinterested"}
+
+  def encode_overinterested(value) when is_nil(value), do: value
+  def encode_overinterested(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.overinterested"}
+
+  def decode_phrenologic(value) when is_nil(value), do: value
+  def decode_phrenologic(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.phrenologic"}
+
+  def encode_phrenologic(value) when is_nil(value), do: value
+  def encode_phrenologic(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.phrenologic"}
+
+  def decode_rainband(value) when is_nil(value), do: value
+  def decode_rainband(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.rainband"}
+
+  def encode_rainband(value) when is_nil(value), do: value
+  def encode_rainband(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.rainband"}
+
+  def decode_shiningly(value) when is_nil(value), do: value
+  def decode_shiningly(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.shiningly"}
+
+  def encode_shiningly(value) when is_nil(value), do: value
+  def encode_shiningly(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.shiningly"}
+
+  def decode_stamineous(value) when is_nil(value), do: value
+  def decode_stamineous(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.stamineous"}
+
+  def encode_stamineous(value) when is_nil(value), do: value
+  def encode_stamineous(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.stamineous"}
+
+  def decode_subscapularis(value) when is_nil(value), do: value
+  def decode_subscapularis(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.subscapularis"}
+
+  def encode_subscapularis(value) when is_nil(value), do: value
+  def encode_subscapularis(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.subscapularis"}
+
+  def decode_tahami(value) when is_nil(value), do: value
+  def decode_tahami(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.tahami"}
+
+  def encode_tahami(value) when is_nil(value), do: value
+  def encode_tahami(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.tahami"}
+
+  def decode_undaubed(value) when is_nil(value), do: value
+  def decode_undaubed(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.undaubed"}
+
+  def encode_undaubed(value) when is_nil(value), do: value
+  def encode_undaubed(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.undaubed"}
+
+  def decode_underntime(value) when is_nil(value), do: value
+  def decode_underntime(_), do: {:error, "Unexpected type when decoding GryphosaurusClass.underntime"}
+
+  def encode_underntime(value) when is_nil(value), do: value
+  def encode_underntime(_), do: {:error, "Unexpected type when encoding GryphosaurusClass.underntime"}
+
   def from_map(m) do
     %GryphosaurusClass{
-      amissibility: m["amissibility"],
-      burushaski: m["Burushaski"],
-      citronin: m["citronin"],
-      coplaintiff: m["coplaintiff"],
-      disquisitionary: m["disquisitionary"],
-      enoplan: m["enoplan"],
-      faintness: m["faintness"],
-      hebetomy: m["hebetomy"],
-      islandry: m["islandry"],
-      lameduck: m["lameduck"],
-      overbattle: m["overbattle"],
-      overinterested: m["overinterested"],
-      phrenologic: m["phrenologic"],
-      rainband: m["rainband"],
-      shiningly: m["shiningly"],
-      stamineous: m["stamineous"],
-      subscapularis: m["subscapularis"],
-      tahami: m["Tahami"],
-      undaubed: m["undaubed"],
-      underntime: m["underntime"],
+      amissibility: decode_amissibility(m["amissibility"]),
+      burushaski: decode_burushaski(m["Burushaski"]),
+      citronin: decode_citronin(m["citronin"]),
+      coplaintiff: decode_coplaintiff(m["coplaintiff"]),
+      disquisitionary: decode_disquisitionary(m["disquisitionary"]),
+      enoplan: decode_enoplan(m["enoplan"]),
+      faintness: decode_faintness(m["faintness"]),
+      hebetomy: decode_hebetomy(m["hebetomy"]),
+      islandry: decode_islandry(m["islandry"]),
+      lameduck: decode_lameduck(m["lameduck"]),
+      overbattle: decode_overbattle(m["overbattle"]),
+      overinterested: decode_overinterested(m["overinterested"]),
+      phrenologic: decode_phrenologic(m["phrenologic"]),
+      rainband: decode_rainband(m["rainband"]),
+      shiningly: decode_shiningly(m["shiningly"]),
+      stamineous: decode_stamineous(m["stamineous"]),
+      subscapularis: decode_subscapularis(m["subscapularis"]),
+      tahami: decode_tahami(m["Tahami"]),
+      undaubed: decode_undaubed(m["undaubed"]),
+      underntime: decode_underntime(m["underntime"]),
     }
   end
 
@@ -839,28 +1471,148 @@ defmodule OskarClass do
           unstoppable: nil
         }
 
+  def decode_acrobates(value) when is_nil(value), do: value
+  def decode_acrobates(_), do: {:error, "Unexpected type when decoding OskarClass.acrobates"}
+
+  def encode_acrobates(value) when is_nil(value), do: value
+  def encode_acrobates(_), do: {:error, "Unexpected type when encoding OskarClass.acrobates"}
+
+  def decode_beanshooter(value) when is_nil(value), do: value
+  def decode_beanshooter(_), do: {:error, "Unexpected type when decoding OskarClass.beanshooter"}
+
+  def encode_beanshooter(value) when is_nil(value), do: value
+  def encode_beanshooter(_), do: {:error, "Unexpected type when encoding OskarClass.beanshooter"}
+
+  def decode_bearhound(value) when is_nil(value), do: value
+  def decode_bearhound(_), do: {:error, "Unexpected type when decoding OskarClass.bearhound"}
+
+  def encode_bearhound(value) when is_nil(value), do: value
+  def encode_bearhound(_), do: {:error, "Unexpected type when encoding OskarClass.bearhound"}
+
+  def decode_cayuga(value) when is_nil(value), do: value
+  def decode_cayuga(_), do: {:error, "Unexpected type when decoding OskarClass.cayuga"}
+
+  def encode_cayuga(value) when is_nil(value), do: value
+  def encode_cayuga(_), do: {:error, "Unexpected type when encoding OskarClass.cayuga"}
+
+  def decode_guarneri(value) when is_nil(value), do: value
+  def decode_guarneri(_), do: {:error, "Unexpected type when decoding OskarClass.guarneri"}
+
+  def encode_guarneri(value) when is_nil(value), do: value
+  def encode_guarneri(_), do: {:error, "Unexpected type when encoding OskarClass.guarneri"}
+
+  def decode_hypochondriacism(value) when is_nil(value), do: value
+  def decode_hypochondriacism(_), do: {:error, "Unexpected type when decoding OskarClass.hypochondriacism"}
+
+  def encode_hypochondriacism(value) when is_nil(value), do: value
+  def encode_hypochondriacism(_), do: {:error, "Unexpected type when encoding OskarClass.hypochondriacism"}
+
+  def decode_indication(value) when is_nil(value), do: value
+  def decode_indication(_), do: {:error, "Unexpected type when decoding OskarClass.indication"}
+
+  def encode_indication(value) when is_nil(value), do: value
+  def encode_indication(_), do: {:error, "Unexpected type when encoding OskarClass.indication"}
+
+  def decode_jaculative(value) when is_nil(value), do: value
+  def decode_jaculative(_), do: {:error, "Unexpected type when decoding OskarClass.jaculative"}
+
+  def encode_jaculative(value) when is_nil(value), do: value
+  def encode_jaculative(_), do: {:error, "Unexpected type when encoding OskarClass.jaculative"}
+
+  def decode_nagana(value) when is_nil(value), do: value
+  def decode_nagana(_), do: {:error, "Unexpected type when decoding OskarClass.nagana"}
+
+  def encode_nagana(value) when is_nil(value), do: value
+  def encode_nagana(_), do: {:error, "Unexpected type when encoding OskarClass.nagana"}
+
+  def decode_netherlandish(value) when is_nil(value), do: value
+  def decode_netherlandish(_), do: {:error, "Unexpected type when decoding OskarClass.netherlandish"}
+
+  def encode_netherlandish(value) when is_nil(value), do: value
+  def encode_netherlandish(_), do: {:error, "Unexpected type when encoding OskarClass.netherlandish"}
+
+  def decode_noctivagous(value) when is_nil(value), do: value
+  def decode_noctivagous(_), do: {:error, "Unexpected type when decoding OskarClass.noctivagous"}
+
+  def encode_noctivagous(value) when is_nil(value), do: value
+  def encode_noctivagous(_), do: {:error, "Unexpected type when encoding OskarClass.noctivagous"}
+
+  def decode_nonphysiological(value) when is_nil(value), do: value
+  def decode_nonphysiological(_), do: {:error, "Unexpected type when decoding OskarClass.nonphysiological"}
+
+  def encode_nonphysiological(value) when is_nil(value), do: value
+  def encode_nonphysiological(_), do: {:error, "Unexpected type when encoding OskarClass.nonphysiological"}
+
+  def decode_praxis(value) when is_nil(value), do: value
+  def decode_praxis(_), do: {:error, "Unexpected type when decoding OskarClass.praxis"}
+
+  def encode_praxis(value) when is_nil(value), do: value
+  def encode_praxis(_), do: {:error, "Unexpected type when encoding OskarClass.praxis"}
+
+  def decode_provision(value) when is_nil(value), do: value
+  def decode_provision(_), do: {:error, "Unexpected type when decoding OskarClass.provision"}
+
+  def encode_provision(value) when is_nil(value), do: value
+  def encode_provision(_), do: {:error, "Unexpected type when encoding OskarClass.provision"}
+
+  def decode_subterhuman(value) when is_nil(value), do: value
+  def decode_subterhuman(_), do: {:error, "Unexpected type when decoding OskarClass.subterhuman"}
+
+  def encode_subterhuman(value) when is_nil(value), do: value
+  def encode_subterhuman(_), do: {:error, "Unexpected type when encoding OskarClass.subterhuman"}
+
+  def decode_sunlit(value) when is_nil(value), do: value
+  def decode_sunlit(_), do: {:error, "Unexpected type when decoding OskarClass.sunlit"}
+
+  def encode_sunlit(value) when is_nil(value), do: value
+  def encode_sunlit(_), do: {:error, "Unexpected type when encoding OskarClass.sunlit"}
+
+  def decode_syncraniate(value) when is_nil(value), do: value
+  def decode_syncraniate(_), do: {:error, "Unexpected type when decoding OskarClass.syncraniate"}
+
+  def encode_syncraniate(value) when is_nil(value), do: value
+  def encode_syncraniate(_), do: {:error, "Unexpected type when encoding OskarClass.syncraniate"}
+
+  def decode_teachment(value) when is_nil(value), do: value
+  def decode_teachment(_), do: {:error, "Unexpected type when decoding OskarClass.teachment"}
+
+  def encode_teachment(value) when is_nil(value), do: value
+  def encode_teachment(_), do: {:error, "Unexpected type when encoding OskarClass.teachment"}
+
+  def decode_unmutinous(value) when is_nil(value), do: value
+  def decode_unmutinous(_), do: {:error, "Unexpected type when decoding OskarClass.unmutinous"}
+
+  def encode_unmutinous(value) when is_nil(value), do: value
+  def encode_unmutinous(_), do: {:error, "Unexpected type when encoding OskarClass.unmutinous"}
+
+  def decode_unstoppable(value) when is_nil(value), do: value
+  def decode_unstoppable(_), do: {:error, "Unexpected type when decoding OskarClass.unstoppable"}
+
+  def encode_unstoppable(value) when is_nil(value), do: value
+  def encode_unstoppable(_), do: {:error, "Unexpected type when encoding OskarClass.unstoppable"}
+
   def from_map(m) do
     %OskarClass{
-      acrobates: m["Acrobates"],
-      beanshooter: m["beanshooter"],
-      bearhound: m["bearhound"],
-      cayuga: m["Cayuga"],
-      guarneri: m["guarneri"],
-      hypochondriacism: m["hypochondriacism"],
-      indication: m["indication"],
-      jaculative: m["jaculative"],
-      nagana: m["nagana"],
-      netherlandish: m["Netherlandish"],
-      noctivagous: m["noctivagous"],
-      nonphysiological: m["nonphysiological"],
-      praxis: m["praxis"],
-      provision: m["provision"],
-      subterhuman: m["subterhuman"],
-      sunlit: m["sunlit"],
-      syncraniate: m["syncraniate"],
-      teachment: m["teachment"],
-      unmutinous: m["unmutinous"],
-      unstoppable: m["unstoppable"],
+      acrobates: decode_acrobates(m["Acrobates"]),
+      beanshooter: decode_beanshooter(m["beanshooter"]),
+      bearhound: decode_bearhound(m["bearhound"]),
+      cayuga: decode_cayuga(m["Cayuga"]),
+      guarneri: decode_guarneri(m["guarneri"]),
+      hypochondriacism: decode_hypochondriacism(m["hypochondriacism"]),
+      indication: decode_indication(m["indication"]),
+      jaculative: decode_jaculative(m["jaculative"]),
+      nagana: decode_nagana(m["nagana"]),
+      netherlandish: decode_netherlandish(m["Netherlandish"]),
+      noctivagous: decode_noctivagous(m["noctivagous"]),
+      nonphysiological: decode_nonphysiological(m["nonphysiological"]),
+      praxis: decode_praxis(m["praxis"]),
+      provision: decode_provision(m["provision"]),
+      subterhuman: decode_subterhuman(m["subterhuman"]),
+      sunlit: decode_sunlit(m["sunlit"]),
+      syncraniate: decode_syncraniate(m["syncraniate"]),
+      teachment: decode_teachment(m["teachment"]),
+      unmutinous: decode_unmutinous(m["unmutinous"]),
+      unstoppable: decode_unstoppable(m["unstoppable"]),
     }
   end
 
@@ -954,6 +1706,12 @@ defmodule TopLevel do
           wayao: %{String.t() => float()}
         }
 
+  def decode_abranchiata(value) when is_list(value), do: value
+  def decode_abranchiata(_), do: {:error, "Unexpected type when decoding TopLevel.abranchiata"}
+
+  def encode_abranchiata(value) when is_list(value), do: value
+  def encode_abranchiata(_), do: {:error, "Unexpected type when encoding TopLevel.abranchiata"}
+
   def decode_abranchiata_element(value) when is_integer(value), do: value
   def decode_abranchiata_element(value) when is_nil(value), do: value
   def decode_abranchiata_element(value) when is_list(value), do: value
@@ -964,6 +1722,12 @@ defmodule TopLevel do
   def encode_abranchiata_element(value) when is_list(value), do: value
   def encode_abranchiata_element(_), do: {:error, "Unexpected type when encoding TopLevel.abranchiata"}
 
+  def decode_academe(value) when is_list(value), do: value
+  def decode_academe(_), do: {:error, "Unexpected type when decoding TopLevel.academe"}
+
+  def encode_academe(value) when is_list(value), do: value
+  def encode_academe(_), do: {:error, "Unexpected type when encoding TopLevel.academe"}
+
   def decode_academe_element(value) when is_integer(value), do: value
   def decode_academe_element(value) when is_list(value), do: value
   def decode_academe_element(value) when is_map(value), do: value
@@ -974,6 +1738,12 @@ defmodule TopLevel do
   def encode_academe_element(value) when is_map(value), do: value
   def encode_academe_element(_), do: {:error, "Unexpected type when encoding TopLevel.academe"}
 
+  def decode_acquirable(value) when is_list(value), do: value
+  def decode_acquirable(_), do: {:error, "Unexpected type when decoding TopLevel.acquirable"}
+
+  def encode_acquirable(value) when is_list(value), do: value
+  def encode_acquirable(_), do: {:error, "Unexpected type when encoding TopLevel.acquirable"}
+
   def decode_acquirable_element(value) when is_list(value), do: value
   def decode_acquirable_element(value) when is_map(value), do: value
   def decode_acquirable_element(_), do: {:error, "Unexpected type when decoding TopLevel.acquirable"}
@@ -982,6 +1752,12 @@ defmodule TopLevel do
   def encode_acquirable_element(value) when is_map(value), do: value
   def encode_acquirable_element(_), do: {:error, "Unexpected type when encoding TopLevel.acquirable"}
 
+  def decode_aerometry(value) when is_list(value), do: value
+  def decode_aerometry(_), do: {:error, "Unexpected type when decoding TopLevel.aerometry"}
+
+  def encode_aerometry(value) when is_list(value), do: value
+  def encode_aerometry(_), do: {:error, "Unexpected type when encoding TopLevel.aerometry"}
+
   def decode_aerometry_element(value) when is_boolean(value), do: value
   def decode_aerometry_element(value) when is_float(value), do: value
   def decode_aerometry_element(value) when is_integer(value), do: value
@@ -992,6 +1768,12 @@ defmodule TopLevel do
   def encode_aerometry_element(value) when is_integer(value), do: value
   def encode_aerometry_element(_), do: {:error, "Unexpected type when encoding TopLevel.aerometry"}
 
+  def decode_alexin(value) when is_list(value), do: value
+  def decode_alexin(_), do: {:error, "Unexpected type when decoding TopLevel.alexin"}
+
+  def encode_alexin(value) when is_list(value), do: value
+  def encode_alexin(_), do: {:error, "Unexpected type when encoding TopLevel.alexin"}
+
   def decode_alexin_element(value) when is_boolean(value), do: value
   def decode_alexin_element(value) when is_list(value), do: value
   def decode_alexin_element(_), do: {:error, "Unexpected type when decoding TopLevel.alexin"}
@@ -1000,6 +1782,12 @@ defmodule TopLevel do
   def encode_alexin_element(value) when is_list(value), do: value
   def encode_alexin_element(_), do: {:error, "Unexpected type when encoding TopLevel.alexin"}
 
+  def decode_alleviate(value) when is_list(value), do: value
+  def decode_alleviate(_), do: {:error, "Unexpected type when decoding TopLevel.alleviate"}
+
+  def encode_alleviate(value) when is_list(value), do: value
+  def encode_alleviate(_), do: {:error, "Unexpected type when encoding TopLevel.alleviate"}
+
   def decode_alleviate_element(%{"apriori" => _,"beggarer" => _,"brokenheartedly" => _,"debilitation" => _,"frike" => _,"gastrolith" => _,"Hulsean" => _,"orthocentric" => _,"petaly" => _,"probudgeting" => _,"reacquire" => _,"scow" => _,"shutoff" => _,"subcontiguous" => _,"suffumigate" => _,"transformable" => _,"uncoroneted" => _,"unparking" => _,"unvarnishedness" => _,"wherewithal" => _,} = value), do: AlleviateClass.from_map(value)
   def decode_alleviate_element(value) when is_list(value), do: value
   def decode_alleviate_element(_), do: {:error, "Unexpected type when decoding TopLevel.alleviate"}
@@ -1008,6 +1796,12 @@ defmodule TopLevel do
   def encode_alleviate_element(value) when is_list(value), do: value
   def encode_alleviate_element(_), do: {:error, "Unexpected type when encoding TopLevel.alleviate"}
 
+  def decode_amaas(value) when is_list(value), do: value
+  def decode_amaas(_), do: {:error, "Unexpected type when decoding TopLevel.amaas"}
+
+  def encode_amaas(value) when is_list(value), do: value
+  def encode_amaas(_), do: {:error, "Unexpected type when encoding TopLevel.amaas"}
+
   def decode_amaas_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: Rebecca.from_map(value)
   def decode_amaas_element(value) when is_boolean(value), do: value
   def decode_amaas_element(value) when is_integer(value), do: value
@@ -1018,6 +1812,12 @@ defmodule TopLevel do
   def encode_amaas_element(value) when is_integer(value), do: value
   def encode_amaas_element(_), do: {:error, "Unexpected type when encoding TopLevel.amaas"}
 
+  def decode_ambassage(value) when is_list(value), do: value
+  def decode_ambassage(_), do: {:error, "Unexpected type when decoding TopLevel.ambassage"}
+
+  def encode_ambassage(value) when is_list(value), do: value
+  def encode_ambassage(_), do: {:error, "Unexpected type when encoding TopLevel.ambassage"}
+
   def decode_ambassage_element(value) when is_binary(value), do: value
   def decode_ambassage_element(value) when is_list(value), do: value
   def decode_ambassage_element(_), do: {:error, "Unexpected type when decoding TopLevel.ambassage"}
@@ -1026,6 +1826,12 @@ defmodule TopLevel do
   def encode_ambassage_element(value) when is_list(value), do: value
   def encode_ambassage_element(_), do: {:error, "Unexpected type when encoding TopLevel.ambassage"}
 
+  def decode_amphithyron(value) when is_list(value), do: value
+  def decode_amphithyron(_), do: {:error, "Unexpected type when decoding TopLevel.amphithyron"}
+
+  def encode_amphithyron(value) when is_list(value), do: value
+  def encode_amphithyron(_), do: {:error, "Unexpected type when encoding TopLevel.amphithyron"}
+
   def decode_amphithyron_element(%{} = value), do: Amphithyron.from_map(value)
   def decode_amphithyron_element(value) when is_nil(value), do: value
   def decode_amphithyron_element(_), do: {:error, "Unexpected type when decoding TopLevel.amphithyron"}
@@ -1034,6 +1840,12 @@ defmodule TopLevel do
   def encode_amphithyron_element(value) when is_nil(value), do: value
   def encode_amphithyron_element(_), do: {:error, "Unexpected type when encoding TopLevel.amphithyron"}
 
+  def decode_andriana(value) when is_list(value), do: value
+  def decode_andriana(_), do: {:error, "Unexpected type when decoding TopLevel.andriana"}
+
+  def encode_andriana(value) when is_list(value), do: value
+  def encode_andriana(_), do: {:error, "Unexpected type when encoding TopLevel.andriana"}
+
   def decode_andriana_element(value) when is_nil(value), do: value
   def decode_andriana_element(value) when is_binary(value), do: value
   def decode_andriana_element(_), do: {:error, "Unexpected type when decoding TopLevel.andriana"}
@@ -1042,6 +1854,12 @@ defmodule TopLevel do
   def encode_andriana_element(value) when is_binary(value), do: value
   def encode_andriana_element(_), do: {:error, "Unexpected type when encoding TopLevel.andriana"}
 
+  def decode_ankee(value) when is_list(value), do: value
+  def decode_ankee(_), do: {:error, "Unexpected type when decoding TopLevel.ankee"}
+
+  def encode_ankee(value) when is_list(value), do: value
+  def encode_ankee(_), do: {:error, "Unexpected type when encoding TopLevel.ankee"}
+
   def decode_ankee_element(%{"Anomoean" => _,"barleyhood" => _,"befriender" => _,"brutishness" => _,"cephalalgy" => _,"cirurgian" => _,"conventionally" => _,"jackshay" => _,"milammeter" => _,"Naja" => _,"ombrological" => _,"phonasthenia" => _,"retrievableness" => _,"snakily" => _,"swot" => _,"tartlet" => _,"thiofuran" => _,"tracheophone" => _,"tuglike" => _,"unscratchingly" => _,} = value), do: AnkeeClass.from_map(value)
   def decode_ankee_element(value) when is_integer(value), do: value
   def decode_ankee_element(value) when is_list(value), do: value
@@ -1052,6 +1870,12 @@ defmodule TopLevel do
   def encode_ankee_element(value) when is_list(value), do: value
   def encode_ankee_element(_), do: {:error, "Unexpected type when encoding TopLevel.ankee"}
 
+  def decode_annihilator(value) when is_list(value), do: value
+  def decode_annihilator(_), do: {:error, "Unexpected type when decoding TopLevel.annihilator"}
+
+  def encode_annihilator(value) when is_list(value), do: value
+  def encode_annihilator(_), do: {:error, "Unexpected type when encoding TopLevel.annihilator"}
+
   def decode_annihilator_element(value) when is_nil(value), do: value
   def decode_annihilator_element(value) when is_map(value), do: value
   def decode_annihilator_element(_), do: {:error, "Unexpected type when decoding TopLevel.annihilator"}
@@ -1060,6 +1884,18 @@ defmodule TopLevel do
   def encode_annihilator_element(value) when is_map(value), do: value
   def encode_annihilator_element(_), do: {:error, "Unexpected type when encoding TopLevel.annihilator"}
 
+  def decode_annulose(value) when is_nil(value), do: value
+  def decode_annulose(_), do: {:error, "Unexpected type when decoding TopLevel.annulose"}
+
+  def encode_annulose(value) when is_nil(value), do: value
+  def encode_annulose(_), do: {:error, "Unexpected type when encoding TopLevel.annulose"}
+
+  def decode_ansarie(value) when is_list(value), do: value
+  def decode_ansarie(_), do: {:error, "Unexpected type when decoding TopLevel.ansarie"}
+
+  def encode_ansarie(value) when is_list(value), do: value
+  def encode_ansarie(_), do: {:error, "Unexpected type when encoding TopLevel.ansarie"}
+
   def decode_ansarie_element(%{"accension" => _,"Alida" => _,"asteria" => _,"beriberic" => _,"edgebone" => _,"gastrodialysis" => _,"geographic" => _,"Ictonyx" => _,"metrocele" => _,"misgraft" => _,"monteith" => _,"notcher" => _,"prorestriction" => _,"Ramist" => _,"throatlet" => _,"unfair" => _,"unsynonymous" => _,"water" => _,"zestfully" => _,"zincic" => _,} = value), do: AnsarieClass.from_map(value)
   def decode_ansarie_element(value) when is_nil(value), do: value
   def decode_ansarie_element(value) when is_list(value), do: value
@@ -1070,6 +1906,12 @@ defmodule TopLevel do
   def encode_ansarie_element(value) when is_list(value), do: value
   def encode_ansarie_element(_), do: {:error, "Unexpected type when encoding TopLevel.ansarie"}
 
+  def decode_aphasia(value) when is_list(value), do: value
+  def decode_aphasia(_), do: {:error, "Unexpected type when decoding TopLevel.aphasia"}
+
+  def encode_aphasia(value) when is_list(value), do: value
+  def encode_aphasia(_), do: {:error, "Unexpected type when encoding TopLevel.aphasia"}
+
   def decode_aphasia_element(value) when is_integer(value), do: value
   def decode_aphasia_element(value) when is_list(value), do: value
   def decode_aphasia_element(_), do: {:error, "Unexpected type when decoding TopLevel.aphasia"}
@@ -1078,6 +1920,12 @@ defmodule TopLevel do
   def encode_aphasia_element(value) when is_list(value), do: value
   def encode_aphasia_element(_), do: {:error, "Unexpected type when encoding TopLevel.aphasia"}
 
+  def decode_asprawl(value) when is_list(value), do: value
+  def decode_asprawl(_), do: {:error, "Unexpected type when decoding TopLevel.asprawl"}
+
+  def encode_asprawl(value) when is_list(value), do: value
+  def encode_asprawl(_), do: {:error, "Unexpected type when encoding TopLevel.asprawl"}
+
   def decode_asprawl_element(value) when is_float(value), do: value
   def decode_asprawl_element(value) when is_integer(value), do: value
   def decode_asprawl_element(value) when is_binary(value), do: value
@@ -1088,6 +1936,12 @@ defmodule TopLevel do
   def encode_asprawl_element(value) when is_binary(value), do: value
   def encode_asprawl_element(_), do: {:error, "Unexpected type when encoding TopLevel.asprawl"}
 
+  def decode_attractive(value) when is_list(value), do: value
+  def decode_attractive(_), do: {:error, "Unexpected type when decoding TopLevel.attractive"}
+
+  def encode_attractive(value) when is_list(value), do: value
+  def encode_attractive(_), do: {:error, "Unexpected type when encoding TopLevel.attractive"}
+
   def decode_attractive_element(value) when is_boolean(value), do: value
   def decode_attractive_element(value) when is_nil(value), do: value
   def decode_attractive_element(_), do: {:error, "Unexpected type when decoding TopLevel.attractive"}
@@ -1096,6 +1950,18 @@ defmodule TopLevel do
   def encode_attractive_element(value) when is_nil(value), do: value
   def encode_attractive_element(_), do: {:error, "Unexpected type when encoding TopLevel.attractive"}
 
+  def decode_barksome_value(value) when is_integer(value), do: value
+  def decode_barksome_value(_), do: {:error, "Unexpected type when decoding TopLevel.barksome"}
+
+  def encode_barksome_value(value) when is_integer(value), do: value
+  def encode_barksome_value(_), do: {:error, "Unexpected type when encoding TopLevel.barksome"}
+
+  def decode_bedesman(value) when is_list(value), do: value
+  def decode_bedesman(_), do: {:error, "Unexpected type when decoding TopLevel.bedesman"}
+
+  def encode_bedesman(value) when is_list(value), do: value
+  def encode_bedesman(_), do: {:error, "Unexpected type when encoding TopLevel.bedesman"}
+
   def decode_bedesman_element(value) when is_boolean(value), do: value
   def decode_bedesman_element(value) when is_float(value), do: value
   def decode_bedesman_element(value) when is_integer(value), do: value
@@ -1108,6 +1974,12 @@ defmodule TopLevel do
   def encode_bedesman_element(value) when is_binary(value), do: value
   def encode_bedesman_element(_), do: {:error, "Unexpected type when encoding TopLevel.bedesman"}
 
+  def decode_belard(value) when is_list(value), do: value
+  def decode_belard(_), do: {:error, "Unexpected type when decoding TopLevel.belard"}
+
+  def encode_belard(value) when is_list(value), do: value
+  def encode_belard(_), do: {:error, "Unexpected type when encoding TopLevel.belard"}
+
   def decode_belard_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: Rebecca.from_map(value)
   def decode_belard_element(value) when is_float(value), do: value
   def decode_belard_element(value) when is_integer(value), do: value
@@ -1120,6 +1992,12 @@ defmodule TopLevel do
   def encode_belard_element(value) when is_list(value), do: value
   def encode_belard_element(_), do: {:error, "Unexpected type when encoding TopLevel.belard"}
 
+  def decode_bocking(value) when is_list(value), do: value
+  def decode_bocking(_), do: {:error, "Unexpected type when decoding TopLevel.bocking"}
+
+  def encode_bocking(value) when is_list(value), do: value
+  def encode_bocking(_), do: {:error, "Unexpected type when encoding TopLevel.bocking"}
+
   def decode_bocking_element(value) when is_boolean(value), do: value
   def decode_bocking_element(value) when is_list(value), do: value
   def decode_bocking_element(value) when is_map(value), do: value
@@ -1130,6 +2008,12 @@ defmodule TopLevel do
   def encode_bocking_element(value) when is_map(value), do: value
   def encode_bocking_element(_), do: {:error, "Unexpected type when encoding TopLevel.bocking"}
 
+  def decode_brawlingly(value) when is_list(value), do: value
+  def decode_brawlingly(_), do: {:error, "Unexpected type when decoding TopLevel.brawlingly"}
+
+  def encode_brawlingly(value) when is_list(value), do: value
+  def encode_brawlingly(_), do: {:error, "Unexpected type when encoding TopLevel.brawlingly"}
+
   def decode_brawlingly_element(value) when is_list(value), do: value
   def decode_brawlingly_element(value) when is_map(value), do: value
   def decode_brawlingly_element(_), do: {:error, "Unexpected type when decoding TopLevel.brawlingly"}
@@ -1138,6 +2022,12 @@ defmodule TopLevel do
   def encode_brawlingly_element(value) when is_map(value), do: value
   def encode_brawlingly_element(_), do: {:error, "Unexpected type when encoding TopLevel.brawlingly"}
 
+  def decode_brookie(value) when is_list(value), do: value
+  def decode_brookie(_), do: {:error, "Unexpected type when decoding TopLevel.brookie"}
+
+  def encode_brookie(value) when is_list(value), do: value
+  def encode_brookie(_), do: {:error, "Unexpected type when encoding TopLevel.brookie"}
+
   def decode_brookie_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: Rebecca.from_map(value)
   def decode_brookie_element(value) when is_list(value), do: value
   def decode_brookie_element(_), do: {:error, "Unexpected type when decoding TopLevel.brookie"}
@@ -1146,6 +2036,12 @@ defmodule TopLevel do
   def encode_brookie_element(value) when is_list(value), do: value
   def encode_brookie_element(_), do: {:error, "Unexpected type when encoding TopLevel.brookie"}
 
+  def decode_bumboatman(value) when is_list(value), do: value
+  def decode_bumboatman(_), do: {:error, "Unexpected type when decoding TopLevel.bumboatman"}
+
+  def encode_bumboatman(value) when is_list(value), do: value
+  def encode_bumboatman(_), do: {:error, "Unexpected type when encoding TopLevel.bumboatman"}
+
   def decode_bumboatman_element(value) when is_nil(value), do: value
   def decode_bumboatman_element(value) when is_binary(value), do: value
   def decode_bumboatman_element(value) when is_list(value), do: value
@@ -1156,6 +2052,18 @@ defmodule TopLevel do
   def encode_bumboatman_element(value) when is_list(value), do: value
   def encode_bumboatman_element(_), do: {:error, "Unexpected type when encoding TopLevel.bumboatman"}
 
+  def decode_bystreet(value) when is_list(value), do: value
+  def decode_bystreet(_), do: {:error, "Unexpected type when decoding TopLevel.bystreet"}
+
+  def encode_bystreet(value) when is_list(value), do: value
+  def encode_bystreet(_), do: {:error, "Unexpected type when encoding TopLevel.bystreet"}
+
+  def decode_calaverite(value) when is_list(value), do: value
+  def decode_calaverite(_), do: {:error, "Unexpected type when decoding TopLevel.calaverite"}
+
+  def encode_calaverite(value) when is_list(value), do: value
+  def encode_calaverite(_), do: {:error, "Unexpected type when encoding TopLevel.calaverite"}
+
   def decode_calaverite_element(value) when is_binary(value), do: value
   def decode_calaverite_element(value) when is_list(value), do: value
   def decode_calaverite_element(_), do: {:error, "Unexpected type when decoding TopLevel.calaverite"}
@@ -1164,6 +2072,12 @@ defmodule TopLevel do
   def encode_calaverite_element(value) when is_list(value), do: value
   def encode_calaverite_element(_), do: {:error, "Unexpected type when encoding TopLevel.calaverite"}
 
+  def decode_catallactic(value) when is_list(value), do: value
+  def decode_catallactic(_), do: {:error, "Unexpected type when decoding TopLevel.catallactic"}
+
+  def encode_catallactic(value) when is_list(value), do: value
+  def encode_catallactic(_), do: {:error, "Unexpected type when encoding TopLevel.catallactic"}
+
   def decode_catallactic_element(value) when is_boolean(value), do: value
   def decode_catallactic_element(value) when is_list(value), do: value
   def decode_catallactic_element(value) when is_map(value), do: value
@@ -1174,6 +2088,12 @@ defmodule TopLevel do
   def encode_catallactic_element(value) when is_map(value), do: value
   def encode_catallactic_element(_), do: {:error, "Unexpected type when encoding TopLevel.catallactic"}
 
+  def decode_cemental(value) when is_list(value), do: value
+  def decode_cemental(_), do: {:error, "Unexpected type when decoding TopLevel.cemental"}
+
+  def encode_cemental(value) when is_list(value), do: value
+  def encode_cemental(_), do: {:error, "Unexpected type when encoding TopLevel.cemental"}
+
   def decode_cemental_element(value) when is_float(value), do: value
   def decode_cemental_element(value) when is_integer(value), do: value
   def decode_cemental_element(value) when is_list(value), do: value
@@ -1186,6 +2106,12 @@ defmodule TopLevel do
   def encode_cemental_element(value) when is_map(value), do: value
   def encode_cemental_element(_), do: {:error, "Unexpected type when encoding TopLevel.cemental"}
 
+  def decode_chytridiaceae(value) when is_list(value), do: value
+  def decode_chytridiaceae(_), do: {:error, "Unexpected type when decoding TopLevel.chytridiaceae"}
+
+  def encode_chytridiaceae(value) when is_list(value), do: value
+  def encode_chytridiaceae(_), do: {:error, "Unexpected type when encoding TopLevel.chytridiaceae"}
+
   def decode_chytridiaceae_element(%{"Batidaceae" => _,"Brechites" => _,"codespairer" => _,"Emery" => _,"enervative" => _,"excriminate" => _,"goshenite" => _,"grime" => _,"gritten" => _,"hectorly" => _,"intermediation" => _,"meeterly" => _,"Narraganset" => _,"onymatic" => _,"paddlecock" => _,"thana" => _,"thornily" => _,"uckia" => _,"unmettle" => _,"vorticellid" => _,} = value), do: ChytridiaceaeClass.from_map(value)
   def decode_chytridiaceae_element(value) when is_boolean(value), do: value
   def decode_chytridiaceae_element(value) when is_nil(value), do: value
@@ -1196,6 +2122,12 @@ defmodule TopLevel do
   def encode_chytridiaceae_element(value) when is_nil(value), do: value
   def encode_chytridiaceae_element(_), do: {:error, "Unexpected type when encoding TopLevel.chytridiaceae"}
 
+  def decode_discordia(value) when is_list(value), do: value
+  def decode_discordia(_), do: {:error, "Unexpected type when decoding TopLevel.discordia"}
+
+  def encode_discordia(value) when is_list(value), do: value
+  def encode_discordia(_), do: {:error, "Unexpected type when encoding TopLevel.discordia"}
+
   def decode_discordia_element(%{} = value), do: DiscordiaClass.from_map(value)
   def decode_discordia_element(value) when is_list(value), do: value
   def decode_discordia_element(_), do: {:error, "Unexpected type when decoding TopLevel.discordia"}
@@ -1204,6 +2136,12 @@ defmodule TopLevel do
   def encode_discordia_element(value) when is_list(value), do: value
   def encode_discordia_element(_), do: {:error, "Unexpected type when encoding TopLevel.discordia"}
 
+  def decode_endomyces(value) when is_list(value), do: value
+  def decode_endomyces(_), do: {:error, "Unexpected type when decoding TopLevel.endomyces"}
+
+  def encode_endomyces(value) when is_list(value), do: value
+  def encode_endomyces(_), do: {:error, "Unexpected type when encoding TopLevel.endomyces"}
+
   def decode_endomyces_element(value) when is_integer(value), do: value
   def decode_endomyces_element(value) when is_binary(value), do: value
   def decode_endomyces_element(_), do: {:error, "Unexpected type when decoding TopLevel.endomyces"}
@@ -1212,6 +2150,12 @@ defmodule TopLevel do
   def encode_endomyces_element(value) when is_binary(value), do: value
   def encode_endomyces_element(_), do: {:error, "Unexpected type when encoding TopLevel.endomyces"}
 
+  def decode_epinephelidae(value) when is_list(value), do: value
+  def decode_epinephelidae(_), do: {:error, "Unexpected type when decoding TopLevel.epinephelidae"}
+
+  def encode_epinephelidae(value) when is_list(value), do: value
+  def encode_epinephelidae(_), do: {:error, "Unexpected type when encoding TopLevel.epinephelidae"}
+
   def decode_epinephelidae_element(value) when is_boolean(value), do: value
   def decode_epinephelidae_element(value) when is_integer(value), do: value
   def decode_epinephelidae_element(value) when is_binary(value), do: value
@@ -1222,6 +2166,12 @@ defmodule TopLevel do
   def encode_epinephelidae_element(value) when is_binary(value), do: value
   def encode_epinephelidae_element(_), do: {:error, "Unexpected type when encoding TopLevel.epinephelidae"}
 
+  def decode_eupatorium(value) when is_list(value), do: value
+  def decode_eupatorium(_), do: {:error, "Unexpected type when decoding TopLevel.eupatorium"}
+
+  def encode_eupatorium(value) when is_list(value), do: value
+  def encode_eupatorium(_), do: {:error, "Unexpected type when encoding TopLevel.eupatorium"}
+
   def decode_eupatorium_element(value) when is_list(value), do: value
   def decode_eupatorium_element(value) when is_map(value), do: value
   def decode_eupatorium_element(_), do: {:error, "Unexpected type when decoding TopLevel.eupatorium"}
@@ -1230,6 +2180,12 @@ defmodule TopLevel do
   def encode_eupatorium_element(value) when is_map(value), do: value
   def encode_eupatorium_element(_), do: {:error, "Unexpected type when encoding TopLevel.eupatorium"}
 
+  def decode_gryphosaurus(value) when is_list(value), do: value
+  def decode_gryphosaurus(_), do: {:error, "Unexpected type when decoding TopLevel.gryphosaurus"}
+
+  def encode_gryphosaurus(value) when is_list(value), do: value
+  def encode_gryphosaurus(_), do: {:error, "Unexpected type when encoding TopLevel.gryphosaurus"}
+
   def decode_gryphosaurus_element(%{"amissibility" => _,"Burushaski" => _,"citronin" => _,"coplaintiff" => _,"disquisitionary" => _,"enoplan" => _,"faintness" => _,"hebetomy" => _,"islandry" => _,"lameduck" => _,"overbattle" => _,"overinterested" => _,"phrenologic" => _,"rainband" => _,"shiningly" => _,"stamineous" => _,"subscapularis" => _,"Tahami" => _,"undaubed" => _,"underntime" => _,} = value), do: GryphosaurusClass.from_map(value)
   def decode_gryphosaurus_element(value) when is_binary(value), do: value
   def decode_gryphosaurus_element(value) when is_list(value), do: value
@@ -1240,6 +2196,12 @@ defmodule TopLevel do
   def encode_gryphosaurus_element(value) when is_list(value), do: value
   def encode_gryphosaurus_element(_), do: {:error, "Unexpected type when encoding TopLevel.gryphosaurus"}
 
+  def decode_koryak(value) when is_list(value), do: value
+  def decode_koryak(_), do: {:error, "Unexpected type when decoding TopLevel.koryak"}
+
+  def encode_koryak(value) when is_list(value), do: value
+  def encode_koryak(_), do: {:error, "Unexpected type when encoding TopLevel.koryak"}
+
   def decode_koryak_element(value) when is_binary(value), do: value
   def decode_koryak_element(value) when is_map(value), do: value
   def decode_koryak_element(_), do: {:error, "Unexpected type when decoding TopLevel.koryak"}
@@ -1248,6 +2210,12 @@ defmodule TopLevel do
   def encode_koryak_element(value) when is_map(value), do: value
   def encode_koryak_element(_), do: {:error, "Unexpected type when encoding TopLevel.koryak"}
 
+  def decode_lavinia(value) when is_list(value), do: value
+  def decode_lavinia(_), do: {:error, "Unexpected type when decoding TopLevel.lavinia"}
+
+  def encode_lavinia(value) when is_list(value), do: value
+  def encode_lavinia(_), do: {:error, "Unexpected type when encoding TopLevel.lavinia"}
+
   def decode_lavinia_element(%{} = value), do: LaviniaClass.from_map(value)
   def decode_lavinia_element(value) when is_binary(value), do: value
   def decode_lavinia_element(_), do: {:error, "Unexpected type when decoding TopLevel.lavinia"}
@@ -1256,6 +2224,12 @@ defmodule TopLevel do
   def encode_lavinia_element(value) when is_binary(value), do: value
   def encode_lavinia_element(_), do: {:error, "Unexpected type when encoding TopLevel.lavinia"}
 
+  def decode_oskar(value) when is_list(value), do: value
+  def decode_oskar(_), do: {:error, "Unexpected type when decoding TopLevel.oskar"}
+
+  def encode_oskar(value) when is_list(value), do: value
+  def encode_oskar(_), do: {:error, "Unexpected type when encoding TopLevel.oskar"}
+
   def decode_oskar_element(%{"Acrobates" => _,"beanshooter" => _,"bearhound" => _,"Cayuga" => _,"guarneri" => _,"hypochondriacism" => _,"indication" => _,"jaculative" => _,"nagana" => _,"Netherlandish" => _,"noctivagous" => _,"nonphysiological" => _,"praxis" => _,"provision" => _,"subterhuman" => _,"sunlit" => _,"syncraniate" => _,"teachment" => _,"unmutinous" => _,"unstoppable" => _,} = value), do: OskarClass.from_map(value)
   def decode_oskar_element(value) when is_list(value), do: value
   def decode_oskar_element(_), do: {:error, "Unexpected type when decoding TopLevel.oskar"}
@@ -1264,6 +2238,12 @@ defmodule TopLevel do
   def encode_oskar_element(value) when is_list(value), do: value
   def encode_oskar_element(_), do: {:error, "Unexpected type when encoding TopLevel.oskar"}
 
+  def decode_rebecca(value) when is_list(value), do: value
+  def decode_rebecca(_), do: {:error, "Unexpected type when decoding TopLevel.rebecca"}
+
+  def encode_rebecca(value) when is_list(value), do: value
+  def encode_rebecca(_), do: {:error, "Unexpected type when encoding TopLevel.rebecca"}
+
   def decode_rebecca_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: Rebecca.from_map(value)
   def decode_rebecca_element(value) when is_integer(value), do: value
   def decode_rebecca_element(value) when is_binary(value), do: value
@@ -1274,6 +2254,12 @@ defmodule TopLevel do
   def encode_rebecca_element(value) when is_binary(value), do: value
   def encode_rebecca_element(_), do: {:error, "Unexpected type when encoding TopLevel.rebecca"}
 
+  def decode_rhomboganoidei(value) when is_list(value), do: value
+  def decode_rhomboganoidei(_), do: {:error, "Unexpected type when decoding TopLevel.rhomboganoidei"}
+
+  def encode_rhomboganoidei(value) when is_list(value), do: value
+  def encode_rhomboganoidei(_), do: {:error, "Unexpected type when encoding TopLevel.rhomboganoidei"}
+
   def decode_rhomboganoidei_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: Rebecca.from_map(value)
   def decode_rhomboganoidei_element(value) when is_binary(value), do: value
   def decode_rhomboganoidei_element(value) when is_list(value), do: value
@@ -1284,6 +2270,18 @@ defmodule TopLevel do
   def encode_rhomboganoidei_element(value) when is_list(value), do: value
   def encode_rhomboganoidei_element(_), do: {:error, "Unexpected type when encoding TopLevel.rhomboganoidei"}
 
+  def decode_rigsmal(value) when is_boolean(value), do: value
+  def decode_rigsmal(_), do: {:error, "Unexpected type when decoding TopLevel.rigsmal"}
+
+  def encode_rigsmal(value) when is_boolean(value), do: value
+  def encode_rigsmal(_), do: {:error, "Unexpected type when encoding TopLevel.rigsmal"}
+
+  def decode_ruellia(value) when is_list(value), do: value
+  def decode_ruellia(_), do: {:error, "Unexpected type when decoding TopLevel.ruellia"}
+
+  def encode_ruellia(value) when is_list(value), do: value
+  def encode_ruellia(_), do: {:error, "Unexpected type when encoding TopLevel.ruellia"}
+
   def decode_ruellia_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: Rebecca.from_map(value)
   def decode_ruellia_element(value) when is_boolean(value), do: value
   def decode_ruellia_element(value) when is_binary(value), do: value
@@ -1294,6 +2292,12 @@ defmodule TopLevel do
   def encode_ruellia_element(value) when is_binary(value), do: value
   def encode_ruellia_element(_), do: {:error, "Unexpected type when encoding TopLevel.ruellia"}
 
+  def decode_school(value) when is_list(value), do: value
+  def decode_school(_), do: {:error, "Unexpected type when decoding TopLevel.school"}
+
+  def encode_school(value) when is_list(value), do: value
+  def encode_school(_), do: {:error, "Unexpected type when encoding TopLevel.school"}
+
   def decode_school_element(value) when is_integer(value), do: value
   def decode_school_element(value) when is_nil(value), do: value
   def decode_school_element(value) when is_map(value), do: value
@@ -1304,6 +2308,12 @@ defmodule TopLevel do
   def encode_school_element(value) when is_map(value), do: value
   def encode_school_element(_), do: {:error, "Unexpected type when encoding TopLevel.school"}
 
+  def decode_shakespearolater(value) when is_list(value), do: value
+  def decode_shakespearolater(_), do: {:error, "Unexpected type when decoding TopLevel.shakespearolater"}
+
+  def encode_shakespearolater(value) when is_list(value), do: value
+  def encode_shakespearolater(_), do: {:error, "Unexpected type when encoding TopLevel.shakespearolater"}
+
   def decode_shakespearolater_element(value) when is_float(value), do: value
   def decode_shakespearolater_element(value) when is_integer(value), do: value
   def decode_shakespearolater_element(value) when is_binary(value), do: value
@@ -1316,6 +2326,20 @@ defmodule TopLevel do
   def encode_shakespearolater_element(value) when is_list(value), do: value
   def encode_shakespearolater_element(_), do: {:error, "Unexpected type when encoding TopLevel.shakespearolater"}
 
+  def decode_svan(value) when is_list(value), do: value
+  def decode_svan(_), do: {:error, "Unexpected type when decoding TopLevel.svan"}
+
+  def encode_svan(value) when is_list(value), do: value
+  def encode_svan(_), do: {:error, "Unexpected type when encoding TopLevel.svan"}
+
+  def decode_wayao_value(value) when is_float(value), do: value
+  def decode_wayao_value(value) when is_integer(value), do: value
+  def decode_wayao_value(_), do: {:error, "Unexpected type when decoding TopLevel.wayao"}
+
+  def encode_wayao_value(value) when is_float(value), do: value
+  def encode_wayao_value(value) when is_integer(value), do: value
+  def encode_wayao_value(_), do: {:error, "Unexpected type when encoding TopLevel.wayao"}
+
   def from_map(m) do
     %TopLevel{
       abranchiata: Enum.map(m["Abranchiata"], &decode_abranchiata_element/1),
@@ -1330,19 +2354,20 @@ defmodule TopLevel do
       andriana: Enum.map(m["Andriana"], &decode_andriana_element/1),
       ankee: Enum.map(m["ankee"], &decode_ankee_element/1),
       annihilator: Enum.map(m["annihilator"], &decode_annihilator_element/1),
-      annulose: m["annulose"],
+      annulose: decode_annulose(m["annulose"]),
       ansarie: Enum.map(m["Ansarie"], &decode_ansarie_element/1),
       aphasia: Enum.map(m["aphasia"], &decode_aphasia_element/1),
       asprawl: Enum.map(m["asprawl"], &decode_asprawl_element/1),
       attractive: Enum.map(m["attractive"], &decode_attractive_element/1),
-      barksome: m["barksome"],
+      barksome: m["barksome"]
+      |> Map.new(fn {key, value} -> {key, decode_barksome_value(value)} end),
       bedesman: Enum.map(m["bedesman"], &decode_bedesman_element/1),
       belard: Enum.map(m["belard"], &decode_belard_element/1),
       bocking: Enum.map(m["bocking"], &decode_bocking_element/1),
       brawlingly: Enum.map(m["brawlingly"], &decode_brawlingly_element/1),
       brookie: Enum.map(m["brookie"], &decode_brookie_element/1),
       bumboatman: Enum.map(m["bumboatman"], &decode_bumboatman_element/1),
-      bystreet: m["bystreet"],
+      bystreet: decode_bystreet(m["bystreet"]),
       calaverite: Enum.map(m["calaverite"], &decode_calaverite_element/1),
       catallactic: Enum.map(m["catallactic"], &decode_catallactic_element/1),
       cemental: Enum.map(m["cemental"], &decode_cemental_element/1),
@@ -1357,12 +2382,13 @@ defmodule TopLevel do
       oskar: Enum.map(m["Oskar"], &decode_oskar_element/1),
       rebecca: Enum.map(m["Rebecca"], &decode_rebecca_element/1),
       rhomboganoidei: Enum.map(m["Rhomboganoidei"], &decode_rhomboganoidei_element/1),
-      rigsmal: m["Rigsmal"],
+      rigsmal: decode_rigsmal(m["Rigsmal"]),
       ruellia: Enum.map(m["Ruellia"], &decode_ruellia_element/1),
       school: Enum.map(m["School"], &decode_school_element/1),
       shakespearolater: Enum.map(m["Shakespearolater"], &decode_shakespearolater_element/1),
-      svan: m["Svan"],
-      wayao: m["Wayao"],
+      svan: decode_svan(m["Svan"]),
+      wayao: m["Wayao"]
+      |> Map.new(fn {key, value} -> {key, decode_wayao_value(value)} end),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/combinations3.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/combinations3.json/default/QuickType.ex
index 4e89536..e45a2c2 100644
--- a/base/elixir/test/inputs/json/priority/combinations3.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/combinations3.json/default/QuickType.ex
@@ -32,28 +32,148 @@ defmodule JurorClass do
           uninhabitedness: nil
         }
 
+  def decode_adipsy(value) when is_nil(value), do: value
+  def decode_adipsy(_), do: {:error, "Unexpected type when decoding JurorClass.adipsy"}
+
+  def encode_adipsy(value) when is_nil(value), do: value
+  def encode_adipsy(_), do: {:error, "Unexpected type when encoding JurorClass.adipsy"}
+
+  def decode_auxiliator(value) when is_nil(value), do: value
+  def decode_auxiliator(_), do: {:error, "Unexpected type when decoding JurorClass.auxiliator"}
+
+  def encode_auxiliator(value) when is_nil(value), do: value
+  def encode_auxiliator(_), do: {:error, "Unexpected type when encoding JurorClass.auxiliator"}
+
+  def decode_benda(value) when is_nil(value), do: value
+  def decode_benda(_), do: {:error, "Unexpected type when decoding JurorClass.benda"}
+
+  def encode_benda(value) when is_nil(value), do: value
+  def encode_benda(_), do: {:error, "Unexpected type when encoding JurorClass.benda"}
+
+  def decode_benjamin(value) when is_nil(value), do: value
+  def decode_benjamin(_), do: {:error, "Unexpected type when decoding JurorClass.benjamin"}
+
+  def encode_benjamin(value) when is_nil(value), do: value
+  def encode_benjamin(_), do: {:error, "Unexpected type when encoding JurorClass.benjamin"}
+
+  def decode_brandling(value) when is_nil(value), do: value
+  def decode_brandling(_), do: {:error, "Unexpected type when decoding JurorClass.brandling"}
+
+  def encode_brandling(value) when is_nil(value), do: value
+  def encode_brandling(_), do: {:error, "Unexpected type when encoding JurorClass.brandling"}
+
+  def decode_epicurishly(value) when is_nil(value), do: value
+  def decode_epicurishly(_), do: {:error, "Unexpected type when decoding JurorClass.epicurishly"}
+
+  def encode_epicurishly(value) when is_nil(value), do: value
+  def encode_epicurishly(_), do: {:error, "Unexpected type when encoding JurorClass.epicurishly"}
+
+  def decode_eremochaetous(value) when is_nil(value), do: value
+  def decode_eremochaetous(_), do: {:error, "Unexpected type when decoding JurorClass.eremochaetous"}
+
+  def encode_eremochaetous(value) when is_nil(value), do: value
+  def encode_eremochaetous(_), do: {:error, "Unexpected type when encoding JurorClass.eremochaetous"}
+
+  def decode_marten(value) when is_nil(value), do: value
+  def decode_marten(_), do: {:error, "Unexpected type when decoding JurorClass.marten"}
+
+  def encode_marten(value) when is_nil(value), do: value
+  def encode_marten(_), do: {:error, "Unexpected type when encoding JurorClass.marten"}
+
+  def decode_monocline(value) when is_nil(value), do: value
+  def decode_monocline(_), do: {:error, "Unexpected type when decoding JurorClass.monocline"}
+
+  def encode_monocline(value) when is_nil(value), do: value
+  def encode_monocline(_), do: {:error, "Unexpected type when encoding JurorClass.monocline"}
+
+  def decode_olea(value) when is_nil(value), do: value
+  def decode_olea(_), do: {:error, "Unexpected type when decoding JurorClass.olea"}
+
+  def encode_olea(value) when is_nil(value), do: value
+  def encode_olea(_), do: {:error, "Unexpected type when encoding JurorClass.olea"}
+
+  def decode_palgat(value) when is_nil(value), do: value
+  def decode_palgat(_), do: {:error, "Unexpected type when decoding JurorClass.palgat"}
+
+  def encode_palgat(value) when is_nil(value), do: value
+  def encode_palgat(_), do: {:error, "Unexpected type when encoding JurorClass.palgat"}
+
+  def decode_pennyworth(value) when is_nil(value), do: value
+  def decode_pennyworth(_), do: {:error, "Unexpected type when decoding JurorClass.pennyworth"}
+
+  def encode_pennyworth(value) when is_nil(value), do: value
+  def encode_pennyworth(_), do: {:error, "Unexpected type when encoding JurorClass.pennyworth"}
+
+  def decode_pioury(value) when is_nil(value), do: value
+  def decode_pioury(_), do: {:error, "Unexpected type when decoding JurorClass.pioury"}
+
+  def encode_pioury(value) when is_nil(value), do: value
+  def encode_pioury(_), do: {:error, "Unexpected type when encoding JurorClass.pioury"}
+
+  def decode_pragmatistic(value) when is_nil(value), do: value
+  def decode_pragmatistic(_), do: {:error, "Unexpected type when decoding JurorClass.pragmatistic"}
+
+  def encode_pragmatistic(value) when is_nil(value), do: value
+  def encode_pragmatistic(_), do: {:error, "Unexpected type when encoding JurorClass.pragmatistic"}
+
+  def decode_stylelessness(value) when is_nil(value), do: value
+  def decode_stylelessness(_), do: {:error, "Unexpected type when decoding JurorClass.stylelessness"}
+
+  def encode_stylelessness(value) when is_nil(value), do: value
+  def encode_stylelessness(_), do: {:error, "Unexpected type when encoding JurorClass.stylelessness"}
+
+  def decode_systematical(value) when is_nil(value), do: value
+  def decode_systematical(_), do: {:error, "Unexpected type when decoding JurorClass.systematical"}
+
+  def encode_systematical(value) when is_nil(value), do: value
+  def encode_systematical(_), do: {:error, "Unexpected type when encoding JurorClass.systematical"}
+
+  def decode_thready(value) when is_nil(value), do: value
+  def decode_thready(_), do: {:error, "Unexpected type when decoding JurorClass.thready"}
+
+  def encode_thready(value) when is_nil(value), do: value
+  def encode_thready(_), do: {:error, "Unexpected type when encoding JurorClass.thready"}
+
+  def decode_uncontemporary(value) when is_nil(value), do: value
+  def decode_uncontemporary(_), do: {:error, "Unexpected type when decoding JurorClass.uncontemporary"}
+
+  def encode_uncontemporary(value) when is_nil(value), do: value
+  def encode_uncontemporary(_), do: {:error, "Unexpected type when encoding JurorClass.uncontemporary"}
+
+  def decode_uncouched(value) when is_nil(value), do: value
+  def decode_uncouched(_), do: {:error, "Unexpected type when decoding JurorClass.uncouched"}
+
+  def encode_uncouched(value) when is_nil(value), do: value
+  def encode_uncouched(_), do: {:error, "Unexpected type when encoding JurorClass.uncouched"}
+
+  def decode_uninhabitedness(value) when is_nil(value), do: value
+  def decode_uninhabitedness(_), do: {:error, "Unexpected type when decoding JurorClass.uninhabitedness"}
+
+  def encode_uninhabitedness(value) when is_nil(value), do: value
+  def encode_uninhabitedness(_), do: {:error, "Unexpected type when encoding JurorClass.uninhabitedness"}
+
   def from_map(m) do
     %JurorClass{
-      adipsy: m["adipsy"],
-      auxiliator: m["auxiliator"],
-      benda: m["benda"],
-      benjamin: m["benjamin"],
-      brandling: m["brandling"],
-      epicurishly: m["epicurishly"],
-      eremochaetous: m["eremochaetous"],
-      marten: m["marten"],
-      monocline: m["monocline"],
-      olea: m["Olea"],
-      palgat: m["palgat"],
-      pennyworth: m["pennyworth"],
-      pioury: m["pioury"],
-      pragmatistic: m["pragmatistic"],
-      stylelessness: m["stylelessness"],
-      systematical: m["systematical"],
-      thready: m["thready"],
-      uncontemporary: m["uncontemporary"],
-      uncouched: m["uncouched"],
-      uninhabitedness: m["uninhabitedness"],
+      adipsy: decode_adipsy(m["adipsy"]),
+      auxiliator: decode_auxiliator(m["auxiliator"]),
+      benda: decode_benda(m["benda"]),
+      benjamin: decode_benjamin(m["benjamin"]),
+      brandling: decode_brandling(m["brandling"]),
+      epicurishly: decode_epicurishly(m["epicurishly"]),
+      eremochaetous: decode_eremochaetous(m["eremochaetous"]),
+      marten: decode_marten(m["marten"]),
+      monocline: decode_monocline(m["monocline"]),
+      olea: decode_olea(m["Olea"]),
+      palgat: decode_palgat(m["palgat"]),
+      pennyworth: decode_pennyworth(m["pennyworth"]),
+      pioury: decode_pioury(m["pioury"]),
+      pragmatistic: decode_pragmatistic(m["pragmatistic"]),
+      stylelessness: decode_stylelessness(m["stylelessness"]),
+      systematical: decode_systematical(m["systematical"]),
+      thready: decode_thready(m["thready"]),
+      uncontemporary: decode_uncontemporary(m["uncontemporary"]),
+      uncouched: decode_uncouched(m["uncouched"]),
+      uninhabitedness: decode_uninhabitedness(m["uninhabitedness"]),
     }
   end
 
@@ -122,28 +242,148 @@ defmodule LadronismClass do
           whafabout: nil
         }
 
+  def decode_acclaimer(value) when is_nil(value), do: value
+  def decode_acclaimer(_), do: {:error, "Unexpected type when decoding LadronismClass.acclaimer"}
+
+  def encode_acclaimer(value) when is_nil(value), do: value
+  def encode_acclaimer(_), do: {:error, "Unexpected type when encoding LadronismClass.acclaimer"}
+
+  def decode_achree(value) when is_nil(value), do: value
+  def decode_achree(_), do: {:error, "Unexpected type when decoding LadronismClass.achree"}
+
+  def encode_achree(value) when is_nil(value), do: value
+  def encode_achree(_), do: {:error, "Unexpected type when encoding LadronismClass.achree"}
+
+  def decode_base(value) when is_nil(value), do: value
+  def decode_base(_), do: {:error, "Unexpected type when decoding LadronismClass.base"}
+
+  def encode_base(value) when is_nil(value), do: value
+  def encode_base(_), do: {:error, "Unexpected type when encoding LadronismClass.base"}
+
+  def decode_conundrumize(value) when is_nil(value), do: value
+  def decode_conundrumize(_), do: {:error, "Unexpected type when decoding LadronismClass.conundrumize"}
+
+  def encode_conundrumize(value) when is_nil(value), do: value
+  def encode_conundrumize(_), do: {:error, "Unexpected type when encoding LadronismClass.conundrumize"}
+
+  def decode_degerminator(value) when is_nil(value), do: value
+  def decode_degerminator(_), do: {:error, "Unexpected type when decoding LadronismClass.degerminator"}
+
+  def encode_degerminator(value) when is_nil(value), do: value
+  def encode_degerminator(_), do: {:error, "Unexpected type when encoding LadronismClass.degerminator"}
+
+  def decode_describable(value) when is_nil(value), do: value
+  def decode_describable(_), do: {:error, "Unexpected type when decoding LadronismClass.describable"}
+
+  def encode_describable(value) when is_nil(value), do: value
+  def encode_describable(_), do: {:error, "Unexpected type when encoding LadronismClass.describable"}
+
+  def decode_exasperatedly(value) when is_nil(value), do: value
+  def decode_exasperatedly(_), do: {:error, "Unexpected type when decoding LadronismClass.exasperatedly"}
+
+  def encode_exasperatedly(value) when is_nil(value), do: value
+  def encode_exasperatedly(_), do: {:error, "Unexpected type when encoding LadronismClass.exasperatedly"}
+
+  def decode_heroine(value) when is_nil(value), do: value
+  def decode_heroine(_), do: {:error, "Unexpected type when decoding LadronismClass.heroine"}
+
+  def encode_heroine(value) when is_nil(value), do: value
+  def encode_heroine(_), do: {:error, "Unexpected type when encoding LadronismClass.heroine"}
+
+  def decode_indazin(value) when is_nil(value), do: value
+  def decode_indazin(_), do: {:error, "Unexpected type when decoding LadronismClass.indazin"}
+
+  def encode_indazin(value) when is_nil(value), do: value
+  def encode_indazin(_), do: {:error, "Unexpected type when encoding LadronismClass.indazin"}
+
+  def decode_luteous(value) when is_nil(value), do: value
+  def decode_luteous(_), do: {:error, "Unexpected type when decoding LadronismClass.luteous"}
+
+  def encode_luteous(value) when is_nil(value), do: value
+  def encode_luteous(_), do: {:error, "Unexpected type when encoding LadronismClass.luteous"}
+
+  def decode_papular(value) when is_nil(value), do: value
+  def decode_papular(_), do: {:error, "Unexpected type when decoding LadronismClass.papular"}
+
+  def encode_papular(value) when is_nil(value), do: value
+  def encode_papular(_), do: {:error, "Unexpected type when encoding LadronismClass.papular"}
+
+  def decode_pritch(value) when is_nil(value), do: value
+  def decode_pritch(_), do: {:error, "Unexpected type when decoding LadronismClass.pritch"}
+
+  def encode_pritch(value) when is_nil(value), do: value
+  def encode_pritch(_), do: {:error, "Unexpected type when encoding LadronismClass.pritch"}
+
+  def decode_prodenia(value) when is_nil(value), do: value
+  def decode_prodenia(_), do: {:error, "Unexpected type when decoding LadronismClass.prodenia"}
+
+  def encode_prodenia(value) when is_nil(value), do: value
+  def encode_prodenia(_), do: {:error, "Unexpected type when encoding LadronismClass.prodenia"}
+
+  def decode_seege(value) when is_nil(value), do: value
+  def decode_seege(_), do: {:error, "Unexpected type when decoding LadronismClass.seege"}
+
+  def encode_seege(value) when is_nil(value), do: value
+  def encode_seege(_), do: {:error, "Unexpected type when encoding LadronismClass.seege"}
+
+  def decode_shopgirl(value) when is_nil(value), do: value
+  def decode_shopgirl(_), do: {:error, "Unexpected type when decoding LadronismClass.shopgirl"}
+
+  def encode_shopgirl(value) when is_nil(value), do: value
+  def encode_shopgirl(_), do: {:error, "Unexpected type when encoding LadronismClass.shopgirl"}
+
+  def decode_tragedietta(value) when is_nil(value), do: value
+  def decode_tragedietta(_), do: {:error, "Unexpected type when decoding LadronismClass.tragedietta"}
+
+  def encode_tragedietta(value) when is_nil(value), do: value
+  def encode_tragedietta(_), do: {:error, "Unexpected type when encoding LadronismClass.tragedietta"}
+
+  def decode_unsparse(value) when is_nil(value), do: value
+  def decode_unsparse(_), do: {:error, "Unexpected type when decoding LadronismClass.unsparse"}
+
+  def encode_unsparse(value) when is_nil(value), do: value
+  def encode_unsparse(_), do: {:error, "Unexpected type when encoding LadronismClass.unsparse"}
+
+  def decode_uplook(value) when is_nil(value), do: value
+  def decode_uplook(_), do: {:error, "Unexpected type when decoding LadronismClass.uplook"}
+
+  def encode_uplook(value) when is_nil(value), do: value
+  def encode_uplook(_), do: {:error, "Unexpected type when encoding LadronismClass.uplook"}
+
+  def decode_vermiformis(value) when is_nil(value), do: value
+  def decode_vermiformis(_), do: {:error, "Unexpected type when decoding LadronismClass.vermiformis"}
+
+  def encode_vermiformis(value) when is_nil(value), do: value
+  def encode_vermiformis(_), do: {:error, "Unexpected type when encoding LadronismClass.vermiformis"}
+
+  def decode_whafabout(value) when is_nil(value), do: value
+  def decode_whafabout(_), do: {:error, "Unexpected type when decoding LadronismClass.whafabout"}
+
+  def encode_whafabout(value) when is_nil(value), do: value
+  def encode_whafabout(_), do: {:error, "Unexpected type when encoding LadronismClass.whafabout"}
+
   def from_map(m) do
     %LadronismClass{
-      acclaimer: m["acclaimer"],
-      achree: m["achree"],
-      base: m["base"],
-      conundrumize: m["conundrumize"],
-      degerminator: m["degerminator"],
-      describable: m["describable"],
-      exasperatedly: m["exasperatedly"],
-      heroine: m["heroine"],
-      indazin: m["indazin"],
-      luteous: m["luteous"],
-      papular: m["papular"],
-      pritch: m["pritch"],
-      prodenia: m["Prodenia"],
-      seege: m["seege"],
-      shopgirl: m["shopgirl"],
-      tragedietta: m["tragedietta"],
-      unsparse: m["unsparse"],
-      uplook: m["uplook"],
-      vermiformis: m["vermiformis"],
-      whafabout: m["whafabout"],
+      acclaimer: decode_acclaimer(m["acclaimer"]),
+      achree: decode_achree(m["achree"]),
+      base: decode_base(m["base"]),
+      conundrumize: decode_conundrumize(m["conundrumize"]),
+      degerminator: decode_degerminator(m["degerminator"]),
+      describable: decode_describable(m["describable"]),
+      exasperatedly: decode_exasperatedly(m["exasperatedly"]),
+      heroine: decode_heroine(m["heroine"]),
+      indazin: decode_indazin(m["indazin"]),
+      luteous: decode_luteous(m["luteous"]),
+      papular: decode_papular(m["papular"]),
+      pritch: decode_pritch(m["pritch"]),
+      prodenia: decode_prodenia(m["Prodenia"]),
+      seege: decode_seege(m["seege"]),
+      shopgirl: decode_shopgirl(m["shopgirl"]),
+      tragedietta: decode_tragedietta(m["tragedietta"]),
+      unsparse: decode_unsparse(m["unsparse"]),
+      uplook: decode_uplook(m["uplook"]),
+      vermiformis: decode_vermiformis(m["vermiformis"]),
+      whafabout: decode_whafabout(m["whafabout"]),
     }
   end
 
@@ -212,28 +452,148 @@ defmodule LandlubberlyClass do
           unrecriminative: nil
         }
 
+  def decode_acropoleis(value) when is_nil(value), do: value
+  def decode_acropoleis(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.acropoleis"}
+
+  def encode_acropoleis(value) when is_nil(value), do: value
+  def encode_acropoleis(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.acropoleis"}
+
+  def decode_aminate(value) when is_nil(value), do: value
+  def decode_aminate(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.aminate"}
+
+  def encode_aminate(value) when is_nil(value), do: value
+  def encode_aminate(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.aminate"}
+
+  def decode_amyraldism(value) when is_nil(value), do: value
+  def decode_amyraldism(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.amyraldism"}
+
+  def encode_amyraldism(value) when is_nil(value), do: value
+  def encode_amyraldism(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.amyraldism"}
+
+  def decode_bipenniform(value) when is_nil(value), do: value
+  def decode_bipenniform(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.bipenniform"}
+
+  def encode_bipenniform(value) when is_nil(value), do: value
+  def encode_bipenniform(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.bipenniform"}
+
+  def decode_bugre(value) when is_nil(value), do: value
+  def decode_bugre(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.bugre"}
+
+  def encode_bugre(value) when is_nil(value), do: value
+  def encode_bugre(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.bugre"}
+
+  def decode_calycule(value) when is_nil(value), do: value
+  def decode_calycule(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.calycule"}
+
+  def encode_calycule(value) when is_nil(value), do: value
+  def encode_calycule(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.calycule"}
+
+  def decode_caoutchouc(value) when is_nil(value), do: value
+  def decode_caoutchouc(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.caoutchouc"}
+
+  def encode_caoutchouc(value) when is_nil(value), do: value
+  def encode_caoutchouc(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.caoutchouc"}
+
+  def decode_disprover(value) when is_nil(value), do: value
+  def decode_disprover(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.disprover"}
+
+  def encode_disprover(value) when is_nil(value), do: value
+  def encode_disprover(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.disprover"}
+
+  def decode_fitroot(value) when is_nil(value), do: value
+  def decode_fitroot(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.fitroot"}
+
+  def encode_fitroot(value) when is_nil(value), do: value
+  def encode_fitroot(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.fitroot"}
+
+  def decode_fulgently(value) when is_nil(value), do: value
+  def decode_fulgently(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.fulgently"}
+
+  def encode_fulgently(value) when is_nil(value), do: value
+  def encode_fulgently(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.fulgently"}
+
+  def decode_kickup(value) when is_nil(value), do: value
+  def decode_kickup(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.kickup"}
+
+  def encode_kickup(value) when is_nil(value), do: value
+  def encode_kickup(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.kickup"}
+
+  def decode_laevoversion(value) when is_nil(value), do: value
+  def decode_laevoversion(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.laevoversion"}
+
+  def encode_laevoversion(value) when is_nil(value), do: value
+  def encode_laevoversion(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.laevoversion"}
+
+  def decode_moter(value) when is_nil(value), do: value
+  def decode_moter(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.moter"}
+
+  def encode_moter(value) when is_nil(value), do: value
+  def encode_moter(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.moter"}
+
+  def decode_objectivity(value) when is_nil(value), do: value
+  def decode_objectivity(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.objectivity"}
+
+  def encode_objectivity(value) when is_nil(value), do: value
+  def encode_objectivity(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.objectivity"}
+
+  def decode_posterity(value) when is_nil(value), do: value
+  def decode_posterity(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.posterity"}
+
+  def encode_posterity(value) when is_nil(value), do: value
+  def encode_posterity(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.posterity"}
+
+  def decode_postnuptial(value) when is_nil(value), do: value
+  def decode_postnuptial(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.postnuptial"}
+
+  def encode_postnuptial(value) when is_nil(value), do: value
+  def encode_postnuptial(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.postnuptial"}
+
+  def decode_precedentary(value) when is_nil(value), do: value
+  def decode_precedentary(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.precedentary"}
+
+  def encode_precedentary(value) when is_nil(value), do: value
+  def encode_precedentary(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.precedentary"}
+
+  def decode_saddling(value) when is_nil(value), do: value
+  def decode_saddling(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.saddling"}
+
+  def encode_saddling(value) when is_nil(value), do: value
+  def encode_saddling(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.saddling"}
+
+  def decode_subcurrent(value) when is_nil(value), do: value
+  def decode_subcurrent(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.subcurrent"}
+
+  def encode_subcurrent(value) when is_nil(value), do: value
+  def encode_subcurrent(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.subcurrent"}
+
+  def decode_unrecriminative(value) when is_nil(value), do: value
+  def decode_unrecriminative(_), do: {:error, "Unexpected type when decoding LandlubberlyClass.unrecriminative"}
+
+  def encode_unrecriminative(value) when is_nil(value), do: value
+  def encode_unrecriminative(_), do: {:error, "Unexpected type when encoding LandlubberlyClass.unrecriminative"}
+
   def from_map(m) do
     %LandlubberlyClass{
-      acropoleis: m["acropoleis"],
-      aminate: m["aminate"],
-      amyraldism: m["Amyraldism"],
-      bipenniform: m["bipenniform"],
-      bugre: m["bugre"],
-      calycule: m["calycule"],
-      caoutchouc: m["caoutchouc"],
-      disprover: m["disprover"],
-      fitroot: m["fitroot"],
-      fulgently: m["fulgently"],
-      kickup: m["kickup"],
-      laevoversion: m["laevoversion"],
-      moter: m["moter"],
-      objectivity: m["objectivity"],
-      posterity: m["posterity"],
-      postnuptial: m["postnuptial"],
-      precedentary: m["precedentary"],
-      saddling: m["saddling"],
-      subcurrent: m["subcurrent"],
-      unrecriminative: m["unrecriminative"],
+      acropoleis: decode_acropoleis(m["acropoleis"]),
+      aminate: decode_aminate(m["aminate"]),
+      amyraldism: decode_amyraldism(m["Amyraldism"]),
+      bipenniform: decode_bipenniform(m["bipenniform"]),
+      bugre: decode_bugre(m["bugre"]),
+      calycule: decode_calycule(m["calycule"]),
+      caoutchouc: decode_caoutchouc(m["caoutchouc"]),
+      disprover: decode_disprover(m["disprover"]),
+      fitroot: decode_fitroot(m["fitroot"]),
+      fulgently: decode_fulgently(m["fulgently"]),
+      kickup: decode_kickup(m["kickup"]),
+      laevoversion: decode_laevoversion(m["laevoversion"]),
+      moter: decode_moter(m["moter"]),
+      objectivity: decode_objectivity(m["objectivity"]),
+      posterity: decode_posterity(m["posterity"]),
+      postnuptial: decode_postnuptial(m["postnuptial"]),
+      precedentary: decode_precedentary(m["precedentary"]),
+      saddling: decode_saddling(m["saddling"]),
+      subcurrent: decode_subcurrent(m["subcurrent"]),
+      unrecriminative: decode_unrecriminative(m["unrecriminative"]),
     }
   end
 
@@ -555,13 +915,45 @@ defmodule MonaziteClass do
           nonbookish: nil
         }
 
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding MonaziteClass.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding MonaziteClass.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding MonaziteClass.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding MonaziteClass.chirotherium"}
+
+  def decode_disdiapason(value) when is_binary(value), do: value
+  def decode_disdiapason(_), do: {:error, "Unexpected type when decoding MonaziteClass.disdiapason"}
+
+  def encode_disdiapason(value) when is_binary(value), do: value
+  def encode_disdiapason(_), do: {:error, "Unexpected type when encoding MonaziteClass.disdiapason"}
+
+  def decode_homocerc(value) when is_boolean(value), do: value
+  def decode_homocerc(_), do: {:error, "Unexpected type when decoding MonaziteClass.homocerc"}
+
+  def encode_homocerc(value) when is_boolean(value), do: value
+  def encode_homocerc(_), do: {:error, "Unexpected type when encoding MonaziteClass.homocerc"}
+
+  def decode_nonbookish(value) when is_nil(value), do: value
+  def decode_nonbookish(_), do: {:error, "Unexpected type when decoding MonaziteClass.nonbookish"}
+
+  def encode_nonbookish(value) when is_nil(value), do: value
+  def encode_nonbookish(_), do: {:error, "Unexpected type when encoding MonaziteClass.nonbookish"}
+
   def from_map(m) do
     %MonaziteClass{
-      catharticalness: m["catharticalness"],
-      chirotherium: m["Chirotherium"],
-      disdiapason: m["disdiapason"],
-      homocerc: m["homocerc"],
-      nonbookish: m["nonbookish"],
+      catharticalness: decode_catharticalness(m["catharticalness"]),
+      chirotherium: decode_chirotherium(m["Chirotherium"]),
+      disdiapason: decode_disdiapason(m["disdiapason"]),
+      homocerc: decode_homocerc(m["homocerc"]),
+      nonbookish: decode_nonbookish(m["nonbookish"]),
     }
   end
 
@@ -704,13 +1096,45 @@ defmodule Noncontributing do
           unrequested: nil
         }
 
+  def decode_estevin(value) when is_binary(value), do: value
+  def decode_estevin(_), do: {:error, "Unexpected type when decoding Noncontributing.estevin"}
+
+  def encode_estevin(value) when is_binary(value), do: value
+  def encode_estevin(_), do: {:error, "Unexpected type when encoding Noncontributing.estevin"}
+
+  def decode_jolterhead(value) when is_float(value), do: value
+  def decode_jolterhead(value) when is_integer(value), do: value
+  def decode_jolterhead(_), do: {:error, "Unexpected type when decoding Noncontributing.jolterhead"}
+
+  def encode_jolterhead(value) when is_float(value), do: value
+  def encode_jolterhead(value) when is_integer(value), do: value
+  def encode_jolterhead(_), do: {:error, "Unexpected type when encoding Noncontributing.jolterhead"}
+
+  def decode_sauternes(value) when is_integer(value), do: value
+  def decode_sauternes(_), do: {:error, "Unexpected type when decoding Noncontributing.sauternes"}
+
+  def encode_sauternes(value) when is_integer(value), do: value
+  def encode_sauternes(_), do: {:error, "Unexpected type when encoding Noncontributing.sauternes"}
+
+  def decode_sparsely(value) when is_boolean(value), do: value
+  def decode_sparsely(_), do: {:error, "Unexpected type when decoding Noncontributing.sparsely"}
+
+  def encode_sparsely(value) when is_boolean(value), do: value
+  def encode_sparsely(_), do: {:error, "Unexpected type when encoding Noncontributing.sparsely"}
+
+  def decode_unrequested(value) when is_nil(value), do: value
+  def decode_unrequested(_), do: {:error, "Unexpected type when decoding Noncontributing.unrequested"}
+
+  def encode_unrequested(value) when is_nil(value), do: value
+  def encode_unrequested(_), do: {:error, "Unexpected type when encoding Noncontributing.unrequested"}
+
   def from_map(m) do
     %Noncontributing{
-      estevin: m["estevin"],
-      jolterhead: m["jolterhead"],
-      sauternes: m["sauternes"],
-      sparsely: m["sparsely"],
-      unrequested: m["unrequested"],
+      estevin: decode_estevin(m["estevin"]),
+      jolterhead: decode_jolterhead(m["jolterhead"]),
+      sauternes: decode_sauternes(m["sauternes"]),
+      sparsely: decode_sparsely(m["sparsely"]),
+      unrequested: decode_unrequested(m["unrequested"]),
     }
   end
 
@@ -764,28 +1188,148 @@ defmodule OccupationalistClass do
           unpocketed: nil
         }
 
+  def decode_beholdable(value) when is_nil(value), do: value
+  def decode_beholdable(_), do: {:error, "Unexpected type when decoding OccupationalistClass.beholdable"}
+
+  def encode_beholdable(value) when is_nil(value), do: value
+  def encode_beholdable(_), do: {:error, "Unexpected type when encoding OccupationalistClass.beholdable"}
+
+  def decode_brotuliform(value) when is_nil(value), do: value
+  def decode_brotuliform(_), do: {:error, "Unexpected type when decoding OccupationalistClass.brotuliform"}
+
+  def encode_brotuliform(value) when is_nil(value), do: value
+  def encode_brotuliform(_), do: {:error, "Unexpected type when encoding OccupationalistClass.brotuliform"}
+
+  def decode_chimakum(value) when is_nil(value), do: value
+  def decode_chimakum(_), do: {:error, "Unexpected type when decoding OccupationalistClass.chimakum"}
+
+  def encode_chimakum(value) when is_nil(value), do: value
+  def encode_chimakum(_), do: {:error, "Unexpected type when encoding OccupationalistClass.chimakum"}
+
+  def decode_doodler(value) when is_nil(value), do: value
+  def decode_doodler(_), do: {:error, "Unexpected type when decoding OccupationalistClass.doodler"}
+
+  def encode_doodler(value) when is_nil(value), do: value
+  def encode_doodler(_), do: {:error, "Unexpected type when encoding OccupationalistClass.doodler"}
+
+  def decode_emulsin(value) when is_nil(value), do: value
+  def decode_emulsin(_), do: {:error, "Unexpected type when decoding OccupationalistClass.emulsin"}
+
+  def encode_emulsin(value) when is_nil(value), do: value
+  def encode_emulsin(_), do: {:error, "Unexpected type when encoding OccupationalistClass.emulsin"}
+
+  def decode_fin(value) when is_nil(value), do: value
+  def decode_fin(_), do: {:error, "Unexpected type when decoding OccupationalistClass.fin"}
+
+  def encode_fin(value) when is_nil(value), do: value
+  def encode_fin(_), do: {:error, "Unexpected type when encoding OccupationalistClass.fin"}
+
+  def decode_flourishing(value) when is_nil(value), do: value
+  def decode_flourishing(_), do: {:error, "Unexpected type when decoding OccupationalistClass.flourishing"}
+
+  def encode_flourishing(value) when is_nil(value), do: value
+  def encode_flourishing(_), do: {:error, "Unexpected type when encoding OccupationalistClass.flourishing"}
+
+  def decode_flueless(value) when is_nil(value), do: value
+  def decode_flueless(_), do: {:error, "Unexpected type when decoding OccupationalistClass.flueless"}
+
+  def encode_flueless(value) when is_nil(value), do: value
+  def encode_flueless(_), do: {:error, "Unexpected type when encoding OccupationalistClass.flueless"}
+
+  def decode_furtively(value) when is_nil(value), do: value
+  def decode_furtively(_), do: {:error, "Unexpected type when decoding OccupationalistClass.furtively"}
+
+  def encode_furtively(value) when is_nil(value), do: value
+  def encode_furtively(_), do: {:error, "Unexpected type when encoding OccupationalistClass.furtively"}
+
+  def decode_gritter(value) when is_nil(value), do: value
+  def decode_gritter(_), do: {:error, "Unexpected type when decoding OccupationalistClass.gritter"}
+
+  def encode_gritter(value) when is_nil(value), do: value
+  def encode_gritter(_), do: {:error, "Unexpected type when encoding OccupationalistClass.gritter"}
+
+  def decode_interwish(value) when is_nil(value), do: value
+  def decode_interwish(_), do: {:error, "Unexpected type when decoding OccupationalistClass.interwish"}
+
+  def encode_interwish(value) when is_nil(value), do: value
+  def encode_interwish(_), do: {:error, "Unexpected type when encoding OccupationalistClass.interwish"}
+
+  def decode_monoxylic(value) when is_nil(value), do: value
+  def decode_monoxylic(_), do: {:error, "Unexpected type when decoding OccupationalistClass.monoxylic"}
+
+  def encode_monoxylic(value) when is_nil(value), do: value
+  def encode_monoxylic(_), do: {:error, "Unexpected type when encoding OccupationalistClass.monoxylic"}
+
+  def decode_myristic(value) when is_nil(value), do: value
+  def decode_myristic(_), do: {:error, "Unexpected type when decoding OccupationalistClass.myristic"}
+
+  def encode_myristic(value) when is_nil(value), do: value
+  def encode_myristic(_), do: {:error, "Unexpected type when encoding OccupationalistClass.myristic"}
+
+  def decode_nightwear(value) when is_nil(value), do: value
+  def decode_nightwear(_), do: {:error, "Unexpected type when decoding OccupationalistClass.nightwear"}
+
+  def encode_nightwear(value) when is_nil(value), do: value
+  def encode_nightwear(_), do: {:error, "Unexpected type when encoding OccupationalistClass.nightwear"}
+
+  def decode_peruser(value) when is_nil(value), do: value
+  def decode_peruser(_), do: {:error, "Unexpected type when decoding OccupationalistClass.peruser"}
+
+  def encode_peruser(value) when is_nil(value), do: value
+  def encode_peruser(_), do: {:error, "Unexpected type when encoding OccupationalistClass.peruser"}
+
+  def decode_theoastrological(value) when is_nil(value), do: value
+  def decode_theoastrological(_), do: {:error, "Unexpected type when decoding OccupationalistClass.theoastrological"}
+
+  def encode_theoastrological(value) when is_nil(value), do: value
+  def encode_theoastrological(_), do: {:error, "Unexpected type when encoding OccupationalistClass.theoastrological"}
+
+  def decode_thumby(value) when is_nil(value), do: value
+  def decode_thumby(_), do: {:error, "Unexpected type when decoding OccupationalistClass.thumby"}
+
+  def encode_thumby(value) when is_nil(value), do: value
+  def encode_thumby(_), do: {:error, "Unexpected type when encoding OccupationalistClass.thumby"}
+
+  def decode_tingitid(value) when is_nil(value), do: value
+  def decode_tingitid(_), do: {:error, "Unexpected type when decoding OccupationalistClass.tingitid"}
+
+  def encode_tingitid(value) when is_nil(value), do: value
+  def encode_tingitid(_), do: {:error, "Unexpected type when encoding OccupationalistClass.tingitid"}
+
+  def decode_trailless(value) when is_nil(value), do: value
+  def decode_trailless(_), do: {:error, "Unexpected type when decoding OccupationalistClass.trailless"}
+
+  def encode_trailless(value) when is_nil(value), do: value
+  def encode_trailless(_), do: {:error, "Unexpected type when encoding OccupationalistClass.trailless"}
+
+  def decode_unpocketed(value) when is_nil(value), do: value
+  def decode_unpocketed(_), do: {:error, "Unexpected type when decoding OccupationalistClass.unpocketed"}
+
+  def encode_unpocketed(value) when is_nil(value), do: value
+  def encode_unpocketed(_), do: {:error, "Unexpected type when encoding OccupationalistClass.unpocketed"}
+
   def from_map(m) do
     %OccupationalistClass{
-      beholdable: m["beholdable"],
-      brotuliform: m["brotuliform"],
-      chimakum: m["Chimakum"],
-      doodler: m["doodler"],
-      emulsin: m["emulsin"],
-      fin: m["Fin"],
-      flourishing: m["flourishing"],
-      flueless: m["flueless"],
-      furtively: m["furtively"],
-      gritter: m["gritter"],
-      interwish: m["interwish"],
-      monoxylic: m["monoxylic"],
-      myristic: m["myristic"],
-      nightwear: m["nightwear"],
-      peruser: m["peruser"],
-      theoastrological: m["theoastrological"],
-      thumby: m["thumby"],
-      tingitid: m["tingitid"],
-      trailless: m["trailless"],
-      unpocketed: m["unpocketed"],
+      beholdable: decode_beholdable(m["beholdable"]),
+      brotuliform: decode_brotuliform(m["brotuliform"]),
+      chimakum: decode_chimakum(m["Chimakum"]),
+      doodler: decode_doodler(m["doodler"]),
+      emulsin: decode_emulsin(m["emulsin"]),
+      fin: decode_fin(m["Fin"]),
+      flourishing: decode_flourishing(m["flourishing"]),
+      flueless: decode_flueless(m["flueless"]),
+      furtively: decode_furtively(m["furtively"]),
+      gritter: decode_gritter(m["gritter"]),
+      interwish: decode_interwish(m["interwish"]),
+      monoxylic: decode_monoxylic(m["monoxylic"]),
+      myristic: decode_myristic(m["myristic"]),
+      nightwear: decode_nightwear(m["nightwear"]),
+      peruser: decode_peruser(m["peruser"]),
+      theoastrological: decode_theoastrological(m["theoastrological"]),
+      thumby: decode_thumby(m["thumby"]),
+      tingitid: decode_tingitid(m["tingitid"]),
+      trailless: decode_trailless(m["trailless"]),
+      unpocketed: decode_unpocketed(m["unpocketed"]),
     }
   end
 
@@ -854,28 +1398,148 @@ defmodule OutrivalClass do
           unpaced: nil
         }
 
+  def decode_adroitly(value) when is_nil(value), do: value
+  def decode_adroitly(_), do: {:error, "Unexpected type when decoding OutrivalClass.adroitly"}
+
+  def encode_adroitly(value) when is_nil(value), do: value
+  def encode_adroitly(_), do: {:error, "Unexpected type when encoding OutrivalClass.adroitly"}
+
+  def decode_bridehood(value) when is_nil(value), do: value
+  def decode_bridehood(_), do: {:error, "Unexpected type when decoding OutrivalClass.bridehood"}
+
+  def encode_bridehood(value) when is_nil(value), do: value
+  def encode_bridehood(_), do: {:error, "Unexpected type when encoding OutrivalClass.bridehood"}
+
+  def decode_castoroides(value) when is_nil(value), do: value
+  def decode_castoroides(_), do: {:error, "Unexpected type when decoding OutrivalClass.castoroides"}
+
+  def encode_castoroides(value) when is_nil(value), do: value
+  def encode_castoroides(_), do: {:error, "Unexpected type when encoding OutrivalClass.castoroides"}
+
+  def decode_czechoslovak(value) when is_nil(value), do: value
+  def decode_czechoslovak(_), do: {:error, "Unexpected type when decoding OutrivalClass.czechoslovak"}
+
+  def encode_czechoslovak(value) when is_nil(value), do: value
+  def encode_czechoslovak(_), do: {:error, "Unexpected type when encoding OutrivalClass.czechoslovak"}
+
+  def decode_diagenesis(value) when is_nil(value), do: value
+  def decode_diagenesis(_), do: {:error, "Unexpected type when decoding OutrivalClass.diagenesis"}
+
+  def encode_diagenesis(value) when is_nil(value), do: value
+  def encode_diagenesis(_), do: {:error, "Unexpected type when encoding OutrivalClass.diagenesis"}
+
+  def decode_dihexahedron(value) when is_nil(value), do: value
+  def decode_dihexahedron(_), do: {:error, "Unexpected type when decoding OutrivalClass.dihexahedron"}
+
+  def encode_dihexahedron(value) when is_nil(value), do: value
+  def encode_dihexahedron(_), do: {:error, "Unexpected type when encoding OutrivalClass.dihexahedron"}
+
+  def decode_dopester(value) when is_nil(value), do: value
+  def decode_dopester(_), do: {:error, "Unexpected type when decoding OutrivalClass.dopester"}
+
+  def encode_dopester(value) when is_nil(value), do: value
+  def encode_dopester(_), do: {:error, "Unexpected type when encoding OutrivalClass.dopester"}
+
+  def decode_eumerism(value) when is_nil(value), do: value
+  def decode_eumerism(_), do: {:error, "Unexpected type when decoding OutrivalClass.eumerism"}
+
+  def encode_eumerism(value) when is_nil(value), do: value
+  def encode_eumerism(_), do: {:error, "Unexpected type when encoding OutrivalClass.eumerism"}
+
+  def decode_flyness(value) when is_nil(value), do: value
+  def decode_flyness(_), do: {:error, "Unexpected type when decoding OutrivalClass.flyness"}
+
+  def encode_flyness(value) when is_nil(value), do: value
+  def encode_flyness(_), do: {:error, "Unexpected type when encoding OutrivalClass.flyness"}
+
+  def decode_fouler(value) when is_nil(value), do: value
+  def decode_fouler(_), do: {:error, "Unexpected type when decoding OutrivalClass.fouler"}
+
+  def encode_fouler(value) when is_nil(value), do: value
+  def encode_fouler(_), do: {:error, "Unexpected type when encoding OutrivalClass.fouler"}
+
+  def decode_laudanosine(value) when is_nil(value), do: value
+  def decode_laudanosine(_), do: {:error, "Unexpected type when decoding OutrivalClass.laudanosine"}
+
+  def encode_laudanosine(value) when is_nil(value), do: value
+  def encode_laudanosine(_), do: {:error, "Unexpected type when encoding OutrivalClass.laudanosine"}
+
+  def decode_lingulidae(value) when is_nil(value), do: value
+  def decode_lingulidae(_), do: {:error, "Unexpected type when decoding OutrivalClass.lingulidae"}
+
+  def encode_lingulidae(value) when is_nil(value), do: value
+  def encode_lingulidae(_), do: {:error, "Unexpected type when encoding OutrivalClass.lingulidae"}
+
+  def decode_minutary(value) when is_nil(value), do: value
+  def decode_minutary(_), do: {:error, "Unexpected type when decoding OutrivalClass.minutary"}
+
+  def encode_minutary(value) when is_nil(value), do: value
+  def encode_minutary(_), do: {:error, "Unexpected type when encoding OutrivalClass.minutary"}
+
+  def decode_mitra(value) when is_nil(value), do: value
+  def decode_mitra(_), do: {:error, "Unexpected type when decoding OutrivalClass.mitra"}
+
+  def encode_mitra(value) when is_nil(value), do: value
+  def encode_mitra(_), do: {:error, "Unexpected type when encoding OutrivalClass.mitra"}
+
+  def decode_opisthorchiasis(value) when is_nil(value), do: value
+  def decode_opisthorchiasis(_), do: {:error, "Unexpected type when decoding OutrivalClass.opisthorchiasis"}
+
+  def encode_opisthorchiasis(value) when is_nil(value), do: value
+  def encode_opisthorchiasis(_), do: {:error, "Unexpected type when encoding OutrivalClass.opisthorchiasis"}
+
+  def decode_pensively(value) when is_nil(value), do: value
+  def decode_pensively(_), do: {:error, "Unexpected type when decoding OutrivalClass.pensively"}
+
+  def encode_pensively(value) when is_nil(value), do: value
+  def encode_pensively(_), do: {:error, "Unexpected type when encoding OutrivalClass.pensively"}
+
+  def decode_pubigerous(value) when is_nil(value), do: value
+  def decode_pubigerous(_), do: {:error, "Unexpected type when decoding OutrivalClass.pubigerous"}
+
+  def encode_pubigerous(value) when is_nil(value), do: value
+  def encode_pubigerous(_), do: {:error, "Unexpected type when encoding OutrivalClass.pubigerous"}
+
+  def decode_rebellious(value) when is_nil(value), do: value
+  def decode_rebellious(_), do: {:error, "Unexpected type when decoding OutrivalClass.rebellious"}
+
+  def encode_rebellious(value) when is_nil(value), do: value
+  def encode_rebellious(_), do: {:error, "Unexpected type when encoding OutrivalClass.rebellious"}
+
+  def decode_recodify(value) when is_nil(value), do: value
+  def decode_recodify(_), do: {:error, "Unexpected type when decoding OutrivalClass.recodify"}
+
+  def encode_recodify(value) when is_nil(value), do: value
+  def encode_recodify(_), do: {:error, "Unexpected type when encoding OutrivalClass.recodify"}
+
+  def decode_unpaced(value) when is_nil(value), do: value
+  def decode_unpaced(_), do: {:error, "Unexpected type when decoding OutrivalClass.unpaced"}
+
+  def encode_unpaced(value) when is_nil(value), do: value
+  def encode_unpaced(_), do: {:error, "Unexpected type when encoding OutrivalClass.unpaced"}
+
   def from_map(m) do
     %OutrivalClass{
-      adroitly: m["adroitly"],
-      bridehood: m["bridehood"],
-      castoroides: m["Castoroides"],
-      czechoslovak: m["Czechoslovak"],
-      diagenesis: m["diagenesis"],
-      dihexahedron: m["dihexahedron"],
-      dopester: m["dopester"],
-      eumerism: m["eumerism"],
-      flyness: m["flyness"],
-      fouler: m["fouler"],
-      laudanosine: m["laudanosine"],
-      lingulidae: m["Lingulidae"],
-      minutary: m["minutary"],
-      mitra: m["mitra"],
-      opisthorchiasis: m["opisthorchiasis"],
-      pensively: m["pensively"],
-      pubigerous: m["pubigerous"],
-      rebellious: m["rebellious"],
-      recodify: m["recodify"],
-      unpaced: m["unpaced"],
+      adroitly: decode_adroitly(m["adroitly"]),
+      bridehood: decode_bridehood(m["bridehood"]),
+      castoroides: decode_castoroides(m["Castoroides"]),
+      czechoslovak: decode_czechoslovak(m["Czechoslovak"]),
+      diagenesis: decode_diagenesis(m["diagenesis"]),
+      dihexahedron: decode_dihexahedron(m["dihexahedron"]),
+      dopester: decode_dopester(m["dopester"]),
+      eumerism: decode_eumerism(m["eumerism"]),
+      flyness: decode_flyness(m["flyness"]),
+      fouler: decode_fouler(m["fouler"]),
+      laudanosine: decode_laudanosine(m["laudanosine"]),
+      lingulidae: decode_lingulidae(m["Lingulidae"]),
+      minutary: decode_minutary(m["minutary"]),
+      mitra: decode_mitra(m["mitra"]),
+      opisthorchiasis: decode_opisthorchiasis(m["opisthorchiasis"]),
+      pensively: decode_pensively(m["pensively"]),
+      pubigerous: decode_pubigerous(m["pubigerous"]),
+      rebellious: decode_rebellious(m["rebellious"]),
+      recodify: decode_recodify(m["recodify"]),
+      unpaced: decode_unpaced(m["unpaced"]),
     }
   end
 
@@ -1152,28 +1816,148 @@ defmodule PotwhiskyClass do
           yoruba: nil
         }
 
+  def decode_arciform(value) when is_nil(value), do: value
+  def decode_arciform(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.arciform"}
+
+  def encode_arciform(value) when is_nil(value), do: value
+  def encode_arciform(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.arciform"}
+
+  def decode_cresolin(value) when is_nil(value), do: value
+  def decode_cresolin(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.cresolin"}
+
+  def encode_cresolin(value) when is_nil(value), do: value
+  def encode_cresolin(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.cresolin"}
+
+  def decode_disheartener(value) when is_nil(value), do: value
+  def decode_disheartener(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.disheartener"}
+
+  def encode_disheartener(value) when is_nil(value), do: value
+  def encode_disheartener(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.disheartener"}
+
+  def decode_disproportionable(value) when is_nil(value), do: value
+  def decode_disproportionable(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.disproportionable"}
+
+  def encode_disproportionable(value) when is_nil(value), do: value
+  def encode_disproportionable(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.disproportionable"}
+
+  def decode_euchorda(value) when is_nil(value), do: value
+  def decode_euchorda(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.euchorda"}
+
+  def encode_euchorda(value) when is_nil(value), do: value
+  def encode_euchorda(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.euchorda"}
+
+  def decode_ferryway(value) when is_nil(value), do: value
+  def decode_ferryway(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.ferryway"}
+
+  def encode_ferryway(value) when is_nil(value), do: value
+  def encode_ferryway(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.ferryway"}
+
+  def decode_filamentiferous(value) when is_nil(value), do: value
+  def decode_filamentiferous(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.filamentiferous"}
+
+  def encode_filamentiferous(value) when is_nil(value), do: value
+  def encode_filamentiferous(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.filamentiferous"}
+
+  def decode_flemish(value) when is_nil(value), do: value
+  def decode_flemish(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.flemish"}
+
+  def encode_flemish(value) when is_nil(value), do: value
+  def encode_flemish(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.flemish"}
+
+  def decode_forgainst(value) when is_nil(value), do: value
+  def decode_forgainst(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.forgainst"}
+
+  def encode_forgainst(value) when is_nil(value), do: value
+  def encode_forgainst(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.forgainst"}
+
+  def decode_grainering(value) when is_nil(value), do: value
+  def decode_grainering(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.grainering"}
+
+  def encode_grainering(value) when is_nil(value), do: value
+  def encode_grainering(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.grainering"}
+
+  def decode_irrevoluble(value) when is_nil(value), do: value
+  def decode_irrevoluble(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.irrevoluble"}
+
+  def encode_irrevoluble(value) when is_nil(value), do: value
+  def encode_irrevoluble(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.irrevoluble"}
+
+  def decode_kindredship(value) when is_nil(value), do: value
+  def decode_kindredship(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.kindredship"}
+
+  def encode_kindredship(value) when is_nil(value), do: value
+  def encode_kindredship(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.kindredship"}
+
+  def decode_pinguitudinous(value) when is_nil(value), do: value
+  def decode_pinguitudinous(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.pinguitudinous"}
+
+  def encode_pinguitudinous(value) when is_nil(value), do: value
+  def encode_pinguitudinous(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.pinguitudinous"}
+
+  def decode_simpletonic(value) when is_nil(value), do: value
+  def decode_simpletonic(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.simpletonic"}
+
+  def encode_simpletonic(value) when is_nil(value), do: value
+  def encode_simpletonic(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.simpletonic"}
+
+  def decode_singsong(value) when is_nil(value), do: value
+  def decode_singsong(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.singsong"}
+
+  def encode_singsong(value) when is_nil(value), do: value
+  def encode_singsong(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.singsong"}
+
+  def decode_submergement(value) when is_nil(value), do: value
+  def decode_submergement(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.submergement"}
+
+  def encode_submergement(value) when is_nil(value), do: value
+  def encode_submergement(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.submergement"}
+
+  def decode_supraoesophagal(value) when is_nil(value), do: value
+  def decode_supraoesophagal(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.supraoesophagal"}
+
+  def encode_supraoesophagal(value) when is_nil(value), do: value
+  def encode_supraoesophagal(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.supraoesophagal"}
+
+  def decode_thrashel(value) when is_nil(value), do: value
+  def decode_thrashel(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.thrashel"}
+
+  def encode_thrashel(value) when is_nil(value), do: value
+  def encode_thrashel(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.thrashel"}
+
+  def decode_tyremesis(value) when is_nil(value), do: value
+  def decode_tyremesis(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.tyremesis"}
+
+  def encode_tyremesis(value) when is_nil(value), do: value
+  def encode_tyremesis(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.tyremesis"}
+
+  def decode_yoruba(value) when is_nil(value), do: value
+  def decode_yoruba(_), do: {:error, "Unexpected type when decoding PotwhiskyClass.yoruba"}
+
+  def encode_yoruba(value) when is_nil(value), do: value
+  def encode_yoruba(_), do: {:error, "Unexpected type when encoding PotwhiskyClass.yoruba"}
+
   def from_map(m) do
     %PotwhiskyClass{
-      arciform: m["arciform"],
-      cresolin: m["cresolin"],
-      disheartener: m["disheartener"],
-      disproportionable: m["disproportionable"],
-      euchorda: m["Euchorda"],
-      ferryway: m["ferryway"],
-      filamentiferous: m["filamentiferous"],
-      flemish: m["flemish"],
-      forgainst: m["forgainst"],
-      grainering: m["grainering"],
-      irrevoluble: m["irrevoluble"],
-      kindredship: m["kindredship"],
-      pinguitudinous: m["pinguitudinous"],
-      simpletonic: m["simpletonic"],
-      singsong: m["singsong"],
-      submergement: m["submergement"],
-      supraoesophagal: m["supraoesophagal"],
-      thrashel: m["thrashel"],
-      tyremesis: m["tyremesis"],
-      yoruba: m["Yoruba"],
+      arciform: decode_arciform(m["arciform"]),
+      cresolin: decode_cresolin(m["cresolin"]),
+      disheartener: decode_disheartener(m["disheartener"]),
+      disproportionable: decode_disproportionable(m["disproportionable"]),
+      euchorda: decode_euchorda(m["Euchorda"]),
+      ferryway: decode_ferryway(m["ferryway"]),
+      filamentiferous: decode_filamentiferous(m["filamentiferous"]),
+      flemish: decode_flemish(m["flemish"]),
+      forgainst: decode_forgainst(m["forgainst"]),
+      grainering: decode_grainering(m["grainering"]),
+      irrevoluble: decode_irrevoluble(m["irrevoluble"]),
+      kindredship: decode_kindredship(m["kindredship"]),
+      pinguitudinous: decode_pinguitudinous(m["pinguitudinous"]),
+      simpletonic: decode_simpletonic(m["simpletonic"]),
+      singsong: decode_singsong(m["singsong"]),
+      submergement: decode_submergement(m["submergement"]),
+      supraoesophagal: decode_supraoesophagal(m["supraoesophagal"]),
+      thrashel: decode_thrashel(m["thrashel"]),
+      tyremesis: decode_tyremesis(m["tyremesis"]),
+      yoruba: decode_yoruba(m["Yoruba"]),
     }
   end
 
@@ -1242,28 +2026,148 @@ defmodule PrefreshmanClass do
           underward: nil
         }
 
+  def decode_azorubine(value) when is_nil(value), do: value
+  def decode_azorubine(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.azorubine"}
+
+  def encode_azorubine(value) when is_nil(value), do: value
+  def encode_azorubine(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.azorubine"}
+
+  def decode_choroiditis(value) when is_nil(value), do: value
+  def decode_choroiditis(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.choroiditis"}
+
+  def encode_choroiditis(value) when is_nil(value), do: value
+  def encode_choroiditis(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.choroiditis"}
+
+  def decode_coagulatory(value) when is_nil(value), do: value
+  def decode_coagulatory(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.coagulatory"}
+
+  def encode_coagulatory(value) when is_nil(value), do: value
+  def encode_coagulatory(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.coagulatory"}
+
+  def decode_cyclorama(value) when is_nil(value), do: value
+  def decode_cyclorama(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.cyclorama"}
+
+  def encode_cyclorama(value) when is_nil(value), do: value
+  def encode_cyclorama(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.cyclorama"}
+
+  def decode_dolphus(value) when is_nil(value), do: value
+  def decode_dolphus(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.dolphus"}
+
+  def encode_dolphus(value) when is_nil(value), do: value
+  def encode_dolphus(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.dolphus"}
+
+  def decode_duckhearted(value) when is_nil(value), do: value
+  def decode_duckhearted(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.duckhearted"}
+
+  def encode_duckhearted(value) when is_nil(value), do: value
+  def encode_duckhearted(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.duckhearted"}
+
+  def decode_ficus(value) when is_nil(value), do: value
+  def decode_ficus(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.ficus"}
+
+  def encode_ficus(value) when is_nil(value), do: value
+  def encode_ficus(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.ficus"}
+
+  def decode_gemaric(value) when is_nil(value), do: value
+  def decode_gemaric(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.gemaric"}
+
+  def encode_gemaric(value) when is_nil(value), do: value
+  def encode_gemaric(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.gemaric"}
+
+  def decode_jugation(value) when is_nil(value), do: value
+  def decode_jugation(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.jugation"}
+
+  def encode_jugation(value) when is_nil(value), do: value
+  def encode_jugation(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.jugation"}
+
+  def decode_myoliposis(value) when is_nil(value), do: value
+  def decode_myoliposis(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.myoliposis"}
+
+  def encode_myoliposis(value) when is_nil(value), do: value
+  def encode_myoliposis(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.myoliposis"}
+
+  def decode_nonnomination(value) when is_nil(value), do: value
+  def decode_nonnomination(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.nonnomination"}
+
+  def encode_nonnomination(value) when is_nil(value), do: value
+  def encode_nonnomination(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.nonnomination"}
+
+  def decode_palay(value) when is_nil(value), do: value
+  def decode_palay(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.palay"}
+
+  def encode_palay(value) when is_nil(value), do: value
+  def encode_palay(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.palay"}
+
+  def decode_pentactinal(value) when is_nil(value), do: value
+  def decode_pentactinal(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.pentactinal"}
+
+  def encode_pentactinal(value) when is_nil(value), do: value
+  def encode_pentactinal(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.pentactinal"}
+
+  def decode_phaet(value) when is_nil(value), do: value
+  def decode_phaet(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.phaet"}
+
+  def encode_phaet(value) when is_nil(value), do: value
+  def encode_phaet(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.phaet"}
+
+  def decode_piquant(value) when is_nil(value), do: value
+  def decode_piquant(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.piquant"}
+
+  def encode_piquant(value) when is_nil(value), do: value
+  def encode_piquant(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.piquant"}
+
+  def decode_registration(value) when is_nil(value), do: value
+  def decode_registration(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.registration"}
+
+  def encode_registration(value) when is_nil(value), do: value
+  def encode_registration(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.registration"}
+
+  def decode_remancipation(value) when is_nil(value), do: value
+  def decode_remancipation(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.remancipation"}
+
+  def encode_remancipation(value) when is_nil(value), do: value
+  def encode_remancipation(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.remancipation"}
+
+  def decode_scutatiform(value) when is_nil(value), do: value
+  def decode_scutatiform(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.scutatiform"}
+
+  def encode_scutatiform(value) when is_nil(value), do: value
+  def encode_scutatiform(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.scutatiform"}
+
+  def decode_theodolite(value) when is_nil(value), do: value
+  def decode_theodolite(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.theodolite"}
+
+  def encode_theodolite(value) when is_nil(value), do: value
+  def encode_theodolite(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.theodolite"}
+
+  def decode_underward(value) when is_nil(value), do: value
+  def decode_underward(_), do: {:error, "Unexpected type when decoding PrefreshmanClass.underward"}
+
+  def encode_underward(value) when is_nil(value), do: value
+  def encode_underward(_), do: {:error, "Unexpected type when encoding PrefreshmanClass.underward"}
+
   def from_map(m) do
     %PrefreshmanClass{
-      azorubine: m["azorubine"],
-      choroiditis: m["choroiditis"],
-      coagulatory: m["coagulatory"],
-      cyclorama: m["cyclorama"],
-      dolphus: m["Dolphus"],
-      duckhearted: m["duckhearted"],
-      ficus: m["Ficus"],
-      gemaric: m["Gemaric"],
-      jugation: m["jugation"],
-      myoliposis: m["myoliposis"],
-      nonnomination: m["nonnomination"],
-      palay: m["palay"],
-      pentactinal: m["pentactinal"],
-      phaet: m["Phaet"],
-      piquant: m["piquant"],
-      registration: m["registration"],
-      remancipation: m["remancipation"],
-      scutatiform: m["scutatiform"],
-      theodolite: m["theodolite"],
-      underward: m["underward"],
+      azorubine: decode_azorubine(m["azorubine"]),
+      choroiditis: decode_choroiditis(m["choroiditis"]),
+      coagulatory: decode_coagulatory(m["coagulatory"]),
+      cyclorama: decode_cyclorama(m["cyclorama"]),
+      dolphus: decode_dolphus(m["Dolphus"]),
+      duckhearted: decode_duckhearted(m["duckhearted"]),
+      ficus: decode_ficus(m["Ficus"]),
+      gemaric: decode_gemaric(m["Gemaric"]),
+      jugation: decode_jugation(m["jugation"]),
+      myoliposis: decode_myoliposis(m["myoliposis"]),
+      nonnomination: decode_nonnomination(m["nonnomination"]),
+      palay: decode_palay(m["palay"]),
+      pentactinal: decode_pentactinal(m["pentactinal"]),
+      phaet: decode_phaet(m["Phaet"]),
+      piquant: decode_piquant(m["piquant"]),
+      registration: decode_registration(m["registration"]),
+      remancipation: decode_remancipation(m["remancipation"]),
+      scutatiform: decode_scutatiform(m["scutatiform"]),
+      theodolite: decode_theodolite(m["theodolite"]),
+      underward: decode_underward(m["underward"]),
     }
   end
 
@@ -1354,6 +2258,12 @@ defmodule TopLevel do
           protext: [[integer()] | boolean() | MonaziteClass.t()]
         }
 
+  def decode_juror(value) when is_list(value), do: value
+  def decode_juror(_), do: {:error, "Unexpected type when decoding TopLevel.juror"}
+
+  def encode_juror(value) when is_list(value), do: value
+  def encode_juror(_), do: {:error, "Unexpected type when encoding TopLevel.juror"}
+
   def decode_juror_element(%{"adipsy" => _,"auxiliator" => _,"benda" => _,"benjamin" => _,"brandling" => _,"epicurishly" => _,"eremochaetous" => _,"marten" => _,"monocline" => _,"Olea" => _,"palgat" => _,"pennyworth" => _,"pioury" => _,"pragmatistic" => _,"stylelessness" => _,"systematical" => _,"thready" => _,"uncontemporary" => _,"uncouched" => _,"uninhabitedness" => _,} = value), do: JurorClass.from_map(value)
   def decode_juror_element(value) when is_boolean(value), do: value
   def decode_juror_element(_), do: {:error, "Unexpected type when decoding TopLevel.juror"}
@@ -1362,6 +2272,12 @@ defmodule TopLevel do
   def encode_juror_element(value) when is_boolean(value), do: value
   def encode_juror_element(_), do: {:error, "Unexpected type when encoding TopLevel.juror"}
 
+  def decode_kongoni(value) when is_list(value), do: value
+  def decode_kongoni(_), do: {:error, "Unexpected type when decoding TopLevel.kongoni"}
+
+  def encode_kongoni(value) when is_list(value), do: value
+  def encode_kongoni(_), do: {:error, "Unexpected type when encoding TopLevel.kongoni"}
+
   def decode_kongoni_element(value) when is_list(value), do: value
   def decode_kongoni_element(value) when is_map(value), do: value
   def decode_kongoni_element(_), do: {:error, "Unexpected type when decoding TopLevel.kongoni"}
@@ -1370,6 +2286,12 @@ defmodule TopLevel do
   def encode_kongoni_element(value) when is_map(value), do: value
   def encode_kongoni_element(_), do: {:error, "Unexpected type when encoding TopLevel.kongoni"}
 
+  def decode_ladronism(value) when is_list(value), do: value
+  def decode_ladronism(_), do: {:error, "Unexpected type when decoding TopLevel.ladronism"}
+
+  def encode_ladronism(value) when is_list(value), do: value
+  def encode_ladronism(_), do: {:error, "Unexpected type when encoding TopLevel.ladronism"}
+
   def decode_ladronism_element(%{"acclaimer" => _,"achree" => _,"base" => _,"conundrumize" => _,"degerminator" => _,"describable" => _,"exasperatedly" => _,"heroine" => _,"indazin" => _,"luteous" => _,"papular" => _,"pritch" => _,"Prodenia" => _,"seege" => _,"shopgirl" => _,"tragedietta" => _,"unsparse" => _,"uplook" => _,"vermiformis" => _,"whafabout" => _,} = value), do: LadronismClass.from_map(value)
   def decode_ladronism_element(value) when is_float(value), do: value
   def decode_ladronism_element(value) when is_integer(value), do: value
@@ -1382,6 +2304,12 @@ defmodule TopLevel do
   def encode_ladronism_element(value) when is_binary(value), do: value
   def encode_ladronism_element(_), do: {:error, "Unexpected type when encoding TopLevel.ladronism"}
 
+  def decode_landlubberly(value) when is_list(value), do: value
+  def decode_landlubberly(_), do: {:error, "Unexpected type when decoding TopLevel.landlubberly"}
+
+  def encode_landlubberly(value) when is_list(value), do: value
+  def encode_landlubberly(_), do: {:error, "Unexpected type when encoding TopLevel.landlubberly"}
+
   def decode_landlubberly_element(%{"acropoleis" => _,"aminate" => _,"Amyraldism" => _,"bipenniform" => _,"bugre" => _,"calycule" => _,"caoutchouc" => _,"disprover" => _,"fitroot" => _,"fulgently" => _,"kickup" => _,"laevoversion" => _,"moter" => _,"objectivity" => _,"posterity" => _,"postnuptial" => _,"precedentary" => _,"saddling" => _,"subcurrent" => _,"unrecriminative" => _,} = value), do: LandlubberlyClass.from_map(value)
   def decode_landlubberly_element(value) when is_boolean(value), do: value
   def decode_landlubberly_element(value) when is_integer(value), do: value
@@ -1392,6 +2320,12 @@ defmodule TopLevel do
   def encode_landlubberly_element(value) when is_integer(value), do: value
   def encode_landlubberly_element(_), do: {:error, "Unexpected type when encoding TopLevel.landlubberly"}
 
+  def decode_listener(value) when is_list(value), do: value
+  def decode_listener(_), do: {:error, "Unexpected type when decoding TopLevel.listener"}
+
+  def encode_listener(value) when is_list(value), do: value
+  def encode_listener(_), do: {:error, "Unexpected type when encoding TopLevel.listener"}
+
   def decode_listener_element(value) when is_integer(value), do: value
   def decode_listener_element(value) when is_list(value), do: value
   def decode_listener_element(_), do: {:error, "Unexpected type when decoding TopLevel.listener"}
@@ -1400,6 +2334,12 @@ defmodule TopLevel do
   def encode_listener_element(value) when is_list(value), do: value
   def encode_listener_element(_), do: {:error, "Unexpected type when encoding TopLevel.listener"}
 
+  def decode_lupus(value) when is_list(value), do: value
+  def decode_lupus(_), do: {:error, "Unexpected type when decoding TopLevel.lupus"}
+
+  def encode_lupus(value) when is_list(value), do: value
+  def encode_lupus(_), do: {:error, "Unexpected type when encoding TopLevel.lupus"}
+
   def decode_lupus_element(%{} = value), do: LupusClass.from_map(value)
   def decode_lupus_element(value) when is_integer(value), do: value
   def decode_lupus_element(_), do: {:error, "Unexpected type when decoding TopLevel.lupus"}
@@ -1408,6 +2348,18 @@ defmodule TopLevel do
   def encode_lupus_element(value) when is_integer(value), do: value
   def encode_lupus_element(_), do: {:error, "Unexpected type when encoding TopLevel.lupus"}
 
+  def decode_maslin(value) when is_list(value), do: value
+  def decode_maslin(_), do: {:error, "Unexpected type when decoding TopLevel.maslin"}
+
+  def encode_maslin(value) when is_list(value), do: value
+  def encode_maslin(_), do: {:error, "Unexpected type when encoding TopLevel.maslin"}
+
+  def decode_monazite(value) when is_list(value), do: value
+  def decode_monazite(_), do: {:error, "Unexpected type when decoding TopLevel.monazite"}
+
+  def encode_monazite(value) when is_list(value), do: value
+  def encode_monazite(_), do: {:error, "Unexpected type when encoding TopLevel.monazite"}
+
   def decode_monazite_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: MonaziteClass.from_map(value)
   def decode_monazite_element(value) when is_float(value), do: value
   def decode_monazite_element(value) when is_integer(value), do: value
@@ -1418,6 +2370,12 @@ defmodule TopLevel do
   def encode_monazite_element(value) when is_integer(value), do: value
   def encode_monazite_element(_), do: {:error, "Unexpected type when encoding TopLevel.monazite"}
 
+  def decode_monoliteral(value) when is_list(value), do: value
+  def decode_monoliteral(_), do: {:error, "Unexpected type when decoding TopLevel.monoliteral"}
+
+  def encode_monoliteral(value) when is_list(value), do: value
+  def encode_monoliteral(_), do: {:error, "Unexpected type when encoding TopLevel.monoliteral"}
+
   def decode_monoliteral_element(value) when is_boolean(value), do: value
   def decode_monoliteral_element(value) when is_list(value), do: value
   def decode_monoliteral_element(_), do: {:error, "Unexpected type when decoding TopLevel.monoliteral"}
@@ -1426,6 +2384,12 @@ defmodule TopLevel do
   def encode_monoliteral_element(value) when is_list(value), do: value
   def encode_monoliteral_element(_), do: {:error, "Unexpected type when encoding TopLevel.monoliteral"}
 
+  def decode_monotheistically(value) when is_list(value), do: value
+  def decode_monotheistically(_), do: {:error, "Unexpected type when decoding TopLevel.monotheistically"}
+
+  def encode_monotheistically(value) when is_list(value), do: value
+  def encode_monotheistically(_), do: {:error, "Unexpected type when encoding TopLevel.monotheistically"}
+
   def decode_monotheistically_element(%{} = value), do: MonotheisticallyClass.from_map(value)
   def decode_monotheistically_element(value) when is_list(value), do: value
   def decode_monotheistically_element(_), do: {:error, "Unexpected type when decoding TopLevel.monotheistically"}
@@ -1434,6 +2398,12 @@ defmodule TopLevel do
   def encode_monotheistically_element(value) when is_list(value), do: value
   def encode_monotheistically_element(_), do: {:error, "Unexpected type when encoding TopLevel.monotheistically"}
 
+  def decode_montage(value) when is_list(value), do: value
+  def decode_montage(_), do: {:error, "Unexpected type when decoding TopLevel.montage"}
+
+  def encode_montage(value) when is_list(value), do: value
+  def encode_montage(_), do: {:error, "Unexpected type when encoding TopLevel.montage"}
+
   def decode_montage_element(value) when is_float(value), do: value
   def decode_montage_element(value) when is_integer(value), do: value
   def decode_montage_element(value) when is_binary(value), do: value
@@ -1446,6 +2416,12 @@ defmodule TopLevel do
   def encode_montage_element(value) when is_list(value), do: value
   def encode_montage_element(_), do: {:error, "Unexpected type when encoding TopLevel.montage"}
 
+  def decode_moralness(value) when is_list(value), do: value
+  def decode_moralness(_), do: {:error, "Unexpected type when decoding TopLevel.moralness"}
+
+  def encode_moralness(value) when is_list(value), do: value
+  def encode_moralness(_), do: {:error, "Unexpected type when encoding TopLevel.moralness"}
+
   def decode_moralness_element(value) when is_float(value), do: value
   def decode_moralness_element(value) when is_integer(value), do: value
   def decode_moralness_element(value) when is_nil(value), do: value
@@ -1458,6 +2434,12 @@ defmodule TopLevel do
   def encode_moralness_element(value) when is_list(value), do: value
   def encode_moralness_element(_), do: {:error, "Unexpected type when encoding TopLevel.moralness"}
 
+  def decode_mowra(value) when is_list(value), do: value
+  def decode_mowra(_), do: {:error, "Unexpected type when decoding TopLevel.mowra"}
+
+  def encode_mowra(value) when is_list(value), do: value
+  def encode_mowra(_), do: {:error, "Unexpected type when encoding TopLevel.mowra"}
+
   def decode_mowra_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: MonaziteClass.from_map(value)
   def decode_mowra_element(value) when is_nil(value), do: value
   def decode_mowra_element(_), do: {:error, "Unexpected type when decoding TopLevel.mowra"}
@@ -1466,6 +2448,12 @@ defmodule TopLevel do
   def encode_mowra_element(value) when is_nil(value), do: value
   def encode_mowra_element(_), do: {:error, "Unexpected type when encoding TopLevel.mowra"}
 
+  def decode_mulishly(value) when is_list(value), do: value
+  def decode_mulishly(_), do: {:error, "Unexpected type when decoding TopLevel.mulishly"}
+
+  def encode_mulishly(value) when is_list(value), do: value
+  def encode_mulishly(_), do: {:error, "Unexpected type when encoding TopLevel.mulishly"}
+
   def decode_mulishly_element(value) when is_float(value), do: value
   def decode_mulishly_element(value) when is_integer(value), do: value
   def decode_mulishly_element(value) when is_nil(value), do: value
@@ -1478,6 +2466,12 @@ defmodule TopLevel do
   def encode_mulishly_element(value) when is_list(value), do: value
   def encode_mulishly_element(_), do: {:error, "Unexpected type when encoding TopLevel.mulishly"}
 
+  def decode_myoscope(value) when is_list(value), do: value
+  def decode_myoscope(_), do: {:error, "Unexpected type when decoding TopLevel.myoscope"}
+
+  def encode_myoscope(value) when is_list(value), do: value
+  def encode_myoscope(_), do: {:error, "Unexpected type when encoding TopLevel.myoscope"}
+
   def decode_myoscope_element(value) when is_boolean(value), do: value
   def decode_myoscope_element(value) when is_integer(value), do: value
   def decode_myoscope_element(value) when is_list(value), do: value
@@ -1488,6 +2482,12 @@ defmodule TopLevel do
   def encode_myoscope_element(value) when is_list(value), do: value
   def encode_myoscope_element(_), do: {:error, "Unexpected type when encoding TopLevel.myoscope"}
 
+  def decode_nach(value) when is_list(value), do: value
+  def decode_nach(_), do: {:error, "Unexpected type when decoding TopLevel.nach"}
+
+  def encode_nach(value) when is_list(value), do: value
+  def encode_nach(_), do: {:error, "Unexpected type when encoding TopLevel.nach"}
+
   def decode_nach_element(value) when is_nil(value), do: value
   def decode_nach_element(value) when is_list(value), do: value
   def decode_nach_element(_), do: {:error, "Unexpected type when decoding TopLevel.nach"}
@@ -1496,6 +2496,12 @@ defmodule TopLevel do
   def encode_nach_element(value) when is_list(value), do: value
   def encode_nach_element(_), do: {:error, "Unexpected type when encoding TopLevel.nach"}
 
+  def decode_neuromastic(value) when is_list(value), do: value
+  def decode_neuromastic(_), do: {:error, "Unexpected type when decoding TopLevel.neuromastic"}
+
+  def encode_neuromastic(value) when is_list(value), do: value
+  def encode_neuromastic(_), do: {:error, "Unexpected type when encoding TopLevel.neuromastic"}
+
   def decode_neuromastic_element(value) when is_float(value), do: value
   def decode_neuromastic_element(value) when is_integer(value), do: value
   def decode_neuromastic_element(value) when is_list(value), do: value
@@ -1506,6 +2512,18 @@ defmodule TopLevel do
   def encode_neuromastic_element(value) when is_list(value), do: value
   def encode_neuromastic_element(_), do: {:error, "Unexpected type when encoding TopLevel.neuromastic"}
 
+  def decode_noncontributing(value) when is_list(value), do: value
+  def decode_noncontributing(_), do: {:error, "Unexpected type when decoding TopLevel.noncontributing"}
+
+  def encode_noncontributing(value) when is_list(value), do: value
+  def encode_noncontributing(_), do: {:error, "Unexpected type when encoding TopLevel.noncontributing"}
+
+  def decode_nonnervous(value) when is_list(value), do: value
+  def decode_nonnervous(_), do: {:error, "Unexpected type when decoding TopLevel.nonnervous"}
+
+  def encode_nonnervous(value) when is_list(value), do: value
+  def encode_nonnervous(_), do: {:error, "Unexpected type when encoding TopLevel.nonnervous"}
+
   def decode_nonnervous_element(value) when is_boolean(value), do: value
   def decode_nonnervous_element(value) when is_integer(value), do: value
   def decode_nonnervous_element(_), do: {:error, "Unexpected type when decoding TopLevel.nonnervous"}
@@ -1514,6 +2532,12 @@ defmodule TopLevel do
   def encode_nonnervous_element(value) when is_integer(value), do: value
   def encode_nonnervous_element(_), do: {:error, "Unexpected type when encoding TopLevel.nonnervous"}
 
+  def decode_nonvaluation(value) when is_list(value), do: value
+  def decode_nonvaluation(_), do: {:error, "Unexpected type when decoding TopLevel.nonvaluation"}
+
+  def encode_nonvaluation(value) when is_list(value), do: value
+  def encode_nonvaluation(_), do: {:error, "Unexpected type when encoding TopLevel.nonvaluation"}
+
   def decode_nonvaluation_element(value) when is_boolean(value), do: value
   def decode_nonvaluation_element(value) when is_float(value), do: value
   def decode_nonvaluation_element(value) when is_integer(value), do: value
@@ -1526,6 +2550,12 @@ defmodule TopLevel do
   def encode_nonvaluation_element(value) when is_list(value), do: value
   def encode_nonvaluation_element(_), do: {:error, "Unexpected type when encoding TopLevel.nonvaluation"}
 
+  def decode_occupationalist(value) when is_list(value), do: value
+  def decode_occupationalist(_), do: {:error, "Unexpected type when decoding TopLevel.occupationalist"}
+
+  def encode_occupationalist(value) when is_list(value), do: value
+  def encode_occupationalist(_), do: {:error, "Unexpected type when encoding TopLevel.occupationalist"}
+
   def decode_occupationalist_element(%{"beholdable" => _,"brotuliform" => _,"Chimakum" => _,"doodler" => _,"emulsin" => _,"Fin" => _,"flourishing" => _,"flueless" => _,"furtively" => _,"gritter" => _,"interwish" => _,"monoxylic" => _,"myristic" => _,"nightwear" => _,"peruser" => _,"theoastrological" => _,"thumby" => _,"tingitid" => _,"trailless" => _,"unpocketed" => _,} = value), do: OccupationalistClass.from_map(value)
   def decode_occupationalist_element(value) when is_nil(value), do: value
   def decode_occupationalist_element(value) when is_list(value), do: value
@@ -1536,6 +2566,12 @@ defmodule TopLevel do
   def encode_occupationalist_element(value) when is_list(value), do: value
   def encode_occupationalist_element(_), do: {:error, "Unexpected type when encoding TopLevel.occupationalist"}
 
+  def decode_outrival(value) when is_list(value), do: value
+  def decode_outrival(_), do: {:error, "Unexpected type when decoding TopLevel.outrival"}
+
+  def encode_outrival(value) when is_list(value), do: value
+  def encode_outrival(_), do: {:error, "Unexpected type when encoding TopLevel.outrival"}
+
   def decode_outrival_element(%{"adroitly" => _,"bridehood" => _,"Castoroides" => _,"Czechoslovak" => _,"diagenesis" => _,"dihexahedron" => _,"dopester" => _,"eumerism" => _,"flyness" => _,"fouler" => _,"laudanosine" => _,"Lingulidae" => _,"minutary" => _,"mitra" => _,"opisthorchiasis" => _,"pensively" => _,"pubigerous" => _,"rebellious" => _,"recodify" => _,"unpaced" => _,} = value), do: OutrivalClass.from_map(value)
   def decode_outrival_element(value) when is_float(value), do: value
   def decode_outrival_element(value) when is_integer(value), do: value
@@ -1548,6 +2584,12 @@ defmodule TopLevel do
   def encode_outrival_element(value) when is_nil(value), do: value
   def encode_outrival_element(_), do: {:error, "Unexpected type when encoding TopLevel.outrival"}
 
+  def decode_paleographically(value) when is_list(value), do: value
+  def decode_paleographically(_), do: {:error, "Unexpected type when decoding TopLevel.paleographically"}
+
+  def encode_paleographically(value) when is_list(value), do: value
+  def encode_paleographically(_), do: {:error, "Unexpected type when encoding TopLevel.paleographically"}
+
   def decode_paleographically_element(value) when is_float(value), do: value
   def decode_paleographically_element(value) when is_integer(value), do: value
   def decode_paleographically_element(value) when is_map(value), do: value
@@ -1558,6 +2600,12 @@ defmodule TopLevel do
   def encode_paleographically_element(value) when is_map(value), do: value
   def encode_paleographically_element(_), do: {:error, "Unexpected type when encoding TopLevel.paleographically"}
 
+  def decode_pamphletwise(value) when is_list(value), do: value
+  def decode_pamphletwise(_), do: {:error, "Unexpected type when decoding TopLevel.pamphletwise"}
+
+  def encode_pamphletwise(value) when is_list(value), do: value
+  def encode_pamphletwise(_), do: {:error, "Unexpected type when encoding TopLevel.pamphletwise"}
+
   def decode_pamphletwise_element(value) when is_integer(value), do: value
   def decode_pamphletwise_element(value) when is_binary(value), do: value
   def decode_pamphletwise_element(value) when is_map(value), do: value
@@ -1568,6 +2616,12 @@ defmodule TopLevel do
   def encode_pamphletwise_element(value) when is_map(value), do: value
   def encode_pamphletwise_element(_), do: {:error, "Unexpected type when encoding TopLevel.pamphletwise"}
 
+  def decode_pediatrics(value) when is_list(value), do: value
+  def decode_pediatrics(_), do: {:error, "Unexpected type when decoding TopLevel.pediatrics"}
+
+  def encode_pediatrics(value) when is_list(value), do: value
+  def encode_pediatrics(_), do: {:error, "Unexpected type when encoding TopLevel.pediatrics"}
+
   def decode_pediatrics_element(value) when is_boolean(value), do: value
   def decode_pediatrics_element(value) when is_float(value), do: value
   def decode_pediatrics_element(value) when is_integer(value), do: value
@@ -1580,6 +2634,18 @@ defmodule TopLevel do
   def encode_pediatrics_element(value) when is_nil(value), do: value
   def encode_pediatrics_element(_), do: {:error, "Unexpected type when encoding TopLevel.pediatrics"}
 
+  def decode_perceptive(value) when is_list(value), do: value
+  def decode_perceptive(_), do: {:error, "Unexpected type when decoding TopLevel.perceptive"}
+
+  def encode_perceptive(value) when is_list(value), do: value
+  def encode_perceptive(_), do: {:error, "Unexpected type when encoding TopLevel.perceptive"}
+
+  def decode_piaculum(value) when is_list(value), do: value
+  def decode_piaculum(_), do: {:error, "Unexpected type when decoding TopLevel.piaculum"}
+
+  def encode_piaculum(value) when is_list(value), do: value
+  def encode_piaculum(_), do: {:error, "Unexpected type when encoding TopLevel.piaculum"}
+
   def decode_piaculum_element(%{} = value), do: PiaculumClass.from_map(value)
   def decode_piaculum_element(value) when is_float(value), do: value
   def decode_piaculum_element(value) when is_integer(value), do: value
@@ -1590,6 +2656,12 @@ defmodule TopLevel do
   def encode_piaculum_element(value) when is_integer(value), do: value
   def encode_piaculum_element(_), do: {:error, "Unexpected type when encoding TopLevel.piaculum"}
 
+  def decode_piccadilly(value) when is_list(value), do: value
+  def decode_piccadilly(_), do: {:error, "Unexpected type when decoding TopLevel.piccadilly"}
+
+  def encode_piccadilly(value) when is_list(value), do: value
+  def encode_piccadilly(_), do: {:error, "Unexpected type when encoding TopLevel.piccadilly"}
+
   def decode_piccadilly_element(value) when is_float(value), do: value
   def decode_piccadilly_element(value) when is_integer(value), do: value
   def decode_piccadilly_element(value) when is_nil(value), do: value
@@ -1602,6 +2674,12 @@ defmodule TopLevel do
   def encode_piccadilly_element(value) when is_binary(value), do: value
   def encode_piccadilly_element(_), do: {:error, "Unexpected type when encoding TopLevel.piccadilly"}
 
+  def decode_piffler(value) when is_list(value), do: value
+  def decode_piffler(_), do: {:error, "Unexpected type when decoding TopLevel.piffler"}
+
+  def encode_piffler(value) when is_list(value), do: value
+  def encode_piffler(_), do: {:error, "Unexpected type when encoding TopLevel.piffler"}
+
   def decode_piffler_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: MonaziteClass.from_map(value)
   def decode_piffler_element(value) when is_list(value), do: value
   def decode_piffler_element(_), do: {:error, "Unexpected type when decoding TopLevel.piffler"}
@@ -1610,6 +2688,12 @@ defmodule TopLevel do
   def encode_piffler_element(value) when is_list(value), do: value
   def encode_piffler_element(_), do: {:error, "Unexpected type when encoding TopLevel.piffler"}
 
+  def decode_pithful(value) when is_list(value), do: value
+  def decode_pithful(_), do: {:error, "Unexpected type when decoding TopLevel.pithful"}
+
+  def encode_pithful(value) when is_list(value), do: value
+  def encode_pithful(_), do: {:error, "Unexpected type when encoding TopLevel.pithful"}
+
   def decode_pithful_element(value) when is_boolean(value), do: value
   def decode_pithful_element(value) when is_integer(value), do: value
   def decode_pithful_element(value) when is_nil(value), do: value
@@ -1620,6 +2704,12 @@ defmodule TopLevel do
   def encode_pithful_element(value) when is_nil(value), do: value
   def encode_pithful_element(_), do: {:error, "Unexpected type when encoding TopLevel.pithful"}
 
+  def decode_placuntitis(value) when is_list(value), do: value
+  def decode_placuntitis(_), do: {:error, "Unexpected type when decoding TopLevel.placuntitis"}
+
+  def encode_placuntitis(value) when is_list(value), do: value
+  def encode_placuntitis(_), do: {:error, "Unexpected type when encoding TopLevel.placuntitis"}
+
   def decode_placuntitis_element(value) when is_integer(value), do: value
   def decode_placuntitis_element(value) when is_map(value), do: value
   def decode_placuntitis_element(_), do: {:error, "Unexpected type when decoding TopLevel.placuntitis"}
@@ -1628,6 +2718,12 @@ defmodule TopLevel do
   def encode_placuntitis_element(value) when is_map(value), do: value
   def encode_placuntitis_element(_), do: {:error, "Unexpected type when encoding TopLevel.placuntitis"}
 
+  def decode_plectopterous(value) when is_list(value), do: value
+  def decode_plectopterous(_), do: {:error, "Unexpected type when decoding TopLevel.plectopterous"}
+
+  def encode_plectopterous(value) when is_list(value), do: value
+  def encode_plectopterous(_), do: {:error, "Unexpected type when encoding TopLevel.plectopterous"}
+
   def decode_plectopterous_element(value) when is_float(value), do: value
   def decode_plectopterous_element(value) when is_integer(value), do: value
   def decode_plectopterous_element(value) when is_map(value), do: value
@@ -1638,6 +2734,12 @@ defmodule TopLevel do
   def encode_plectopterous_element(value) when is_map(value), do: value
   def encode_plectopterous_element(_), do: {:error, "Unexpected type when encoding TopLevel.plectopterous"}
 
+  def decode_pneumocele(value) when is_list(value), do: value
+  def decode_pneumocele(_), do: {:error, "Unexpected type when decoding TopLevel.pneumocele"}
+
+  def encode_pneumocele(value) when is_list(value), do: value
+  def encode_pneumocele(_), do: {:error, "Unexpected type when encoding TopLevel.pneumocele"}
+
   def decode_pneumocele_element(%{} = value), do: Pneumocele.from_map(value)
   def decode_pneumocele_element(value) when is_nil(value), do: value
   def decode_pneumocele_element(_), do: {:error, "Unexpected type when decoding TopLevel.pneumocele"}
@@ -1646,6 +2748,12 @@ defmodule TopLevel do
   def encode_pneumocele_element(value) when is_nil(value), do: value
   def encode_pneumocele_element(_), do: {:error, "Unexpected type when encoding TopLevel.pneumocele"}
 
+  def decode_poliorcetic(value) when is_list(value), do: value
+  def decode_poliorcetic(_), do: {:error, "Unexpected type when decoding TopLevel.poliorcetic"}
+
+  def encode_poliorcetic(value) when is_list(value), do: value
+  def encode_poliorcetic(_), do: {:error, "Unexpected type when encoding TopLevel.poliorcetic"}
+
   def decode_poliorcetic_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: MonaziteClass.from_map(value)
   def decode_poliorcetic_element(value) when is_boolean(value), do: value
   def decode_poliorcetic_element(_), do: {:error, "Unexpected type when decoding TopLevel.poliorcetic"}
@@ -1654,6 +2762,12 @@ defmodule TopLevel do
   def encode_poliorcetic_element(value) when is_boolean(value), do: value
   def encode_poliorcetic_element(_), do: {:error, "Unexpected type when encoding TopLevel.poliorcetic"}
 
+  def decode_poormaster(value) when is_list(value), do: value
+  def decode_poormaster(_), do: {:error, "Unexpected type when decoding TopLevel.poormaster"}
+
+  def encode_poormaster(value) when is_list(value), do: value
+  def encode_poormaster(_), do: {:error, "Unexpected type when encoding TopLevel.poormaster"}
+
   def decode_poormaster_element(value) when is_nil(value), do: value
   def decode_poormaster_element(value) when is_list(value), do: value
   def decode_poormaster_element(value) when is_map(value), do: value
@@ -1664,6 +2778,12 @@ defmodule TopLevel do
   def encode_poormaster_element(value) when is_map(value), do: value
   def encode_poormaster_element(_), do: {:error, "Unexpected type when encoding TopLevel.poormaster"}
 
+  def decode_potwhisky(value) when is_list(value), do: value
+  def decode_potwhisky(_), do: {:error, "Unexpected type when decoding TopLevel.potwhisky"}
+
+  def encode_potwhisky(value) when is_list(value), do: value
+  def encode_potwhisky(_), do: {:error, "Unexpected type when encoding TopLevel.potwhisky"}
+
   def decode_potwhisky_element(%{"arciform" => _,"cresolin" => _,"disheartener" => _,"disproportionable" => _,"Euchorda" => _,"ferryway" => _,"filamentiferous" => _,"flemish" => _,"forgainst" => _,"grainering" => _,"irrevoluble" => _,"kindredship" => _,"pinguitudinous" => _,"simpletonic" => _,"singsong" => _,"submergement" => _,"supraoesophagal" => _,"thrashel" => _,"tyremesis" => _,"Yoruba" => _,} = value), do: PotwhiskyClass.from_map(value)
   def decode_potwhisky_element(value) when is_integer(value), do: value
   def decode_potwhisky_element(value) when is_nil(value), do: value
@@ -1674,6 +2794,12 @@ defmodule TopLevel do
   def encode_potwhisky_element(value) when is_nil(value), do: value
   def encode_potwhisky_element(_), do: {:error, "Unexpected type when encoding TopLevel.potwhisky"}
 
+  def decode_practicalizer(value) when is_list(value), do: value
+  def decode_practicalizer(_), do: {:error, "Unexpected type when decoding TopLevel.practicalizer"}
+
+  def encode_practicalizer(value) when is_list(value), do: value
+  def encode_practicalizer(_), do: {:error, "Unexpected type when encoding TopLevel.practicalizer"}
+
   def decode_practicalizer_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: MonaziteClass.from_map(value)
   def decode_practicalizer_element(value) when is_binary(value), do: value
   def decode_practicalizer_element(value) when is_list(value), do: value
@@ -1684,6 +2810,12 @@ defmodule TopLevel do
   def encode_practicalizer_element(value) when is_list(value), do: value
   def encode_practicalizer_element(_), do: {:error, "Unexpected type when encoding TopLevel.practicalizer"}
 
+  def decode_prefreshman(value) when is_list(value), do: value
+  def decode_prefreshman(_), do: {:error, "Unexpected type when decoding TopLevel.prefreshman"}
+
+  def encode_prefreshman(value) when is_list(value), do: value
+  def encode_prefreshman(_), do: {:error, "Unexpected type when encoding TopLevel.prefreshman"}
+
   def decode_prefreshman_element(%{"azorubine" => _,"choroiditis" => _,"coagulatory" => _,"cyclorama" => _,"Dolphus" => _,"duckhearted" => _,"Ficus" => _,"Gemaric" => _,"jugation" => _,"myoliposis" => _,"nonnomination" => _,"palay" => _,"pentactinal" => _,"Phaet" => _,"piquant" => _,"registration" => _,"remancipation" => _,"scutatiform" => _,"theodolite" => _,"underward" => _,} = value), do: PrefreshmanClass.from_map(value)
   def decode_prefreshman_element(value) when is_binary(value), do: value
   def decode_prefreshman_element(value) when is_list(value), do: value
@@ -1694,6 +2826,12 @@ defmodule TopLevel do
   def encode_prefreshman_element(value) when is_list(value), do: value
   def encode_prefreshman_element(_), do: {:error, "Unexpected type when encoding TopLevel.prefreshman"}
 
+  def decode_prehensility(value) when is_list(value), do: value
+  def decode_prehensility(_), do: {:error, "Unexpected type when decoding TopLevel.prehensility"}
+
+  def encode_prehensility(value) when is_list(value), do: value
+  def encode_prehensility(_), do: {:error, "Unexpected type when encoding TopLevel.prehensility"}
+
   def decode_prehensility_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: MonaziteClass.from_map(value)
   def decode_prehensility_element(value) when is_boolean(value), do: value
   def decode_prehensility_element(value) when is_list(value), do: value
@@ -1704,6 +2842,12 @@ defmodule TopLevel do
   def encode_prehensility_element(value) when is_list(value), do: value
   def encode_prehensility_element(_), do: {:error, "Unexpected type when encoding TopLevel.prehensility"}
 
+  def decode_prevoidance(value) when is_list(value), do: value
+  def decode_prevoidance(_), do: {:error, "Unexpected type when decoding TopLevel.prevoidance"}
+
+  def encode_prevoidance(value) when is_list(value), do: value
+  def encode_prevoidance(_), do: {:error, "Unexpected type when encoding TopLevel.prevoidance"}
+
   def decode_prevoidance_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: MonaziteClass.from_map(value)
   def decode_prevoidance_element(value) when is_integer(value), do: value
   def decode_prevoidance_element(value) when is_list(value), do: value
@@ -1714,6 +2858,18 @@ defmodule TopLevel do
   def encode_prevoidance_element(value) when is_list(value), do: value
   def encode_prevoidance_element(_), do: {:error, "Unexpected type when encoding TopLevel.prevoidance"}
 
+  def decode_probant(value) when is_list(value), do: value
+  def decode_probant(_), do: {:error, "Unexpected type when decoding TopLevel.probant"}
+
+  def encode_probant(value) when is_list(value), do: value
+  def encode_probant(_), do: {:error, "Unexpected type when encoding TopLevel.probant"}
+
+  def decode_protext(value) when is_list(value), do: value
+  def decode_protext(_), do: {:error, "Unexpected type when decoding TopLevel.protext"}
+
+  def encode_protext(value) when is_list(value), do: value
+  def encode_protext(_), do: {:error, "Unexpected type when encoding TopLevel.protext"}
+
   def decode_protext_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: MonaziteClass.from_map(value)
   def decode_protext_element(value) when is_boolean(value), do: value
   def decode_protext_element(value) when is_list(value), do: value
@@ -1751,7 +2907,7 @@ defmodule TopLevel do
       paleographically: Enum.map(m["paleographically"], &decode_paleographically_element/1),
       pamphletwise: Enum.map(m["pamphletwise"], &decode_pamphletwise_element/1),
       pediatrics: Enum.map(m["pediatrics"], &decode_pediatrics_element/1),
-      perceptive: m["perceptive"],
+      perceptive: decode_perceptive(m["perceptive"]),
       piaculum: Enum.map(m["piaculum"], &decode_piaculum_element/1),
       piccadilly: Enum.map(m["piccadilly"], &decode_piccadilly_element/1),
       piffler: Enum.map(m["piffler"], &decode_piffler_element/1),
@@ -1766,7 +2922,7 @@ defmodule TopLevel do
       prefreshman: Enum.map(m["prefreshman"], &decode_prefreshman_element/1),
       prehensility: Enum.map(m["prehensility"], &decode_prehensility_element/1),
       prevoidance: Enum.map(m["prevoidance"], &decode_prevoidance_element/1),
-      probant: m["probant"],
+      probant: decode_probant(m["probant"]),
       protext: Enum.map(m["protext"], &decode_protext_element/1),
     }
   end
diff --git a/base/elixir/test/inputs/json/priority/combinations4.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/combinations4.json/default/QuickType.ex
index d79ec65..7c031fc 100644
--- a/base/elixir/test/inputs/json/priority/combinations4.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/combinations4.json/default/QuickType.ex
@@ -32,28 +32,148 @@ defmodule PulpitismClass do
           underburn: nil
         }
 
+  def decode_abnet(value) when is_nil(value), do: value
+  def decode_abnet(_), do: {:error, "Unexpected type when decoding PulpitismClass.abnet"}
+
+  def encode_abnet(value) when is_nil(value), do: value
+  def encode_abnet(_), do: {:error, "Unexpected type when encoding PulpitismClass.abnet"}
+
+  def decode_buckhorn(value) when is_nil(value), do: value
+  def decode_buckhorn(_), do: {:error, "Unexpected type when decoding PulpitismClass.buckhorn"}
+
+  def encode_buckhorn(value) when is_nil(value), do: value
+  def encode_buckhorn(_), do: {:error, "Unexpected type when encoding PulpitismClass.buckhorn"}
+
+  def decode_calciform(value) when is_nil(value), do: value
+  def decode_calciform(_), do: {:error, "Unexpected type when decoding PulpitismClass.calciform"}
+
+  def encode_calciform(value) when is_nil(value), do: value
+  def encode_calciform(_), do: {:error, "Unexpected type when encoding PulpitismClass.calciform"}
+
+  def decode_chelophore(value) when is_nil(value), do: value
+  def decode_chelophore(_), do: {:error, "Unexpected type when decoding PulpitismClass.chelophore"}
+
+  def encode_chelophore(value) when is_nil(value), do: value
+  def encode_chelophore(_), do: {:error, "Unexpected type when encoding PulpitismClass.chelophore"}
+
+  def decode_cogitation(value) when is_nil(value), do: value
+  def decode_cogitation(_), do: {:error, "Unexpected type when decoding PulpitismClass.cogitation"}
+
+  def encode_cogitation(value) when is_nil(value), do: value
+  def encode_cogitation(_), do: {:error, "Unexpected type when encoding PulpitismClass.cogitation"}
+
+  def decode_decreeable(value) when is_nil(value), do: value
+  def decode_decreeable(_), do: {:error, "Unexpected type when decoding PulpitismClass.decreeable"}
+
+  def encode_decreeable(value) when is_nil(value), do: value
+  def encode_decreeable(_), do: {:error, "Unexpected type when encoding PulpitismClass.decreeable"}
+
+  def decode_despicable(value) when is_nil(value), do: value
+  def decode_despicable(_), do: {:error, "Unexpected type when decoding PulpitismClass.despicable"}
+
+  def encode_despicable(value) when is_nil(value), do: value
+  def encode_despicable(_), do: {:error, "Unexpected type when encoding PulpitismClass.despicable"}
+
+  def decode_isodiazo(value) when is_nil(value), do: value
+  def decode_isodiazo(_), do: {:error, "Unexpected type when decoding PulpitismClass.isodiazo"}
+
+  def encode_isodiazo(value) when is_nil(value), do: value
+  def encode_isodiazo(_), do: {:error, "Unexpected type when encoding PulpitismClass.isodiazo"}
+
+  def decode_jadedly(value) when is_nil(value), do: value
+  def decode_jadedly(_), do: {:error, "Unexpected type when decoding PulpitismClass.jadedly"}
+
+  def encode_jadedly(value) when is_nil(value), do: value
+  def encode_jadedly(_), do: {:error, "Unexpected type when encoding PulpitismClass.jadedly"}
+
+  def decode_leptochlorite(value) when is_nil(value), do: value
+  def decode_leptochlorite(_), do: {:error, "Unexpected type when decoding PulpitismClass.leptochlorite"}
+
+  def encode_leptochlorite(value) when is_nil(value), do: value
+  def encode_leptochlorite(_), do: {:error, "Unexpected type when encoding PulpitismClass.leptochlorite"}
+
+  def decode_nursling(value) when is_nil(value), do: value
+  def decode_nursling(_), do: {:error, "Unexpected type when decoding PulpitismClass.nursling"}
+
+  def encode_nursling(value) when is_nil(value), do: value
+  def encode_nursling(_), do: {:error, "Unexpected type when encoding PulpitismClass.nursling"}
+
+  def decode_palamedean(value) when is_nil(value), do: value
+  def decode_palamedean(_), do: {:error, "Unexpected type when decoding PulpitismClass.palamedean"}
+
+  def encode_palamedean(value) when is_nil(value), do: value
+  def encode_palamedean(_), do: {:error, "Unexpected type when encoding PulpitismClass.palamedean"}
+
+  def decode_photoheliograph(value) when is_nil(value), do: value
+  def decode_photoheliograph(_), do: {:error, "Unexpected type when decoding PulpitismClass.photoheliograph"}
+
+  def encode_photoheliograph(value) when is_nil(value), do: value
+  def encode_photoheliograph(_), do: {:error, "Unexpected type when encoding PulpitismClass.photoheliograph"}
+
+  def decode_pipewood(value) when is_nil(value), do: value
+  def decode_pipewood(_), do: {:error, "Unexpected type when decoding PulpitismClass.pipewood"}
+
+  def encode_pipewood(value) when is_nil(value), do: value
+  def encode_pipewood(_), do: {:error, "Unexpected type when encoding PulpitismClass.pipewood"}
+
+  def decode_roberd(value) when is_nil(value), do: value
+  def decode_roberd(_), do: {:error, "Unexpected type when decoding PulpitismClass.roberd"}
+
+  def encode_roberd(value) when is_nil(value), do: value
+  def encode_roberd(_), do: {:error, "Unexpected type when encoding PulpitismClass.roberd"}
+
+  def decode_statable(value) when is_nil(value), do: value
+  def decode_statable(_), do: {:error, "Unexpected type when decoding PulpitismClass.statable"}
+
+  def encode_statable(value) when is_nil(value), do: value
+  def encode_statable(_), do: {:error, "Unexpected type when encoding PulpitismClass.statable"}
+
+  def decode_superassume(value) when is_nil(value), do: value
+  def decode_superassume(_), do: {:error, "Unexpected type when decoding PulpitismClass.superassume"}
+
+  def encode_superassume(value) when is_nil(value), do: value
+  def encode_superassume(_), do: {:error, "Unexpected type when encoding PulpitismClass.superassume"}
+
+  def decode_syllabe(value) when is_nil(value), do: value
+  def decode_syllabe(_), do: {:error, "Unexpected type when decoding PulpitismClass.syllabe"}
+
+  def encode_syllabe(value) when is_nil(value), do: value
+  def encode_syllabe(_), do: {:error, "Unexpected type when encoding PulpitismClass.syllabe"}
+
+  def decode_toughhead(value) when is_nil(value), do: value
+  def decode_toughhead(_), do: {:error, "Unexpected type when decoding PulpitismClass.toughhead"}
+
+  def encode_toughhead(value) when is_nil(value), do: value
+  def encode_toughhead(_), do: {:error, "Unexpected type when encoding PulpitismClass.toughhead"}
+
+  def decode_underburn(value) when is_nil(value), do: value
+  def decode_underburn(_), do: {:error, "Unexpected type when decoding PulpitismClass.underburn"}
+
+  def encode_underburn(value) when is_nil(value), do: value
+  def encode_underburn(_), do: {:error, "Unexpected type when encoding PulpitismClass.underburn"}
+
   def from_map(m) do
     %PulpitismClass{
-      abnet: m["abnet"],
-      buckhorn: m["buckhorn"],
-      calciform: m["calciform"],
-      chelophore: m["chelophore"],
-      cogitation: m["cogitation"],
-      decreeable: m["decreeable"],
-      despicable: m["despicable"],
-      isodiazo: m["isodiazo"],
-      jadedly: m["jadedly"],
-      leptochlorite: m["leptochlorite"],
-      nursling: m["nursling"],
-      palamedean: m["palamedean"],
-      photoheliograph: m["photoheliograph"],
-      pipewood: m["pipewood"],
-      roberd: m["roberd"],
-      statable: m["statable"],
-      superassume: m["superassume"],
-      syllabe: m["syllabe"],
-      toughhead: m["toughhead"],
-      underburn: m["underburn"],
+      abnet: decode_abnet(m["abnet"]),
+      buckhorn: decode_buckhorn(m["buckhorn"]),
+      calciform: decode_calciform(m["calciform"]),
+      chelophore: decode_chelophore(m["chelophore"]),
+      cogitation: decode_cogitation(m["cogitation"]),
+      decreeable: decode_decreeable(m["decreeable"]),
+      despicable: decode_despicable(m["despicable"]),
+      isodiazo: decode_isodiazo(m["isodiazo"]),
+      jadedly: decode_jadedly(m["jadedly"]),
+      leptochlorite: decode_leptochlorite(m["leptochlorite"]),
+      nursling: decode_nursling(m["nursling"]),
+      palamedean: decode_palamedean(m["palamedean"]),
+      photoheliograph: decode_photoheliograph(m["photoheliograph"]),
+      pipewood: decode_pipewood(m["pipewood"]),
+      roberd: decode_roberd(m["roberd"]),
+      statable: decode_statable(m["statable"]),
+      superassume: decode_superassume(m["superassume"]),
+      syllabe: decode_syllabe(m["syllabe"]),
+      toughhead: decode_toughhead(m["toughhead"]),
+      underburn: decode_underburn(m["underburn"]),
     }
   end
 
@@ -122,28 +242,148 @@ defmodule PyodermiaClass do
           unsyncopated: nil
         }
 
+  def decode_aphoristically(value) when is_nil(value), do: value
+  def decode_aphoristically(_), do: {:error, "Unexpected type when decoding PyodermiaClass.aphoristically"}
+
+  def encode_aphoristically(value) when is_nil(value), do: value
+  def encode_aphoristically(_), do: {:error, "Unexpected type when encoding PyodermiaClass.aphoristically"}
+
+  def decode_apophyllous(value) when is_nil(value), do: value
+  def decode_apophyllous(_), do: {:error, "Unexpected type when decoding PyodermiaClass.apophyllous"}
+
+  def encode_apophyllous(value) when is_nil(value), do: value
+  def encode_apophyllous(_), do: {:error, "Unexpected type when encoding PyodermiaClass.apophyllous"}
+
+  def decode_cognize(value) when is_nil(value), do: value
+  def decode_cognize(_), do: {:error, "Unexpected type when decoding PyodermiaClass.cognize"}
+
+  def encode_cognize(value) when is_nil(value), do: value
+  def encode_cognize(_), do: {:error, "Unexpected type when encoding PyodermiaClass.cognize"}
+
+  def decode_dermonosology(value) when is_nil(value), do: value
+  def decode_dermonosology(_), do: {:error, "Unexpected type when decoding PyodermiaClass.dermonosology"}
+
+  def encode_dermonosology(value) when is_nil(value), do: value
+  def encode_dermonosology(_), do: {:error, "Unexpected type when encoding PyodermiaClass.dermonosology"}
+
+  def decode_gyppo(value) when is_nil(value), do: value
+  def decode_gyppo(_), do: {:error, "Unexpected type when decoding PyodermiaClass.gyppo"}
+
+  def encode_gyppo(value) when is_nil(value), do: value
+  def encode_gyppo(_), do: {:error, "Unexpected type when encoding PyodermiaClass.gyppo"}
+
+  def decode_ither(value) when is_nil(value), do: value
+  def decode_ither(_), do: {:error, "Unexpected type when decoding PyodermiaClass.ither"}
+
+  def encode_ither(value) when is_nil(value), do: value
+  def encode_ither(_), do: {:error, "Unexpected type when encoding PyodermiaClass.ither"}
+
+  def decode_juglandaceous(value) when is_nil(value), do: value
+  def decode_juglandaceous(_), do: {:error, "Unexpected type when decoding PyodermiaClass.juglandaceous"}
+
+  def encode_juglandaceous(value) when is_nil(value), do: value
+  def encode_juglandaceous(_), do: {:error, "Unexpected type when encoding PyodermiaClass.juglandaceous"}
+
+  def decode_litho(value) when is_nil(value), do: value
+  def decode_litho(_), do: {:error, "Unexpected type when decoding PyodermiaClass.litho"}
+
+  def encode_litho(value) when is_nil(value), do: value
+  def encode_litho(_), do: {:error, "Unexpected type when encoding PyodermiaClass.litho"}
+
+  def decode_macropterous(value) when is_nil(value), do: value
+  def decode_macropterous(_), do: {:error, "Unexpected type when decoding PyodermiaClass.macropterous"}
+
+  def encode_macropterous(value) when is_nil(value), do: value
+  def encode_macropterous(_), do: {:error, "Unexpected type when encoding PyodermiaClass.macropterous"}
+
+  def decode_photographer(value) when is_nil(value), do: value
+  def decode_photographer(_), do: {:error, "Unexpected type when decoding PyodermiaClass.photographer"}
+
+  def encode_photographer(value) when is_nil(value), do: value
+  def encode_photographer(_), do: {:error, "Unexpected type when encoding PyodermiaClass.photographer"}
+
+  def decode_romancing(value) when is_nil(value), do: value
+  def decode_romancing(_), do: {:error, "Unexpected type when decoding PyodermiaClass.romancing"}
+
+  def encode_romancing(value) when is_nil(value), do: value
+  def encode_romancing(_), do: {:error, "Unexpected type when encoding PyodermiaClass.romancing"}
+
+  def decode_rumness(value) when is_nil(value), do: value
+  def decode_rumness(_), do: {:error, "Unexpected type when decoding PyodermiaClass.rumness"}
+
+  def encode_rumness(value) when is_nil(value), do: value
+  def encode_rumness(_), do: {:error, "Unexpected type when encoding PyodermiaClass.rumness"}
+
+  def decode_somniloquist(value) when is_nil(value), do: value
+  def decode_somniloquist(_), do: {:error, "Unexpected type when decoding PyodermiaClass.somniloquist"}
+
+  def encode_somniloquist(value) when is_nil(value), do: value
+  def encode_somniloquist(_), do: {:error, "Unexpected type when encoding PyodermiaClass.somniloquist"}
+
+  def decode_stressfully(value) when is_nil(value), do: value
+  def decode_stressfully(_), do: {:error, "Unexpected type when decoding PyodermiaClass.stressfully"}
+
+  def encode_stressfully(value) when is_nil(value), do: value
+  def encode_stressfully(_), do: {:error, "Unexpected type when encoding PyodermiaClass.stressfully"}
+
+  def decode_tactically(value) when is_nil(value), do: value
+  def decode_tactically(_), do: {:error, "Unexpected type when decoding PyodermiaClass.tactically"}
+
+  def encode_tactically(value) when is_nil(value), do: value
+  def encode_tactically(_), do: {:error, "Unexpected type when encoding PyodermiaClass.tactically"}
+
+  def decode_tracheophony(value) when is_nil(value), do: value
+  def decode_tracheophony(_), do: {:error, "Unexpected type when decoding PyodermiaClass.tracheophony"}
+
+  def encode_tracheophony(value) when is_nil(value), do: value
+  def encode_tracheophony(_), do: {:error, "Unexpected type when encoding PyodermiaClass.tracheophony"}
+
+  def decode_unappositely(value) when is_nil(value), do: value
+  def decode_unappositely(_), do: {:error, "Unexpected type when decoding PyodermiaClass.unappositely"}
+
+  def encode_unappositely(value) when is_nil(value), do: value
+  def encode_unappositely(_), do: {:error, "Unexpected type when encoding PyodermiaClass.unappositely"}
+
+  def decode_unclothedly(value) when is_nil(value), do: value
+  def decode_unclothedly(_), do: {:error, "Unexpected type when decoding PyodermiaClass.unclothedly"}
+
+  def encode_unclothedly(value) when is_nil(value), do: value
+  def encode_unclothedly(_), do: {:error, "Unexpected type when encoding PyodermiaClass.unclothedly"}
+
+  def decode_unimplied(value) when is_nil(value), do: value
+  def decode_unimplied(_), do: {:error, "Unexpected type when decoding PyodermiaClass.unimplied"}
+
+  def encode_unimplied(value) when is_nil(value), do: value
+  def encode_unimplied(_), do: {:error, "Unexpected type when encoding PyodermiaClass.unimplied"}
+
+  def decode_unsyncopated(value) when is_nil(value), do: value
+  def decode_unsyncopated(_), do: {:error, "Unexpected type when decoding PyodermiaClass.unsyncopated"}
+
+  def encode_unsyncopated(value) when is_nil(value), do: value
+  def encode_unsyncopated(_), do: {:error, "Unexpected type when encoding PyodermiaClass.unsyncopated"}
+
   def from_map(m) do
     %PyodermiaClass{
-      aphoristically: m["aphoristically"],
-      apophyllous: m["apophyllous"],
-      cognize: m["cognize"],
-      dermonosology: m["dermonosology"],
-      gyppo: m["Gyppo"],
-      ither: m["ither"],
-      juglandaceous: m["juglandaceous"],
-      litho: m["litho"],
-      macropterous: m["macropterous"],
-      photographer: m["photographer"],
-      romancing: m["romancing"],
-      rumness: m["rumness"],
-      somniloquist: m["somniloquist"],
-      stressfully: m["stressfully"],
-      tactically: m["tactically"],
-      tracheophony: m["tracheophony"],
-      unappositely: m["unappositely"],
-      unclothedly: m["unclothedly"],
-      unimplied: m["unimplied"],
-      unsyncopated: m["unsyncopated"],
+      aphoristically: decode_aphoristically(m["aphoristically"]),
+      apophyllous: decode_apophyllous(m["apophyllous"]),
+      cognize: decode_cognize(m["cognize"]),
+      dermonosology: decode_dermonosology(m["dermonosology"]),
+      gyppo: decode_gyppo(m["Gyppo"]),
+      ither: decode_ither(m["ither"]),
+      juglandaceous: decode_juglandaceous(m["juglandaceous"]),
+      litho: decode_litho(m["litho"]),
+      macropterous: decode_macropterous(m["macropterous"]),
+      photographer: decode_photographer(m["photographer"]),
+      romancing: decode_romancing(m["romancing"]),
+      rumness: decode_rumness(m["rumness"]),
+      somniloquist: decode_somniloquist(m["somniloquist"]),
+      stressfully: decode_stressfully(m["stressfully"]),
+      tactically: decode_tactically(m["tactically"]),
+      tracheophony: decode_tracheophony(m["tracheophony"]),
+      unappositely: decode_unappositely(m["unappositely"]),
+      unclothedly: decode_unclothedly(m["unclothedly"]),
+      unimplied: decode_unimplied(m["unimplied"]),
+      unsyncopated: decode_unsyncopated(m["unsyncopated"]),
     }
   end
 
@@ -197,13 +437,45 @@ defmodule QuebrachineClass do
           nonbookish: nil
         }
 
+  def decode_catharticalness(value) when is_float(value), do: value
+  def decode_catharticalness(value) when is_integer(value), do: value
+  def decode_catharticalness(_), do: {:error, "Unexpected type when decoding QuebrachineClass.catharticalness"}
+
+  def encode_catharticalness(value) when is_float(value), do: value
+  def encode_catharticalness(value) when is_integer(value), do: value
+  def encode_catharticalness(_), do: {:error, "Unexpected type when encoding QuebrachineClass.catharticalness"}
+
+  def decode_chirotherium(value) when is_integer(value), do: value
+  def decode_chirotherium(_), do: {:error, "Unexpected type when decoding QuebrachineClass.chirotherium"}
+
+  def encode_chirotherium(value) when is_integer(value), do: value
+  def encode_chirotherium(_), do: {:error, "Unexpected type when encoding QuebrachineClass.chirotherium"}
+
+  def decode_disdiapason(value) when is_binary(value), do: value
+  def decode_disdiapason(_), do: {:error, "Unexpected type when decoding QuebrachineClass.disdiapason"}
+
+  def encode_disdiapason(value) when is_binary(value), do: value
+  def encode_disdiapason(_), do: {:error, "Unexpected type when encoding QuebrachineClass.disdiapason"}
+
+  def decode_homocerc(value) when is_boolean(value), do: value
+  def decode_homocerc(_), do: {:error, "Unexpected type when decoding QuebrachineClass.homocerc"}
+
+  def encode_homocerc(value) when is_boolean(value), do: value
+  def encode_homocerc(_), do: {:error, "Unexpected type when encoding QuebrachineClass.homocerc"}
+
+  def decode_nonbookish(value) when is_nil(value), do: value
+  def decode_nonbookish(_), do: {:error, "Unexpected type when decoding QuebrachineClass.nonbookish"}
+
+  def encode_nonbookish(value) when is_nil(value), do: value
+  def encode_nonbookish(_), do: {:error, "Unexpected type when encoding QuebrachineClass.nonbookish"}
+
   def from_map(m) do
     %QuebrachineClass{
-      catharticalness: m["catharticalness"],
-      chirotherium: m["Chirotherium"],
-      disdiapason: m["disdiapason"],
-      homocerc: m["homocerc"],
-      nonbookish: m["nonbookish"],
+      catharticalness: decode_catharticalness(m["catharticalness"]),
+      chirotherium: decode_chirotherium(m["Chirotherium"]),
+      disdiapason: decode_disdiapason(m["disdiapason"]),
+      homocerc: decode_homocerc(m["homocerc"]),
+      nonbookish: decode_nonbookish(m["nonbookish"]),
     }
   end
 
@@ -361,28 +633,148 @@ defmodule Ressaut do
           unmingleable: String.t()
         }
 
+  def decode_apperceptive(value) when is_binary(value), do: value
+  def decode_apperceptive(_), do: {:error, "Unexpected type when decoding Ressaut.apperceptive"}
+
+  def encode_apperceptive(value) when is_binary(value), do: value
+  def encode_apperceptive(_), do: {:error, "Unexpected type when encoding Ressaut.apperceptive"}
+
+  def decode_cuttoo(value) when is_binary(value), do: value
+  def decode_cuttoo(_), do: {:error, "Unexpected type when decoding Ressaut.cuttoo"}
+
+  def encode_cuttoo(value) when is_binary(value), do: value
+  def encode_cuttoo(_), do: {:error, "Unexpected type when encoding Ressaut.cuttoo"}
+
+  def decode_douser(value) when is_binary(value), do: value
+  def decode_douser(_), do: {:error, "Unexpected type when decoding Ressaut.douser"}
+
+  def encode_douser(value) when is_binary(value), do: value
+  def encode_douser(_), do: {:error, "Unexpected type when encoding Ressaut.douser"}
+
+  def decode_drinkproof(value) when is_binary(value), do: value
+  def decode_drinkproof(_), do: {:error, "Unexpected type when decoding Ressaut.drinkproof"}
+
+  def encode_drinkproof(value) when is_binary(value), do: value
+  def encode_drinkproof(_), do: {:error, "Unexpected type when encoding Ressaut.drinkproof"}
+
+  def decode_forementioned(value) when is_binary(value), do: value
+  def decode_forementioned(_), do: {:error, "Unexpected type when decoding Ressaut.forementioned"}
+
+  def encode_forementioned(value) when is_binary(value), do: value
+  def encode_forementioned(_), do: {:error, "Unexpected type when encoding Ressaut.forementioned"}
+
+  def decode_freesia(value) when is_binary(value), do: value
+  def decode_freesia(_), do: {:error, "Unexpected type when decoding Ressaut.freesia"}
+
+  def encode_freesia(value) when is_binary(value), do: value
+  def encode_freesia(_), do: {:error, "Unexpected type when encoding Ressaut.freesia"}
+
+  def decode_genevieve(value) when is_binary(value), do: value
+  def decode_genevieve(_), do: {:error, "Unexpected type when decoding Ressaut.genevieve"}
+
+  def encode_genevieve(value) when is_binary(value), do: value
+  def encode_genevieve(_), do: {:error, "Unexpected type when encoding Ressaut.genevieve"}
+
+  def decode_hyperdiabolical(value) when is_binary(value), do: value
+  def decode_hyperdiabolical(_), do: {:error, "Unexpected type when decoding Ressaut.hyperdiabolical"}
+
+  def encode_hyperdiabolical(value) when is_binary(value), do: value
+  def encode_hyperdiabolical(_), do: {:error, "Unexpected type when encoding Ressaut.hyperdiabolical"}
+
+  def decode_hypocone(value) when is_binary(value), do: value
+  def decode_hypocone(_), do: {:error, "Unexpected type when decoding Ressaut.hypocone"}
+
+  def encode_hypocone(value) when is_binary(value), do: value
+  def encode_hypocone(_), do: {:error, "Unexpected type when encoding Ressaut.hypocone"}
+
+  def decode_irreverentially(value) when is_binary(value), do: value
+  def decode_irreverentially(_), do: {:error, "Unexpected type when decoding Ressaut.irreverentially"}
+
+  def encode_irreverentially(value) when is_binary(value), do: value
+  def encode_irreverentially(_), do: {:error, "Unexpected type when encoding Ressaut.irreverentially"}
+
+  def decode_jumart(value) when is_binary(value), do: value
+  def decode_jumart(_), do: {:error, "Unexpected type when decoding Ressaut.jumart"}
+
+  def encode_jumart(value) when is_binary(value), do: value
+  def encode_jumart(_), do: {:error, "Unexpected type when encoding Ressaut.jumart"}
+
+  def decode_mimosaceae(value) when is_binary(value), do: value
+  def decode_mimosaceae(_), do: {:error, "Unexpected type when decoding Ressaut.mimosaceae"}
+
+  def encode_mimosaceae(value) when is_binary(value), do: value
+  def encode_mimosaceae(_), do: {:error, "Unexpected type when encoding Ressaut.mimosaceae"}
+
+  def decode_mollicrush(value) when is_binary(value), do: value
+  def decode_mollicrush(_), do: {:error, "Unexpected type when decoding Ressaut.mollicrush"}
+
+  def encode_mollicrush(value) when is_binary(value), do: value
+  def encode_mollicrush(_), do: {:error, "Unexpected type when encoding Ressaut.mollicrush"}
+
+  def decode_nedder(value) when is_binary(value), do: value
+  def decode_nedder(_), do: {:error, "Unexpected type when decoding Ressaut.nedder"}
+
+  def encode_nedder(value) when is_binary(value), do: value
+  def encode_nedder(_), do: {:error, "Unexpected type when encoding Ressaut.nedder"}
+
+  def decode_retinasphalt(value) when is_binary(value), do: value
+  def decode_retinasphalt(_), do: {:error, "Unexpected type when decoding Ressaut.retinasphalt"}
+
+  def encode_retinasphalt(value) when is_binary(value), do: value
+  def encode_retinasphalt(_), do: {:error, "Unexpected type when encoding Ressaut.retinasphalt"}
+
+  def decode_sough(value) when is_binary(value), do: value
+  def decode_sough(_), do: {:error, "Unexpected type when decoding Ressaut.sough"}
+
+  def encode_sough(value) when is_binary(value), do: value
+  def encode_sough(_), do: {:error, "Unexpected type when encoding Ressaut.sough"}
+
+  def decode_steading(value) when is_binary(value), do: value
+  def decode_steading(_), do: {:error, "Unexpected type when decoding Ressaut.steading"}
+
+  def encode_steading(value) when is_binary(value), do: value
+  def encode_steading(_), do: {:error, "Unexpected type when encoding Ressaut.steading"}
+
+  def decode_theopaschitism(value) when is_binary(value), do: value
+  def decode_theopaschitism(_), do: {:error, "Unexpected type when decoding Ressaut.theopaschitism"}
+
+  def encode_theopaschitism(value) when is_binary(value), do: value
+  def encode_theopaschitism(_), do: {:error, "Unexpected type when encoding Ressaut.theopaschitism"}
+
+  def decode_undurableness(value) when is_binary(value), do: value
+  def decode_undurableness(_), do: {:error, "Unexpected type when decoding Ressaut.undurableness"}
+
+  def encode_undurableness(value) when is_binary(value), do: value
+  def encode_undurableness(_), do: {:error, "Unexpected type when encoding Ressaut.undurableness"}
+
+  def decode_unmingleable(value) when is_binary(value), do: value
+  def decode_unmingleable(_), do: {:error, "Unexpected type when decoding Ressaut.unmingleable"}
+
+  def encode_unmingleable(value) when is_binary(value), do: value
+  def encode_unmingleable(_), do: {:error, "Unexpected type when encoding Ressaut.unmingleable"}
+
   def from_map(m) do
     %Ressaut{
-      apperceptive: m["apperceptive"],
-      cuttoo: m["cuttoo"],
-      douser: m["douser"],
-      drinkproof: m["drinkproof"],
-      forementioned: m["forementioned"],
-      freesia: m["Freesia"],
-      genevieve: m["Genevieve"],
-      hyperdiabolical: m["hyperdiabolical"],
-      hypocone: m["hypocone"],
-      irreverentially: m["irreverentially"],
-      jumart: m["jumart"],
-      mimosaceae: m["Mimosaceae"],
-      mollicrush: m["mollicrush"],
-      nedder: m["nedder"],
-      retinasphalt: m["retinasphalt"],
-      sough: m["sough"],
-      steading: m["steading"],
-      theopaschitism: m["Theopaschitism"],
-      undurableness: m["undurableness"],
-      unmingleable: m["unmingleable"],
+      apperceptive: decode_apperceptive(m["apperceptive"]),
+      cuttoo: decode_cuttoo(m["cuttoo"]),
+      douser: decode_douser(m["douser"]),
+      drinkproof: decode_drinkproof(m["drinkproof"]),
+      forementioned: decode_forementioned(m["forementioned"]),
+      freesia: decode_freesia(m["Freesia"]),
+      genevieve: decode_genevieve(m["Genevieve"]),
+      hyperdiabolical: decode_hyperdiabolical(m["hyperdiabolical"]),
+      hypocone: decode_hypocone(m["hypocone"]),
+      irreverentially: decode_irreverentially(m["irreverentially"]),
+      jumart: decode_jumart(m["jumart"]),
+      mimosaceae: decode_mimosaceae(m["Mimosaceae"]),
+      mollicrush: decode_mollicrush(m["mollicrush"]),
+      nedder: decode_nedder(m["nedder"]),
+      retinasphalt: decode_retinasphalt(m["retinasphalt"]),
+      sough: decode_sough(m["sough"]),
+      steading: decode_steading(m["steading"]),
+      theopaschitism: decode_theopaschitism(m["Theopaschitism"]),
+      undurableness: decode_undurableness(m["undurableness"]),
+      unmingleable: decode_unmingleable(m["unmingleable"]),
     }
   end
 
@@ -451,28 +843,148 @@ defmodule RewriteClass do
           yardman: nil
         }
 
+  def decode_accountancy(value) when is_nil(value), do: value
+  def decode_accountancy(_), do: {:error, "Unexpected type when decoding RewriteClass.accountancy"}
+
+  def encode_accountancy(value) when is_nil(value), do: value
+  def encode_accountancy(_), do: {:error, "Unexpected type when encoding RewriteClass.accountancy"}
+
+  def decode_cacotrophic(value) when is_nil(value), do: value
+  def decode_cacotrophic(_), do: {:error, "Unexpected type when decoding RewriteClass.cacotrophic"}
+
+  def encode_cacotrophic(value) when is_nil(value), do: value
+  def encode_cacotrophic(_), do: {:error, "Unexpected type when encoding RewriteClass.cacotrophic"}
+
+  def decode_contest(value) when is_nil(value), do: value
+  def decode_contest(_), do: {:error, "Unexpected type when decoding RewriteClass.contest"}
+
+  def encode_contest(value) when is_nil(value), do: value
+  def encode_contest(_), do: {:error, "Unexpected type when encoding RewriteClass.contest"}
+
+  def decode_couthily(value) when is_nil(value), do: value
+  def decode_couthily(_), do: {:error, "Unexpected type when decoding RewriteClass.couthily"}
+
+  def encode_couthily(value) when is_nil(value), do: value
+  def encode_couthily(_), do: {:error, "Unexpected type when encoding RewriteClass.couthily"}
+
+  def decode_falculate(value) when is_nil(value), do: value
+  def decode_falculate(_), do: {:error, "Unexpected type when decoding RewriteClass.falculate"}
+
+  def encode_falculate(value) when is_nil(value), do: value
+  def encode_falculate(_), do: {:error, "Unexpected type when encoding RewriteClass.falculate"}
+
+  def decode_foreseize(value) when is_nil(value), do: value
+  def decode_foreseize(_), do: {:error, "Unexpected type when decoding RewriteClass.foreseize"}
+
+  def encode_foreseize(value) when is_nil(value), do: value
+  def encode_foreseize(_), do: {:error, "Unexpected type when encoding RewriteClass.foreseize"}
+
+  def decode_hyades(value) when is_nil(value), do: value
+  def decode_hyades(_), do: {:error, "Unexpected type when decoding RewriteClass.hyades"}
+
+  def encode_hyades(value) when is_nil(value), do: value
+  def encode_hyades(_), do: {:error, "Unexpected type when encoding RewriteClass.hyades"}
+
+  def decode_lemnad(value) when is_nil(value), do: value
+  def decode_lemnad(_), do: {:error, "Unexpected type when decoding RewriteClass.lemnad"}
+
+  def encode_lemnad(value) when is_nil(value), do: value
+  def encode_lemnad(_), do: {:error, "Unexpected type when encoding RewriteClass.lemnad"}
+
+  def decode_monotheistically(value) when is_nil(value), do: value
+  def decode_monotheistically(_), do: {:error, "Unexpected type when decoding RewriteClass.monotheistically"}
+
+  def encode_monotheistically(value) when is_nil(value), do: value
+  def encode_monotheistically(_), do: {:error, "Unexpected type when encoding RewriteClass.monotheistically"}
+
+  def decode_nonflying(value) when is_nil(value), do: value
+  def decode_nonflying(_), do: {:error, "Unexpected type when decoding RewriteClass.nonflying"}
+
+  def encode_nonflying(value) when is_nil(value), do: value
+  def encode_nonflying(_), do: {:error, "Unexpected type when encoding RewriteClass.nonflying"}
+
+  def decode_ptenoglossa(value) when is_nil(value), do: value
+  def decode_ptenoglossa(_), do: {:error, "Unexpected type when decoding RewriteClass.ptenoglossa"}
+
+  def encode_ptenoglossa(value) when is_nil(value), do: value
+  def encode_ptenoglossa(_), do: {:error, "Unexpected type when encoding RewriteClass.ptenoglossa"}
+
+  def decode_repatch(value) when is_nil(value), do: value
+  def decode_repatch(_), do: {:error, "Unexpected type when decoding RewriteClass.repatch"}
+
+  def encode_repatch(value) when is_nil(value), do: value
+  def encode_repatch(_), do: {:error, "Unexpected type when encoding RewriteClass.repatch"}
+
+  def decode_rodman(value) when is_nil(value), do: value
+  def decode_rodman(_), do: {:error, "Unexpected type when decoding RewriteClass.rodman"}
+
+  def encode_rodman(value) when is_nil(value), do: value
+  def encode_rodman(_), do: {:error, "Unexpected type when encoding RewriteClass.rodman"}
+
+  def decode_strung(value) when is_nil(value), do: value
+  def decode_strung(_), do: {:error, "Unexpected type when decoding RewriteClass.strung"}
+
+  def encode_strung(value) when is_nil(value), do: value
+  def encode_strung(_), do: {:error, "Unexpected type when encoding RewriteClass.strung"}
+
+  def decode_titmal(value) when is_nil(value), do: value
+  def decode_titmal(_), do: {:error, "Unexpected type when decoding RewriteClass.titmal"}
+
+  def encode_titmal(value) when is_nil(value), do: value
+  def encode_titmal(_), do: {:error, "Unexpected type when encoding RewriteClass.titmal"}
+
+  def decode_twalpennyworth(value) when is_nil(value), do: value
+  def decode_twalpennyworth(_), do: {:error, "Unexpected type when decoding RewriteClass.twalpennyworth"}
+
+  def encode_twalpennyworth(value) when is_nil(value), do: value
+  def encode_twalpennyworth(_), do: {:error, "Unexpected type when encoding RewriteClass.twalpennyworth"}
+
+  def decode_unblamable(value) when is_nil(value), do: value
+  def decode_unblamable(_), do: {:error, "Unexpected type when decoding RewriteClass.unblamable"}
+
+  def encode_unblamable(value) when is_nil(value), do: value
+  def encode_unblamable(_), do: {:error, "Unexpected type when encoding RewriteClass.unblamable"}
+
+  def decode_vertical(value) when is_nil(value), do: value
+  def decode_vertical(_), do: {:error, "Unexpected type when decoding RewriteClass.vertical"}
+
+  def encode_vertical(value) when is_nil(value), do: value
+  def encode_vertical(_), do: {:error, "Unexpected type when encoding RewriteClass.vertical"}
+
+  def decode_whiggification(value) when is_nil(value), do: value
+  def decode_whiggification(_), do: {:error, "Unexpected type when decoding RewriteClass.whiggification"}
+
+  def encode_whiggification(value) when is_nil(value), do: value
+  def encode_whiggification(_), do: {:error, "Unexpected type when encoding RewriteClass.whiggification"}
+
+  def decode_yardman(value) when is_nil(value), do: value
+  def decode_yardman(_), do: {:error, "Unexpected type when decoding RewriteClass.yardman"}
+
+  def encode_yardman(value) when is_nil(value), do: value
+  def encode_yardman(_), do: {:error, "Unexpected type when encoding RewriteClass.yardman"}
+
   def from_map(m) do
     %RewriteClass{
-      accountancy: m["accountancy"],
-      cacotrophic: m["cacotrophic"],
-      contest: m["contest"],
-      couthily: m["couthily"],
-      falculate: m["falculate"],
-      foreseize: m["foreseize"],
-      hyades: m["Hyades"],
-      lemnad: m["lemnad"],
-      monotheistically: m["monotheistically"],
-      nonflying: m["nonflying"],
-      ptenoglossa: m["Ptenoglossa"],
-      repatch: m["repatch"],
-      rodman: m["rodman"],
-      strung: m["strung"],
-      titmal: m["titmal"],
-      twalpennyworth: m["twalpennyworth"],
-      unblamable: m["unblamable"],
-      vertical: m["vertical"],
-      whiggification: m["Whiggification"],
-      yardman: m["yardman"],
+      accountancy: decode_accountancy(m["accountancy"]),
+      cacotrophic: decode_cacotrophic(m["cacotrophic"]),
+      contest: decode_contest(m["contest"]),
+      couthily: decode_couthily(m["couthily"]),
+      falculate: decode_falculate(m["falculate"]),
+      foreseize: decode_foreseize(m["foreseize"]),
+      hyades: decode_hyades(m["Hyades"]),
+      lemnad: decode_lemnad(m["lemnad"]),
+      monotheistically: decode_monotheistically(m["monotheistically"]),
+      nonflying: decode_nonflying(m["nonflying"]),
+      ptenoglossa: decode_ptenoglossa(m["Ptenoglossa"]),
+      repatch: decode_repatch(m["repatch"]),
+      rodman: decode_rodman(m["rodman"]),
+      strung: decode_strung(m["strung"]),
+      titmal: decode_titmal(m["titmal"]),
+      twalpennyworth: decode_twalpennyworth(m["twalpennyworth"]),
+      unblamable: decode_unblamable(m["unblamable"]),
+      vertical: decode_vertical(m["vertical"]),
+      whiggification: decode_whiggification(m["Whiggification"]),
+      yardman: decode_yardman(m["yardman"]),
     }
   end
 
@@ -541,28 +1053,148 @@ defmodule SantirClass do
           vorticular: nil
         }
 
+  def decode_admiredly(value) when is_nil(value), do: value
+  def decode_admiredly(_), do: {:error, "Unexpected type when decoding SantirClass.admiredly"}
+
+  def encode_admiredly(value) when is_nil(value), do: value
+  def encode_admiredly(_), do: {:error, "Unexpected type when encoding SantirClass.admiredly"}
+
+  def decode_demicaponier(value) when is_nil(value), do: value
+  def decode_demicaponier(_), do: {:error, "Unexpected type when decoding SantirClass.demicaponier"}
+
+  def encode_demicaponier(value) when is_nil(value), do: value
+  def encode_demicaponier(_), do: {:error, "Unexpected type when encoding SantirClass.demicaponier"}
+
+  def decode_epitympanic(value) when is_nil(value), do: value
+  def decode_epitympanic(_), do: {:error, "Unexpected type when decoding SantirClass.epitympanic"}
+
+  def encode_epitympanic(value) when is_nil(value), do: value
+  def encode_epitympanic(_), do: {:error, "Unexpected type when encoding SantirClass.epitympanic"}
+
+  def decode_investitor(value) when is_nil(value), do: value
+  def decode_investitor(_), do: {:error, "Unexpected type when decoding SantirClass.investitor"}
+
+  def encode_investitor(value) when is_nil(value), do: value
+  def encode_investitor(_), do: {:error, "Unexpected type when encoding SantirClass.investitor"}
+
+  def decode_lupiform(value) when is_nil(value), do: value
+  def decode_lupiform(_), do: {:error, "Unexpected type when decoding SantirClass.lupiform"}
+
+  def encode_lupiform(value) when is_nil(value), do: value
+  def encode_lupiform(_), do: {:error, "Unexpected type when encoding SantirClass.lupiform"}
+
+  def decode_monoflagellate(value) when is_nil(value), do: value
+  def decode_monoflagellate(_), do: {:error, "Unexpected type when decoding SantirClass.monoflagellate"}
+
+  def encode_monoflagellate(value) when is_nil(value), do: value
+  def encode_monoflagellate(_), do: {:error, "Unexpected type when encoding SantirClass.monoflagellate"}
+
+  def decode_paleoethnic(value) when is_nil(value), do: value
+  def decode_paleoethnic(_), do: {:error, "Unexpected type when decoding SantirClass.paleoethnic"}
+
+  def encode_paleoethnic(value) when is_nil(value), do: value
+  def encode_paleoethnic(_), do: {:error, "Unexpected type when encoding SantirClass.paleoethnic"}
+
+  def decode_prediscountable(value) when is_nil(value), do: value
+  def decode_prediscountable(_), do: {:error, "Unexpected type when decoding SantirClass.prediscountable"}
+
+  def encode_prediscountable(value) when is_nil(value), do: value
+  def encode_prediscountable(_), do: {:error, "Unexpected type when encoding SantirClass.prediscountable"}
+
+  def decode_rhetoricals(value) when is_nil(value), do: value
+  def decode_rhetoricals(_), do: {:error, "Unexpected type when decoding SantirClass.rhetoricals"}
+
+  def encode_rhetoricals(value) when is_nil(value), do: value
+  def encode_rhetoricals(_), do: {:error, "Unexpected type when encoding SantirClass.rhetoricals"}
+
+  def decode_roomth(value) when is_nil(value), do: value
+  def decode_roomth(_), do: {:error, "Unexpected type when decoding SantirClass.roomth"}
+
+  def encode_roomth(value) when is_nil(value), do: value
+  def encode_roomth(_), do: {:error, "Unexpected type when encoding SantirClass.roomth"}
+
+  def decode_saccharose(value) when is_nil(value), do: value
+  def decode_saccharose(_), do: {:error, "Unexpected type when decoding SantirClass.saccharose"}
+
+  def encode_saccharose(value) when is_nil(value), do: value
+  def encode_saccharose(_), do: {:error, "Unexpected type when encoding SantirClass.saccharose"}
+
+  def decode_septonasal(value) when is_nil(value), do: value
+  def decode_septonasal(_), do: {:error, "Unexpected type when decoding SantirClass.septonasal"}
+
+  def encode_septonasal(value) when is_nil(value), do: value
+  def encode_septonasal(_), do: {:error, "Unexpected type when encoding SantirClass.septonasal"}
+
+  def decode_serpenticide(value) when is_nil(value), do: value
+  def decode_serpenticide(_), do: {:error, "Unexpected type when decoding SantirClass.serpenticide"}
+
+  def encode_serpenticide(value) when is_nil(value), do: value
+  def encode_serpenticide(_), do: {:error, "Unexpected type when encoding SantirClass.serpenticide"}
+
+  def decode_setarious(value) when is_nil(value), do: value
+  def decode_setarious(_), do: {:error, "Unexpected type when decoding SantirClass.setarious"}
+
+  def encode_setarious(value) when is_nil(value), do: value
+  def encode_setarious(_), do: {:error, "Unexpected type when encoding SantirClass.setarious"}
+
+  def decode_spaework(value) when is_nil(value), do: value
+  def decode_spaework(_), do: {:error, "Unexpected type when decoding SantirClass.spaework"}
+
+  def encode_spaework(value) when is_nil(value), do: value
+  def encode_spaework(_), do: {:error, "Unexpected type when encoding SantirClass.spaework"}
+
+  def decode_stylite(value) when is_nil(value), do: value
+  def decode_stylite(_), do: {:error, "Unexpected type when decoding SantirClass.stylite"}
+
+  def encode_stylite(value) when is_nil(value), do: value
+  def encode_stylite(_), do: {:error, "Unexpected type when encoding SantirClass.stylite"}
+
+  def decode_suessiones(value) when is_nil(value), do: value
+  def decode_suessiones(_), do: {:error, "Unexpected type when decoding SantirClass.suessiones"}
+
+  def encode_suessiones(value) when is_nil(value), do: value
+  def encode_suessiones(_), do: {:error, "Unexpected type when encoding SantirClass.suessiones"}
+
+  def decode_timelily(value) when is_nil(value), do: value
+  def decode_timelily(_), do: {:error, "Unexpected type when decoding SantirClass.timelily"}
+
+  def encode_timelily(value) when is_nil(value), do: value
+  def encode_timelily(_), do: {:error, "Unexpected type when encoding SantirClass.timelily"}
+
+  def decode_unprofaned(value) when is_nil(value), do: value
+  def decode_unprofaned(_), do: {:error, "Unexpected type when decoding SantirClass.unprofaned"}
+
+  def encode_unprofaned(value) when is_nil(value), do: value
+  def encode_unprofaned(_), do: {:error, "Unexpected type when encoding SantirClass.unprofaned"}
+
+  def decode_vorticular(value) when is_nil(value), do: value
+  def decode_vorticular(_), do: {:error, "Unexpected type when decoding SantirClass.vorticular"}
+
+  def encode_vorticular(value) when is_nil(value), do: value
+  def encode_vorticular(_), do: {:error, "Unexpected type when encoding SantirClass.vorticular"}
+
   def from_map(m) do
     %SantirClass{
-      admiredly: m["admiredly"],
-      demicaponier: m["demicaponier"],
-      epitympanic: m["epitympanic"],
-      investitor: m["investitor"],
-      lupiform: m["lupiform"],
-      monoflagellate: m["monoflagellate"],
-      paleoethnic: m["paleoethnic"],
-      prediscountable: m["prediscountable"],
-      rhetoricals: m["rhetoricals"],
-      roomth: m["roomth"],
-      saccharose: m["saccharose"],
-      septonasal: m["septonasal"],
-      serpenticide: m["serpenticide"],
-      setarious: m["setarious"],
-      spaework: m["spaework"],
-      stylite: m["stylite"],
-      suessiones: m["Suessiones"],
-      timelily: m["timelily"],
-      unprofaned: m["unprofaned"],
-      vorticular: m["vorticular"],
+      admiredly: decode_admiredly(m["admiredly"]),
+      demicaponier: decode_demicaponier(m["demicaponier"]),
+      epitympanic: decode_epitympanic(m["epitympanic"]),
+      investitor: decode_investitor(m["investitor"]),
+      lupiform: decode_lupiform(m["lupiform"]),
+      monoflagellate: decode_monoflagellate(m["monoflagellate"]),
+      paleoethnic: decode_paleoethnic(m["paleoethnic"]),
+      prediscountable: decode_prediscountable(m["prediscountable"]),
+      rhetoricals: decode_rhetoricals(m["rhetoricals"]),
+      roomth: decode_roomth(m["roomth"]),
+      saccharose: decode_saccharose(m["saccharose"]),
+      septonasal: decode_septonasal(m["septonasal"]),
+      serpenticide: decode_serpenticide(m["serpenticide"]),
+      setarious: decode_setarious(m["setarious"]),
+      spaework: decode_spaework(m["spaework"]),
+      stylite: decode_stylite(m["stylite"]),
+      suessiones: decode_suessiones(m["Suessiones"]),
+      timelily: decode_timelily(m["timelily"]),
+      unprofaned: decode_unprofaned(m["unprofaned"]),
+      vorticular: decode_vorticular(m["vorticular"]),
     }
   end
 
@@ -735,28 +1367,148 @@ defmodule Scatty do
           uncombated: nil
         }
 
+  def decode_aeriferous(value) when is_nil(value), do: value
+  def decode_aeriferous(_), do: {:error, "Unexpected type when decoding Scatty.aeriferous"}
+
+  def encode_aeriferous(value) when is_nil(value), do: value
+  def encode_aeriferous(_), do: {:error, "Unexpected type when encoding Scatty.aeriferous"}
+
+  def decode_antical(value) when is_nil(value), do: value
+  def decode_antical(_), do: {:error, "Unexpected type when decoding Scatty.antical"}
+
+  def encode_antical(value) when is_nil(value), do: value
+  def encode_antical(_), do: {:error, "Unexpected type when encoding Scatty.antical"}
+
+  def decode_antighostism(value) when is_nil(value), do: value
+  def decode_antighostism(_), do: {:error, "Unexpected type when decoding Scatty.antighostism"}
+
+  def encode_antighostism(value) when is_nil(value), do: value
+  def encode_antighostism(_), do: {:error, "Unexpected type when encoding Scatty.antighostism"}
+
+  def decode_arcanum(value) when is_nil(value), do: value
+  def decode_arcanum(_), do: {:error, "Unexpected type when decoding Scatty.arcanum"}
+
+  def encode_arcanum(value) when is_nil(value), do: value
+  def encode_arcanum(_), do: {:error, "Unexpected type when encoding Scatty.arcanum"}
+
+  def decode_autotrophy(value) when is_nil(value), do: value
+  def decode_autotrophy(_), do: {:error, "Unexpected type when decoding Scatty.autotrophy"}
+
+  def encode_autotrophy(value) when is_nil(value), do: value
+  def encode_autotrophy(_), do: {:error, "Unexpected type when encoding Scatty.autotrophy"}
+
+  def decode_baronial(value) when is_nil(value), do: value
+  def decode_baronial(_), do: {:error, "Unexpected type when decoding Scatty.baronial"}
+
+  def encode_baronial(value) when is_nil(value), do: value
+  def encode_baronial(_), do: {:error, "Unexpected type when encoding Scatty.baronial"}
+
+  def decode_caffeine(value) when is_nil(value), do: value
+  def decode_caffeine(_), do: {:error, "Unexpected type when decoding Scatty.caffeine"}
+
+  def encode_caffeine(value) when is_nil(value), do: value
+  def encode_caffeine(_), do: {:error, "Unexpected type when encoding Scatty.caffeine"}
+
+  def decode_gorgoniacean(value) when is_nil(value), do: value
+  def decode_gorgoniacean(_), do: {:error, "Unexpected type when decoding Scatty.gorgoniacean"}
+
+  def encode_gorgoniacean(value) when is_nil(value), do: value
+  def encode_gorgoniacean(_), do: {:error, "Unexpected type when encoding Scatty.gorgoniacean"}
+
+  def decode_heroical(value) when is_nil(value), do: value
+  def decode_heroical(_), do: {:error, "Unexpected type when decoding Scatty.heroical"}
+
+  def encode_heroical(value) when is_nil(value), do: value
+  def encode_heroical(_), do: {:error, "Unexpected type when encoding Scatty.heroical"}
+
+  def decode_hydropical(value) when is_nil(value), do: value
+  def decode_hydropical(_), do: {:error, "Unexpected type when decoding Scatty.hydropical"}
+
+  def encode_hydropical(value) when is_nil(value), do: value
+  def encode_hydropical(_), do: {:error, "Unexpected type when encoding Scatty.hydropical"}
+
+  def decode_mechanology(value) when is_nil(value), do: value
+  def decode_mechanology(_), do: {:error, "Unexpected type when decoding Scatty.mechanology"}
+
+  def encode_mechanology(value) when is_nil(value), do: value
+  def encode_mechanology(_), do: {:error, "Unexpected type when encoding Scatty.mechanology"}
+
+  def decode_musicopoetic(value) when is_nil(value), do: value
+  def decode_musicopoetic(_), do: {:error, "Unexpected type when decoding Scatty.musicopoetic"}
+
+  def encode_musicopoetic(value) when is_nil(value), do: value
+  def encode_musicopoetic(_), do: {:error, "Unexpected type when encoding Scatty.musicopoetic"}
+
+  def decode_officiality(value) when is_nil(value), do: value
+  def decode_officiality(_), do: {:error, "Unexpected type when decoding Scatty.officiality"}
+
+  def encode_officiality(value) when is_nil(value), do: value
+  def encode_officiality(_), do: {:error, "Unexpected type when encoding Scatty.officiality"}
+
+  def decode_oftentimes(value) when is_nil(value), do: value
+  def decode_oftentimes(_), do: {:error, "Unexpected type when decoding Scatty.oftentimes"}
+
+  def encode_oftentimes(value) when is_nil(value), do: value
+  def encode_oftentimes(_), do: {:error, "Unexpected type when encoding Scatty.oftentimes"}
+
+  def decode_ophthalmotonometer(value) when is_nil(value), do: value
+  def decode_ophthalmotonometer(_), do: {:error, "Unexpected type when decoding Scatty.ophthalmotonometer"}
+
+  def encode_ophthalmotonometer(value) when is_nil(value), do: value
+  def encode_ophthalmotonometer(_), do: {:error, "Unexpected type when encoding Scatty.ophthalmotonometer"}
+
+  def decode_reflectively(value) when is_nil(value), do: value
+  def decode_reflectively(_), do: {:error, "Unexpected type when decoding Scatty.reflectively"}
+
+  def encode_reflectively(value) when is_nil(value), do: value
+  def encode_reflectively(_), do: {:error, "Unexpected type when encoding Scatty.reflectively"}
+
+  def decode_springer(value) when is_nil(value), do: value
+  def decode_springer(_), do: {:error, "Unexpected type when decoding Scatty.springer"}
+
+  def encode_springer(value) when is_nil(value), do: value
+  def encode_springer(_), do: {:error, "Unexpected type when encoding Scatty.springer"}
+
+  def decode_tabasco(value) when is_nil(value), do: value
+  def decode_tabasco(_), do: {:error, "Unexpected type when decoding Scatty.tabasco"}
+
+  def encode_tabasco(value) when is_nil(value), do: value
+  def encode_tabasco(_), do: {:error, "Unexpected type when encoding Scatty.tabasco"}
+
+  def decode_teleianthous(value) when is_nil(value), do: value
+  def decode_teleianthous(_), do: {:error, "Unexpected type when decoding Scatty.teleianthous"}
+
+  def encode_teleianthous(value) when is_nil(value), do: value
+  def encode_teleianthous(_), do: {:error, "Unexpected type when encoding Scatty.teleianthous"}
+
+  def decode_uncombated(value) when is_nil(value), do: value
+  def decode_uncombated(_), do: {:error, "Unexpected type when decoding Scatty.uncombated"}
+
+  def encode_uncombated(value) when is_nil(value), do: value
+  def encode_uncombated(_), do: {:error, "Unexpected type when encoding Scatty.uncombated"}
+
   def from_map(m) do
     %Scatty{
-      aeriferous: m["aeriferous"],
-      antical: m["antical"],
-      antighostism: m["antighostism"],
-      arcanum: m["arcanum"],
-      autotrophy: m["autotrophy"],
-      baronial: m["baronial"],
-      caffeine: m["caffeine"],
-      gorgoniacean: m["gorgoniacean"],
-      heroical: m["heroical"],
-      hydropical: m["hydropical"],
-      mechanology: m["mechanology"],
-      musicopoetic: m["musicopoetic"],
-      officiality: m["officiality"],
-      oftentimes: m["oftentimes"],
-      ophthalmotonometer: m["ophthalmotonometer"],
-      reflectively: m["reflectively"],
-      springer: m["springer"],
-      tabasco: m["Tabasco"],
-      teleianthous: m["teleianthous"],
-      uncombated: m["uncombated"],
+      aeriferous: decode_aeriferous(m["aeriferous"]),
+      antical: decode_antical(m["antical"]),
+      antighostism: decode_antighostism(m["antighostism"]),
+      arcanum: decode_arcanum(m["arcanum"]),
+      autotrophy: decode_autotrophy(m["autotrophy"]),
+      baronial: decode_baronial(m["baronial"]),
+      caffeine: decode_caffeine(m["caffeine"]),
+      gorgoniacean: decode_gorgoniacean(m["gorgoniacean"]),
+      heroical: decode_heroical(m["heroical"]),
+      hydropical: decode_hydropical(m["hydropical"]),
+      mechanology: decode_mechanology(m["mechanology"]),
+      musicopoetic: decode_musicopoetic(m["musicopoetic"]),
+      officiality: decode_officiality(m["officiality"]),
+      oftentimes: decode_oftentimes(m["oftentimes"]),
+      ophthalmotonometer: decode_ophthalmotonometer(m["ophthalmotonometer"]),
+      reflectively: decode_reflectively(m["reflectively"]),
+      springer: decode_springer(m["springer"]),
+      tabasco: decode_tabasco(m["Tabasco"]),
+      teleianthous: decode_teleianthous(m["teleianthous"]),
+      uncombated: decode_uncombated(m["uncombated"]),
     }
   end
 
@@ -825,28 +1577,148 @@ defmodule SisteringClass do
           vineal: nil
         }
 
+  def decode_amphicarpic(value) when is_nil(value), do: value
+  def decode_amphicarpic(_), do: {:error, "Unexpected type when decoding SisteringClass.amphicarpic"}
+
+  def encode_amphicarpic(value) when is_nil(value), do: value
+  def encode_amphicarpic(_), do: {:error, "Unexpected type when encoding SisteringClass.amphicarpic"}
+
+  def decode_chianti(value) when is_nil(value), do: value
+  def decode_chianti(_), do: {:error, "Unexpected type when decoding SisteringClass.chianti"}
+
+  def encode_chianti(value) when is_nil(value), do: value
+  def encode_chianti(_), do: {:error, "Unexpected type when encoding SisteringClass.chianti"}
+
+  def decode_frigorific(value) when is_nil(value), do: value
+  def decode_frigorific(_), do: {:error, "Unexpected type when decoding SisteringClass.frigorific"}
+
+  def encode_frigorific(value) when is_nil(value), do: value
+  def encode_frigorific(_), do: {:error, "Unexpected type when encoding SisteringClass.frigorific"}
+
+  def decode_haplomi(value) when is_nil(value), do: value
+  def decode_haplomi(_), do: {:error, "Unexpected type when decoding SisteringClass.haplomi"}
+
+  def encode_haplomi(value) when is_nil(value), do: value
+  def encode_haplomi(_), do: {:error, "Unexpected type when encoding SisteringClass.haplomi"}
+
+  def decode_hyperkinesis(value) when is_nil(value), do: value
+  def decode_hyperkinesis(_), do: {:error, "Unexpected type when decoding SisteringClass.hyperkinesis"}
+
+  def encode_hyperkinesis(value) when is_nil(value), do: value
+  def encode_hyperkinesis(_), do: {:error, "Unexpected type when encoding SisteringClass.hyperkinesis"}
+
+  def decode_laudable(value) when is_nil(value), do: value
+  def decode_laudable(_), do: {:error, "Unexpected type when decoding SisteringClass.laudable"}
+
+  def encode_laudable(value) when is_nil(value), do: value
+  def encode_laudable(_), do: {:error, "Unexpected type when encoding SisteringClass.laudable"}
+
+  def decode_madwoman(value) when is_nil(value), do: value
+  def decode_madwoman(_), do: {:error, "Unexpected type when decoding SisteringClass.madwoman"}
+
+  def encode_madwoman(value) when is_nil(value), do: value
+  def encode_madwoman(_), do: {:error, "Unexpected type when encoding SisteringClass.madwoman"}
+
+  def decode_maimedly(value) when is_nil(value), do: value
+  def decode_maimedly(_), do: {:error, "Unexpected type when decoding SisteringClass.maimedly"}
+
+  def encode_maimedly(value) when is_nil(value), do: value
+  def encode_maimedly(_), do: {:error, "Unexpected type when encoding SisteringClass.maimedly"}
+
+  def decode_micropterygidae(value) when is_nil(value), do: value
+  def decode_micropterygidae(_), do: {:error, "Unexpected type when decoding SisteringClass.micropterygidae"}
+
+  def encode_micropterygidae(value) when is_nil(value), do: value
+  def encode_micropterygidae(_), do: {:error, "Unexpected type when encoding SisteringClass.micropterygidae"}
+
+  def decode_microrhabdus(value) when is_nil(value), do: value
+  def decode_microrhabdus(_), do: {:error, "Unexpected type when decoding SisteringClass.microrhabdus"}
+
+  def encode_microrhabdus(value) when is_nil(value), do: value
+  def encode_microrhabdus(_), do: {:error, "Unexpected type when encoding SisteringClass.microrhabdus"}
+
+  def decode_nondense(value) when is_nil(value), do: value
+  def decode_nondense(_), do: {:error, "Unexpected type when decoding SisteringClass.nondense"}
+
+  def encode_nondense(value) when is_nil(value), do: value
+  def encode_nondense(_), do: {:error, "Unexpected type when encoding SisteringClass.nondense"}
+
+  def decode_phlebemphraxis(value) when is_nil(value), do: value
+  def decode_phlebemphraxis(_), do: {:error, "Unexpected type when decoding SisteringClass.phlebemphraxis"}
+
+  def encode_phlebemphraxis(value) when is_nil(value), do: value
+  def encode_phlebemphraxis(_), do: {:error, "Unexpected type when encoding SisteringClass.phlebemphraxis"}
+
+  def decode_redsear(value) when is_nil(value), do: value
+  def decode_redsear(_), do: {:error, "Unexpected type when decoding SisteringClass.redsear"}
+
+  def encode_redsear(value) when is_nil(value), do: value
+  def encode_redsear(_), do: {:error, "Unexpected type when encoding SisteringClass.redsear"}
+
+  def decode_schismatical(value) when is_nil(value), do: value
+  def decode_schismatical(_), do: {:error, "Unexpected type when decoding SisteringClass.schismatical"}
+
+  def encode_schismatical(value) when is_nil(value), do: value
+  def encode_schismatical(_), do: {:error, "Unexpected type when encoding SisteringClass.schismatical"}
+
+  def decode_tartryl(value) when is_nil(value), do: value
+  def decode_tartryl(_), do: {:error, "Unexpected type when decoding SisteringClass.tartryl"}
+
+  def encode_tartryl(value) when is_nil(value), do: value
+  def encode_tartryl(_), do: {:error, "Unexpected type when encoding SisteringClass.tartryl"}
+
+  def decode_unabhorred(value) when is_nil(value), do: value
+  def decode_unabhorred(_), do: {:error, "Unexpected type when decoding SisteringClass.unabhorred"}
+
+  def encode_unabhorred(value) when is_nil(value), do: value
+  def encode_unabhorred(_), do: {:error, "Unexpected type when encoding SisteringClass.unabhorred"}
+
+  def decode_undeliberateness(value) when is_nil(value), do: value
+  def decode_undeliberateness(_), do: {:error, "Unexpected type when decoding SisteringClass.undeliberateness"}
+
+  def encode_undeliberateness(value) when is_nil(value), do: value
+  def encode_undeliberateness(_), do: {:error, "Unexpected type when encoding SisteringClass.undeliberateness"}
+
+  def decode_unmixable(value) when is_nil(value), do: value
+  def decode_unmixable(_), do: {:error, "Unexpected type when decoding SisteringClass.unmixable"}
+
+  def encode_unmixable(value) when is_nil(value), do: value
+  def encode_unmixable(_), do: {:error, "Unexpected type when encoding SisteringClass.unmixable"}
+
+  def decode_untruckling(value) when is_nil(value), do: value
+  def decode_untruckling(_), do: {:error, "Unexpected type when decoding SisteringClass.untruckling"}
+
+  def encode_untruckling(value) when is_nil(value), do: value
+  def encode_untruckling(_), do: {:error, "Unexpected type when encoding SisteringClass.untruckling"}
+
+  def decode_vineal(value) when is_nil(value), do: value
+  def decode_vineal(_), do: {:error, "Unexpected type when decoding SisteringClass.vineal"}
+
+  def encode_vineal(value) when is_nil(value), do: value
+  def encode_vineal(_), do: {:error, "Unexpected type when encoding SisteringClass.vineal"}
+
   def from_map(m) do
     %SisteringClass{
-      amphicarpic: m["amphicarpic"],
-      chianti: m["Chianti"],
-      frigorific: m["frigorific"],
-      haplomi: m["Haplomi"],
-      hyperkinesis: m["hyperkinesis"],
-      laudable: m["laudable"],
-      madwoman: m["madwoman"],
-      maimedly: m["maimedly"],
-      micropterygidae: m["Micropterygidae"],
-      microrhabdus: m["microrhabdus"],
-      nondense: m["nondense"],
-      phlebemphraxis: m["phlebemphraxis"],
-      redsear: m["redsear"],
-      schismatical: m["schismatical"],
-      tartryl: m["tartryl"],
-      unabhorred: m["unabhorred"],
-      undeliberateness: m["undeliberateness"],
-      unmixable: m["unmixable"],
-      untruckling: m["untruckling"],
-      vineal: m["vineal"],
+      amphicarpic: decode_amphicarpic(m["amphicarpic"]),
+      chianti: decode_chianti(m["Chianti"]),
+      frigorific: decode_frigorific(m["frigorific"]),
+      haplomi: decode_haplomi(m["Haplomi"]),
+      hyperkinesis: decode_hyperkinesis(m["hyperkinesis"]),
+      laudable: decode_laudable(m["laudable"]),
+      madwoman: decode_madwoman(m["madwoman"]),
+      maimedly: decode_maimedly(m["maimedly"]),
+      micropterygidae: decode_micropterygidae(m["Micropterygidae"]),
+      microrhabdus: decode_microrhabdus(m["microrhabdus"]),
+      nondense: decode_nondense(m["nondense"]),
+      phlebemphraxis: decode_phlebemphraxis(m["phlebemphraxis"]),
+      redsear: decode_redsear(m["redsear"]),
+      schismatical: decode_schismatical(m["schismatical"]),
+      tartryl: decode_tartryl(m["tartryl"]),
+      unabhorred: decode_unabhorred(m["unabhorred"]),
+      undeliberateness: decode_undeliberateness(m["undeliberateness"]),
+      unmixable: decode_unmixable(m["unmixable"]),
+      untruckling: decode_untruckling(m["untruckling"]),
+      vineal: decode_vineal(m["vineal"]),
     }
   end
 
@@ -1331,28 +2203,148 @@ defmodule UnstressedClass do
           vowellessness: nil
         }
 
+  def decode_alain(value) when is_nil(value), do: value
+  def decode_alain(_), do: {:error, "Unexpected type when decoding UnstressedClass.alain"}
+
+  def encode_alain(value) when is_nil(value), do: value
+  def encode_alain(_), do: {:error, "Unexpected type when encoding UnstressedClass.alain"}
+
+  def decode_amphirhina(value) when is_nil(value), do: value
+  def decode_amphirhina(_), do: {:error, "Unexpected type when decoding UnstressedClass.amphirhina"}
+
+  def encode_amphirhina(value) when is_nil(value), do: value
+  def encode_amphirhina(_), do: {:error, "Unexpected type when encoding UnstressedClass.amphirhina"}
+
+  def decode_antimachinery(value) when is_nil(value), do: value
+  def decode_antimachinery(_), do: {:error, "Unexpected type when decoding UnstressedClass.antimachinery"}
+
+  def encode_antimachinery(value) when is_nil(value), do: value
+  def encode_antimachinery(_), do: {:error, "Unexpected type when encoding UnstressedClass.antimachinery"}
+
+  def decode_coldish(value) when is_nil(value), do: value
+  def decode_coldish(_), do: {:error, "Unexpected type when decoding UnstressedClass.coldish"}
+
+  def encode_coldish(value) when is_nil(value), do: value
+  def encode_coldish(_), do: {:error, "Unexpected type when encoding UnstressedClass.coldish"}
+
+  def decode_crantara(value) when is_nil(value), do: value
+  def decode_crantara(_), do: {:error, "Unexpected type when decoding UnstressedClass.crantara"}
+
+  def encode_crantara(value) when is_nil(value), do: value
+  def encode_crantara(_), do: {:error, "Unexpected type when encoding UnstressedClass.crantara"}
+
+  def decode_distinguishing(value) when is_nil(value), do: value
+  def decode_distinguishing(_), do: {:error, "Unexpected type when decoding UnstressedClass.distinguishing"}
+
+  def encode_distinguishing(value) when is_nil(value), do: value
+  def encode_distinguishing(_), do: {:error, "Unexpected type when encoding UnstressedClass.distinguishing"}
+
+  def decode_elytroposis(value) when is_nil(value), do: value
+  def decode_elytroposis(_), do: {:error, "Unexpected type when decoding UnstressedClass.elytroposis"}
+
+  def encode_elytroposis(value) when is_nil(value), do: value
+  def encode_elytroposis(_), do: {:error, "Unexpected type when encoding UnstressedClass.elytroposis"}
+
+  def decode_gentianwort(value) when is_nil(value), do: value
+  def decode_gentianwort(_), do: {:error, "Unexpected type when decoding UnstressedClass.gentianwort"}
+
+  def encode_gentianwort(value) when is_nil(value), do: value
+  def encode_gentianwort(_), do: {:error, "Unexpected type when encoding UnstressedClass.gentianwort"}
+
+  def decode_heliosis(value) when is_nil(value), do: value
+  def decode_heliosis(_), do: {:error, "Unexpected type when decoding UnstressedClass.heliosis"}
+
+  def encode_heliosis(value) when is_nil(value), do: value
+  def encode_heliosis(_), do: {:error, "Unexpected type when encoding UnstressedClass.heliosis"}
+
+  def decode_instrumental(value) when is_nil(value), do: value
+  def decode_instrumental(_), do: {:error, "Unexpected type when decoding UnstressedClass.instrumental"}
+
+  def encode_instrumental(value) when is_nil(value), do: value
+  def encode_instrumental(_), do: {:error, "Unexpected type when encoding UnstressedClass.instrumental"}
+
+  def decode_introinflection(value) when is_nil(value), do: value
+  def decode_introinflection(_), do: {:error, "Unexpected type when decoding UnstressedClass.introinflection"}
+
+  def encode_introinflection(value) when is_nil(value), do: value
+  def encode_introinflection(_), do: {:error, "Unexpected type when encoding UnstressedClass.introinflection"}
+
+  def decode_kala(value) when is_nil(value), do: value
+  def decode_kala(_), do: {:error, "Unexpected type when decoding UnstressedClass.kala"}
+
+  def encode_kala(value) when is_nil(value), do: value
+  def encode_kala(_), do: {:error, "Unexpected type when encoding UnstressedClass.kala"}
+
+  def decode_lincolnian(value) when is_nil(value), do: value
+  def decode_lincolnian(_), do: {:error, "Unexpected type when decoding UnstressedClass.lincolnian"}
+
+  def encode_lincolnian(value) when is_nil(value), do: value
+  def encode_lincolnian(_), do: {:error, "Unexpected type when encoding UnstressedClass.lincolnian"}
+
+  def decode_metad(value) when is_nil(value), do: value
+  def decode_metad(_), do: {:error, "Unexpected type when decoding UnstressedClass.metad"}
+
+  def encode_metad(value) when is_nil(value), do: value
+  def encode_metad(_), do: {:error, "Unexpected type when encoding UnstressedClass.metad"}
+
+  def decode_sarcophilus(value) when is_nil(value), do: value
+  def decode_sarcophilus(_), do: {:error, "Unexpected type when decoding UnstressedClass.sarcophilus"}
+
+  def encode_sarcophilus(value) when is_nil(value), do: value
+  def encode_sarcophilus(_), do: {:error, "Unexpected type when encoding UnstressedClass.sarcophilus"}
+
+  def decode_swingingly(value) when is_nil(value), do: value
+  def decode_swingingly(_), do: {:error, "Unexpected type when decoding UnstressedClass.swingingly"}
+
+  def encode_swingingly(value) when is_nil(value), do: value
+  def encode_swingingly(_), do: {:error, "Unexpected type when encoding UnstressedClass.swingingly"}
+
+  def decode_unconformity(value) when is_nil(value), do: value
+  def decode_unconformity(_), do: {:error, "Unexpected type when decoding UnstressedClass.unconformity"}
+
+  def encode_unconformity(value) when is_nil(value), do: value
+  def encode_unconformity(_), do: {:error, "Unexpected type when encoding UnstressedClass.unconformity"}
+
+  def decode_undecreed(value) when is_nil(value), do: value
+  def decode_undecreed(_), do: {:error, "Unexpected type when decoding UnstressedClass.undecreed"}
+
+  def encode_undecreed(value) when is_nil(value), do: value
+  def encode_undecreed(_), do: {:error, "Unexpected type when encoding UnstressedClass.undecreed"}
+
+  def decode_venerable(value) when is_nil(value), do: value
+  def decode_venerable(_), do: {:error, "Unexpected type when decoding UnstressedClass.venerable"}
+
+  def encode_venerable(value) when is_nil(value), do: value
+  def encode_venerable(_), do: {:error, "Unexpected type when encoding UnstressedClass.venerable"}
+
+  def decode_vowellessness(value) when is_nil(value), do: value
+  def decode_vowellessness(_), do: {:error, "Unexpected type when decoding UnstressedClass.vowellessness"}
+
+  def encode_vowellessness(value) when is_nil(value), do: value
+  def encode_vowellessness(_), do: {:error, "Unexpected type when encoding UnstressedClass.vowellessness"}
+
   def from_map(m) do
     %UnstressedClass{
-      alain: m["Alain"],
-      amphirhina: m["Amphirhina"],
-      antimachinery: m["antimachinery"],
-      coldish: m["coldish"],
-      crantara: m["crantara"],
-      distinguishing: m["distinguishing"],
-      elytroposis: m["elytroposis"],
-      gentianwort: m["gentianwort"],
-      heliosis: m["heliosis"],
-      instrumental: m["instrumental"],
-      introinflection: m["introinflection"],
-      kala: m["kala"],
-      lincolnian: m["Lincolnian"],
-      metad: m["metad"],
-      sarcophilus: m["Sarcophilus"],
-      swingingly: m["swingingly"],
-      unconformity: m["unconformity"],
-      undecreed: m["undecreed"],
-      venerable: m["venerable"],
-      vowellessness: m["vowellessness"],
+      alain: decode_alain(m["Alain"]),
+      amphirhina: decode_amphirhina(m["Amphirhina"]),
+      antimachinery: decode_antimachinery(m["antimachinery"]),
+      coldish: decode_coldish(m["coldish"]),
+      crantara: decode_crantara(m["crantara"]),
+      distinguishing: decode_distinguishing(m["distinguishing"]),
+      elytroposis: decode_elytroposis(m["elytroposis"]),
+      gentianwort: decode_gentianwort(m["gentianwort"]),
+      heliosis: decode_heliosis(m["heliosis"]),
+      instrumental: decode_instrumental(m["instrumental"]),
+      introinflection: decode_introinflection(m["introinflection"]),
+      kala: decode_kala(m["kala"]),
+      lincolnian: decode_lincolnian(m["Lincolnian"]),
+      metad: decode_metad(m["metad"]),
+      sarcophilus: decode_sarcophilus(m["Sarcophilus"]),
+      swingingly: decode_swingingly(m["swingingly"]),
+      unconformity: decode_unconformity(m["unconformity"]),
+      undecreed: decode_undecreed(m["undecreed"]),
+      venerable: decode_venerable(m["venerable"]),
+      vowellessness: decode_vowellessness(m["vowellessness"]),
     }
   end
 
@@ -1421,28 +2413,148 @@ defmodule WrothyClass do
           unbooked: nil
         }
 
+  def decode_aeschynanthus(value) when is_nil(value), do: value
+  def decode_aeschynanthus(_), do: {:error, "Unexpected type when decoding WrothyClass.aeschynanthus"}
+
+  def encode_aeschynanthus(value) when is_nil(value), do: value
+  def encode_aeschynanthus(_), do: {:error, "Unexpected type when encoding WrothyClass.aeschynanthus"}
+
+  def decode_aquiferous(value) when is_nil(value), do: value
+  def decode_aquiferous(_), do: {:error, "Unexpected type when decoding WrothyClass.aquiferous"}
+
+  def encode_aquiferous(value) when is_nil(value), do: value
+  def encode_aquiferous(_), do: {:error, "Unexpected type when encoding WrothyClass.aquiferous"}
+
+  def decode_cheapener(value) when is_nil(value), do: value
+  def decode_cheapener(_), do: {:error, "Unexpected type when decoding WrothyClass.cheapener"}
+
+  def encode_cheapener(value) when is_nil(value), do: value
+  def encode_cheapener(_), do: {:error, "Unexpected type when encoding WrothyClass.cheapener"}
+
+  def decode_enumeration(value) when is_nil(value), do: value
+  def decode_enumeration(_), do: {:error, "Unexpected type when decoding WrothyClass.enumeration"}
+
+  def encode_enumeration(value) when is_nil(value), do: value
+  def encode_enumeration(_), do: {:error, "Unexpected type when encoding WrothyClass.enumeration"}
+
+  def decode_ephesine(value) when is_nil(value), do: value
+  def decode_ephesine(_), do: {:error, "Unexpected type when decoding WrothyClass.ephesine"}
+
+  def encode_ephesine(value) when is_nil(value), do: value
+  def encode_ephesine(_), do: {:error, "Unexpected type when encoding WrothyClass.ephesine"}
+
+  def decode_escadrille(value) when is_nil(value), do: value
+  def decode_escadrille(_), do: {:error, "Unexpected type when decoding WrothyClass.escadrille"}
+
+  def encode_escadrille(value) when is_nil(value), do: value
+  def encode_escadrille(_), do: {:error, "Unexpected type when encoding WrothyClass.escadrille"}
+
+  def decode_estrous(value) when is_nil(value), do: value
+  def decode_estrous(_), do: {:error, "Unexpected type when decoding WrothyClass.estrous"}
+
+  def encode_estrous(value) when is_nil(value), do: value
+  def encode_estrous(_), do: {:error, "Unexpected type when encoding WrothyClass.estrous"}
+
+  def decode_interestedly(value) when is_nil(value), do: value
+  def decode_interestedly(_), do: {:error, "Unexpected type when decoding WrothyClass.interestedly"}
+
+  def encode_interestedly(value) when is_nil(value), do: value
+  def encode_interestedly(_), do: {:error, "Unexpected type when encoding WrothyClass.interestedly"}
+
+  def decode_katakinetomer(value) when is_nil(value), do: value
+  def decode_katakinetomer(_), do: {:error, "Unexpected type when decoding WrothyClass.katakinetomer"}
+
+  def encode_katakinetomer(value) when is_nil(value), do: value
+  def encode_katakinetomer(_), do: {:error, "Unexpected type when encoding WrothyClass.katakinetomer"}
+
+  def decode_mortification(value) when is_nil(value), do: value
+  def decode_mortification(_), do: {:error, "Unexpected type when decoding WrothyClass.mortification"}
+
+  def encode_mortification(value) when is_nil(value), do: value
+  def encode_mortification(_), do: {:error, "Unexpected type when encoding WrothyClass.mortification"}
+
+  def decode_morula(value) when is_nil(value), do: value
+  def decode_morula(_), do: {:error, "Unexpected type when decoding WrothyClass.morula"}
+
+  def encode_morula(value) when is_nil(value), do: value
+  def encode_morula(_), do: {:error, "Unexpected type when encoding WrothyClass.morula"}
+
+  def decode_orthosymmetrical(value) when is_nil(value), do: value
+  def decode_orthosymmetrical(_), do: {:error, "Unexpected type when decoding WrothyClass.orthosymmetrical"}
+
+  def encode_orthosymmetrical(value) when is_nil(value), do: value
+  def encode_orthosymmetrical(_), do: {:error, "Unexpected type when encoding WrothyClass.orthosymmetrical"}
+
+  def decode_overbark(value) when is_nil(value), do: value
+  def decode_overbark(_), do: {:error, "Unexpected type when decoding WrothyClass.overbark"}
+
+  def encode_overbark(value) when is_nil(value), do: value
+  def encode_overbark(_), do: {:error, "Unexpected type when encoding WrothyClass.overbark"}
+
+  def decode_politist(value) when is_nil(value), do: value
+  def decode_politist(_), do: {:error, "Unexpected type when decoding WrothyClass.politist"}
+
+  def encode_politist(value) when is_nil(value), do: value
+  def encode_politist(_), do: {:error, "Unexpected type when encoding WrothyClass.politist"}
+
+  def decode_qualified(value) when is_nil(value), do: value
+  def decode_qualified(_), do: {:error, "Unexpected type when decoding WrothyClass.qualified"}
+
+  def encode_qualified(value) when is_nil(value), do: value
+  def encode_qualified(_), do: {:error, "Unexpected type when encoding WrothyClass.qualified"}
+
+  def decode_sphenomalar(value) when is_nil(value), do: value
+  def decode_sphenomalar(_), do: {:error, "Unexpected type when decoding WrothyClass.sphenomalar"}
+
+  def encode_sphenomalar(value) when is_nil(value), do: value
+  def encode_sphenomalar(_), do: {:error, "Unexpected type when encoding WrothyClass.sphenomalar"}
+
+  def decode_throatful(value) when is_nil(value), do: value
+  def decode_throatful(_), do: {:error, "Unexpected type when decoding WrothyClass.throatful"}
+
+  def encode_throatful(value) when is_nil(value), do: value
+  def encode_throatful(_), do: {:error, "Unexpected type when encoding WrothyClass.throatful"}
+
+  def decode_transhumance(value) when is_nil(value), do: value
+  def decode_transhumance(_), do: {:error, "Unexpected type when decoding WrothyClass.transhumance"}
+
+  def encode_transhumance(value) when is_nil(value), do: value
+  def encode_transhumance(_), do: {:error, "Unexpected type when encoding WrothyClass.transhumance"}
+
+  def decode_triandrian(value) when is_nil(value), do: value
+  def decode_triandrian(_), do: {:error, "Unexpected type when decoding WrothyClass.triandrian"}
+
+  def encode_triandrian(value) when is_nil(value), do: value
+  def encode_triandrian(_), do: {:error, "Unexpected type when encoding WrothyClass.triandrian"}
+
+  def decode_unbooked(value) when is_nil(value), do: value
+  def decode_unbooked(_), do: {:error, "Unexpected type when decoding WrothyClass.unbooked"}
+
+  def encode_unbooked(value) when is_nil(value), do: value
+  def encode_unbooked(_), do: {:error, "Unexpected type when encoding WrothyClass.unbooked"}
+
   def from_map(m) do
     %WrothyClass{
-      aeschynanthus: m["Aeschynanthus"],
-      aquiferous: m["aquiferous"],
-      cheapener: m["cheapener"],
-      enumeration: m["enumeration"],
-      ephesine: m["Ephesine"],
-      escadrille: m["escadrille"],
-      estrous: m["estrous"],
-      interestedly: m["interestedly"],
-      katakinetomer: m["katakinetomer"],
-      mortification: m["mortification"],
-      morula: m["morula"],
-      orthosymmetrical: m["orthosymmetrical"],
-      overbark: m["overbark"],
-      politist: m["politist"],
-      qualified: m["qualified"],
-      sphenomalar: m["sphenomalar"],
-      throatful: m["throatful"],
-      transhumance: m["transhumance"],
-      triandrian: m["triandrian"],
-      unbooked: m["unbooked"],
+      aeschynanthus: decode_aeschynanthus(m["Aeschynanthus"]),
+      aquiferous: decode_aquiferous(m["aquiferous"]),
+      cheapener: decode_cheapener(m["cheapener"]),
+      enumeration: decode_enumeration(m["enumeration"]),
+      ephesine: decode_ephesine(m["Ephesine"]),
+      escadrille: decode_escadrille(m["escadrille"]),
+      estrous: decode_estrous(m["estrous"]),
+      interestedly: decode_interestedly(m["interestedly"]),
+      katakinetomer: decode_katakinetomer(m["katakinetomer"]),
+      mortification: decode_mortification(m["mortification"]),
+      morula: decode_morula(m["morula"]),
+      orthosymmetrical: decode_orthosymmetrical(m["orthosymmetrical"]),
+      overbark: decode_overbark(m["overbark"]),
+      politist: decode_politist(m["politist"]),
+      qualified: decode_qualified(m["qualified"]),
+      sphenomalar: decode_sphenomalar(m["sphenomalar"]),
+      throatful: decode_throatful(m["throatful"]),
+      transhumance: decode_transhumance(m["transhumance"]),
+      triandrian: decode_triandrian(m["triandrian"]),
+      unbooked: decode_unbooked(m["unbooked"]),
     }
   end
 
@@ -1543,6 +2655,12 @@ defmodule TopLevel do
           wrothy: [[nil] | WrothyClass.t()]
         }
 
+  def decode_protrusive(value) when is_list(value), do: value
+  def decode_protrusive(_), do: {:error, "Unexpected type when decoding TopLevel.protrusive"}
+
+  def encode_protrusive(value) when is_list(value), do: value
+  def encode_protrusive(_), do: {:error, "Unexpected type when encoding TopLevel.protrusive"}
+
   def decode_protrusive_element(value) when is_float(value), do: value
   def decode_protrusive_element(value) when is_integer(value), do: value
   def decode_protrusive_element(value) when is_list(value), do: value
@@ -1553,6 +2671,12 @@ defmodule TopLevel do
   def encode_protrusive_element(value) when is_list(value), do: value
   def encode_protrusive_element(_), do: {:error, "Unexpected type when encoding TopLevel.protrusive"}
 
+  def decode_pulpitism(value) when is_list(value), do: value
+  def decode_pulpitism(_), do: {:error, "Unexpected type when decoding TopLevel.pulpitism"}
+
+  def encode_pulpitism(value) when is_list(value), do: value
+  def encode_pulpitism(_), do: {:error, "Unexpected type when encoding TopLevel.pulpitism"}
+
   def decode_pulpitism_element(%{"abnet" => _,"buckhorn" => _,"calciform" => _,"chelophore" => _,"cogitation" => _,"decreeable" => _,"despicable" => _,"isodiazo" => _,"jadedly" => _,"leptochlorite" => _,"nursling" => _,"palamedean" => _,"photoheliograph" => _,"pipewood" => _,"roberd" => _,"statable" => _,"superassume" => _,"syllabe" => _,"toughhead" => _,"underburn" => _,} = value), do: PulpitismClass.from_map(value)
   def decode_pulpitism_element(value) when is_float(value), do: value
   def decode_pulpitism_element(value) when is_integer(value), do: value
@@ -1565,6 +2689,12 @@ defmodule TopLevel do
   def encode_pulpitism_element(value) when is_list(value), do: value
   def encode_pulpitism_element(_), do: {:error, "Unexpected type when encoding TopLevel.pulpitism"}
 
+  def decode_pyodermia(value) when is_list(value), do: value
+  def decode_pyodermia(_), do: {:error, "Unexpected type when decoding TopLevel.pyodermia"}
+
+  def encode_pyodermia(value) when is_list(value), do: value
+  def encode_pyodermia(_), do: {:error, "Unexpected type when encoding TopLevel.pyodermia"}
+
   def decode_pyodermia_element(%{"aphoristically" => _,"apophyllous" => _,"cognize" => _,"dermonosology" => _,"Gyppo" => _,"ither" => _,"juglandaceous" => _,"litho" => _,"macropterous" => _,"photographer" => _,"romancing" => _,"rumness" => _,"somniloquist" => _,"stressfully" => _,"tactically" => _,"tracheophony" => _,"unappositely" => _,"unclothedly" => _,"unimplied" => _,"unsyncopated" => _,} = value), do: PyodermiaClass.from_map(value)
   def decode_pyodermia_element(value) when is_integer(value), do: value
   def decode_pyodermia_element(_), do: {:error, "Unexpected type when decoding TopLevel.pyodermia"}
@@ -1573,6 +2703,12 @@ defmodule TopLevel do
   def encode_pyodermia_element(value) when is_integer(value), do: value
   def encode_pyodermia_element(_), do: {:error, "Unexpected type when encoding TopLevel.pyodermia"}
 
+  def decode_quebrachine(value) when is_list(value), do: value
+  def decode_quebrachine(_), do: {:error, "Unexpected type when decoding TopLevel.quebrachine"}
+
+  def encode_quebrachine(value) when is_list(value), do: value
+  def encode_quebrachine(_), do: {:error, "Unexpected type when encoding TopLevel.quebrachine"}
+
   def decode_quebrachine_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: QuebrachineClass.from_map(value)
   def decode_quebrachine_element(value) when is_boolean(value), do: value
   def decode_quebrachine_element(value) when is_nil(value), do: value
@@ -1583,6 +2719,12 @@ defmodule TopLevel do
   def encode_quebrachine_element(value) when is_nil(value), do: value
   def encode_quebrachine_element(_), do: {:error, "Unexpected type when encoding TopLevel.quebrachine"}
 
+  def decode_querier(value) when is_list(value), do: value
+  def decode_querier(_), do: {:error, "Unexpected type when decoding TopLevel.querier"}
+
+  def encode_querier(value) when is_list(value), do: value
+  def encode_querier(_), do: {:error, "Unexpected type when encoding TopLevel.querier"}
+
   def decode_querier_element(value) when is_boolean(value), do: value
   def decode_querier_element(value) when is_map(value), do: value
   def decode_querier_element(_), do: {:error, "Unexpected type when decoding TopLevel.querier"}
@@ -1591,6 +2733,12 @@ defmodule TopLevel do
   def encode_querier_element(value) when is_map(value), do: value
   def encode_querier_element(_), do: {:error, "Unexpected type when encoding TopLevel.querier"}
 
+  def decode_rebarbative(value) when is_list(value), do: value
+  def decode_rebarbative(_), do: {:error, "Unexpected type when decoding TopLevel.rebarbative"}
+
+  def encode_rebarbative(value) when is_list(value), do: value
+  def encode_rebarbative(_), do: {:error, "Unexpected type when encoding TopLevel.rebarbative"}
+
   def decode_rebarbative_element(value) when is_boolean(value), do: value
   def decode_rebarbative_element(value) when is_float(value), do: value
   def decode_rebarbative_element(value) when is_integer(value), do: value
@@ -1603,6 +2751,18 @@ defmodule TopLevel do
   def encode_rebarbative_element(value) when is_list(value), do: value
   def encode_rebarbative_element(_), do: {:error, "Unexpected type when encoding TopLevel.rebarbative"}
 
+  def decode_reimagine(value) when is_list(value), do: value
+  def decode_reimagine(_), do: {:error, "Unexpected type when decoding TopLevel.reimagine"}
+
+  def encode_reimagine(value) when is_list(value), do: value
+  def encode_reimagine(_), do: {:error, "Unexpected type when encoding TopLevel.reimagine"}
+
+  def decode_retrocervical(value) when is_list(value), do: value
+  def decode_retrocervical(_), do: {:error, "Unexpected type when decoding TopLevel.retrocervical"}
+
+  def encode_retrocervical(value) when is_list(value), do: value
+  def encode_retrocervical(_), do: {:error, "Unexpected type when encoding TopLevel.retrocervical"}
+
   def decode_retrocervical_element(value) when is_integer(value), do: value
   def decode_retrocervical_element(value) when is_list(value), do: value
   def decode_retrocervical_element(_), do: {:error, "Unexpected type when decoding TopLevel.retrocervical"}
@@ -1611,6 +2771,12 @@ defmodule TopLevel do
   def encode_retrocervical_element(value) when is_list(value), do: value
   def encode_retrocervical_element(_), do: {:error, "Unexpected type when encoding TopLevel.retrocervical"}
 
+  def decode_revert(value) when is_list(value), do: value
+  def decode_revert(_), do: {:error, "Unexpected type when decoding TopLevel.revert"}
+
+  def encode_revert(value) when is_list(value), do: value
+  def encode_revert(_), do: {:error, "Unexpected type when encoding TopLevel.revert"}
+
   def decode_revert_element(value) when is_boolean(value), do: value
   def decode_revert_element(value) when is_binary(value), do: value
   def decode_revert_element(_), do: {:error, "Unexpected type when decoding TopLevel.revert"}
@@ -1619,6 +2785,12 @@ defmodule TopLevel do
   def encode_revert_element(value) when is_binary(value), do: value
   def encode_revert_element(_), do: {:error, "Unexpected type when encoding TopLevel.revert"}
 
+  def decode_rewrite(value) when is_list(value), do: value
+  def decode_rewrite(_), do: {:error, "Unexpected type when decoding TopLevel.rewrite"}
+
+  def encode_rewrite(value) when is_list(value), do: value
+  def encode_rewrite(_), do: {:error, "Unexpected type when encoding TopLevel.rewrite"}
+
   def decode_rewrite_element(%{"accountancy" => _,"cacotrophic" => _,"contest" => _,"couthily" => _,"falculate" => _,"foreseize" => _,"Hyades" => _,"lemnad" => _,"monotheistically" => _,"nonflying" => _,"Ptenoglossa" => _,"repatch" => _,"rodman" => _,"strung" => _,"titmal" => _,"twalpennyworth" => _,"unblamable" => _,"vertical" => _,"Whiggification" => _,"yardman" => _,} = value), do: RewriteClass.from_map(value)
   def decode_rewrite_element(value) when is_float(value), do: value
   def decode_rewrite_element(value) when is_integer(value), do: value
@@ -1631,6 +2803,12 @@ defmodule TopLevel do
   def encode_rewrite_element(value) when is_list(value), do: value
   def encode_rewrite_element(_), do: {:error, "Unexpected type when encoding TopLevel.rewrite"}
 
+  def decode_saccoderm(value) when is_list(value), do: value
+  def decode_saccoderm(_), do: {:error, "Unexpected type when decoding TopLevel.saccoderm"}
+
+  def encode_saccoderm(value) when is_list(value), do: value
+  def encode_saccoderm(_), do: {:error, "Unexpected type when encoding TopLevel.saccoderm"}
+
   def decode_saccoderm_element(value) when is_nil(value), do: value
   def decode_saccoderm_element(value) when is_binary(value), do: value
   def decode_saccoderm_element(value) when is_list(value), do: value
@@ -1641,6 +2819,12 @@ defmodule TopLevel do
   def encode_saccoderm_element(value) when is_list(value), do: value
   def encode_saccoderm_element(_), do: {:error, "Unexpected type when encoding TopLevel.saccoderm"}
 
+  def decode_santir(value) when is_list(value), do: value
+  def decode_santir(_), do: {:error, "Unexpected type when decoding TopLevel.santir"}
+
+  def encode_santir(value) when is_list(value), do: value
+  def encode_santir(_), do: {:error, "Unexpected type when encoding TopLevel.santir"}
+
   def decode_santir_element(%{"admiredly" => _,"demicaponier" => _,"epitympanic" => _,"investitor" => _,"lupiform" => _,"monoflagellate" => _,"paleoethnic" => _,"prediscountable" => _,"rhetoricals" => _,"roomth" => _,"saccharose" => _,"septonasal" => _,"serpenticide" => _,"setarious" => _,"spaework" => _,"stylite" => _,"Suessiones" => _,"timelily" => _,"unprofaned" => _,"vorticular" => _,} = value), do: SantirClass.from_map(value)
   def decode_santir_element(value) when is_float(value), do: value
   def decode_santir_element(value) when is_integer(value), do: value
@@ -1651,6 +2835,12 @@ defmodule TopLevel do
   def encode_santir_element(value) when is_integer(value), do: value
   def encode_santir_element(_), do: {:error, "Unexpected type when encoding TopLevel.santir"}
 
+  def decode_saprophilous(value) when is_list(value), do: value
+  def decode_saprophilous(_), do: {:error, "Unexpected type when decoding TopLevel.saprophilous"}
+
+  def encode_saprophilous(value) when is_list(value), do: value
+  def encode_saprophilous(_), do: {:error, "Unexpected type when encoding TopLevel.saprophilous"}
+
   def decode_saprophilous_element(value) when is_nil(value), do: value
   def decode_saprophilous_element(value) when is_binary(value), do: value
   def decode_saprophilous_element(value) when is_map(value), do: value
@@ -1661,6 +2851,12 @@ defmodule TopLevel do
   def encode_saprophilous_element(value) when is_map(value), do: value
   def encode_saprophilous_element(_), do: {:error, "Unexpected type when encoding TopLevel.saprophilous"}
 
+  def decode_saxten(value) when is_list(value), do: value
+  def decode_saxten(_), do: {:error, "Unexpected type when decoding TopLevel.saxten"}
+
+  def encode_saxten(value) when is_list(value), do: value
+  def encode_saxten(_), do: {:error, "Unexpected type when encoding TopLevel.saxten"}
+
   def decode_saxten_element(%{} = value), do: SaxtenClass.from_map(value)
   def decode_saxten_element(value) when is_binary(value), do: value
   def decode_saxten_element(_), do: {:error, "Unexpected type when decoding TopLevel.saxten"}
@@ -1669,6 +2865,12 @@ defmodule TopLevel do
   def encode_saxten_element(value) when is_binary(value), do: value
   def encode_saxten_element(_), do: {:error, "Unexpected type when encoding TopLevel.saxten"}
 
+  def decode_scatty(value) when is_list(value), do: value
+  def decode_scatty(_), do: {:error, "Unexpected type when decoding TopLevel.scatty"}
+
+  def encode_scatty(value) when is_list(value), do: value
+  def encode_scatty(_), do: {:error, "Unexpected type when encoding TopLevel.scatty"}
+
   def decode_scatty_element(%{"aeriferous" => _,"antical" => _,"antighostism" => _,"arcanum" => _,"autotrophy" => _,"baronial" => _,"caffeine" => _,"gorgoniacean" => _,"heroical" => _,"hydropical" => _,"mechanology" => _,"musicopoetic" => _,"officiality" => _,"oftentimes" => _,"ophthalmotonometer" => _,"reflectively" => _,"springer" => _,"Tabasco" => _,"teleianthous" => _,"uncombated" => _,} = value), do: Scatty.from_map(value)
   def decode_scatty_element(value) when is_nil(value), do: value
   def decode_scatty_element(_), do: {:error, "Unexpected type when decoding TopLevel.scatty"}
@@ -1677,6 +2879,12 @@ defmodule TopLevel do
   def encode_scatty_element(value) when is_nil(value), do: value
   def encode_scatty_element(_), do: {:error, "Unexpected type when encoding TopLevel.scatty"}
 
+  def decode_scoffer(value) when is_list(value), do: value
+  def decode_scoffer(_), do: {:error, "Unexpected type when decoding TopLevel.scoffer"}
+
+  def encode_scoffer(value) when is_list(value), do: value
+  def encode_scoffer(_), do: {:error, "Unexpected type when encoding TopLevel.scoffer"}
+
   def decode_scoffer_element(value) when is_nil(value), do: value
   def decode_scoffer_element(value) when is_list(value), do: value
   def decode_scoffer_element(value) when is_map(value), do: value
@@ -1687,6 +2895,12 @@ defmodule TopLevel do
   def encode_scoffer_element(value) when is_map(value), do: value
   def encode_scoffer_element(_), do: {:error, "Unexpected type when encoding TopLevel.scoffer"}
 
+  def decode_scrampum(value) when is_list(value), do: value
+  def decode_scrampum(_), do: {:error, "Unexpected type when decoding TopLevel.scrampum"}
+
+  def encode_scrampum(value) when is_list(value), do: value
+  def encode_scrampum(_), do: {:error, "Unexpected type when encoding TopLevel.scrampum"}
+
   def decode_scrampum_element(value) when is_boolean(value), do: value
   def decode_scrampum_element(value) when is_nil(value), do: value
   def decode_scrampum_element(value) when is_list(value), do: value
@@ -1697,6 +2911,20 @@ defmodule TopLevel do
   def encode_scrampum_element(value) when is_list(value), do: value
   def encode_scrampum_element(_), do: {:error, "Unexpected type when encoding TopLevel.scrampum"}
 
+  def decode_semantic(value) when is_float(value), do: value
+  def decode_semantic(value) when is_integer(value), do: value
+  def decode_semantic(_), do: {:error, "Unexpected type when decoding TopLevel.semantic"}
+
+  def encode_semantic(value) when is_float(value), do: value
+  def encode_semantic(value) when is_integer(value), do: value
+  def encode_semantic(_), do: {:error, "Unexpected type when encoding TopLevel.semantic"}
+
+  def decode_serpentinic(value) when is_list(value), do: value
+  def decode_serpentinic(_), do: {:error, "Unexpected type when decoding TopLevel.serpentinic"}
+
+  def encode_serpentinic(value) when is_list(value), do: value
+  def encode_serpentinic(_), do: {:error, "Unexpected type when encoding TopLevel.serpentinic"}
+
   def decode_serpentinic_element(value) when is_float(value), do: value
   def decode_serpentinic_element(value) when is_integer(value), do: value
   def decode_serpentinic_element(value) when is_list(value), do: value
@@ -1707,6 +2935,12 @@ defmodule TopLevel do
   def encode_serpentinic_element(value) when is_list(value), do: value
   def encode_serpentinic_element(_), do: {:error, "Unexpected type when encoding TopLevel.serpentinic"}
 
+  def decode_shadowable(value) when is_list(value), do: value
+  def decode_shadowable(_), do: {:error, "Unexpected type when decoding TopLevel.shadowable"}
+
+  def encode_shadowable(value) when is_list(value), do: value
+  def encode_shadowable(_), do: {:error, "Unexpected type when encoding TopLevel.shadowable"}
+
   def decode_shadowable_element(value) when is_boolean(value), do: value
   def decode_shadowable_element(value) when is_list(value), do: value
   def decode_shadowable_element(_), do: {:error, "Unexpected type when decoding TopLevel.shadowable"}
@@ -1715,6 +2949,12 @@ defmodule TopLevel do
   def encode_shadowable_element(value) when is_list(value), do: value
   def encode_shadowable_element(_), do: {:error, "Unexpected type when encoding TopLevel.shadowable"}
 
+  def decode_sistering(value) when is_list(value), do: value
+  def decode_sistering(_), do: {:error, "Unexpected type when decoding TopLevel.sistering"}
+
+  def encode_sistering(value) when is_list(value), do: value
+  def encode_sistering(_), do: {:error, "Unexpected type when encoding TopLevel.sistering"}
+
   def decode_sistering_element(%{"amphicarpic" => _,"Chianti" => _,"frigorific" => _,"Haplomi" => _,"hyperkinesis" => _,"laudable" => _,"madwoman" => _,"maimedly" => _,"Micropterygidae" => _,"microrhabdus" => _,"nondense" => _,"phlebemphraxis" => _,"redsear" => _,"schismatical" => _,"tartryl" => _,"unabhorred" => _,"undeliberateness" => _,"unmixable" => _,"untruckling" => _,"vineal" => _,} = value), do: SisteringClass.from_map(value)
   def decode_sistering_element(value) when is_integer(value), do: value
   def decode_sistering_element(value) when is_list(value), do: value
@@ -1725,6 +2965,18 @@ defmodule TopLevel do
   def encode_sistering_element(value) when is_list(value), do: value
   def encode_sistering_element(_), do: {:error, "Unexpected type when encoding TopLevel.sistering"}
 
+  def decode_staghunting(value) when is_list(value), do: value
+  def decode_staghunting(_), do: {:error, "Unexpected type when decoding TopLevel.staghunting"}
+
+  def encode_staghunting(value) when is_list(value), do: value
+  def encode_staghunting(_), do: {:error, "Unexpected type when encoding TopLevel.staghunting"}
+
+  def decode_stagmometer(value) when is_list(value), do: value
+  def decode_stagmometer(_), do: {:error, "Unexpected type when decoding TopLevel.stagmometer"}
+
+  def encode_stagmometer(value) when is_list(value), do: value
+  def encode_stagmometer(_), do: {:error, "Unexpected type when encoding TopLevel.stagmometer"}
+
   def decode_stagmometer_element(value) when is_binary(value), do: value
   def decode_stagmometer_element(value) when is_list(value), do: value
   def decode_stagmometer_element(_), do: {:error, "Unexpected type when decoding TopLevel.stagmometer"}
@@ -1733,6 +2985,12 @@ defmodule TopLevel do
   def encode_stagmometer_element(value) when is_list(value), do: value
   def encode_stagmometer_element(_), do: {:error, "Unexpected type when encoding TopLevel.stagmometer"}
 
+  def decode_stimulability(value) when is_list(value), do: value
+  def decode_stimulability(_), do: {:error, "Unexpected type when decoding TopLevel.stimulability"}
+
+  def encode_stimulability(value) when is_list(value), do: value
+  def encode_stimulability(_), do: {:error, "Unexpected type when encoding TopLevel.stimulability"}
+
   def decode_stimulability_element(value) when is_boolean(value), do: value
   def decode_stimulability_element(value) when is_integer(value), do: value
   def decode_stimulability_element(value) when is_map(value), do: value
@@ -1743,6 +3001,12 @@ defmodule TopLevel do
   def encode_stimulability_element(value) when is_map(value), do: value
   def encode_stimulability_element(_), do: {:error, "Unexpected type when encoding TopLevel.stimulability"}
 
+  def decode_strangleable(value) when is_list(value), do: value
+  def decode_strangleable(_), do: {:error, "Unexpected type when decoding TopLevel.strangleable"}
+
+  def encode_strangleable(value) when is_list(value), do: value
+  def encode_strangleable(_), do: {:error, "Unexpected type when encoding TopLevel.strangleable"}
+
   def decode_strangleable_element(value) when is_float(value), do: value
   def decode_strangleable_element(value) when is_integer(value), do: value
   def decode_strangleable_element(value) when is_list(value), do: value
@@ -1753,6 +3017,12 @@ defmodule TopLevel do
   def encode_strangleable_element(value) when is_list(value), do: value
   def encode_strangleable_element(_), do: {:error, "Unexpected type when encoding TopLevel.strangleable"}
 
+  def decode_strenuosity(value) when is_list(value), do: value
+  def decode_strenuosity(_), do: {:error, "Unexpected type when decoding TopLevel.strenuosity"}
+
+  def encode_strenuosity(value) when is_list(value), do: value
+  def encode_strenuosity(_), do: {:error, "Unexpected type when encoding TopLevel.strenuosity"}
+
   def decode_strenuosity_element(%{} = value), do: StrenuosityClass.from_map(value)
   def decode_strenuosity_element(value) when is_list(value), do: value
   def decode_strenuosity_element(_), do: {:error, "Unexpected type when decoding TopLevel.strenuosity"}
@@ -1761,6 +3031,12 @@ defmodule TopLevel do
   def encode_strenuosity_element(value) when is_list(value), do: value
   def encode_strenuosity_element(_), do: {:error, "Unexpected type when encoding TopLevel.strenuosity"}
 
+  def decode_tabaxir(value) when is_list(value), do: value
+  def decode_tabaxir(_), do: {:error, "Unexpected type when decoding TopLevel.tabaxir"}
+
+  def encode_tabaxir(value) when is_list(value), do: value
+  def encode_tabaxir(_), do: {:error, "Unexpected type when encoding TopLevel.tabaxir"}
+
   def decode_tabaxir_element(value) when is_boolean(value), do: value
   def decode_tabaxir_element(value) when is_float(value), do: value
   def decode_tabaxir_element(value) when is_integer(value), do: value
@@ -1771,6 +3047,12 @@ defmodule TopLevel do
   def encode_tabaxir_element(value) when is_integer(value), do: value
   def encode_tabaxir_element(_), do: {:error, "Unexpected type when encoding TopLevel.tabaxir"}
 
+  def decode_talpiform(value) when is_list(value), do: value
+  def decode_talpiform(_), do: {:error, "Unexpected type when decoding TopLevel.talpiform"}
+
+  def encode_talpiform(value) when is_list(value), do: value
+  def encode_talpiform(_), do: {:error, "Unexpected type when encoding TopLevel.talpiform"}
+
   def decode_talpiform_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: QuebrachineClass.from_map(value)
   def decode_talpiform_element(value) when is_float(value), do: value
   def decode_talpiform_element(value) when is_integer(value), do: value
@@ -1783,6 +3065,12 @@ defmodule TopLevel do
   def encode_talpiform_element(value) when is_nil(value), do: value
   def encode_talpiform_element(_), do: {:error, "Unexpected type when encoding TopLevel.talpiform"}
 
+  def decode_thwack(value) when is_list(value), do: value
+  def decode_thwack(_), do: {:error, "Unexpected type when decoding TopLevel.thwack"}
+
+  def encode_thwack(value) when is_list(value), do: value
+  def encode_thwack(_), do: {:error, "Unexpected type when encoding TopLevel.thwack"}
+
   def decode_thwack_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: QuebrachineClass.from_map(value)
   def decode_thwack_element(value) when is_boolean(value), do: value
   def decode_thwack_element(value) when is_float(value), do: value
@@ -1795,6 +3083,12 @@ defmodule TopLevel do
   def encode_thwack_element(value) when is_integer(value), do: value
   def encode_thwack_element(_), do: {:error, "Unexpected type when encoding TopLevel.thwack"}
 
+  def decode_to(value) when is_list(value), do: value
+  def decode_to(_), do: {:error, "Unexpected type when decoding TopLevel.to"}
+
+  def encode_to(value) when is_list(value), do: value
+  def encode_to(_), do: {:error, "Unexpected type when encoding TopLevel.to"}
+
   def decode_to_element(value) when is_float(value), do: value
   def decode_to_element(value) when is_integer(value), do: value
   def decode_to_element(value) when is_nil(value), do: value
@@ -1805,6 +3099,12 @@ defmodule TopLevel do
   def encode_to_element(value) when is_nil(value), do: value
   def encode_to_element(_), do: {:error, "Unexpected type when encoding TopLevel.to"}
 
+  def decode_tortricine(value) when is_list(value), do: value
+  def decode_tortricine(_), do: {:error, "Unexpected type when decoding TopLevel.tortricine"}
+
+  def encode_tortricine(value) when is_list(value), do: value
+  def encode_tortricine(_), do: {:error, "Unexpected type when encoding TopLevel.tortricine"}
+
   def decode_tortricine_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: QuebrachineClass.from_map(value)
   def decode_tortricine_element(value) when is_list(value), do: value
   def decode_tortricine_element(_), do: {:error, "Unexpected type when decoding TopLevel.tortricine"}
@@ -1813,6 +3113,12 @@ defmodule TopLevel do
   def encode_tortricine_element(value) when is_list(value), do: value
   def encode_tortricine_element(_), do: {:error, "Unexpected type when encoding TopLevel.tortricine"}
 
+  def decode_truantcy(value) when is_list(value), do: value
+  def decode_truantcy(_), do: {:error, "Unexpected type when decoding TopLevel.truantcy"}
+
+  def encode_truantcy(value) when is_list(value), do: value
+  def encode_truantcy(_), do: {:error, "Unexpected type when encoding TopLevel.truantcy"}
+
   def decode_truantcy_element(%{} = value), do: TruantcyClass.from_map(value)
   def decode_truantcy_element(value) when is_boolean(value), do: value
   def decode_truantcy_element(_), do: {:error, "Unexpected type when decoding TopLevel.truantcy"}
@@ -1821,6 +3127,18 @@ defmodule TopLevel do
   def encode_truantcy_element(value) when is_boolean(value), do: value
   def encode_truantcy_element(_), do: {:error, "Unexpected type when encoding TopLevel.truantcy"}
 
+  def decode_turgesce(value) when is_list(value), do: value
+  def decode_turgesce(_), do: {:error, "Unexpected type when decoding TopLevel.turgesce"}
+
+  def encode_turgesce(value) when is_list(value), do: value
+  def encode_turgesce(_), do: {:error, "Unexpected type when encoding TopLevel.turgesce"}
+
+  def decode_unbeginning(value) when is_list(value), do: value
+  def decode_unbeginning(_), do: {:error, "Unexpected type when decoding TopLevel.unbeginning"}
+
+  def encode_unbeginning(value) when is_list(value), do: value
+  def encode_unbeginning(_), do: {:error, "Unexpected type when encoding TopLevel.unbeginning"}
+
   def decode_unbeginning_element(value) when is_binary(value), do: value
   def decode_unbeginning_element(value) when is_list(value), do: value
   def decode_unbeginning_element(value) when is_map(value), do: value
@@ -1831,6 +3149,18 @@ defmodule TopLevel do
   def encode_unbeginning_element(value) when is_map(value), do: value
   def encode_unbeginning_element(_), do: {:error, "Unexpected type when encoding TopLevel.unbeginning"}
 
+  def decode_underdunged(value) when is_list(value), do: value
+  def decode_underdunged(_), do: {:error, "Unexpected type when decoding TopLevel.underdunged"}
+
+  def encode_underdunged(value) when is_list(value), do: value
+  def encode_underdunged(_), do: {:error, "Unexpected type when encoding TopLevel.underdunged"}
+
+  def decode_undesirability(value) when is_list(value), do: value
+  def decode_undesirability(_), do: {:error, "Unexpected type when decoding TopLevel.undesirability"}
+
+  def encode_undesirability(value) when is_list(value), do: value
+  def encode_undesirability(_), do: {:error, "Unexpected type when encoding TopLevel.undesirability"}
+
   def decode_undesirability_element(value) when is_binary(value), do: value
   def decode_undesirability_element(value) when is_list(value), do: value
   def decode_undesirability_element(value) when is_map(value), do: value
@@ -1841,6 +3171,12 @@ defmodule TopLevel do
   def encode_undesirability_element(value) when is_map(value), do: value
   def encode_undesirability_element(_), do: {:error, "Unexpected type when encoding TopLevel.undesirability"}
 
+  def decode_unerasing(value) when is_list(value), do: value
+  def decode_unerasing(_), do: {:error, "Unexpected type when decoding TopLevel.unerasing"}
+
+  def encode_unerasing(value) when is_list(value), do: value
+  def encode_unerasing(_), do: {:error, "Unexpected type when encoding TopLevel.unerasing"}
+
   def decode_unerasing_element(value) when is_integer(value), do: value
   def decode_unerasing_element(value) when is_list(value), do: value
   def decode_unerasing_element(value) when is_map(value), do: value
@@ -1851,6 +3187,12 @@ defmodule TopLevel do
   def encode_unerasing_element(value) when is_map(value), do: value
   def encode_unerasing_element(_), do: {:error, "Unexpected type when encoding TopLevel.unerasing"}
 
+  def decode_unguentarium(value) when is_list(value), do: value
+  def decode_unguentarium(_), do: {:error, "Unexpected type when decoding TopLevel.unguentarium"}
+
+  def encode_unguentarium(value) when is_list(value), do: value
+  def encode_unguentarium(_), do: {:error, "Unexpected type when encoding TopLevel.unguentarium"}
+
   def decode_unguentarium_element(value) when is_integer(value), do: value
   def decode_unguentarium_element(value) when is_nil(value), do: value
   def decode_unguentarium_element(value) when is_list(value), do: value
@@ -1861,6 +3203,12 @@ defmodule TopLevel do
   def encode_unguentarium_element(value) when is_list(value), do: value
   def encode_unguentarium_element(_), do: {:error, "Unexpected type when encoding TopLevel.unguentarium"}
 
+  def decode_unimpeachably(value) when is_list(value), do: value
+  def decode_unimpeachably(_), do: {:error, "Unexpected type when decoding TopLevel.unimpeachably"}
+
+  def encode_unimpeachably(value) when is_list(value), do: value
+  def encode_unimpeachably(_), do: {:error, "Unexpected type when encoding TopLevel.unimpeachably"}
+
   def decode_unimpeachably_element(%{} = value), do: UnimpeachablyClass.from_map(value)
   def decode_unimpeachably_element(value) when is_boolean(value), do: value
   def decode_unimpeachably_element(_), do: {:error, "Unexpected type when decoding TopLevel.unimpeachably"}
@@ -1869,6 +3217,12 @@ defmodule TopLevel do
   def encode_unimpeachably_element(value) when is_boolean(value), do: value
   def encode_unimpeachably_element(_), do: {:error, "Unexpected type when encoding TopLevel.unimpeachably"}
 
+  def decode_unmortgaged(value) when is_list(value), do: value
+  def decode_unmortgaged(_), do: {:error, "Unexpected type when decoding TopLevel.unmortgaged"}
+
+  def encode_unmortgaged(value) when is_list(value), do: value
+  def encode_unmortgaged(_), do: {:error, "Unexpected type when encoding TopLevel.unmortgaged"}
+
   def decode_unmortgaged_element(value) when is_float(value), do: value
   def decode_unmortgaged_element(value) when is_integer(value), do: value
   def decode_unmortgaged_element(value) when is_nil(value), do: value
@@ -1881,6 +3235,12 @@ defmodule TopLevel do
   def encode_unmortgaged_element(value) when is_map(value), do: value
   def encode_unmortgaged_element(_), do: {:error, "Unexpected type when encoding TopLevel.unmortgaged"}
 
+  def decode_unobstructed(value) when is_list(value), do: value
+  def decode_unobstructed(_), do: {:error, "Unexpected type when decoding TopLevel.unobstructed"}
+
+  def encode_unobstructed(value) when is_list(value), do: value
+  def encode_unobstructed(_), do: {:error, "Unexpected type when encoding TopLevel.unobstructed"}
+
   def decode_unobstructed_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: QuebrachineClass.from_map(value)
   def decode_unobstructed_element(value) when is_integer(value), do: value
   def decode_unobstructed_element(value) when is_nil(value), do: value
@@ -1891,6 +3251,12 @@ defmodule TopLevel do
   def encode_unobstructed_element(value) when is_nil(value), do: value
   def encode_unobstructed_element(_), do: {:error, "Unexpected type when encoding TopLevel.unobstructed"}
 
+  def decode_unreceptivity(value) when is_list(value), do: value
+  def decode_unreceptivity(_), do: {:error, "Unexpected type when decoding TopLevel.unreceptivity"}
+
+  def encode_unreceptivity(value) when is_list(value), do: value
+  def encode_unreceptivity(_), do: {:error, "Unexpected type when encoding TopLevel.unreceptivity"}
+
   def decode_unreceptivity_element(value) when is_integer(value), do: value
   def decode_unreceptivity_element(value) when is_binary(value), do: value
   def decode_unreceptivity_element(value) when is_list(value), do: value
@@ -1901,6 +3267,12 @@ defmodule TopLevel do
   def encode_unreceptivity_element(value) when is_list(value), do: value
   def encode_unreceptivity_element(_), do: {:error, "Unexpected type when encoding TopLevel.unreceptivity"}
 
+  def decode_unsatisfactoriness(value) when is_list(value), do: value
+  def decode_unsatisfactoriness(_), do: {:error, "Unexpected type when decoding TopLevel.unsatisfactoriness"}
+
+  def encode_unsatisfactoriness(value) when is_list(value), do: value
+  def encode_unsatisfactoriness(_), do: {:error, "Unexpected type when encoding TopLevel.unsatisfactoriness"}
+
   def decode_unsatisfactoriness_element(value) when is_boolean(value), do: value
   def decode_unsatisfactoriness_element(value) when is_integer(value), do: value
   def decode_unsatisfactoriness_element(value) when is_list(value), do: value
@@ -1911,6 +3283,18 @@ defmodule TopLevel do
   def encode_unsatisfactoriness_element(value) when is_list(value), do: value
   def encode_unsatisfactoriness_element(_), do: {:error, "Unexpected type when encoding TopLevel.unsatisfactoriness"}
 
+  def decode_unsecurity(value) when is_list(value), do: value
+  def decode_unsecurity(_), do: {:error, "Unexpected type when decoding TopLevel.unsecurity"}
+
+  def encode_unsecurity(value) when is_list(value), do: value
+  def encode_unsecurity(_), do: {:error, "Unexpected type when encoding TopLevel.unsecurity"}
+
+  def decode_unstressed(value) when is_list(value), do: value
+  def decode_unstressed(_), do: {:error, "Unexpected type when decoding TopLevel.unstressed"}
+
+  def encode_unstressed(value) when is_list(value), do: value
+  def encode_unstressed(_), do: {:error, "Unexpected type when encoding TopLevel.unstressed"}
+
   def decode_unstressed_element(%{"Alain" => _,"Amphirhina" => _,"antimachinery" => _,"coldish" => _,"crantara" => _,"distinguishing" => _,"elytroposis" => _,"gentianwort" => _,"heliosis" => _,"instrumental" => _,"introinflection" => _,"kala" => _,"Lincolnian" => _,"metad" => _,"Sarcophilus" => _,"swingingly" => _,"unconformity" => _,"undecreed" => _,"venerable" => _,"vowellessness" => _,} = value), do: UnstressedClass.from_map(value)
   def decode_unstressed_element(value) when is_boolean(value), do: value
   def decode_unstressed_element(value) when is_binary(value), do: value
@@ -1921,6 +3305,12 @@ defmodule TopLevel do
   def encode_unstressed_element(value) when is_binary(value), do: value
   def encode_unstressed_element(_), do: {:error, "Unexpected type when encoding TopLevel.unstressed"}
 
+  def decode_untasked(value) when is_list(value), do: value
+  def decode_untasked(_), do: {:error, "Unexpected type when decoding TopLevel.untasked"}
+
+  def encode_untasked(value) when is_list(value), do: value
+  def encode_untasked(_), do: {:error, "Unexpected type when encoding TopLevel.untasked"}
+
   def decode_untasked_element(value) when is_float(value), do: value
   def decode_untasked_element(value) when is_integer(value), do: value
   def decode_untasked_element(value) when is_list(value), do: value
@@ -1933,6 +3323,12 @@ defmodule TopLevel do
   def encode_untasked_element(value) when is_map(value), do: value
   def encode_untasked_element(_), do: {:error, "Unexpected type when encoding TopLevel.untasked"}
 
+  def decode_unvarying(value) when is_list(value), do: value
+  def decode_unvarying(_), do: {:error, "Unexpected type when decoding TopLevel.unvarying"}
+
+  def encode_unvarying(value) when is_list(value), do: value
+  def encode_unvarying(_), do: {:error, "Unexpected type when encoding TopLevel.unvarying"}
+
   def decode_unvarying_element(value) when is_boolean(value), do: value
   def decode_unvarying_element(value) when is_float(value), do: value
   def decode_unvarying_element(value) when is_integer(value), do: value
@@ -1945,6 +3341,12 @@ defmodule TopLevel do
   def encode_unvarying_element(value) when is_map(value), do: value
   def encode_unvarying_element(_), do: {:error, "Unexpected type when encoding TopLevel.unvarying"}
 
+  def decode_vehemently(value) when is_list(value), do: value
+  def decode_vehemently(_), do: {:error, "Unexpected type when decoding TopLevel.vehemently"}
+
+  def encode_vehemently(value) when is_list(value), do: value
+  def encode_vehemently(_), do: {:error, "Unexpected type when encoding TopLevel.vehemently"}
+
   def decode_vehemently_element(value) when is_boolean(value), do: value
   def decode_vehemently_element(value) when is_nil(value), do: value
   def decode_vehemently_element(value) when is_list(value), do: value
@@ -1955,6 +3357,18 @@ defmodule TopLevel do
   def encode_vehemently_element(value) when is_list(value), do: value
   def encode_vehemently_element(_), do: {:error, "Unexpected type when encoding TopLevel.vehemently"}
 
+  def decode_warriorship_value(value) when is_boolean(value), do: value
+  def decode_warriorship_value(_), do: {:error, "Unexpected type when decoding TopLevel.warriorship"}
+
+  def encode_warriorship_value(value) when is_boolean(value), do: value
+  def encode_warriorship_value(_), do: {:error, "Unexpected type when encoding TopLevel.warriorship"}
+
+  def decode_whitepot(value) when is_list(value), do: value
+  def decode_whitepot(_), do: {:error, "Unexpected type when decoding TopLevel.whitepot"}
+
+  def encode_whitepot(value) when is_list(value), do: value
+  def encode_whitepot(_), do: {:error, "Unexpected type when encoding TopLevel.whitepot"}
+
   def decode_whitepot_element(%{"catharticalness" => _,"Chirotherium" => _,"disdiapason" => _,"homocerc" => _,"nonbookish" => _,} = value), do: QuebrachineClass.from_map(value)
   def decode_whitepot_element(value) when is_float(value), do: value
   def decode_whitepot_element(value) when is_integer(value), do: value
@@ -1965,6 +3379,12 @@ defmodule TopLevel do
   def encode_whitepot_element(value) when is_integer(value), do: value
   def encode_whitepot_element(_), do: {:error, "Unexpected type when encoding TopLevel.whitepot"}
 
+  def decode_wrothy(value) when is_list(value), do: value
+  def decode_wrothy(_), do: {:error, "Unexpected type when decoding TopLevel.wrothy"}
+
+  def encode_wrothy(value) when is_list(value), do: value
+  def encode_wrothy(_), do: {:error, "Unexpected type when encoding TopLevel.wrothy"}
+
   def decode_wrothy_element(%{"Aeschynanthus" => _,"aquiferous" => _,"cheapener" => _,"enumeration" => _,"Ephesine" => _,"escadrille" => _,"estrous" => _,"interestedly" => _,"katakinetomer" => _,"mortification" => _,"morula" => _,"orthosymmetrical" => _,"overbark" => _,"politist" => _,"qualified" => _,"sphenomalar" => _,"throatful" => _,"transhumance" => _,"triandrian" => _,"unbooked" => _,} = value), do: WrothyClass.from_map(value)
   def decode_wrothy_element(value) when is_list(value), do: value
   def decode_wrothy_element(_), do: {:error, "Unexpected type when decoding TopLevel.wrothy"}
@@ -1993,7 +3413,7 @@ defmodule TopLevel do
       scatty: Enum.map(m["scatty"], &decode_scatty_element/1),
       scoffer: Enum.map(m["scoffer"], &decode_scoffer_element/1),
       scrampum: Enum.map(m["scrampum"], &decode_scrampum_element/1),
-      semantic: m["semantic"],
+      semantic: decode_semantic(m["semantic"]),
       serpentinic: Enum.map(m["serpentinic"], &decode_serpentinic_element/1),
       shadowable: Enum.map(m["shadowable"], &decode_shadowable_element/1),
       sistering: Enum.map(m["sistering"], &decode_sistering_element/1),
@@ -2008,9 +3428,9 @@ defmodule TopLevel do
       to: Enum.map(m["to"], &decode_to_element/1),
       tortricine: Enum.map(m["tortricine"], &decode_tortricine_element/1),
       truantcy: Enum.map(m["truantcy"], &decode_truantcy_element/1),
-      turgesce: m["turgesce"],
+      turgesce: decode_turgesce(m["turgesce"]),
       unbeginning: Enum.map(m["unbeginning"], &decode_unbeginning_element/1),
-      underdunged: m["underdunged"],
+      underdunged: decode_underdunged(m["underdunged"]),
       undesirability: Enum.map(m["undesirability"], &decode_undesirability_element/1),
       unerasing: Enum.map(m["unerasing"], &decode_unerasing_element/1),
       unguentarium: Enum.map(m["unguentarium"], &decode_unguentarium_element/1),
@@ -2019,12 +3439,13 @@ defmodule TopLevel do
       unobstructed: Enum.map(m["unobstructed"], &decode_unobstructed_element/1),
       unreceptivity: Enum.map(m["unreceptivity"], &decode_unreceptivity_element/1),
       unsatisfactoriness: Enum.map(m["unsatisfactoriness"], &decode_unsatisfactoriness_element/1),
-      unsecurity: m["unsecurity"],
+      unsecurity: decode_unsecurity(m["unsecurity"]),
       unstressed: Enum.map(m["unstressed"], &decode_unstressed_element/1),
       untasked: Enum.map(m["untasked"], &decode_untasked_element/1),
       unvarying: Enum.map(m["unvarying"], &decode_unvarying_element/1),
       vehemently: Enum.map(m["vehemently"], &decode_vehemently_element/1),
-      warriorship: m["warriorship"],
+      warriorship: m["warriorship"]
+      |> Map.new(fn {key, value} -> {key, decode_warriorship_value(value)} end),
       whitepot: Enum.map(m["whitepot"], &decode_whitepot_element/1),
       wrothy: Enum.map(m["wrothy"], &decode_wrothy_element/1),
     }
diff --git a/base/elixir/test/inputs/json/priority/combined-enum.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/combined-enum.json/default/QuickType.ex
index 177db56..9e63fa5 100644
--- a/base/elixir/test/inputs/json/priority/combined-enum.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/combined-enum.json/default/QuickType.ex
@@ -94,6 +94,18 @@ defmodule TopLevel do
           foo: [Bar.t()]
         }
 
+  def decode_bar(value) when is_list(value), do: value
+  def decode_bar(_), do: {:error, "Unexpected type when decoding TopLevel.bar"}
+
+  def encode_bar(value) when is_list(value), do: value
+  def encode_bar(_), do: {:error, "Unexpected type when encoding TopLevel.bar"}
+
+  def decode_foo(value) when is_list(value), do: value
+  def decode_foo(_), do: {:error, "Unexpected type when decoding TopLevel.foo"}
+
+  def encode_foo(value) when is_list(value), do: value
+  def encode_foo(_), do: {:error, "Unexpected type when encoding TopLevel.foo"}
+
   def from_map(m) do
     %TopLevel{
       bar: Enum.map(m["bar"], &Bar.from_map/1),
diff --git a/base/elixir/test/inputs/json/priority/direct-recursive.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/direct-recursive.json/default/QuickType.ex
index 367470d..91734a5 100644
--- a/base/elixir/test/inputs/json/priority/direct-recursive.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/direct-recursive.json/default/QuickType.ex
@@ -17,13 +17,39 @@ defmodule TopLevel do
           quux: String.t()
         }
 
+  def decode_bar(value) when is_boolean(value), do: value
+  def decode_bar(_), do: {:error, "Unexpected type when decoding TopLevel.bar"}
+
+  def encode_bar(value) when is_boolean(value), do: value
+  def encode_bar(_), do: {:error, "Unexpected type when encoding TopLevel.bar"}
+
+  def decode_foo(value) when is_integer(value), do: value
+  def decode_foo(_), do: {:error, "Unexpected type when decoding TopLevel.foo"}
+
+  def encode_foo(value) when is_integer(value), do: value
+  def encode_foo(_), do: {:error, "Unexpected type when encoding TopLevel.foo"}
+
+  def decode_moo(value) when is_float(value), do: value
+  def decode_moo(value) when is_integer(value), do: value
+  def decode_moo(_), do: {:error, "Unexpected type when decoding TopLevel.moo"}
+
+  def encode_moo(value) when is_float(value), do: value
+  def encode_moo(value) when is_integer(value), do: value
+  def encode_moo(_), do: {:error, "Unexpected type when encoding TopLevel.moo"}
+
+  def decode_quux(value) when is_binary(value), do: value
+  def decode_quux(_), do: {:error, "Unexpected type when decoding TopLevel.quux"}
+
+  def encode_quux(value) when is_binary(value), do: value
+  def encode_quux(_), do: {:error, "Unexpected type when encoding TopLevel.quux"}
+
   def from_map(m) do
     %TopLevel{
       also: m["also"] && TopLevel.from_map(m["also"]),
-      bar: m["bar"],
-      foo: m["foo"],
-      moo: m["moo"],
-      quux: m["quux"],
+      bar: decode_bar(m["bar"]),
+      foo: decode_foo(m["foo"]),
+      moo: decode_moo(m["moo"]),
+      quux: decode_quux(m["quux"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/empty-enum.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/empty-enum.json/default/QuickType.ex
index 8572991..2dcdce4 100644
--- a/base/elixir/test/inputs/json/priority/empty-enum.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/empty-enum.json/default/QuickType.ex
@@ -45,6 +45,12 @@ defmodule TopLevel do
           foo: [Foo.t()]
         }
 
+  def decode_foo(value) when is_list(value), do: value
+  def decode_foo(_), do: {:error, "Unexpected type when decoding TopLevel.foo"}
+
+  def encode_foo(value) when is_list(value), do: value
+  def encode_foo(_), do: {:error, "Unexpected type when encoding TopLevel.foo"}
+
   def from_map(m) do
     %TopLevel{
       foo: Enum.map(m["foo"], &Foo.from_map/1),
diff --git a/base/elixir/test/inputs/json/priority/identifiers.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/identifiers.json/default/QuickType.ex
index ea12c18..4b33982 100644
--- a/base/elixir/test/inputs/json/priority/identifiers.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/identifiers.json/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule TopLevelBla do
           bar: integer()
         }
 
+  def decode_bar(value) when is_integer(value), do: value
+  def decode_bar(_), do: {:error, "Unexpected type when decoding TopLevelBla.bar"}
+
+  def encode_bar(value) when is_integer(value), do: value
+  def encode_bar(_), do: {:error, "Unexpected type when encoding TopLevelBla.bar"}
+
   def from_map(m) do
     %TopLevelBla{
-      bar: m["bar"],
+      bar: decode_bar(m["bar"]),
     }
   end
 
@@ -46,9 +52,15 @@ defmodule Empty do
           x: integer()
         }
 
+  def decode_x(value) when is_integer(value), do: value
+  def decode_x(_), do: {:error, "Unexpected type when decoding Empty.x"}
+
+  def encode_x(value) when is_integer(value), do: value
+  def encode_x(_), do: {:error, "Unexpected type when encoding Empty.x"}
+
   def from_map(m) do
     %Empty{
-      x: m["x"],
+      x: decode_x(m["x"]),
     }
   end
 
@@ -110,11 +122,23 @@ defmodule Foo do
           foo: integer()
         }
 
+  def decode_empty(value) when is_integer(value), do: value
+  def decode_empty(_), do: {:error, "Unexpected type when decoding Foo.empty"}
+
+  def encode_empty(value) when is_integer(value), do: value
+  def encode_empty(_), do: {:error, "Unexpected type when encoding Foo.empty"}
+
+  def decode_foo(value) when is_integer(value), do: value
+  def decode_foo(_), do: {:error, "Unexpected type when decoding Foo.foo"}
+
+  def encode_foo(value) when is_integer(value), do: value
+  def encode_foo(_), do: {:error, "Unexpected type when encoding Foo.foo"}
+
   def from_map(m) do
     %Foo{
       bla: FooBla.from_map(m["bla"]),
-      empty: m["_"],
-      foo: m["__"],
+      empty: decode_empty(m["_"]),
+      foo: decode_foo(m["__"]),
     }
   end
 
@@ -148,10 +172,22 @@ defmodule ThisIsAToughOne do
           this_is_a_tough_one: integer()
         }
 
+  def decode_empty(value) when is_integer(value), do: value
+  def decode_empty(_), do: {:error, "Unexpected type when decoding ThisIsAToughOne.empty"}
+
+  def encode_empty(value) when is_integer(value), do: value
+  def encode_empty(_), do: {:error, "Unexpected type when encoding ThisIsAToughOne.empty"}
+
+  def decode_this_is_a_tough_one(value) when is_integer(value), do: value
+  def decode_this_is_a_tough_one(_), do: {:error, "Unexpected type when decoding ThisIsAToughOne.this_is_a_tough_one"}
+
+  def encode_this_is_a_tough_one(value) when is_integer(value), do: value
+  def encode_this_is_a_tough_one(_), do: {:error, "Unexpected type when encoding ThisIsAToughOne.this_is_a_tough_one"}
+
   def from_map(m) do
     %ThisIsAToughOne{
-      empty: m["\n\n\n"],
-      this_is_a_tough_one: m["\""],
+      empty: decode_empty(m["\n\n\n"]),
+      this_is_a_tough_one: decode_this_is_a_tough_one(m["\""]),
     }
   end
 
@@ -183,9 +219,15 @@ defmodule EmptyClass do
           y: integer()
         }
 
+  def decode_y(value) when is_integer(value), do: value
+  def decode_y(_), do: {:error, "Unexpected type when decoding EmptyClass.y"}
+
+  def encode_y(value) when is_integer(value), do: value
+  def encode_y(_), do: {:error, "Unexpected type when encoding EmptyClass.y"}
+
   def from_map(m) do
     %EmptyClass{
-      y: m["y"],
+      y: decode_y(m["y"]),
     }
   end
 
@@ -221,13 +263,19 @@ defmodule TopLevel do
           top_level_empty: EmptyClass.t()
         }
 
+  def decode_top_level(value) when is_integer(value), do: value
+  def decode_top_level(_), do: {:error, "Unexpected type when decoding TopLevel.top_level"}
+
+  def encode_top_level(value) when is_integer(value), do: value
+  def encode_top_level(_), do: {:error, "Unexpected type when encoding TopLevel.top_level"}
+
   def from_map(m) do
     %TopLevel{
       bla: TopLevelBla.from_map(m["bla"]),
       empty: Empty.from_map(m[""]),
       foo: Foo.from_map(m["foo"]),
       this_is_a_tough_one: ThisIsAToughOne.from_map(m["ThisIsA😜Tough\"\n\nOne"]),
-      top_level: m["!"],
+      top_level: decode_top_level(m["!"]),
       top_level_empty: EmptyClass.from_map(m["Empty"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/priority/issue2680-object-array.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/issue2680-object-array.json/default/QuickType.ex
index a23987d..ed1f32d 100644
--- a/base/elixir/test/inputs/json/priority/issue2680-object-array.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/issue2680-object-array.json/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule TopLevelElement do
           key: String.t()
         }
 
+  def decode_key(value) when is_binary(value), do: value
+  def decode_key(_), do: {:error, "Unexpected type when decoding TopLevelElement.key"}
+
+  def encode_key(value) when is_binary(value), do: value
+  def encode_key(_), do: {:error, "Unexpected type when encoding TopLevelElement.key"}
+
   def from_map(m) do
     %TopLevelElement{
-      key: m["key"],
+      key: decode_key(m["key"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/keywords.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/keywords.json/default/QuickType.ex
index c59b492..d651b3f 100644
--- a/base/elixir/test/inputs/json/priority/keywords.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/keywords.json/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule Abstract do
           abstract: integer()
         }
 
+  def decode_abstract(value) when is_integer(value), do: value
+  def decode_abstract(_), do: {:error, "Unexpected type when decoding Abstract.abstract"}
+
+  def encode_abstract(value) when is_integer(value), do: value
+  def encode_abstract(_), do: {:error, "Unexpected type when encoding Abstract.abstract"}
+
   def from_map(m) do
     %Abstract{
-      abstract: m["abstract"],
+      abstract: decode_abstract(m["abstract"]),
     }
   end
 
@@ -46,9 +52,15 @@ defmodule Alignas do
           alignas: integer()
         }
 
+  def decode_alignas(value) when is_integer(value), do: value
+  def decode_alignas(_), do: {:error, "Unexpected type when decoding Alignas.alignas"}
+
+  def encode_alignas(value) when is_integer(value), do: value
+  def encode_alignas(_), do: {:error, "Unexpected type when encoding Alignas.alignas"}
+
   def from_map(m) do
     %Alignas{
-      alignas: m["alignas"],
+      alignas: decode_alignas(m["alignas"]),
     }
   end
 
@@ -79,9 +91,15 @@ defmodule Alignof do
           alignof: integer()
         }
 
+  def decode_alignof(value) when is_integer(value), do: value
+  def decode_alignof(_), do: {:error, "Unexpected type when decoding Alignof.alignof"}
+
+  def encode_alignof(value) when is_integer(value), do: value
+  def encode_alignof(_), do: {:error, "Unexpected type when encoding Alignof.alignof"}
+
   def from_map(m) do
     %Alignof{
-      alignof: m["alignof"],
+      alignof: decode_alignof(m["alignof"]),
     }
   end
 
@@ -112,9 +130,15 @@ defmodule AndEq do
           and_eq: integer()
         }
 
+  def decode_and_eq(value) when is_integer(value), do: value
+  def decode_and_eq(_), do: {:error, "Unexpected type when decoding AndEq.and_eq"}
+
+  def encode_and_eq(value) when is_integer(value), do: value
+  def encode_and_eq(_), do: {:error, "Unexpected type when encoding AndEq.and_eq"}
+
   def from_map(m) do
     %AndEq{
-      and_eq: m["and_eq"],
+      and_eq: decode_and_eq(m["and_eq"]),
     }
   end
 
@@ -145,9 +169,15 @@ defmodule AnyClass do
           any: integer()
         }
 
+  def decode_any(value) when is_integer(value), do: value
+  def decode_any(_), do: {:error, "Unexpected type when decoding AnyClass.any"}
+
+  def encode_any(value) when is_integer(value), do: value
+  def encode_any(_), do: {:error, "Unexpected type when encoding AnyClass.any"}
+
   def from_map(m) do
     %AnyClass{
-      any: m["Any"],
+      any: decode_any(m["Any"]),
     }
   end
 
@@ -178,9 +208,15 @@ defmodule Array do
           array: integer()
         }
 
+  def decode_array(value) when is_integer(value), do: value
+  def decode_array(_), do: {:error, "Unexpected type when decoding Array.array"}
+
+  def encode_array(value) when is_integer(value), do: value
+  def encode_array(_), do: {:error, "Unexpected type when encoding Array.array"}
+
   def from_map(m) do
     %Array{
-      array: m["array"],
+      array: decode_array(m["array"]),
     }
   end
 
@@ -211,9 +247,15 @@ defmodule As do
           as: integer()
         }
 
+  def decode_as(value) when is_integer(value), do: value
+  def decode_as(_), do: {:error, "Unexpected type when decoding As.as"}
+
+  def encode_as(value) when is_integer(value), do: value
+  def encode_as(_), do: {:error, "Unexpected type when encoding As.as"}
+
   def from_map(m) do
     %As{
-      as: m["as"],
+      as: decode_as(m["as"]),
     }
   end
 
@@ -244,9 +286,15 @@ defmodule ASM do
           asm: integer()
         }
 
+  def decode_asm(value) when is_integer(value), do: value
+  def decode_asm(_), do: {:error, "Unexpected type when decoding ASM.asm"}
+
+  def encode_asm(value) when is_integer(value), do: value
+  def encode_asm(_), do: {:error, "Unexpected type when encoding ASM.asm"}
+
   def from_map(m) do
     %ASM{
-      asm: m["asm"],
+      asm: decode_asm(m["asm"]),
     }
   end
 
@@ -277,9 +325,15 @@ defmodule Assert do
           assert: integer()
         }
 
+  def decode_assert(value) when is_integer(value), do: value
+  def decode_assert(_), do: {:error, "Unexpected type when decoding Assert.assert"}
+
+  def encode_assert(value) when is_integer(value), do: value
+  def encode_assert(_), do: {:error, "Unexpected type when encoding Assert.assert"}
+
   def from_map(m) do
     %Assert{
-      assert: m["assert"],
+      assert: decode_assert(m["assert"]),
     }
   end
 
@@ -310,9 +364,15 @@ defmodule Associatedtype do
           associatedtype: integer()
         }
 
+  def decode_associatedtype(value) when is_integer(value), do: value
+  def decode_associatedtype(_), do: {:error, "Unexpected type when decoding Associatedtype.associatedtype"}
+
+  def encode_associatedtype(value) when is_integer(value), do: value
+  def encode_associatedtype(_), do: {:error, "Unexpected type when encoding Associatedtype.associatedtype"}
+
   def from_map(m) do
     %Associatedtype{
-      associatedtype: m["associatedtype"],
+      associatedtype: decode_associatedtype(m["associatedtype"]),
     }
   end
 
@@ -343,9 +403,15 @@ defmodule Associativity do
           associativity: integer()
         }
 
+  def decode_associativity(value) when is_integer(value), do: value
+  def decode_associativity(_), do: {:error, "Unexpected type when decoding Associativity.associativity"}
+
+  def encode_associativity(value) when is_integer(value), do: value
+  def encode_associativity(_), do: {:error, "Unexpected type when encoding Associativity.associativity"}
+
   def from_map(m) do
     %Associativity{
-      associativity: m["associativity"],
+      associativity: decode_associativity(m["associativity"]),
     }
   end
 
@@ -376,9 +442,15 @@ defmodule Async do
           async: integer()
         }
 
+  def decode_async(value) when is_integer(value), do: value
+  def decode_async(_), do: {:error, "Unexpected type when decoding Async.async"}
+
+  def encode_async(value) when is_integer(value), do: value
+  def encode_async(_), do: {:error, "Unexpected type when encoding Async.async"}
+
   def from_map(m) do
     %Async{
-      async: m["async"],
+      async: decode_async(m["async"]),
     }
   end
 
@@ -409,9 +481,15 @@ defmodule Atomic do
           atomic: integer()
         }
 
+  def decode_atomic(value) when is_integer(value), do: value
+  def decode_atomic(_), do: {:error, "Unexpected type when decoding Atomic.atomic"}
+
+  def encode_atomic(value) when is_integer(value), do: value
+  def encode_atomic(_), do: {:error, "Unexpected type when encoding Atomic.atomic"}
+
   def from_map(m) do
     %Atomic{
-      atomic: m["atomic"],
+      atomic: decode_atomic(m["atomic"]),
     }
   end
 
@@ -442,9 +520,15 @@ defmodule AtomicCancel do
           atomic_cancel: integer()
         }
 
+  def decode_atomic_cancel(value) when is_integer(value), do: value
+  def decode_atomic_cancel(_), do: {:error, "Unexpected type when decoding AtomicCancel.atomic_cancel"}
+
+  def encode_atomic_cancel(value) when is_integer(value), do: value
+  def encode_atomic_cancel(_), do: {:error, "Unexpected type when encoding AtomicCancel.atomic_cancel"}
+
   def from_map(m) do
     %AtomicCancel{
-      atomic_cancel: m["atomic_cancel"],
+      atomic_cancel: decode_atomic_cancel(m["atomic_cancel"]),
     }
   end
 
@@ -475,9 +559,15 @@ defmodule AtomicCommit do
           atomic_commit: integer()
         }
 
+  def decode_atomic_commit(value) when is_integer(value), do: value
+  def decode_atomic_commit(_), do: {:error, "Unexpected type when decoding AtomicCommit.atomic_commit"}
+
+  def encode_atomic_commit(value) when is_integer(value), do: value
+  def encode_atomic_commit(_), do: {:error, "Unexpected type when encoding AtomicCommit.atomic_commit"}
+
   def from_map(m) do
     %AtomicCommit{
-      atomic_commit: m["atomic_commit"],
+      atomic_commit: decode_atomic_commit(m["atomic_commit"]),
     }
   end
 
@@ -508,9 +598,15 @@ defmodule AtomicNoexcept do
           atomic_noexcept: integer()
         }
 
+  def decode_atomic_noexcept(value) when is_integer(value), do: value
+  def decode_atomic_noexcept(_), do: {:error, "Unexpected type when decoding AtomicNoexcept.atomic_noexcept"}
+
+  def encode_atomic_noexcept(value) when is_integer(value), do: value
+  def encode_atomic_noexcept(_), do: {:error, "Unexpected type when encoding AtomicNoexcept.atomic_noexcept"}
+
   def from_map(m) do
     %AtomicNoexcept{
-      atomic_noexcept: m["atomic_noexcept"],
+      atomic_noexcept: decode_atomic_noexcept(m["atomic_noexcept"]),
     }
   end
 
@@ -541,9 +637,15 @@ defmodule Auto do
           auto: integer()
         }
 
+  def decode_auto(value) when is_integer(value), do: value
+  def decode_auto(_), do: {:error, "Unexpected type when decoding Auto.auto"}
+
+  def encode_auto(value) when is_integer(value), do: value
+  def encode_auto(_), do: {:error, "Unexpected type when encoding Auto.auto"}
+
   def from_map(m) do
     %Auto{
-      auto: m["auto"],
+      auto: decode_auto(m["auto"]),
     }
   end
 
@@ -574,9 +676,15 @@ defmodule Await do
           await: integer()
         }
 
+  def decode_await(value) when is_integer(value), do: value
+  def decode_await(_), do: {:error, "Unexpected type when decoding Await.await"}
+
+  def encode_await(value) when is_integer(value), do: value
+  def encode_await(_), do: {:error, "Unexpected type when encoding Await.await"}
+
   def from_map(m) do
     %Await{
-      await: m["await"],
+      await: decode_await(m["await"]),
     }
   end
 
@@ -607,9 +715,15 @@ defmodule BaseClass do
           base: integer()
         }
 
+  def decode_base(value) when is_integer(value), do: value
+  def decode_base(_), do: {:error, "Unexpected type when decoding BaseClass.base"}
+
+  def encode_base(value) when is_integer(value), do: value
+  def encode_base(_), do: {:error, "Unexpected type when encoding BaseClass.base"}
+
   def from_map(m) do
     %BaseClass{
-      base: m["base"],
+      base: decode_base(m["base"]),
     }
   end
 
@@ -640,9 +754,15 @@ defmodule Bitand do
           bitand: integer()
         }
 
+  def decode_bitand(value) when is_integer(value), do: value
+  def decode_bitand(_), do: {:error, "Unexpected type when decoding Bitand.bitand"}
+
+  def encode_bitand(value) when is_integer(value), do: value
+  def encode_bitand(_), do: {:error, "Unexpected type when encoding Bitand.bitand"}
+
   def from_map(m) do
     %Bitand{
-      bitand: m["bitand"],
+      bitand: decode_bitand(m["bitand"]),
     }
   end
 
@@ -673,9 +793,15 @@ defmodule Bitor do
           bitor: integer()
         }
 
+  def decode_bitor(value) when is_integer(value), do: value
+  def decode_bitor(_), do: {:error, "Unexpected type when decoding Bitor.bitor"}
+
+  def encode_bitor(value) when is_integer(value), do: value
+  def encode_bitor(_), do: {:error, "Unexpected type when encoding Bitor.bitor"}
+
   def from_map(m) do
     %Bitor{
-      bitor: m["bitor"],
+      bitor: decode_bitor(m["bitor"]),
     }
   end
 
@@ -706,9 +832,15 @@ defmodule Bool do
           bool: integer()
         }
 
+  def decode_bool(value) when is_integer(value), do: value
+  def decode_bool(_), do: {:error, "Unexpected type when decoding Bool.bool"}
+
+  def encode_bool(value) when is_integer(value), do: value
+  def encode_bool(_), do: {:error, "Unexpected type when encoding Bool.bool"}
+
   def from_map(m) do
     %Bool{
-      bool: m["BOOL"],
+      bool: decode_bool(m["BOOL"]),
     }
   end
 
@@ -739,9 +871,15 @@ defmodule Obj1Bool do
           bool: integer()
         }
 
+  def decode_bool(value) when is_integer(value), do: value
+  def decode_bool(_), do: {:error, "Unexpected type when decoding Obj1Bool.bool"}
+
+  def encode_bool(value) when is_integer(value), do: value
+  def encode_bool(_), do: {:error, "Unexpected type when encoding Obj1Bool.bool"}
+
   def from_map(m) do
     %Obj1Bool{
-      bool: m["bool"],
+      bool: decode_bool(m["bool"]),
     }
   end
 
@@ -772,9 +910,15 @@ defmodule Boolean do
           boolean: integer()
         }
 
+  def decode_boolean(value) when is_integer(value), do: value
+  def decode_boolean(_), do: {:error, "Unexpected type when decoding Boolean.boolean"}
+
+  def encode_boolean(value) when is_integer(value), do: value
+  def encode_boolean(_), do: {:error, "Unexpected type when encoding Boolean.boolean"}
+
   def from_map(m) do
     %Boolean{
-      boolean: m["boolean"],
+      boolean: decode_boolean(m["boolean"]),
     }
   end
 
@@ -805,9 +949,15 @@ defmodule Break do
           break: integer()
         }
 
+  def decode_break(value) when is_integer(value), do: value
+  def decode_break(_), do: {:error, "Unexpected type when decoding Break.break"}
+
+  def encode_break(value) when is_integer(value), do: value
+  def encode_break(_), do: {:error, "Unexpected type when encoding Break.break"}
+
   def from_map(m) do
     %Break{
-      break: m["break"],
+      break: decode_break(m["break"]),
     }
   end
 
@@ -838,9 +988,15 @@ defmodule Bycopy do
           bycopy: integer()
         }
 
+  def decode_bycopy(value) when is_integer(value), do: value
+  def decode_bycopy(_), do: {:error, "Unexpected type when decoding Bycopy.bycopy"}
+
+  def encode_bycopy(value) when is_integer(value), do: value
+  def encode_bycopy(_), do: {:error, "Unexpected type when encoding Bycopy.bycopy"}
+
   def from_map(m) do
     %Bycopy{
-      bycopy: m["bycopy"],
+      bycopy: decode_bycopy(m["bycopy"]),
     }
   end
 
@@ -871,9 +1027,15 @@ defmodule Byref do
           byref: integer()
         }
 
+  def decode_byref(value) when is_integer(value), do: value
+  def decode_byref(_), do: {:error, "Unexpected type when decoding Byref.byref"}
+
+  def encode_byref(value) when is_integer(value), do: value
+  def encode_byref(_), do: {:error, "Unexpected type when encoding Byref.byref"}
+
   def from_map(m) do
     %Byref{
-      byref: m["byref"],
+      byref: decode_byref(m["byref"]),
     }
   end
 
@@ -904,9 +1066,15 @@ defmodule Byte do
           byte: integer()
         }
 
+  def decode_byte(value) when is_integer(value), do: value
+  def decode_byte(_), do: {:error, "Unexpected type when decoding Byte.byte"}
+
+  def encode_byte(value) when is_integer(value), do: value
+  def encode_byte(_), do: {:error, "Unexpected type when encoding Byte.byte"}
+
   def from_map(m) do
     %Byte{
-      byte: m["byte"],
+      byte: decode_byte(m["byte"]),
     }
   end
 
@@ -937,9 +1105,15 @@ defmodule Case do
           case: integer()
         }
 
+  def decode_case(value) when is_integer(value), do: value
+  def decode_case(_), do: {:error, "Unexpected type when decoding Case.case"}
+
+  def encode_case(value) when is_integer(value), do: value
+  def encode_case(_), do: {:error, "Unexpected type when encoding Case.case"}
+
   def from_map(m) do
     %Case{
-      case: m["case"],
+      case: decode_case(m["case"]),
     }
   end
 
@@ -970,9 +1144,15 @@ defmodule Chan do
           chan: integer()
         }
 
+  def decode_chan(value) when is_integer(value), do: value
+  def decode_chan(_), do: {:error, "Unexpected type when decoding Chan.chan"}
+
+  def encode_chan(value) when is_integer(value), do: value
+  def encode_chan(_), do: {:error, "Unexpected type when encoding Chan.chan"}
+
   def from_map(m) do
     %Chan{
-      chan: m["chan"],
+      chan: decode_chan(m["chan"]),
     }
   end
 
@@ -1003,9 +1183,15 @@ defmodule Char do
           char: integer()
         }
 
+  def decode_char(value) when is_integer(value), do: value
+  def decode_char(_), do: {:error, "Unexpected type when decoding Char.char"}
+
+  def encode_char(value) when is_integer(value), do: value
+  def encode_char(_), do: {:error, "Unexpected type when encoding Char.char"}
+
   def from_map(m) do
     %Char{
-      char: m["char"],
+      char: decode_char(m["char"]),
     }
   end
 
@@ -1036,9 +1222,15 @@ defmodule Char16T do
           char16_t: integer()
         }
 
+  def decode_char16_t(value) when is_integer(value), do: value
+  def decode_char16_t(_), do: {:error, "Unexpected type when decoding Char16T.char16_t"}
+
+  def encode_char16_t(value) when is_integer(value), do: value
+  def encode_char16_t(_), do: {:error, "Unexpected type when encoding Char16T.char16_t"}
+
   def from_map(m) do
     %Char16T{
-      char16_t: m["char16_t"],
+      char16_t: decode_char16_t(m["char16_t"]),
     }
   end
 
@@ -1069,9 +1261,15 @@ defmodule Char32T do
           char32_t: integer()
         }
 
+  def decode_char32_t(value) when is_integer(value), do: value
+  def decode_char32_t(_), do: {:error, "Unexpected type when decoding Char32T.char32_t"}
+
+  def encode_char32_t(value) when is_integer(value), do: value
+  def encode_char32_t(_), do: {:error, "Unexpected type when encoding Char32T.char32_t"}
+
   def from_map(m) do
     %Char32T{
-      char32_t: m["char32_t"],
+      char32_t: decode_char32_t(m["char32_t"]),
     }
   end
 
@@ -1102,9 +1300,15 @@ defmodule Checked do
           checked: integer()
         }
 
+  def decode_checked(value) when is_integer(value), do: value
+  def decode_checked(_), do: {:error, "Unexpected type when decoding Checked.checked"}
+
+  def encode_checked(value) when is_integer(value), do: value
+  def encode_checked(_), do: {:error, "Unexpected type when encoding Checked.checked"}
+
   def from_map(m) do
     %Checked{
-      checked: m["checked"],
+      checked: decode_checked(m["checked"]),
     }
   end
 
@@ -1135,9 +1339,15 @@ defmodule Class do
           class: integer()
         }
 
+  def decode_class(value) when is_integer(value), do: value
+  def decode_class(_), do: {:error, "Unexpected type when decoding Class.class"}
+
+  def encode_class(value) when is_integer(value), do: value
+  def encode_class(_), do: {:error, "Unexpected type when encoding Class.class"}
+
   def from_map(m) do
     %Class{
-      class: m["Class"],
+      class: decode_class(m["Class"]),
     }
   end
 
@@ -1168,9 +1378,15 @@ defmodule Clone do
           clone: integer()
         }
 
+  def decode_clone(value) when is_integer(value), do: value
+  def decode_clone(_), do: {:error, "Unexpected type when decoding Clone.clone"}
+
+  def encode_clone(value) when is_integer(value), do: value
+  def encode_clone(_), do: {:error, "Unexpected type when encoding Clone.clone"}
+
   def from_map(m) do
     %Clone{
-      clone: m["clone"],
+      clone: decode_clone(m["clone"]),
     }
   end
 
@@ -1201,9 +1417,15 @@ defmodule CoAwait do
           co_await: integer()
         }
 
+  def decode_co_await(value) when is_integer(value), do: value
+  def decode_co_await(_), do: {:error, "Unexpected type when decoding CoAwait.co_await"}
+
+  def encode_co_await(value) when is_integer(value), do: value
+  def encode_co_await(_), do: {:error, "Unexpected type when encoding CoAwait.co_await"}
+
   def from_map(m) do
     %CoAwait{
-      co_await: m["co_await"],
+      co_await: decode_co_await(m["co_await"]),
     }
   end
 
@@ -1234,9 +1456,15 @@ defmodule CoReturn do
           co_return: integer()
         }
 
+  def decode_co_return(value) when is_integer(value), do: value
+  def decode_co_return(_), do: {:error, "Unexpected type when decoding CoReturn.co_return"}
+
+  def encode_co_return(value) when is_integer(value), do: value
+  def encode_co_return(_), do: {:error, "Unexpected type when encoding CoReturn.co_return"}
+
   def from_map(m) do
     %CoReturn{
-      co_return: m["co_return"],
+      co_return: decode_co_return(m["co_return"]),
     }
   end
 
@@ -1267,9 +1495,15 @@ defmodule CoYield do
           co_yield: integer()
         }
 
+  def decode_co_yield(value) when is_integer(value), do: value
+  def decode_co_yield(_), do: {:error, "Unexpected type when decoding CoYield.co_yield"}
+
+  def encode_co_yield(value) when is_integer(value), do: value
+  def encode_co_yield(_), do: {:error, "Unexpected type when encoding CoYield.co_yield"}
+
   def from_map(m) do
     %CoYield{
-      co_yield: m["co_yield"],
+      co_yield: decode_co_yield(m["co_yield"]),
     }
   end
 
@@ -1300,9 +1534,15 @@ defmodule Compl do
           compl: integer()
         }
 
+  def decode_compl(value) when is_integer(value), do: value
+  def decode_compl(_), do: {:error, "Unexpected type when decoding Compl.compl"}
+
+  def encode_compl(value) when is_integer(value), do: value
+  def encode_compl(_), do: {:error, "Unexpected type when encoding Compl.compl"}
+
   def from_map(m) do
     %Compl{
-      compl: m["compl"],
+      compl: decode_compl(m["compl"]),
     }
   end
 
@@ -1333,9 +1573,15 @@ defmodule Complex do
           complex: integer()
         }
 
+  def decode_complex(value) when is_integer(value), do: value
+  def decode_complex(_), do: {:error, "Unexpected type when decoding Complex.complex"}
+
+  def encode_complex(value) when is_integer(value), do: value
+  def encode_complex(_), do: {:error, "Unexpected type when encoding Complex.complex"}
+
   def from_map(m) do
     %Complex{
-      complex: m["_Complex"],
+      complex: decode_complex(m["_Complex"]),
     }
   end
 
@@ -1366,9 +1612,15 @@ defmodule Concept do
           concept: integer()
         }
 
+  def decode_concept(value) when is_integer(value), do: value
+  def decode_concept(_), do: {:error, "Unexpected type when decoding Concept.concept"}
+
+  def encode_concept(value) when is_integer(value), do: value
+  def encode_concept(_), do: {:error, "Unexpected type when encoding Concept.concept"}
+
   def from_map(m) do
     %Concept{
-      concept: m["concept"],
+      concept: decode_concept(m["concept"]),
     }
   end
 
@@ -1399,9 +1651,15 @@ defmodule Console do
           console: integer()
         }
 
+  def decode_console(value) when is_integer(value), do: value
+  def decode_console(_), do: {:error, "Unexpected type when decoding Console.console"}
+
+  def encode_console(value) when is_integer(value), do: value
+  def encode_console(_), do: {:error, "Unexpected type when encoding Console.console"}
+
   def from_map(m) do
     %Console{
-      console: m["console"],
+      console: decode_console(m["console"]),
     }
   end
 
@@ -1432,9 +1690,15 @@ defmodule Const do
           const: integer()
         }
 
+  def decode_const(value) when is_integer(value), do: value
+  def decode_const(_), do: {:error, "Unexpected type when decoding Const.const"}
+
+  def encode_const(value) when is_integer(value), do: value
+  def encode_const(_), do: {:error, "Unexpected type when encoding Const.const"}
+
   def from_map(m) do
     %Const{
-      const: m["const"],
+      const: decode_const(m["const"]),
     }
   end
 
@@ -1465,9 +1729,15 @@ defmodule ConstCast do
           const_cast: integer()
         }
 
+  def decode_const_cast(value) when is_integer(value), do: value
+  def decode_const_cast(_), do: {:error, "Unexpected type when decoding ConstCast.const_cast"}
+
+  def encode_const_cast(value) when is_integer(value), do: value
+  def encode_const_cast(_), do: {:error, "Unexpected type when encoding ConstCast.const_cast"}
+
   def from_map(m) do
     %ConstCast{
-      const_cast: m["const_cast"],
+      const_cast: decode_const_cast(m["const_cast"]),
     }
   end
 
@@ -1498,9 +1768,15 @@ defmodule Constexpr do
           constexpr: integer()
         }
 
+  def decode_constexpr(value) when is_integer(value), do: value
+  def decode_constexpr(_), do: {:error, "Unexpected type when decoding Constexpr.constexpr"}
+
+  def encode_constexpr(value) when is_integer(value), do: value
+  def encode_constexpr(_), do: {:error, "Unexpected type when encoding Constexpr.constexpr"}
+
   def from_map(m) do
     %Constexpr{
-      constexpr: m["constexpr"],
+      constexpr: decode_constexpr(m["constexpr"]),
     }
   end
 
@@ -1531,9 +1807,15 @@ defmodule Constructor do
           constructor: integer()
         }
 
+  def decode_constructor(value) when is_integer(value), do: value
+  def decode_constructor(_), do: {:error, "Unexpected type when decoding Constructor.constructor"}
+
+  def encode_constructor(value) when is_integer(value), do: value
+  def encode_constructor(_), do: {:error, "Unexpected type when encoding Constructor.constructor"}
+
   def from_map(m) do
     %Constructor{
-      constructor: m["constructor"],
+      constructor: decode_constructor(m["constructor"]),
     }
   end
 
@@ -1564,9 +1846,15 @@ defmodule Continue do
           continue: integer()
         }
 
+  def decode_continue(value) when is_integer(value), do: value
+  def decode_continue(_), do: {:error, "Unexpected type when decoding Continue.continue"}
+
+  def encode_continue(value) when is_integer(value), do: value
+  def encode_continue(_), do: {:error, "Unexpected type when encoding Continue.continue"}
+
   def from_map(m) do
     %Continue{
-      continue: m["continue"],
+      continue: decode_continue(m["continue"]),
     }
   end
 
@@ -1597,9 +1885,15 @@ defmodule Convenience do
           convenience: integer()
         }
 
+  def decode_convenience(value) when is_integer(value), do: value
+  def decode_convenience(_), do: {:error, "Unexpected type when decoding Convenience.convenience"}
+
+  def encode_convenience(value) when is_integer(value), do: value
+  def encode_convenience(_), do: {:error, "Unexpected type when encoding Convenience.convenience"}
+
   def from_map(m) do
     %Convenience{
-      convenience: m["convenience"],
+      convenience: decode_convenience(m["convenience"]),
     }
   end
 
@@ -1630,9 +1924,15 @@ defmodule Convert do
           convert: integer()
         }
 
+  def decode_convert(value) when is_integer(value), do: value
+  def decode_convert(_), do: {:error, "Unexpected type when decoding Convert.convert"}
+
+  def encode_convert(value) when is_integer(value), do: value
+  def encode_convert(_), do: {:error, "Unexpected type when encoding Convert.convert"}
+
   def from_map(m) do
     %Convert{
-      convert: m["convert"],
+      convert: decode_convert(m["convert"]),
     }
   end
 
@@ -1663,9 +1963,15 @@ defmodule Converter do
           converter: integer()
         }
 
+  def decode_converter(value) when is_integer(value), do: value
+  def decode_converter(_), do: {:error, "Unexpected type when decoding Converter.converter"}
+
+  def encode_converter(value) when is_integer(value), do: value
+  def encode_converter(_), do: {:error, "Unexpected type when encoding Converter.converter"}
+
   def from_map(m) do
     %Converter{
-      converter: m["converter"],
+      converter: decode_converter(m["converter"]),
     }
   end
 
@@ -1696,9 +2002,15 @@ defmodule DateClass do
           date: integer()
         }
 
+  def decode_date(value) when is_integer(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding DateClass.date"}
+
+  def encode_date(value) when is_integer(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding DateClass.date"}
+
   def from_map(m) do
     %DateClass{
-      date: m["date"],
+      date: decode_date(m["date"]),
     }
   end
 
@@ -1729,9 +2041,15 @@ defmodule DateParseHandling do
           date_parse_handling: integer()
         }
 
+  def decode_date_parse_handling(value) when is_integer(value), do: value
+  def decode_date_parse_handling(_), do: {:error, "Unexpected type when decoding DateParseHandling.date_parse_handling"}
+
+  def encode_date_parse_handling(value) when is_integer(value), do: value
+  def encode_date_parse_handling(_), do: {:error, "Unexpected type when encoding DateParseHandling.date_parse_handling"}
+
   def from_map(m) do
     %DateParseHandling{
-      date_parse_handling: m["date_parse_handling"],
+      date_parse_handling: decode_date_parse_handling(m["date_parse_handling"]),
     }
   end
 
@@ -1762,9 +2080,15 @@ defmodule Debugger do
           debugger: integer()
         }
 
+  def decode_debugger(value) when is_integer(value), do: value
+  def decode_debugger(_), do: {:error, "Unexpected type when decoding Debugger.debugger"}
+
+  def encode_debugger(value) when is_integer(value), do: value
+  def encode_debugger(_), do: {:error, "Unexpected type when encoding Debugger.debugger"}
+
   def from_map(m) do
     %Debugger{
-      debugger: m["debugger"],
+      debugger: decode_debugger(m["debugger"]),
     }
   end
 
@@ -1795,9 +2119,15 @@ defmodule Decimal do
           decimal: integer()
         }
 
+  def decode_decimal(value) when is_integer(value), do: value
+  def decode_decimal(_), do: {:error, "Unexpected type when decoding Decimal.decimal"}
+
+  def encode_decimal(value) when is_integer(value), do: value
+  def encode_decimal(_), do: {:error, "Unexpected type when encoding Decimal.decimal"}
+
   def from_map(m) do
     %Decimal{
-      decimal: m["decimal"],
+      decimal: decode_decimal(m["decimal"]),
     }
   end
 
@@ -1828,9 +2158,15 @@ defmodule Declare do
           declare: integer()
         }
 
+  def decode_declare(value) when is_integer(value), do: value
+  def decode_declare(_), do: {:error, "Unexpected type when decoding Declare.declare"}
+
+  def encode_declare(value) when is_integer(value), do: value
+  def encode_declare(_), do: {:error, "Unexpected type when encoding Declare.declare"}
+
   def from_map(m) do
     %Declare{
-      declare: m["declare"],
+      declare: decode_declare(m["declare"]),
     }
   end
 
@@ -1861,9 +2197,15 @@ defmodule Decltype do
           decltype: integer()
         }
 
+  def decode_decltype(value) when is_integer(value), do: value
+  def decode_decltype(_), do: {:error, "Unexpected type when decoding Decltype.decltype"}
+
+  def encode_decltype(value) when is_integer(value), do: value
+  def encode_decltype(_), do: {:error, "Unexpected type when encoding Decltype.decltype"}
+
   def from_map(m) do
     %Decltype{
-      decltype: m["decltype"],
+      decltype: decode_decltype(m["decltype"]),
     }
   end
 
@@ -1894,9 +2236,15 @@ defmodule DecodeString do
           decode_string: integer()
         }
 
+  def decode_decode_string(value) when is_integer(value), do: value
+  def decode_decode_string(_), do: {:error, "Unexpected type when decoding DecodeString.decode_string"}
+
+  def encode_decode_string(value) when is_integer(value), do: value
+  def encode_decode_string(_), do: {:error, "Unexpected type when encoding DecodeString.decode_string"}
+
   def from_map(m) do
     %DecodeString{
-      decode_string: m["decode_string"],
+      decode_string: decode_decode_string(m["decode_string"]),
     }
   end
 
@@ -1927,9 +2275,15 @@ defmodule Empty do
           empty: integer()
         }
 
+  def decode_empty(value) when is_integer(value), do: value
+  def decode_empty(_), do: {:error, "Unexpected type when decoding Empty.empty"}
+
+  def encode_empty(value) when is_integer(value), do: value
+  def encode_empty(_), do: {:error, "Unexpected type when encoding Empty.empty"}
+
   def from_map(m) do
     %Empty{
-      empty: m["_"],
+      empty: decode_empty(m["_"]),
     }
   end
 
@@ -1960,9 +2314,15 @@ defmodule Imaginery do
           imaginery: integer()
         }
 
+  def decode_imaginery(value) when is_integer(value), do: value
+  def decode_imaginery(_), do: {:error, "Unexpected type when decoding Imaginery.imaginery"}
+
+  def encode_imaginery(value) when is_integer(value), do: value
+  def encode_imaginery(_), do: {:error, "Unexpected type when encoding Imaginery.imaginery"}
+
   def from_map(m) do
     %Imaginery{
-      imaginery: m["_Imaginery"],
+      imaginery: decode_imaginery(m["_Imaginery"]),
     }
   end
 
@@ -1993,9 +2353,15 @@ defmodule AndClass do
           and_and: integer()
         }
 
+  def decode_and_and(value) when is_integer(value), do: value
+  def decode_and_and(_), do: {:error, "Unexpected type when decoding AndClass.and_and"}
+
+  def encode_and_and(value) when is_integer(value), do: value
+  def encode_and_and(_), do: {:error, "Unexpected type when encoding AndClass.and_and"}
+
   def from_map(m) do
     %AndClass{
-      and_and: m["and"],
+      and_and: decode_and_and(m["and"]),
     }
   end
 
@@ -2026,9 +2392,15 @@ defmodule Obj1Any do
           any: integer()
         }
 
+  def decode_any(value) when is_integer(value), do: value
+  def decode_any(_), do: {:error, "Unexpected type when decoding Obj1Any.any"}
+
+  def encode_any(value) when is_integer(value), do: value
+  def encode_any(_), do: {:error, "Unexpected type when encoding Obj1Any.any"}
+
   def from_map(m) do
     %Obj1Any{
-      any: m["any"],
+      any: decode_any(m["any"]),
     }
   end
 
@@ -2059,9 +2431,15 @@ defmodule BoolClass do
           bool: integer()
         }
 
+  def decode_bool(value) when is_integer(value), do: value
+  def decode_bool(_), do: {:error, "Unexpected type when decoding BoolClass.bool"}
+
+  def encode_bool(value) when is_integer(value), do: value
+  def encode_bool(_), do: {:error, "Unexpected type when encoding BoolClass.bool"}
+
   def from_map(m) do
     %BoolClass{
-      bool: m["_Bool"],
+      bool: decode_bool(m["_Bool"]),
     }
   end
 
@@ -2092,9 +2470,15 @@ defmodule CatchClass do
           catch_catch: integer()
         }
 
+  def decode_catch_catch(value) when is_integer(value), do: value
+  def decode_catch_catch(_), do: {:error, "Unexpected type when decoding CatchClass.catch_catch"}
+
+  def encode_catch_catch(value) when is_integer(value), do: value
+  def encode_catch_catch(_), do: {:error, "Unexpected type when encoding CatchClass.catch_catch"}
+
   def from_map(m) do
     %CatchClass{
-      catch_catch: m["catch"],
+      catch_catch: decode_catch_catch(m["catch"]),
     }
   end
 
@@ -2125,9 +2509,15 @@ defmodule ClassClass do
           class: integer()
         }
 
+  def decode_class(value) when is_integer(value), do: value
+  def decode_class(_), do: {:error, "Unexpected type when decoding ClassClass.class"}
+
+  def encode_class(value) when is_integer(value), do: value
+  def encode_class(_), do: {:error, "Unexpected type when encoding ClassClass.class"}
+
   def from_map(m) do
     %ClassClass{
-      class: m["class"],
+      class: decode_class(m["class"]),
     }
   end
 
@@ -2223,6 +2613,12 @@ defmodule Obj1 do
           obj1_class: ClassClass.t()
         }
 
+  def decode_dummy(value) when is_integer(value), do: value
+  def decode_dummy(_), do: {:error, "Unexpected type when decoding Obj1.dummy"}
+
+  def encode_dummy(value) when is_integer(value), do: value
+  def encode_dummy(_), do: {:error, "Unexpected type when encoding Obj1.dummy"}
+
   def from_map(m) do
     %Obj1{
       abstract: Abstract.from_map(m["abstract"]),
@@ -2283,7 +2679,7 @@ defmodule Obj1 do
       declare: Declare.from_map(m["declare"]),
       decltype: Decltype.from_map(m["decltype"]),
       decode_string: DecodeString.from_map(m["decode_string"]),
-      dummy: m["dummy"],
+      dummy: decode_dummy(m["dummy"]),
       empty: Empty.from_map(m["_"]),
       imaginery: Imaginery.from_map(m["_Imaginery"]),
       obj1_and: AndClass.from_map(m["and"]),
@@ -2386,9 +2782,15 @@ defmodule Default do
           default: integer()
         }
 
+  def decode_default(value) when is_integer(value), do: value
+  def decode_default(_), do: {:error, "Unexpected type when decoding Default.default"}
+
+  def encode_default(value) when is_integer(value), do: value
+  def encode_default(_), do: {:error, "Unexpected type when encoding Default.default"}
+
   def from_map(m) do
     %Default{
-      default: m["default"],
+      default: decode_default(m["default"]),
     }
   end
 
@@ -2419,9 +2821,15 @@ defmodule Defer do
           defer: integer()
         }
 
+  def decode_defer(value) when is_integer(value), do: value
+  def decode_defer(_), do: {:error, "Unexpected type when decoding Defer.defer"}
+
+  def encode_defer(value) when is_integer(value), do: value
+  def encode_defer(_), do: {:error, "Unexpected type when encoding Defer.defer"}
+
   def from_map(m) do
     %Defer{
-      defer: m["defer"],
+      defer: decode_defer(m["defer"]),
     }
   end
 
@@ -2452,9 +2860,15 @@ defmodule Deinit do
           deinit: integer()
         }
 
+  def decode_deinit(value) when is_integer(value), do: value
+  def decode_deinit(_), do: {:error, "Unexpected type when decoding Deinit.deinit"}
+
+  def encode_deinit(value) when is_integer(value), do: value
+  def encode_deinit(_), do: {:error, "Unexpected type when encoding Deinit.deinit"}
+
   def from_map(m) do
     %Deinit{
-      deinit: m["deinit"],
+      deinit: decode_deinit(m["deinit"]),
     }
   end
 
@@ -2485,9 +2899,15 @@ defmodule Del do
           del: integer()
         }
 
+  def decode_del(value) when is_integer(value), do: value
+  def decode_del(_), do: {:error, "Unexpected type when decoding Del.del"}
+
+  def encode_del(value) when is_integer(value), do: value
+  def encode_del(_), do: {:error, "Unexpected type when encoding Del.del"}
+
   def from_map(m) do
     %Del{
-      del: m["del"],
+      del: decode_del(m["del"]),
     }
   end
 
@@ -2518,9 +2938,15 @@ defmodule Delegate do
           delegate: integer()
         }
 
+  def decode_delegate(value) when is_integer(value), do: value
+  def decode_delegate(_), do: {:error, "Unexpected type when decoding Delegate.delegate"}
+
+  def encode_delegate(value) when is_integer(value), do: value
+  def encode_delegate(_), do: {:error, "Unexpected type when encoding Delegate.delegate"}
+
   def from_map(m) do
     %Delegate{
-      delegate: m["delegate"],
+      delegate: decode_delegate(m["delegate"]),
     }
   end
 
@@ -2551,9 +2977,15 @@ defmodule Delete do
           delete: integer()
         }
 
+  def decode_delete(value) when is_integer(value), do: value
+  def decode_delete(_), do: {:error, "Unexpected type when decoding Delete.delete"}
+
+  def encode_delete(value) when is_integer(value), do: value
+  def encode_delete(_), do: {:error, "Unexpected type when encoding Delete.delete"}
+
   def from_map(m) do
     %Delete{
-      delete: m["delete"],
+      delete: decode_delete(m["delete"]),
     }
   end
 
@@ -2584,9 +3016,15 @@ defmodule DictClass do
           dict: integer()
         }
 
+  def decode_dict(value) when is_integer(value), do: value
+  def decode_dict(_), do: {:error, "Unexpected type when decoding DictClass.dict"}
+
+  def encode_dict(value) when is_integer(value), do: value
+  def encode_dict(_), do: {:error, "Unexpected type when encoding DictClass.dict"}
+
   def from_map(m) do
     %DictClass{
-      dict: m["dict"],
+      dict: decode_dict(m["dict"]),
     }
   end
 
@@ -2617,9 +3055,15 @@ defmodule Dictionary do
           dictionary: integer()
         }
 
+  def decode_dictionary(value) when is_integer(value), do: value
+  def decode_dictionary(_), do: {:error, "Unexpected type when decoding Dictionary.dictionary"}
+
+  def encode_dictionary(value) when is_integer(value), do: value
+  def encode_dictionary(_), do: {:error, "Unexpected type when encoding Dictionary.dictionary"}
+
   def from_map(m) do
     %Dictionary{
-      dictionary: m["dictionary"],
+      dictionary: decode_dictionary(m["dictionary"]),
     }
   end
 
@@ -2650,9 +3094,15 @@ defmodule DidSet do
           did_set: integer()
         }
 
+  def decode_did_set(value) when is_integer(value), do: value
+  def decode_did_set(_), do: {:error, "Unexpected type when decoding DidSet.did_set"}
+
+  def encode_did_set(value) when is_integer(value), do: value
+  def encode_did_set(_), do: {:error, "Unexpected type when encoding DidSet.did_set"}
+
   def from_map(m) do
     %DidSet{
-      did_set: m["didSet"],
+      did_set: decode_did_set(m["didSet"]),
     }
   end
 
@@ -2683,9 +3133,15 @@ defmodule Double do
           double: integer()
         }
 
+  def decode_double(value) when is_integer(value), do: value
+  def decode_double(_), do: {:error, "Unexpected type when decoding Double.double"}
+
+  def encode_double(value) when is_integer(value), do: value
+  def encode_double(_), do: {:error, "Unexpected type when encoding Double.double"}
+
   def from_map(m) do
     %Double{
-      double: m["double"],
+      double: decode_double(m["double"]),
     }
   end
 
@@ -2716,9 +3172,15 @@ defmodule Dynamic do
           dynamic: integer()
         }
 
+  def decode_dynamic(value) when is_integer(value), do: value
+  def decode_dynamic(_), do: {:error, "Unexpected type when decoding Dynamic.dynamic"}
+
+  def encode_dynamic(value) when is_integer(value), do: value
+  def encode_dynamic(_), do: {:error, "Unexpected type when encoding Dynamic.dynamic"}
+
   def from_map(m) do
     %Dynamic{
-      dynamic: m["dynamic"],
+      dynamic: decode_dynamic(m["dynamic"]),
     }
   end
 
@@ -2749,9 +3211,15 @@ defmodule DynamicCast do
           dynamic_cast: integer()
         }
 
+  def decode_dynamic_cast(value) when is_integer(value), do: value
+  def decode_dynamic_cast(_), do: {:error, "Unexpected type when decoding DynamicCast.dynamic_cast"}
+
+  def encode_dynamic_cast(value) when is_integer(value), do: value
+  def encode_dynamic_cast(_), do: {:error, "Unexpected type when encoding DynamicCast.dynamic_cast"}
+
   def from_map(m) do
     %DynamicCast{
-      dynamic_cast: m["dynamic_cast"],
+      dynamic_cast: decode_dynamic_cast(m["dynamic_cast"]),
     }
   end
 
@@ -2782,9 +3250,15 @@ defmodule Elif do
           elif: integer()
         }
 
+  def decode_elif(value) when is_integer(value), do: value
+  def decode_elif(_), do: {:error, "Unexpected type when decoding Elif.elif"}
+
+  def encode_elif(value) when is_integer(value), do: value
+  def encode_elif(_), do: {:error, "Unexpected type when encoding Elif.elif"}
+
   def from_map(m) do
     %Elif{
-      elif: m["elif"],
+      elif: decode_elif(m["elif"]),
     }
   end
 
@@ -2815,9 +3289,15 @@ defmodule EncodeQuickType do
           encode_quick_type: integer()
         }
 
+  def decode_encode_quick_type(value) when is_integer(value), do: value
+  def decode_encode_quick_type(_), do: {:error, "Unexpected type when decoding EncodeQuickType.encode_quick_type"}
+
+  def encode_encode_quick_type(value) when is_integer(value), do: value
+  def encode_encode_quick_type(_), do: {:error, "Unexpected type when encoding EncodeQuickType.encode_quick_type"}
+
   def from_map(m) do
     %EncodeQuickType{
-      encode_quick_type: m["encode_quick_type"],
+      encode_quick_type: decode_encode_quick_type(m["encode_quick_type"]),
     }
   end
 
@@ -2848,9 +3328,15 @@ defmodule EnumClass do
           enum: integer()
         }
 
+  def decode_enum(value) when is_integer(value), do: value
+  def decode_enum(_), do: {:error, "Unexpected type when decoding EnumClass.enum"}
+
+  def encode_enum(value) when is_integer(value), do: value
+  def encode_enum(_), do: {:error, "Unexpected type when encoding EnumClass.enum"}
+
   def from_map(m) do
     %EnumClass{
-      enum: m["enum"],
+      enum: decode_enum(m["enum"]),
     }
   end
 
@@ -2881,9 +3367,15 @@ defmodule EqualityContract do
           equality_contract: integer()
         }
 
+  def decode_equality_contract(value) when is_integer(value), do: value
+  def decode_equality_contract(_), do: {:error, "Unexpected type when decoding EqualityContract.equality_contract"}
+
+  def encode_equality_contract(value) when is_integer(value), do: value
+  def encode_equality_contract(_), do: {:error, "Unexpected type when encoding EqualityContract.equality_contract"}
+
   def from_map(m) do
     %EqualityContract{
-      equality_contract: m["equalityContract"],
+      equality_contract: decode_equality_contract(m["equalityContract"]),
     }
   end
 
@@ -2914,9 +3406,15 @@ defmodule Event do
           event: integer()
         }
 
+  def decode_event(value) when is_integer(value), do: value
+  def decode_event(_), do: {:error, "Unexpected type when decoding Event.event"}
+
+  def encode_event(value) when is_integer(value), do: value
+  def encode_event(_), do: {:error, "Unexpected type when encoding Event.event"}
+
   def from_map(m) do
     %Event{
-      event: m["event"],
+      event: decode_event(m["event"]),
     }
   end
 
@@ -2947,9 +3445,15 @@ defmodule Except do
           except: integer()
         }
 
+  def decode_except(value) when is_integer(value), do: value
+  def decode_except(_), do: {:error, "Unexpected type when decoding Except.except"}
+
+  def encode_except(value) when is_integer(value), do: value
+  def encode_except(_), do: {:error, "Unexpected type when encoding Except.except"}
+
   def from_map(m) do
     %Except{
-      except: m["except"],
+      except: decode_except(m["except"]),
     }
   end
 
@@ -2980,9 +3484,15 @@ defmodule ExceptionClass do
           exception: integer()
         }
 
+  def decode_exception(value) when is_integer(value), do: value
+  def decode_exception(_), do: {:error, "Unexpected type when decoding ExceptionClass.exception"}
+
+  def encode_exception(value) when is_integer(value), do: value
+  def encode_exception(_), do: {:error, "Unexpected type when encoding ExceptionClass.exception"}
+
   def from_map(m) do
     %ExceptionClass{
-      exception: m["exception"],
+      exception: decode_exception(m["exception"]),
     }
   end
 
@@ -3013,9 +3523,15 @@ defmodule Explicit do
           explicit: integer()
         }
 
+  def decode_explicit(value) when is_integer(value), do: value
+  def decode_explicit(_), do: {:error, "Unexpected type when decoding Explicit.explicit"}
+
+  def encode_explicit(value) when is_integer(value), do: value
+  def encode_explicit(_), do: {:error, "Unexpected type when encoding Explicit.explicit"}
+
   def from_map(m) do
     %Explicit{
-      explicit: m["explicit"],
+      explicit: decode_explicit(m["explicit"]),
     }
   end
 
@@ -3046,9 +3562,15 @@ defmodule Export do
           export: integer()
         }
 
+  def decode_export(value) when is_integer(value), do: value
+  def decode_export(_), do: {:error, "Unexpected type when decoding Export.export"}
+
+  def encode_export(value) when is_integer(value), do: value
+  def encode_export(_), do: {:error, "Unexpected type when encoding Export.export"}
+
   def from_map(m) do
     %Export{
-      export: m["export"],
+      export: decode_export(m["export"]),
     }
   end
 
@@ -3079,9 +3601,15 @@ defmodule Exposing do
           exposing: integer()
         }
 
+  def decode_exposing(value) when is_integer(value), do: value
+  def decode_exposing(_), do: {:error, "Unexpected type when decoding Exposing.exposing"}
+
+  def encode_exposing(value) when is_integer(value), do: value
+  def encode_exposing(_), do: {:error, "Unexpected type when encoding Exposing.exposing"}
+
   def from_map(m) do
     %Exposing{
-      exposing: m["exposing"],
+      exposing: decode_exposing(m["exposing"]),
     }
   end
 
@@ -3112,9 +3640,15 @@ defmodule Extends do
           extends: integer()
         }
 
+  def decode_extends(value) when is_integer(value), do: value
+  def decode_extends(_), do: {:error, "Unexpected type when decoding Extends.extends"}
+
+  def encode_extends(value) when is_integer(value), do: value
+  def encode_extends(_), do: {:error, "Unexpected type when encoding Extends.extends"}
+
   def from_map(m) do
     %Extends{
-      extends: m["extends"],
+      extends: decode_extends(m["extends"]),
     }
   end
 
@@ -3145,9 +3679,15 @@ defmodule Extension do
           extension: integer()
         }
 
+  def decode_extension(value) when is_integer(value), do: value
+  def decode_extension(_), do: {:error, "Unexpected type when decoding Extension.extension"}
+
+  def encode_extension(value) when is_integer(value), do: value
+  def encode_extension(_), do: {:error, "Unexpected type when encoding Extension.extension"}
+
   def from_map(m) do
     %Extension{
-      extension: m["extension"],
+      extension: decode_extension(m["extension"]),
     }
   end
 
@@ -3178,9 +3718,15 @@ defmodule Extern do
           extern: integer()
         }
 
+  def decode_extern(value) when is_integer(value), do: value
+  def decode_extern(_), do: {:error, "Unexpected type when decoding Extern.extern"}
+
+  def encode_extern(value) when is_integer(value), do: value
+  def encode_extern(_), do: {:error, "Unexpected type when encoding Extern.extern"}
+
   def from_map(m) do
     %Extern{
-      extern: m["extern"],
+      extern: decode_extern(m["extern"]),
     }
   end
 
@@ -3211,9 +3757,15 @@ defmodule Fallthrough do
           fallthrough: integer()
         }
 
+  def decode_fallthrough(value) when is_integer(value), do: value
+  def decode_fallthrough(_), do: {:error, "Unexpected type when decoding Fallthrough.fallthrough"}
+
+  def encode_fallthrough(value) when is_integer(value), do: value
+  def encode_fallthrough(_), do: {:error, "Unexpected type when encoding Fallthrough.fallthrough"}
+
   def from_map(m) do
     %Fallthrough{
-      fallthrough: m["fallthrough"],
+      fallthrough: decode_fallthrough(m["fallthrough"]),
     }
   end
 
@@ -3244,9 +3796,15 @@ defmodule Obj2False do
           false_false: integer()
         }
 
+  def decode_false_false(value) when is_integer(value), do: value
+  def decode_false_false(_), do: {:error, "Unexpected type when decoding Obj2False.false_false"}
+
+  def encode_false_false(value) when is_integer(value), do: value
+  def encode_false_false(_), do: {:error, "Unexpected type when encoding Obj2False.false_false"}
+
   def from_map(m) do
     %Obj2False{
-      false_false: m["false"],
+      false_false: decode_false_false(m["false"]),
     }
   end
 
@@ -3277,9 +3835,15 @@ defmodule Fileprivate do
           fileprivate: integer()
         }
 
+  def decode_fileprivate(value) when is_integer(value), do: value
+  def decode_fileprivate(_), do: {:error, "Unexpected type when decoding Fileprivate.fileprivate"}
+
+  def encode_fileprivate(value) when is_integer(value), do: value
+  def encode_fileprivate(_), do: {:error, "Unexpected type when encoding Fileprivate.fileprivate"}
+
   def from_map(m) do
     %Fileprivate{
-      fileprivate: m["fileprivate"],
+      fileprivate: decode_fileprivate(m["fileprivate"]),
     }
   end
 
@@ -3310,9 +3874,15 @@ defmodule Final do
           final: integer()
         }
 
+  def decode_final(value) when is_integer(value), do: value
+  def decode_final(_), do: {:error, "Unexpected type when decoding Final.final"}
+
+  def encode_final(value) when is_integer(value), do: value
+  def encode_final(_), do: {:error, "Unexpected type when encoding Final.final"}
+
   def from_map(m) do
     %Final{
-      final: m["final"],
+      final: decode_final(m["final"]),
     }
   end
 
@@ -3343,9 +3913,15 @@ defmodule Finally do
           finally: integer()
         }
 
+  def decode_finally(value) when is_integer(value), do: value
+  def decode_finally(_), do: {:error, "Unexpected type when decoding Finally.finally"}
+
+  def encode_finally(value) when is_integer(value), do: value
+  def encode_finally(_), do: {:error, "Unexpected type when encoding Finally.finally"}
+
   def from_map(m) do
     %Finally{
-      finally: m["finally"],
+      finally: decode_finally(m["finally"]),
     }
   end
 
@@ -3376,9 +3952,15 @@ defmodule Fixed do
           fixed: integer()
         }
 
+  def decode_fixed(value) when is_integer(value), do: value
+  def decode_fixed(_), do: {:error, "Unexpected type when decoding Fixed.fixed"}
+
+  def encode_fixed(value) when is_integer(value), do: value
+  def encode_fixed(_), do: {:error, "Unexpected type when encoding Fixed.fixed"}
+
   def from_map(m) do
     %Fixed{
-      fixed: m["fixed"],
+      fixed: decode_fixed(m["fixed"]),
     }
   end
 
@@ -3409,9 +3991,15 @@ defmodule FloatClass do
           float: integer()
         }
 
+  def decode_float(value) when is_integer(value), do: value
+  def decode_float(_), do: {:error, "Unexpected type when decoding FloatClass.float"}
+
+  def encode_float(value) when is_integer(value), do: value
+  def encode_float(_), do: {:error, "Unexpected type when encoding FloatClass.float"}
+
   def from_map(m) do
     %FloatClass{
-      float: m["float"],
+      float: decode_float(m["float"]),
     }
   end
 
@@ -3442,9 +4030,15 @@ defmodule For do
           for: integer()
         }
 
+  def decode_for(value) when is_integer(value), do: value
+  def decode_for(_), do: {:error, "Unexpected type when decoding For.for"}
+
+  def encode_for(value) when is_integer(value), do: value
+  def encode_for(_), do: {:error, "Unexpected type when encoding For.for"}
+
   def from_map(m) do
     %For{
-      for: m["for"],
+      for: decode_for(m["for"]),
     }
   end
 
@@ -3475,9 +4069,15 @@ defmodule Foreach do
           foreach: integer()
         }
 
+  def decode_foreach(value) when is_integer(value), do: value
+  def decode_foreach(_), do: {:error, "Unexpected type when decoding Foreach.foreach"}
+
+  def encode_foreach(value) when is_integer(value), do: value
+  def encode_foreach(_), do: {:error, "Unexpected type when encoding Foreach.foreach"}
+
   def from_map(m) do
     %Foreach{
-      foreach: m["foreach"],
+      foreach: decode_foreach(m["foreach"]),
     }
   end
 
@@ -3508,9 +4108,15 @@ defmodule Friend do
           friend: integer()
         }
 
+  def decode_friend(value) when is_integer(value), do: value
+  def decode_friend(_), do: {:error, "Unexpected type when decoding Friend.friend"}
+
+  def encode_friend(value) when is_integer(value), do: value
+  def encode_friend(_), do: {:error, "Unexpected type when encoding Friend.friend"}
+
   def from_map(m) do
     %Friend{
-      friend: m["friend"],
+      friend: decode_friend(m["friend"]),
     }
   end
 
@@ -3541,9 +4147,15 @@ defmodule From do
           from: integer()
         }
 
+  def decode_from(value) when is_integer(value), do: value
+  def decode_from(_), do: {:error, "Unexpected type when decoding From.from"}
+
+  def encode_from(value) when is_integer(value), do: value
+  def encode_from(_), do: {:error, "Unexpected type when encoding From.from"}
+
   def from_map(m) do
     %From{
-      from: m["from"],
+      from: decode_from(m["from"]),
     }
   end
 
@@ -3574,9 +4186,15 @@ defmodule FromJSON do
           from_json: integer()
         }
 
+  def decode_from_json(value) when is_integer(value), do: value
+  def decode_from_json(_), do: {:error, "Unexpected type when decoding FromJSON.from_json"}
+
+  def encode_from_json(value) when is_integer(value), do: value
+  def encode_from_json(_), do: {:error, "Unexpected type when encoding FromJSON.from_json"}
+
   def from_map(m) do
     %FromJSON{
-      from_json: m["from_json"],
+      from_json: decode_from_json(m["from_json"]),
     }
   end
 
@@ -3607,9 +4225,15 @@ defmodule Func do
           func: integer()
         }
 
+  def decode_func(value) when is_integer(value), do: value
+  def decode_func(_), do: {:error, "Unexpected type when decoding Func.func"}
+
+  def encode_func(value) when is_integer(value), do: value
+  def encode_func(_), do: {:error, "Unexpected type when encoding Func.func"}
+
   def from_map(m) do
     %Func{
-      func: m["func"],
+      func: decode_func(m["func"]),
     }
   end
 
@@ -3640,9 +4264,15 @@ defmodule FunctionClass do
           function: integer()
         }
 
+  def decode_function(value) when is_integer(value), do: value
+  def decode_function(_), do: {:error, "Unexpected type when decoding FunctionClass.function"}
+
+  def encode_function(value) when is_integer(value), do: value
+  def encode_function(_), do: {:error, "Unexpected type when encoding FunctionClass.function"}
+
   def from_map(m) do
     %FunctionClass{
-      function: m["function"],
+      function: decode_function(m["function"]),
     }
   end
 
@@ -3673,9 +4303,15 @@ defmodule Get do
           get: integer()
         }
 
+  def decode_get(value) when is_integer(value), do: value
+  def decode_get(_), do: {:error, "Unexpected type when decoding Get.get"}
+
+  def encode_get(value) when is_integer(value), do: value
+  def encode_get(_), do: {:error, "Unexpected type when encoding Get.get"}
+
   def from_map(m) do
     %Get{
-      get: m["get"],
+      get: decode_get(m["get"]),
     }
   end
 
@@ -3706,9 +4342,15 @@ defmodule Global do
           global: integer()
         }
 
+  def decode_global(value) when is_integer(value), do: value
+  def decode_global(_), do: {:error, "Unexpected type when decoding Global.global"}
+
+  def encode_global(value) when is_integer(value), do: value
+  def encode_global(_), do: {:error, "Unexpected type when encoding Global.global"}
+
   def from_map(m) do
     %Global{
-      global: m["global"],
+      global: decode_global(m["global"]),
     }
   end
 
@@ -3739,9 +4381,15 @@ defmodule Go do
           go: integer()
         }
 
+  def decode_go(value) when is_integer(value), do: value
+  def decode_go(_), do: {:error, "Unexpected type when decoding Go.go"}
+
+  def encode_go(value) when is_integer(value), do: value
+  def encode_go(_), do: {:error, "Unexpected type when encoding Go.go"}
+
   def from_map(m) do
     %Go{
-      go: m["go"],
+      go: decode_go(m["go"]),
     }
   end
 
@@ -3772,9 +4420,15 @@ defmodule Goto do
           goto: integer()
         }
 
+  def decode_goto(value) when is_integer(value), do: value
+  def decode_goto(_), do: {:error, "Unexpected type when decoding Goto.goto"}
+
+  def encode_goto(value) when is_integer(value), do: value
+  def encode_goto(_), do: {:error, "Unexpected type when encoding Goto.goto"}
+
   def from_map(m) do
     %Goto{
-      goto: m["goto"],
+      goto: decode_goto(m["goto"]),
     }
   end
 
@@ -3805,9 +4459,15 @@ defmodule Guard do
           guard: integer()
         }
 
+  def decode_guard(value) when is_integer(value), do: value
+  def decode_guard(_), do: {:error, "Unexpected type when decoding Guard.guard"}
+
+  def encode_guard(value) when is_integer(value), do: value
+  def encode_guard(_), do: {:error, "Unexpected type when encoding Guard.guard"}
+
   def from_map(m) do
     %Guard{
-      guard: m["guard"],
+      guard: decode_guard(m["guard"]),
     }
   end
 
@@ -3838,9 +4498,15 @@ defmodule HasOwnProperty do
           has_own_property: integer()
         }
 
+  def decode_has_own_property(value) when is_integer(value), do: value
+  def decode_has_own_property(_), do: {:error, "Unexpected type when decoding HasOwnProperty.has_own_property"}
+
+  def encode_has_own_property(value) when is_integer(value), do: value
+  def encode_has_own_property(_), do: {:error, "Unexpected type when encoding HasOwnProperty.has_own_property"}
+
   def from_map(m) do
     %HasOwnProperty{
-      has_own_property: m["hasOwnProperty"],
+      has_own_property: decode_has_own_property(m["hasOwnProperty"]),
     }
   end
 
@@ -3871,9 +4537,15 @@ defmodule ID do
           id: integer()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding ID.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding ID.id"}
+
   def from_map(m) do
     %ID{
-      id: m["id"],
+      id: decode_id(m["id"]),
     }
   end
 
@@ -3904,9 +4576,15 @@ defmodule If do
           if: integer()
         }
 
+  def decode_if(value) when is_integer(value), do: value
+  def decode_if(_), do: {:error, "Unexpected type when decoding If.if"}
+
+  def encode_if(value) when is_integer(value), do: value
+  def encode_if(_), do: {:error, "Unexpected type when encoding If.if"}
+
   def from_map(m) do
     %If{
-      if: m["if"],
+      if: decode_if(m["if"]),
     }
   end
 
@@ -3937,9 +4615,15 @@ defmodule Imp do
           imp: integer()
         }
 
+  def decode_imp(value) when is_integer(value), do: value
+  def decode_imp(_), do: {:error, "Unexpected type when decoding Imp.imp"}
+
+  def encode_imp(value) when is_integer(value), do: value
+  def encode_imp(_), do: {:error, "Unexpected type when encoding Imp.imp"}
+
   def from_map(m) do
     %Imp{
-      imp: m["IMP"],
+      imp: decode_imp(m["IMP"]),
     }
   end
 
@@ -3970,9 +4654,15 @@ defmodule Implements do
           implements: integer()
         }
 
+  def decode_implements(value) when is_integer(value), do: value
+  def decode_implements(_), do: {:error, "Unexpected type when decoding Implements.implements"}
+
+  def encode_implements(value) when is_integer(value), do: value
+  def encode_implements(_), do: {:error, "Unexpected type when encoding Implements.implements"}
+
   def from_map(m) do
     %Implements{
-      implements: m["implements"],
+      implements: decode_implements(m["implements"]),
     }
   end
 
@@ -4003,9 +4693,15 @@ defmodule Implicit do
           implicit: integer()
         }
 
+  def decode_implicit(value) when is_integer(value), do: value
+  def decode_implicit(_), do: {:error, "Unexpected type when decoding Implicit.implicit"}
+
+  def encode_implicit(value) when is_integer(value), do: value
+  def encode_implicit(_), do: {:error, "Unexpected type when encoding Implicit.implicit"}
+
   def from_map(m) do
     %Implicit{
-      implicit: m["implicit"],
+      implicit: decode_implicit(m["implicit"]),
     }
   end
 
@@ -4036,9 +4732,15 @@ defmodule Indirect do
           indirect: integer()
         }
 
+  def decode_indirect(value) when is_integer(value), do: value
+  def decode_indirect(_), do: {:error, "Unexpected type when decoding Indirect.indirect"}
+
+  def encode_indirect(value) when is_integer(value), do: value
+  def encode_indirect(_), do: {:error, "Unexpected type when encoding Indirect.indirect"}
+
   def from_map(m) do
     %Indirect{
-      indirect: m["indirect"],
+      indirect: decode_indirect(m["indirect"]),
     }
   end
 
@@ -4069,9 +4771,15 @@ defmodule Infix do
           infix: integer()
         }
 
+  def decode_infix(value) when is_integer(value), do: value
+  def decode_infix(_), do: {:error, "Unexpected type when decoding Infix.infix"}
+
+  def encode_infix(value) when is_integer(value), do: value
+  def encode_infix(_), do: {:error, "Unexpected type when encoding Infix.infix"}
+
   def from_map(m) do
     %Infix{
-      infix: m["infix"],
+      infix: decode_infix(m["infix"]),
     }
   end
 
@@ -4102,9 +4810,15 @@ defmodule Init do
           init: integer()
         }
 
+  def decode_init(value) when is_integer(value), do: value
+  def decode_init(_), do: {:error, "Unexpected type when decoding Init.init"}
+
+  def encode_init(value) when is_integer(value), do: value
+  def encode_init(_), do: {:error, "Unexpected type when encoding Init.init"}
+
   def from_map(m) do
     %Init{
-      init: m["init"],
+      init: decode_init(m["init"]),
     }
   end
 
@@ -4135,9 +4849,15 @@ defmodule Inline do
           inline: integer()
         }
 
+  def decode_inline(value) when is_integer(value), do: value
+  def decode_inline(_), do: {:error, "Unexpected type when decoding Inline.inline"}
+
+  def encode_inline(value) when is_integer(value), do: value
+  def encode_inline(_), do: {:error, "Unexpected type when encoding Inline.inline"}
+
   def from_map(m) do
     %Inline{
-      inline: m["inline"],
+      inline: decode_inline(m["inline"]),
     }
   end
 
@@ -4168,9 +4888,15 @@ defmodule Inout do
           inout: integer()
         }
 
+  def decode_inout(value) when is_integer(value), do: value
+  def decode_inout(_), do: {:error, "Unexpected type when decoding Inout.inout"}
+
+  def encode_inout(value) when is_integer(value), do: value
+  def encode_inout(_), do: {:error, "Unexpected type when encoding Inout.inout"}
+
   def from_map(m) do
     %Inout{
-      inout: m["inout"],
+      inout: decode_inout(m["inout"]),
     }
   end
 
@@ -4201,9 +4927,15 @@ defmodule Instanceof do
           instanceof: integer()
         }
 
+  def decode_instanceof(value) when is_integer(value), do: value
+  def decode_instanceof(_), do: {:error, "Unexpected type when decoding Instanceof.instanceof"}
+
+  def encode_instanceof(value) when is_integer(value), do: value
+  def encode_instanceof(_), do: {:error, "Unexpected type when encoding Instanceof.instanceof"}
+
   def from_map(m) do
     %Instanceof{
-      instanceof: m["instanceof"],
+      instanceof: decode_instanceof(m["instanceof"]),
     }
   end
 
@@ -4234,9 +4966,15 @@ defmodule Int do
           int: integer()
         }
 
+  def decode_int(value) when is_integer(value), do: value
+  def decode_int(_), do: {:error, "Unexpected type when decoding Int.int"}
+
+  def encode_int(value) when is_integer(value), do: value
+  def encode_int(_), do: {:error, "Unexpected type when encoding Int.int"}
+
   def from_map(m) do
     %Int{
-      int: m["int"],
+      int: decode_int(m["int"]),
     }
   end
 
@@ -4267,9 +5005,15 @@ defmodule Interface do
           interface: integer()
         }
 
+  def decode_interface(value) when is_integer(value), do: value
+  def decode_interface(_), do: {:error, "Unexpected type when decoding Interface.interface"}
+
+  def encode_interface(value) when is_integer(value), do: value
+  def encode_interface(_), do: {:error, "Unexpected type when encoding Interface.interface"}
+
   def from_map(m) do
     %Interface{
-      interface: m["interface"],
+      interface: decode_interface(m["interface"]),
     }
   end
 
@@ -4300,9 +5044,15 @@ defmodule Internal do
           internal: integer()
         }
 
+  def decode_internal(value) when is_integer(value), do: value
+  def decode_internal(_), do: {:error, "Unexpected type when decoding Internal.internal"}
+
+  def encode_internal(value) when is_integer(value), do: value
+  def encode_internal(_), do: {:error, "Unexpected type when encoding Internal.internal"}
+
   def from_map(m) do
     %Internal{
-      internal: m["internal"],
+      internal: decode_internal(m["internal"]),
     }
   end
 
@@ -4333,9 +5083,15 @@ defmodule DefClass do
           def_def: integer()
         }
 
+  def decode_def_def(value) when is_integer(value), do: value
+  def decode_def_def(_), do: {:error, "Unexpected type when decoding DefClass.def_def"}
+
+  def encode_def_def(value) when is_integer(value), do: value
+  def encode_def_def(_), do: {:error, "Unexpected type when encoding DefClass.def_def"}
+
   def from_map(m) do
     %DefClass{
-      def_def: m["def"],
+      def_def: decode_def_def(m["def"]),
     }
   end
 
@@ -4366,9 +5122,15 @@ defmodule DoClass do
           do_do: integer()
         }
 
+  def decode_do_do(value) when is_integer(value), do: value
+  def decode_do_do(_), do: {:error, "Unexpected type when decoding DoClass.do_do"}
+
+  def encode_do_do(value) when is_integer(value), do: value
+  def encode_do_do(_), do: {:error, "Unexpected type when encoding DoClass.do_do"}
+
   def from_map(m) do
     %DoClass{
-      do_do: m["do"],
+      do_do: decode_do_do(m["do"]),
     }
   end
 
@@ -4399,9 +5161,15 @@ defmodule ElseClass do
           else_else: integer()
         }
 
+  def decode_else_else(value) when is_integer(value), do: value
+  def decode_else_else(_), do: {:error, "Unexpected type when decoding ElseClass.else_else"}
+
+  def encode_else_else(value) when is_integer(value), do: value
+  def encode_else_else(_), do: {:error, "Unexpected type when encoding ElseClass.else_else"}
+
   def from_map(m) do
     %ElseClass{
-      else_else: m["else"],
+      else_else: decode_else_else(m["else"]),
     }
   end
 
@@ -4432,9 +5200,15 @@ defmodule FalseClass do
           false_false: integer()
         }
 
+  def decode_false_false(value) when is_integer(value), do: value
+  def decode_false_false(_), do: {:error, "Unexpected type when decoding FalseClass.false_false"}
+
+  def encode_false_false(value) when is_integer(value), do: value
+  def encode_false_false(_), do: {:error, "Unexpected type when encoding FalseClass.false_false"}
+
   def from_map(m) do
     %FalseClass{
-      false_false: m["False"],
+      false_false: decode_false_false(m["False"]),
     }
   end
 
@@ -4465,9 +5239,15 @@ defmodule ImportClass do
           import_import: integer()
         }
 
+  def decode_import_import(value) when is_integer(value), do: value
+  def decode_import_import(_), do: {:error, "Unexpected type when decoding ImportClass.import_import"}
+
+  def encode_import_import(value) when is_integer(value), do: value
+  def encode_import_import(_), do: {:error, "Unexpected type when encoding ImportClass.import_import"}
+
   def from_map(m) do
     %ImportClass{
-      import_import: m["import"],
+      import_import: decode_import_import(m["import"]),
     }
   end
 
@@ -4498,9 +5278,15 @@ defmodule InClass do
           in_in: integer()
         }
 
+  def decode_in_in(value) when is_integer(value), do: value
+  def decode_in_in(_), do: {:error, "Unexpected type when decoding InClass.in_in"}
+
+  def encode_in_in(value) when is_integer(value), do: value
+  def encode_in_in(_), do: {:error, "Unexpected type when encoding InClass.in_in"}
+
   def from_map(m) do
     %InClass{
-      in_in: m["in"],
+      in_in: decode_in_in(m["in"]),
     }
   end
 
@@ -4596,6 +5382,12 @@ defmodule Obj2 do
           obj2_in: InClass.t()
         }
 
+  def decode_dummy(value) when is_integer(value), do: value
+  def decode_dummy(_), do: {:error, "Unexpected type when decoding Obj2.dummy"}
+
+  def encode_dummy(value) when is_integer(value), do: value
+  def encode_dummy(_), do: {:error, "Unexpected type when encoding Obj2.dummy"}
+
   def from_map(m) do
     %Obj2{
       default: Default.from_map(m["default"]),
@@ -4608,7 +5400,7 @@ defmodule Obj2 do
       dictionary: Dictionary.from_map(m["dictionary"]),
       did_set: DidSet.from_map(m["didSet"]),
       double: Double.from_map(m["double"]),
-      dummy: m["dummy"],
+      dummy: decode_dummy(m["dummy"]),
       dynamic: Dynamic.from_map(m["dynamic"]),
       dynamic_cast: DynamicCast.from_map(m["dynamic_cast"]),
       elif: Elif.from_map(m["elif"]),
@@ -4759,9 +5551,15 @@ defmodule Is do
           is: integer()
         }
 
+  def decode_is(value) when is_integer(value), do: value
+  def decode_is(_), do: {:error, "Unexpected type when decoding Is.is"}
+
+  def encode_is(value) when is_integer(value), do: value
+  def encode_is(_), do: {:error, "Unexpected type when encoding Is.is"}
+
   def from_map(m) do
     %Is{
-      is: m["is"],
+      is: decode_is(m["is"]),
     }
   end
 
@@ -4792,9 +5590,15 @@ defmodule Iterable do
           iterable: integer()
         }
 
+  def decode_iterable(value) when is_integer(value), do: value
+  def decode_iterable(_), do: {:error, "Unexpected type when decoding Iterable.iterable"}
+
+  def encode_iterable(value) when is_integer(value), do: value
+  def encode_iterable(_), do: {:error, "Unexpected type when encoding Iterable.iterable"}
+
   def from_map(m) do
     %Iterable{
-      iterable: m["iterable"],
+      iterable: decode_iterable(m["iterable"]),
     }
   end
 
@@ -4825,9 +5629,15 @@ defmodule Jdec do
           jdec: integer()
         }
 
+  def decode_jdec(value) when is_integer(value), do: value
+  def decode_jdec(_), do: {:error, "Unexpected type when decoding Jdec.jdec"}
+
+  def encode_jdec(value) when is_integer(value), do: value
+  def encode_jdec(_), do: {:error, "Unexpected type when encoding Jdec.jdec"}
+
   def from_map(m) do
     %Jdec{
-      jdec: m["jdec"],
+      jdec: decode_jdec(m["jdec"]),
     }
   end
 
@@ -4858,9 +5668,15 @@ defmodule Jenc do
           jenc: integer()
         }
 
+  def decode_jenc(value) when is_integer(value), do: value
+  def decode_jenc(_), do: {:error, "Unexpected type when decoding Jenc.jenc"}
+
+  def encode_jenc(value) when is_integer(value), do: value
+  def encode_jenc(_), do: {:error, "Unexpected type when encoding Jenc.jenc"}
+
   def from_map(m) do
     %Jenc{
-      jenc: m["jenc"],
+      jenc: decode_jenc(m["jenc"]),
     }
   end
 
@@ -4891,9 +5707,15 @@ defmodule Jpipe do
           jpipe: integer()
         }
 
+  def decode_jpipe(value) when is_integer(value), do: value
+  def decode_jpipe(_), do: {:error, "Unexpected type when decoding Jpipe.jpipe"}
+
+  def encode_jpipe(value) when is_integer(value), do: value
+  def encode_jpipe(_), do: {:error, "Unexpected type when encoding Jpipe.jpipe"}
+
   def from_map(m) do
     %Jpipe{
-      jpipe: m["jpipe"],
+      jpipe: decode_jpipe(m["jpipe"]),
     }
   end
 
@@ -4924,9 +5746,15 @@ defmodule JSON do
           json: integer()
         }
 
+  def decode_json(value) when is_integer(value), do: value
+  def decode_json(_), do: {:error, "Unexpected type when decoding JSON.json"}
+
+  def encode_json(value) when is_integer(value), do: value
+  def encode_json(_), do: {:error, "Unexpected type when encoding JSON.json"}
+
   def from_map(m) do
     %JSON{
-      json: m["json"],
+      json: decode_json(m["json"]),
     }
   end
 
@@ -4957,9 +5785,15 @@ defmodule JSONConverter do
           json_converter: integer()
         }
 
+  def decode_json_converter(value) when is_integer(value), do: value
+  def decode_json_converter(_), do: {:error, "Unexpected type when decoding JSONConverter.json_converter"}
+
+  def encode_json_converter(value) when is_integer(value), do: value
+  def encode_json_converter(_), do: {:error, "Unexpected type when encoding JSONConverter.json_converter"}
+
   def from_map(m) do
     %JSONConverter{
-      json_converter: m["json_converter"],
+      json_converter: decode_json_converter(m["json_converter"]),
     }
   end
 
@@ -4990,9 +5824,15 @@ defmodule JSONSerializer do
           json_serializer: integer()
         }
 
+  def decode_json_serializer(value) when is_integer(value), do: value
+  def decode_json_serializer(_), do: {:error, "Unexpected type when decoding JSONSerializer.json_serializer"}
+
+  def encode_json_serializer(value) when is_integer(value), do: value
+  def encode_json_serializer(_), do: {:error, "Unexpected type when encoding JSONSerializer.json_serializer"}
+
   def from_map(m) do
     %JSONSerializer{
-      json_serializer: m["json_serializer"],
+      json_serializer: decode_json_serializer(m["json_serializer"]),
     }
   end
 
@@ -5023,9 +5863,15 @@ defmodule JSONToken do
           json_token: integer()
         }
 
+  def decode_json_token(value) when is_integer(value), do: value
+  def decode_json_token(_), do: {:error, "Unexpected type when decoding JSONToken.json_token"}
+
+  def encode_json_token(value) when is_integer(value), do: value
+  def encode_json_token(_), do: {:error, "Unexpected type when encoding JSONToken.json_token"}
+
   def from_map(m) do
     %JSONToken{
-      json_token: m["json_token"],
+      json_token: decode_json_token(m["json_token"]),
     }
   end
 
@@ -5056,9 +5902,15 @@ defmodule JSONWriter do
           json_writer: integer()
         }
 
+  def decode_json_writer(value) when is_integer(value), do: value
+  def decode_json_writer(_), do: {:error, "Unexpected type when decoding JSONWriter.json_writer"}
+
+  def encode_json_writer(value) when is_integer(value), do: value
+  def encode_json_writer(_), do: {:error, "Unexpected type when encoding JSONWriter.json_writer"}
+
   def from_map(m) do
     %JSONWriter{
-      json_writer: m["json_writer"],
+      json_writer: decode_json_writer(m["json_writer"]),
     }
   end
 
@@ -5089,9 +5941,15 @@ defmodule Lambda do
           lambda: integer()
         }
 
+  def decode_lambda(value) when is_integer(value), do: value
+  def decode_lambda(_), do: {:error, "Unexpected type when decoding Lambda.lambda"}
+
+  def encode_lambda(value) when is_integer(value), do: value
+  def encode_lambda(_), do: {:error, "Unexpected type when encoding Lambda.lambda"}
+
   def from_map(m) do
     %Lambda{
-      lambda: m["lambda"],
+      lambda: decode_lambda(m["lambda"]),
     }
   end
 
@@ -5122,9 +5980,15 @@ defmodule Lazy do
           lazy: integer()
         }
 
+  def decode_lazy(value) when is_integer(value), do: value
+  def decode_lazy(_), do: {:error, "Unexpected type when decoding Lazy.lazy"}
+
+  def encode_lazy(value) when is_integer(value), do: value
+  def encode_lazy(_), do: {:error, "Unexpected type when encoding Lazy.lazy"}
+
   def from_map(m) do
     %Lazy{
-      lazy: m["lazy"],
+      lazy: decode_lazy(m["lazy"]),
     }
   end
 
@@ -5155,9 +6019,15 @@ defmodule Left do
           left: integer()
         }
 
+  def decode_left(value) when is_integer(value), do: value
+  def decode_left(_), do: {:error, "Unexpected type when decoding Left.left"}
+
+  def encode_left(value) when is_integer(value), do: value
+  def encode_left(_), do: {:error, "Unexpected type when encoding Left.left"}
+
   def from_map(m) do
     %Left{
-      left: m["left"],
+      left: decode_left(m["left"]),
     }
   end
 
@@ -5188,9 +6058,15 @@ defmodule Let do
           let: integer()
         }
 
+  def decode_let(value) when is_integer(value), do: value
+  def decode_let(_), do: {:error, "Unexpected type when decoding Let.let"}
+
+  def encode_let(value) when is_integer(value), do: value
+  def encode_let(_), do: {:error, "Unexpected type when encoding Let.let"}
+
   def from_map(m) do
     %Let{
-      let: m["let"],
+      let: decode_let(m["let"]),
     }
   end
 
@@ -5221,9 +6097,15 @@ defmodule ListClass do
           list: integer()
         }
 
+  def decode_list(value) when is_integer(value), do: value
+  def decode_list(_), do: {:error, "Unexpected type when decoding ListClass.list"}
+
+  def encode_list(value) when is_integer(value), do: value
+  def encode_list(_), do: {:error, "Unexpected type when encoding ListClass.list"}
+
   def from_map(m) do
     %ListClass{
-      list: m["list"],
+      list: decode_list(m["list"]),
     }
   end
 
@@ -5254,9 +6136,15 @@ defmodule Lock do
           lock: integer()
         }
 
+  def decode_lock(value) when is_integer(value), do: value
+  def decode_lock(_), do: {:error, "Unexpected type when decoding Lock.lock"}
+
+  def encode_lock(value) when is_integer(value), do: value
+  def encode_lock(_), do: {:error, "Unexpected type when encoding Lock.lock"}
+
   def from_map(m) do
     %Lock{
-      lock: m["lock"],
+      lock: decode_lock(m["lock"]),
     }
   end
 
@@ -5287,9 +6175,15 @@ defmodule Long do
           long: integer()
         }
 
+  def decode_long(value) when is_integer(value), do: value
+  def decode_long(_), do: {:error, "Unexpected type when decoding Long.long"}
+
+  def encode_long(value) when is_integer(value), do: value
+  def encode_long(_), do: {:error, "Unexpected type when encoding Long.long"}
+
   def from_map(m) do
     %Long{
-      long: m["long"],
+      long: decode_long(m["long"]),
     }
   end
 
@@ -5320,9 +6214,15 @@ defmodule MapClass do
           map: integer()
         }
 
+  def decode_map(value) when is_integer(value), do: value
+  def decode_map(_), do: {:error, "Unexpected type when decoding MapClass.map"}
+
+  def encode_map(value) when is_integer(value), do: value
+  def encode_map(_), do: {:error, "Unexpected type when encoding MapClass.map"}
+
   def from_map(m) do
     %MapClass{
-      map: m["map"],
+      map: decode_map(m["map"]),
     }
   end
 
@@ -5353,9 +6253,15 @@ defmodule MetadataPropertyHandling do
           metadata_property_handling: integer()
         }
 
+  def decode_metadata_property_handling(value) when is_integer(value), do: value
+  def decode_metadata_property_handling(_), do: {:error, "Unexpected type when decoding MetadataPropertyHandling.metadata_property_handling"}
+
+  def encode_metadata_property_handling(value) when is_integer(value), do: value
+  def encode_metadata_property_handling(_), do: {:error, "Unexpected type when encoding MetadataPropertyHandling.metadata_property_handling"}
+
   def from_map(m) do
     %MetadataPropertyHandling{
-      metadata_property_handling: m["metadata_property_handling"],
+      metadata_property_handling: decode_metadata_property_handling(m["metadata_property_handling"]),
     }
   end
 
@@ -5386,9 +6292,15 @@ defmodule ModuleClass do
           module: integer()
         }
 
+  def decode_module(value) when is_integer(value), do: value
+  def decode_module(_), do: {:error, "Unexpected type when decoding ModuleClass.module"}
+
+  def encode_module(value) when is_integer(value), do: value
+  def encode_module(_), do: {:error, "Unexpected type when encoding ModuleClass.module"}
+
   def from_map(m) do
     %ModuleClass{
-      module: m["module"],
+      module: decode_module(m["module"]),
     }
   end
 
@@ -5419,9 +6331,15 @@ defmodule Mutable do
           mutable: integer()
         }
 
+  def decode_mutable(value) when is_integer(value), do: value
+  def decode_mutable(_), do: {:error, "Unexpected type when decoding Mutable.mutable"}
+
+  def encode_mutable(value) when is_integer(value), do: value
+  def encode_mutable(_), do: {:error, "Unexpected type when encoding Mutable.mutable"}
+
   def from_map(m) do
     %Mutable{
-      mutable: m["mutable"],
+      mutable: decode_mutable(m["mutable"]),
     }
   end
 
@@ -5452,9 +6370,15 @@ defmodule Mutating do
           mutating: integer()
         }
 
+  def decode_mutating(value) when is_integer(value), do: value
+  def decode_mutating(_), do: {:error, "Unexpected type when decoding Mutating.mutating"}
+
+  def encode_mutating(value) when is_integer(value), do: value
+  def encode_mutating(_), do: {:error, "Unexpected type when encoding Mutating.mutating"}
+
   def from_map(m) do
     %Mutating{
-      mutating: m["mutating"],
+      mutating: decode_mutating(m["mutating"]),
     }
   end
 
@@ -5485,9 +6409,15 @@ defmodule Namespace do
           namespace: integer()
         }
 
+  def decode_namespace(value) when is_integer(value), do: value
+  def decode_namespace(_), do: {:error, "Unexpected type when decoding Namespace.namespace"}
+
+  def encode_namespace(value) when is_integer(value), do: value
+  def encode_namespace(_), do: {:error, "Unexpected type when encoding Namespace.namespace"}
+
   def from_map(m) do
     %Namespace{
-      namespace: m["namespace"],
+      namespace: decode_namespace(m["namespace"]),
     }
   end
 
@@ -5518,9 +6448,15 @@ defmodule Native do
           native: integer()
         }
 
+  def decode_native(value) when is_integer(value), do: value
+  def decode_native(_), do: {:error, "Unexpected type when decoding Native.native"}
+
+  def encode_native(value) when is_integer(value), do: value
+  def encode_native(_), do: {:error, "Unexpected type when encoding Native.native"}
+
   def from_map(m) do
     %Native{
-      native: m["native"],
+      native: decode_native(m["native"]),
     }
   end
 
@@ -5551,9 +6487,15 @@ defmodule New do
           new: integer()
         }
 
+  def decode_new(value) when is_integer(value), do: value
+  def decode_new(_), do: {:error, "Unexpected type when decoding New.new"}
+
+  def encode_new(value) when is_integer(value), do: value
+  def encode_new(_), do: {:error, "Unexpected type when encoding New.new"}
+
   def from_map(m) do
     %New{
-      new: m["new"],
+      new: decode_new(m["new"]),
     }
   end
 
@@ -5584,9 +6526,15 @@ defmodule Newtonsoft do
           newtonsoft: integer()
         }
 
+  def decode_newtonsoft(value) when is_integer(value), do: value
+  def decode_newtonsoft(_), do: {:error, "Unexpected type when decoding Newtonsoft.newtonsoft"}
+
+  def encode_newtonsoft(value) when is_integer(value), do: value
+  def encode_newtonsoft(_), do: {:error, "Unexpected type when encoding Newtonsoft.newtonsoft"}
+
   def from_map(m) do
     %Newtonsoft{
-      newtonsoft: m["newtonsoft"],
+      newtonsoft: decode_newtonsoft(m["newtonsoft"]),
     }
   end
 
@@ -5617,9 +6565,15 @@ defmodule No do
           no: integer()
         }
 
+  def decode_no(value) when is_integer(value), do: value
+  def decode_no(_), do: {:error, "Unexpected type when decoding No.no"}
+
+  def encode_no(value) when is_integer(value), do: value
+  def encode_no(_), do: {:error, "Unexpected type when encoding No.no"}
+
   def from_map(m) do
     %No{
-      no: m["NO"],
+      no: decode_no(m["NO"]),
     }
   end
 
@@ -5650,9 +6604,15 @@ defmodule Noexcept do
           noexcept: integer()
         }
 
+  def decode_noexcept(value) when is_integer(value), do: value
+  def decode_noexcept(_), do: {:error, "Unexpected type when decoding Noexcept.noexcept"}
+
+  def encode_noexcept(value) when is_integer(value), do: value
+  def encode_noexcept(_), do: {:error, "Unexpected type when encoding Noexcept.noexcept"}
+
   def from_map(m) do
     %Noexcept{
-      noexcept: m["noexcept"],
+      noexcept: decode_noexcept(m["noexcept"]),
     }
   end
 
@@ -5683,9 +6643,15 @@ defmodule Nonatomic do
           nonatomic: integer()
         }
 
+  def decode_nonatomic(value) when is_integer(value), do: value
+  def decode_nonatomic(_), do: {:error, "Unexpected type when decoding Nonatomic.nonatomic"}
+
+  def encode_nonatomic(value) when is_integer(value), do: value
+  def encode_nonatomic(_), do: {:error, "Unexpected type when encoding Nonatomic.nonatomic"}
+
   def from_map(m) do
     %Nonatomic{
-      nonatomic: m["nonatomic"],
+      nonatomic: decode_nonatomic(m["nonatomic"]),
     }
   end
 
@@ -5716,9 +6682,15 @@ defmodule None do
           none: integer()
         }
 
+  def decode_none(value) when is_integer(value), do: value
+  def decode_none(_), do: {:error, "Unexpected type when decoding None.none"}
+
+  def encode_none(value) when is_integer(value), do: value
+  def encode_none(_), do: {:error, "Unexpected type when encoding None.none"}
+
   def from_map(m) do
     %None{
-      none: m["None"],
+      none: decode_none(m["None"]),
     }
   end
 
@@ -5749,9 +6721,15 @@ defmodule Nonlocal do
           nonlocal: integer()
         }
 
+  def decode_nonlocal(value) when is_integer(value), do: value
+  def decode_nonlocal(_), do: {:error, "Unexpected type when decoding Nonlocal.nonlocal"}
+
+  def encode_nonlocal(value) when is_integer(value), do: value
+  def encode_nonlocal(_), do: {:error, "Unexpected type when encoding Nonlocal.nonlocal"}
+
   def from_map(m) do
     %Nonlocal{
-      nonlocal: m["nonlocal"],
+      nonlocal: decode_nonlocal(m["nonlocal"]),
     }
   end
 
@@ -5782,9 +6760,15 @@ defmodule Nonmutating do
           nonmutating: integer()
         }
 
+  def decode_nonmutating(value) when is_integer(value), do: value
+  def decode_nonmutating(_), do: {:error, "Unexpected type when decoding Nonmutating.nonmutating"}
+
+  def encode_nonmutating(value) when is_integer(value), do: value
+  def encode_nonmutating(_), do: {:error, "Unexpected type when encoding Nonmutating.nonmutating"}
+
   def from_map(m) do
     %Nonmutating{
-      nonmutating: m["nonmutating"],
+      nonmutating: decode_nonmutating(m["nonmutating"]),
     }
   end
 
@@ -5815,9 +6799,15 @@ defmodule NotEq do
           not_eq: integer()
         }
 
+  def decode_not_eq(value) when is_integer(value), do: value
+  def decode_not_eq(_), do: {:error, "Unexpected type when decoding NotEq.not_eq"}
+
+  def encode_not_eq(value) when is_integer(value), do: value
+  def encode_not_eq(_), do: {:error, "Unexpected type when encoding NotEq.not_eq"}
+
   def from_map(m) do
     %NotEq{
-      not_eq: m["not_eq"],
+      not_eq: decode_not_eq(m["not_eq"]),
     }
   end
 
@@ -5848,9 +6838,15 @@ defmodule NSString do
           ns_string: integer()
         }
 
+  def decode_ns_string(value) when is_integer(value), do: value
+  def decode_ns_string(_), do: {:error, "Unexpected type when decoding NSString.ns_string"}
+
+  def encode_ns_string(value) when is_integer(value), do: value
+  def encode_ns_string(_), do: {:error, "Unexpected type when encoding NSString.ns_string"}
+
   def from_map(m) do
     %NSString{
-      ns_string: m["NSString"],
+      ns_string: decode_ns_string(m["NSString"]),
     }
   end
 
@@ -5881,9 +6877,15 @@ defmodule Null do
           null: integer()
         }
 
+  def decode_null(value) when is_integer(value), do: value
+  def decode_null(_), do: {:error, "Unexpected type when decoding Null.null"}
+
+  def encode_null(value) when is_integer(value), do: value
+  def encode_null(_), do: {:error, "Unexpected type when encoding Null.null"}
+
   def from_map(m) do
     %Null{
-      null: m["NULL"],
+      null: decode_null(m["NULL"]),
     }
   end
 
@@ -5914,9 +6916,15 @@ defmodule Nullptr do
           nullptr: integer()
         }
 
+  def decode_nullptr(value) when is_integer(value), do: value
+  def decode_nullptr(_), do: {:error, "Unexpected type when decoding Nullptr.nullptr"}
+
+  def encode_nullptr(value) when is_integer(value), do: value
+  def encode_nullptr(_), do: {:error, "Unexpected type when encoding Nullptr.nullptr"}
+
   def from_map(m) do
     %Nullptr{
-      nullptr: m["nullptr"],
+      nullptr: decode_nullptr(m["nullptr"]),
     }
   end
 
@@ -5947,9 +6955,15 @@ defmodule Number do
           number: integer()
         }
 
+  def decode_number(value) when is_integer(value), do: value
+  def decode_number(_), do: {:error, "Unexpected type when decoding Number.number"}
+
+  def encode_number(value) when is_integer(value), do: value
+  def encode_number(_), do: {:error, "Unexpected type when encoding Number.number"}
+
   def from_map(m) do
     %Number{
-      number: m["number"],
+      number: decode_number(m["number"]),
     }
   end
 
@@ -5980,9 +6994,15 @@ defmodule NilClass do
           nil_nil: integer()
         }
 
+  def decode_nil_nil(value) when is_integer(value), do: value
+  def decode_nil_nil(_), do: {:error, "Unexpected type when decoding NilClass.nil_nil"}
+
+  def encode_nil_nil(value) when is_integer(value), do: value
+  def encode_nil_nil(_), do: {:error, "Unexpected type when encoding NilClass.nil_nil"}
+
   def from_map(m) do
     %NilClass{
-      nil_nil: m["nil"],
+      nil_nil: decode_nil_nil(m["nil"]),
     }
   end
 
@@ -6013,9 +7033,15 @@ defmodule NoneClass do
           none: integer()
         }
 
+  def decode_none(value) when is_integer(value), do: value
+  def decode_none(_), do: {:error, "Unexpected type when decoding NoneClass.none"}
+
+  def encode_none(value) when is_integer(value), do: value
+  def encode_none(_), do: {:error, "Unexpected type when encoding NoneClass.none"}
+
   def from_map(m) do
     %NoneClass{
-      none: m["none"],
+      none: decode_none(m["none"]),
     }
   end
 
@@ -6046,9 +7072,15 @@ defmodule NotClass do
           not_not: integer()
         }
 
+  def decode_not_not(value) when is_integer(value), do: value
+  def decode_not_not(_), do: {:error, "Unexpected type when decoding NotClass.not_not"}
+
+  def encode_not_not(value) when is_integer(value), do: value
+  def encode_not_not(_), do: {:error, "Unexpected type when encoding NotClass.not_not"}
+
   def from_map(m) do
     %NotClass{
-      not_not: m["not"],
+      not_not: decode_not_not(m["not"]),
     }
   end
 
@@ -6079,9 +7111,15 @@ defmodule NullClass do
           null: integer()
         }
 
+  def decode_null(value) when is_integer(value), do: value
+  def decode_null(_), do: {:error, "Unexpected type when decoding NullClass.null"}
+
+  def encode_null(value) when is_integer(value), do: value
+  def encode_null(_), do: {:error, "Unexpected type when encoding NullClass.null"}
+
   def from_map(m) do
     %NullClass{
-      null: m["null"],
+      null: decode_null(m["null"]),
     }
   end
 
@@ -6112,9 +7150,15 @@ defmodule OrClass do
           or_or: integer()
         }
 
+  def decode_or_or(value) when is_integer(value), do: value
+  def decode_or_or(_), do: {:error, "Unexpected type when decoding OrClass.or_or"}
+
+  def encode_or_or(value) when is_integer(value), do: value
+  def encode_or_or(_), do: {:error, "Unexpected type when encoding OrClass.or_or"}
+
   def from_map(m) do
     %OrClass{
-      or_or: m["or"],
+      or_or: decode_or_or(m["or"]),
     }
   end
 
@@ -6145,9 +7189,15 @@ defmodule Obj3Protocol do
           protocol: integer()
         }
 
+  def decode_protocol(value) when is_integer(value), do: value
+  def decode_protocol(_), do: {:error, "Unexpected type when decoding Obj3Protocol.protocol"}
+
+  def encode_protocol(value) when is_integer(value), do: value
+  def encode_protocol(_), do: {:error, "Unexpected type when encoding Obj3Protocol.protocol"}
+
   def from_map(m) do
     %Obj3Protocol{
-      protocol: m["protocol"],
+      protocol: decode_protocol(m["protocol"]),
     }
   end
 
@@ -6178,9 +7228,15 @@ defmodule Object do
           object: integer()
         }
 
+  def decode_object(value) when is_integer(value), do: value
+  def decode_object(_), do: {:error, "Unexpected type when decoding Object.object"}
+
+  def encode_object(value) when is_integer(value), do: value
+  def encode_object(_), do: {:error, "Unexpected type when encoding Object.object"}
+
   def from_map(m) do
     %Object{
-      object: m["object"],
+      object: decode_object(m["object"]),
     }
   end
 
@@ -6211,9 +7267,15 @@ defmodule Of do
           of: integer()
         }
 
+  def decode_of(value) when is_integer(value), do: value
+  def decode_of(_), do: {:error, "Unexpected type when decoding Of.of"}
+
+  def encode_of(value) when is_integer(value), do: value
+  def encode_of(_), do: {:error, "Unexpected type when encoding Of.of"}
+
   def from_map(m) do
     %Of{
-      of: m["of"],
+      of: decode_of(m["of"]),
     }
   end
 
@@ -6244,9 +7306,15 @@ defmodule Oneway do
           oneway: integer()
         }
 
+  def decode_oneway(value) when is_integer(value), do: value
+  def decode_oneway(_), do: {:error, "Unexpected type when decoding Oneway.oneway"}
+
+  def encode_oneway(value) when is_integer(value), do: value
+  def encode_oneway(_), do: {:error, "Unexpected type when encoding Oneway.oneway"}
+
   def from_map(m) do
     %Oneway{
-      oneway: m["oneway"],
+      oneway: decode_oneway(m["oneway"]),
     }
   end
 
@@ -6277,9 +7345,15 @@ defmodule Open do
           open: integer()
         }
 
+  def decode_open(value) when is_integer(value), do: value
+  def decode_open(_), do: {:error, "Unexpected type when decoding Open.open"}
+
+  def encode_open(value) when is_integer(value), do: value
+  def encode_open(_), do: {:error, "Unexpected type when encoding Open.open"}
+
   def from_map(m) do
     %Open{
-      open: m["open"],
+      open: decode_open(m["open"]),
     }
   end
 
@@ -6310,9 +7384,15 @@ defmodule Operator do
           operator: integer()
         }
 
+  def decode_operator(value) when is_integer(value), do: value
+  def decode_operator(_), do: {:error, "Unexpected type when decoding Operator.operator"}
+
+  def encode_operator(value) when is_integer(value), do: value
+  def encode_operator(_), do: {:error, "Unexpected type when encoding Operator.operator"}
+
   def from_map(m) do
     %Operator{
-      operator: m["operator"],
+      operator: decode_operator(m["operator"]),
     }
   end
 
@@ -6343,9 +7423,15 @@ defmodule Optional do
           optional: integer()
         }
 
+  def decode_optional(value) when is_integer(value), do: value
+  def decode_optional(_), do: {:error, "Unexpected type when decoding Optional.optional"}
+
+  def encode_optional(value) when is_integer(value), do: value
+  def encode_optional(_), do: {:error, "Unexpected type when encoding Optional.optional"}
+
   def from_map(m) do
     %Optional{
-      optional: m["optional"],
+      optional: decode_optional(m["optional"]),
     }
   end
 
@@ -6376,9 +7462,15 @@ defmodule OrEq do
           or_eq: integer()
         }
 
+  def decode_or_eq(value) when is_integer(value), do: value
+  def decode_or_eq(_), do: {:error, "Unexpected type when decoding OrEq.or_eq"}
+
+  def encode_or_eq(value) when is_integer(value), do: value
+  def encode_or_eq(_), do: {:error, "Unexpected type when encoding OrEq.or_eq"}
+
   def from_map(m) do
     %OrEq{
-      or_eq: m["or_eq"],
+      or_eq: decode_or_eq(m["or_eq"]),
     }
   end
 
@@ -6409,9 +7501,15 @@ defmodule Out do
           out: integer()
         }
 
+  def decode_out(value) when is_integer(value), do: value
+  def decode_out(_), do: {:error, "Unexpected type when decoding Out.out"}
+
+  def encode_out(value) when is_integer(value), do: value
+  def encode_out(_), do: {:error, "Unexpected type when encoding Out.out"}
+
   def from_map(m) do
     %Out{
-      out: m["out"],
+      out: decode_out(m["out"]),
     }
   end
 
@@ -6442,9 +7540,15 @@ defmodule Override do
           override: integer()
         }
 
+  def decode_override(value) when is_integer(value), do: value
+  def decode_override(_), do: {:error, "Unexpected type when decoding Override.override"}
+
+  def encode_override(value) when is_integer(value), do: value
+  def encode_override(_), do: {:error, "Unexpected type when encoding Override.override"}
+
   def from_map(m) do
     %Override{
-      override: m["override"],
+      override: decode_override(m["override"]),
     }
   end
 
@@ -6475,9 +7579,15 @@ defmodule Package do
           package: integer()
         }
 
+  def decode_package(value) when is_integer(value), do: value
+  def decode_package(_), do: {:error, "Unexpected type when decoding Package.package"}
+
+  def encode_package(value) when is_integer(value), do: value
+  def encode_package(_), do: {:error, "Unexpected type when encoding Package.package"}
+
   def from_map(m) do
     %Package{
-      package: m["package"],
+      package: decode_package(m["package"]),
     }
   end
 
@@ -6508,9 +7618,15 @@ defmodule Params do
           params: integer()
         }
 
+  def decode_params(value) when is_integer(value), do: value
+  def decode_params(_), do: {:error, "Unexpected type when decoding Params.params"}
+
+  def encode_params(value) when is_integer(value), do: value
+  def encode_params(_), do: {:error, "Unexpected type when encoding Params.params"}
+
   def from_map(m) do
     %Params{
-      params: m["params"],
+      params: decode_params(m["params"]),
     }
   end
 
@@ -6541,9 +7657,15 @@ defmodule Pass do
           pass: integer()
         }
 
+  def decode_pass(value) when is_integer(value), do: value
+  def decode_pass(_), do: {:error, "Unexpected type when decoding Pass.pass"}
+
+  def encode_pass(value) when is_integer(value), do: value
+  def encode_pass(_), do: {:error, "Unexpected type when encoding Pass.pass"}
+
   def from_map(m) do
     %Pass{
-      pass: m["pass"],
+      pass: decode_pass(m["pass"]),
     }
   end
 
@@ -6574,9 +7696,15 @@ defmodule PortClass do
           port: integer()
         }
 
+  def decode_port(value) when is_integer(value), do: value
+  def decode_port(_), do: {:error, "Unexpected type when decoding PortClass.port"}
+
+  def encode_port(value) when is_integer(value), do: value
+  def encode_port(_), do: {:error, "Unexpected type when encoding PortClass.port"}
+
   def from_map(m) do
     %PortClass{
-      port: m["port"],
+      port: decode_port(m["port"]),
     }
   end
 
@@ -6607,9 +7735,15 @@ defmodule Postfix do
           postfix: integer()
         }
 
+  def decode_postfix(value) when is_integer(value), do: value
+  def decode_postfix(_), do: {:error, "Unexpected type when decoding Postfix.postfix"}
+
+  def encode_postfix(value) when is_integer(value), do: value
+  def encode_postfix(_), do: {:error, "Unexpected type when encoding Postfix.postfix"}
+
   def from_map(m) do
     %Postfix{
-      postfix: m["postfix"],
+      postfix: decode_postfix(m["postfix"]),
     }
   end
 
@@ -6640,9 +7774,15 @@ defmodule Precedence do
           precedence: integer()
         }
 
+  def decode_precedence(value) when is_integer(value), do: value
+  def decode_precedence(_), do: {:error, "Unexpected type when decoding Precedence.precedence"}
+
+  def encode_precedence(value) when is_integer(value), do: value
+  def encode_precedence(_), do: {:error, "Unexpected type when encoding Precedence.precedence"}
+
   def from_map(m) do
     %Precedence{
-      precedence: m["precedence"],
+      precedence: decode_precedence(m["precedence"]),
     }
   end
 
@@ -6673,9 +7813,15 @@ defmodule Prefix do
           prefix: integer()
         }
 
+  def decode_prefix(value) when is_integer(value), do: value
+  def decode_prefix(_), do: {:error, "Unexpected type when decoding Prefix.prefix"}
+
+  def encode_prefix(value) when is_integer(value), do: value
+  def encode_prefix(_), do: {:error, "Unexpected type when encoding Prefix.prefix"}
+
   def from_map(m) do
     %Prefix{
-      prefix: m["prefix"],
+      prefix: decode_prefix(m["prefix"]),
     }
   end
 
@@ -6706,9 +7852,15 @@ defmodule Print do
           print: integer()
         }
 
+  def decode_print(value) when is_integer(value), do: value
+  def decode_print(_), do: {:error, "Unexpected type when decoding Print.print"}
+
+  def encode_print(value) when is_integer(value), do: value
+  def encode_print(_), do: {:error, "Unexpected type when encoding Print.print"}
+
   def from_map(m) do
     %Print{
-      print: m["print"],
+      print: decode_print(m["print"]),
     }
   end
 
@@ -6739,9 +7891,15 @@ defmodule PrintMembers do
           print_members: integer()
         }
 
+  def decode_print_members(value) when is_integer(value), do: value
+  def decode_print_members(_), do: {:error, "Unexpected type when decoding PrintMembers.print_members"}
+
+  def encode_print_members(value) when is_integer(value), do: value
+  def encode_print_members(_), do: {:error, "Unexpected type when encoding PrintMembers.print_members"}
+
   def from_map(m) do
     %PrintMembers{
-      print_members: m["printMembers"],
+      print_members: decode_print_members(m["printMembers"]),
     }
   end
 
@@ -6772,9 +7930,15 @@ defmodule Printf do
           printf: integer()
         }
 
+  def decode_printf(value) when is_integer(value), do: value
+  def decode_printf(_), do: {:error, "Unexpected type when decoding Printf.printf"}
+
+  def encode_printf(value) when is_integer(value), do: value
+  def encode_printf(_), do: {:error, "Unexpected type when encoding Printf.printf"}
+
   def from_map(m) do
     %Printf{
-      printf: m["printf"],
+      printf: decode_printf(m["printf"]),
     }
   end
 
@@ -6805,9 +7969,15 @@ defmodule Private do
           private: integer()
         }
 
+  def decode_private(value) when is_integer(value), do: value
+  def decode_private(_), do: {:error, "Unexpected type when decoding Private.private"}
+
+  def encode_private(value) when is_integer(value), do: value
+  def encode_private(_), do: {:error, "Unexpected type when encoding Private.private"}
+
   def from_map(m) do
     %Private{
-      private: m["private"],
+      private: decode_private(m["private"]),
     }
   end
 
@@ -6838,9 +8008,15 @@ defmodule Protected do
           protected: integer()
         }
 
+  def decode_protected(value) when is_integer(value), do: value
+  def decode_protected(_), do: {:error, "Unexpected type when decoding Protected.protected"}
+
+  def encode_protected(value) when is_integer(value), do: value
+  def encode_protected(_), do: {:error, "Unexpected type when encoding Protected.protected"}
+
   def from_map(m) do
     %Protected{
-      protected: m["protected"],
+      protected: decode_protected(m["protected"]),
     }
   end
 
@@ -6871,9 +8047,15 @@ defmodule ProtocolClass do
           protocol: integer()
         }
 
+  def decode_protocol(value) when is_integer(value), do: value
+  def decode_protocol(_), do: {:error, "Unexpected type when decoding ProtocolClass.protocol"}
+
+  def encode_protocol(value) when is_integer(value), do: value
+  def encode_protocol(_), do: {:error, "Unexpected type when encoding ProtocolClass.protocol"}
+
   def from_map(m) do
     %ProtocolClass{
-      protocol: m["Protocol"],
+      protocol: decode_protocol(m["Protocol"]),
     }
   end
 
@@ -6969,9 +8151,15 @@ defmodule Obj3 do
           protocol: ProtocolClass.t()
         }
 
+  def decode_dummy(value) when is_integer(value), do: value
+  def decode_dummy(_), do: {:error, "Unexpected type when decoding Obj3.dummy"}
+
+  def encode_dummy(value) when is_integer(value), do: value
+  def encode_dummy(_), do: {:error, "Unexpected type when encoding Obj3.dummy"}
+
   def from_map(m) do
     %Obj3{
-      dummy: m["dummy"],
+      dummy: decode_dummy(m["dummy"]),
       is: Is.from_map(m["is"]),
       iterable: Iterable.from_map(m["iterable"]),
       jdec: Jdec.from_map(m["jdec"]),
@@ -7132,9 +8320,15 @@ defmodule SelfClass do
           self: integer()
         }
 
+  def decode_self(value) when is_integer(value), do: value
+  def decode_self(_), do: {:error, "Unexpected type when decoding SelfClass.self"}
+
+  def encode_self(value) when is_integer(value), do: value
+  def encode_self(_), do: {:error, "Unexpected type when encoding SelfClass.self"}
+
   def from_map(m) do
     %SelfClass{
-      self: m["self"],
+      self: decode_self(m["self"]),
     }
   end
 
@@ -7165,9 +8359,15 @@ defmodule TrueClass do
           true_true: integer()
         }
 
+  def decode_true_true(value) when is_integer(value), do: value
+  def decode_true_true(_), do: {:error, "Unexpected type when decoding TrueClass.true_true"}
+
+  def encode_true_true(value) when is_integer(value), do: value
+  def encode_true_true(_), do: {:error, "Unexpected type when encoding TrueClass.true_true"}
+
   def from_map(m) do
     %TrueClass{
-      true_true: m["True"],
+      true_true: decode_true_true(m["True"]),
     }
   end
 
@@ -7198,9 +8398,15 @@ defmodule TypeClass do
           type: integer()
         }
 
+  def decode_type(value) when is_integer(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding TypeClass.type"}
+
+  def encode_type(value) when is_integer(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding TypeClass.type"}
+
   def from_map(m) do
     %TypeClass{
-      type: m["type"],
+      type: decode_type(m["type"]),
     }
   end
 
@@ -7231,9 +8437,15 @@ defmodule Public do
           public: integer()
         }
 
+  def decode_public(value) when is_integer(value), do: value
+  def decode_public(_), do: {:error, "Unexpected type when decoding Public.public"}
+
+  def encode_public(value) when is_integer(value), do: value
+  def encode_public(_), do: {:error, "Unexpected type when encoding Public.public"}
+
   def from_map(m) do
     %Public{
-      public: m["public"],
+      public: decode_public(m["public"]),
     }
   end
 
@@ -7264,9 +8476,15 @@ defmodule Quicktype do
           quicktype: integer()
         }
 
+  def decode_quicktype(value) when is_integer(value), do: value
+  def decode_quicktype(_), do: {:error, "Unexpected type when decoding Quicktype.quicktype"}
+
+  def encode_quicktype(value) when is_integer(value), do: value
+  def encode_quicktype(_), do: {:error, "Unexpected type when encoding Quicktype.quicktype"}
+
   def from_map(m) do
     %Quicktype{
-      quicktype: m["quicktype"],
+      quicktype: decode_quicktype(m["quicktype"]),
     }
   end
 
@@ -7297,9 +8515,15 @@ defmodule Raise do
           raise: integer()
         }
 
+  def decode_raise(value) when is_integer(value), do: value
+  def decode_raise(_), do: {:error, "Unexpected type when decoding Raise.raise"}
+
+  def encode_raise(value) when is_integer(value), do: value
+  def encode_raise(_), do: {:error, "Unexpected type when encoding Raise.raise"}
+
   def from_map(m) do
     %Raise{
-      raise: m["raise"],
+      raise: decode_raise(m["raise"]),
     }
   end
 
@@ -7330,9 +8554,15 @@ defmodule RangeClass do
           range: integer()
         }
 
+  def decode_range(value) when is_integer(value), do: value
+  def decode_range(_), do: {:error, "Unexpected type when decoding RangeClass.range"}
+
+  def encode_range(value) when is_integer(value), do: value
+  def encode_range(_), do: {:error, "Unexpected type when encoding RangeClass.range"}
+
   def from_map(m) do
     %RangeClass{
-      range: m["range"],
+      range: decode_range(m["range"]),
     }
   end
 
@@ -7363,9 +8593,15 @@ defmodule Readonly do
           readonly: integer()
         }
 
+  def decode_readonly(value) when is_integer(value), do: value
+  def decode_readonly(_), do: {:error, "Unexpected type when decoding Readonly.readonly"}
+
+  def encode_readonly(value) when is_integer(value), do: value
+  def encode_readonly(_), do: {:error, "Unexpected type when encoding Readonly.readonly"}
+
   def from_map(m) do
     %Readonly{
-      readonly: m["readonly"],
+      readonly: decode_readonly(m["readonly"]),
     }
   end
 
@@ -7396,9 +8632,15 @@ defmodule Ref do
           ref: integer()
         }
 
+  def decode_ref(value) when is_integer(value), do: value
+  def decode_ref(_), do: {:error, "Unexpected type when decoding Ref.ref"}
+
+  def encode_ref(value) when is_integer(value), do: value
+  def encode_ref(_), do: {:error, "Unexpected type when encoding Ref.ref"}
+
   def from_map(m) do
     %Ref{
-      ref: m["ref"],
+      ref: decode_ref(m["ref"]),
     }
   end
 
@@ -7429,9 +8671,15 @@ defmodule Register do
           register: integer()
         }
 
+  def decode_register(value) when is_integer(value), do: value
+  def decode_register(_), do: {:error, "Unexpected type when decoding Register.register"}
+
+  def encode_register(value) when is_integer(value), do: value
+  def encode_register(_), do: {:error, "Unexpected type when encoding Register.register"}
+
   def from_map(m) do
     %Register{
-      register: m["register"],
+      register: decode_register(m["register"]),
     }
   end
 
@@ -7462,9 +8710,15 @@ defmodule ReinterpretCast do
           reinterpret_cast: integer()
         }
 
+  def decode_reinterpret_cast(value) when is_integer(value), do: value
+  def decode_reinterpret_cast(_), do: {:error, "Unexpected type when decoding ReinterpretCast.reinterpret_cast"}
+
+  def encode_reinterpret_cast(value) when is_integer(value), do: value
+  def encode_reinterpret_cast(_), do: {:error, "Unexpected type when encoding ReinterpretCast.reinterpret_cast"}
+
   def from_map(m) do
     %ReinterpretCast{
-      reinterpret_cast: m["reinterpret_cast"],
+      reinterpret_cast: decode_reinterpret_cast(m["reinterpret_cast"]),
     }
   end
 
@@ -7495,9 +8749,15 @@ defmodule Repeat do
           repeat: integer()
         }
 
+  def decode_repeat(value) when is_integer(value), do: value
+  def decode_repeat(_), do: {:error, "Unexpected type when decoding Repeat.repeat"}
+
+  def encode_repeat(value) when is_integer(value), do: value
+  def encode_repeat(_), do: {:error, "Unexpected type when encoding Repeat.repeat"}
+
   def from_map(m) do
     %Repeat{
-      repeat: m["repeat"],
+      repeat: decode_repeat(m["repeat"]),
     }
   end
 
@@ -7528,9 +8788,15 @@ defmodule Require do
           require: integer()
         }
 
+  def decode_require(value) when is_integer(value), do: value
+  def decode_require(_), do: {:error, "Unexpected type when decoding Require.require"}
+
+  def encode_require(value) when is_integer(value), do: value
+  def encode_require(_), do: {:error, "Unexpected type when encoding Require.require"}
+
   def from_map(m) do
     %Require{
-      require: m["require"],
+      require: decode_require(m["require"]),
     }
   end
 
@@ -7561,9 +8827,15 @@ defmodule Required do
           required: integer()
         }
 
+  def decode_required(value) when is_integer(value), do: value
+  def decode_required(_), do: {:error, "Unexpected type when decoding Required.required"}
+
+  def encode_required(value) when is_integer(value), do: value
+  def encode_required(_), do: {:error, "Unexpected type when encoding Required.required"}
+
   def from_map(m) do
     %Required{
-      required: m["required"],
+      required: decode_required(m["required"]),
     }
   end
 
@@ -7594,9 +8866,15 @@ defmodule Requires do
           requires: integer()
         }
 
+  def decode_requires(value) when is_integer(value), do: value
+  def decode_requires(_), do: {:error, "Unexpected type when decoding Requires.requires"}
+
+  def encode_requires(value) when is_integer(value), do: value
+  def encode_requires(_), do: {:error, "Unexpected type when encoding Requires.requires"}
+
   def from_map(m) do
     %Requires{
-      requires: m["requires"],
+      requires: decode_requires(m["requires"]),
     }
   end
 
@@ -7627,9 +8905,15 @@ defmodule Restrict do
           restrict: integer()
         }
 
+  def decode_restrict(value) when is_integer(value), do: value
+  def decode_restrict(_), do: {:error, "Unexpected type when decoding Restrict.restrict"}
+
+  def encode_restrict(value) when is_integer(value), do: value
+  def encode_restrict(_), do: {:error, "Unexpected type when encoding Restrict.restrict"}
+
   def from_map(m) do
     %Restrict{
-      restrict: m["restrict"],
+      restrict: decode_restrict(m["restrict"]),
     }
   end
 
@@ -7660,9 +8944,15 @@ defmodule Retain do
           retain: integer()
         }
 
+  def decode_retain(value) when is_integer(value), do: value
+  def decode_retain(_), do: {:error, "Unexpected type when decoding Retain.retain"}
+
+  def encode_retain(value) when is_integer(value), do: value
+  def encode_retain(_), do: {:error, "Unexpected type when encoding Retain.retain"}
+
   def from_map(m) do
     %Retain{
-      retain: m["retain"],
+      retain: decode_retain(m["retain"]),
     }
   end
 
@@ -7693,9 +8983,15 @@ defmodule Rethrows do
           rethrows: integer()
         }
 
+  def decode_rethrows(value) when is_integer(value), do: value
+  def decode_rethrows(_), do: {:error, "Unexpected type when decoding Rethrows.rethrows"}
+
+  def encode_rethrows(value) when is_integer(value), do: value
+  def encode_rethrows(_), do: {:error, "Unexpected type when encoding Rethrows.rethrows"}
+
   def from_map(m) do
     %Rethrows{
-      rethrows: m["rethrows"],
+      rethrows: decode_rethrows(m["rethrows"]),
     }
   end
 
@@ -7726,9 +9022,15 @@ defmodule Return do
           return: integer()
         }
 
+  def decode_return(value) when is_integer(value), do: value
+  def decode_return(_), do: {:error, "Unexpected type when decoding Return.return"}
+
+  def encode_return(value) when is_integer(value), do: value
+  def encode_return(_), do: {:error, "Unexpected type when encoding Return.return"}
+
   def from_map(m) do
     %Return{
-      return: m["return"],
+      return: decode_return(m["return"]),
     }
   end
 
@@ -7759,9 +9061,15 @@ defmodule Right do
           right: integer()
         }
 
+  def decode_right(value) when is_integer(value), do: value
+  def decode_right(_), do: {:error, "Unexpected type when decoding Right.right"}
+
+  def encode_right(value) when is_integer(value), do: value
+  def encode_right(_), do: {:error, "Unexpected type when encoding Right.right"}
+
   def from_map(m) do
     %Right{
-      right: m["right"],
+      right: decode_right(m["right"]),
     }
   end
 
@@ -7792,9 +9100,15 @@ defmodule Sbyte do
           sbyte: integer()
         }
 
+  def decode_sbyte(value) when is_integer(value), do: value
+  def decode_sbyte(_), do: {:error, "Unexpected type when decoding Sbyte.sbyte"}
+
+  def encode_sbyte(value) when is_integer(value), do: value
+  def encode_sbyte(_), do: {:error, "Unexpected type when encoding Sbyte.sbyte"}
+
   def from_map(m) do
     %Sbyte{
-      sbyte: m["sbyte"],
+      sbyte: decode_sbyte(m["sbyte"]),
     }
   end
 
@@ -7825,9 +9139,15 @@ defmodule Sealed do
           sealed: integer()
         }
 
+  def decode_sealed(value) when is_integer(value), do: value
+  def decode_sealed(_), do: {:error, "Unexpected type when decoding Sealed.sealed"}
+
+  def encode_sealed(value) when is_integer(value), do: value
+  def encode_sealed(_), do: {:error, "Unexpected type when encoding Sealed.sealed"}
+
   def from_map(m) do
     %Sealed{
-      sealed: m["sealed"],
+      sealed: decode_sealed(m["sealed"]),
     }
   end
 
@@ -7858,9 +9178,15 @@ defmodule Sel do
           sel: integer()
         }
 
+  def decode_sel(value) when is_integer(value), do: value
+  def decode_sel(_), do: {:error, "Unexpected type when decoding Sel.sel"}
+
+  def encode_sel(value) when is_integer(value), do: value
+  def encode_sel(_), do: {:error, "Unexpected type when encoding Sel.sel"}
+
   def from_map(m) do
     %Sel{
-      sel: m["SEL"],
+      sel: decode_sel(m["SEL"]),
     }
   end
 
@@ -7891,9 +9217,15 @@ defmodule Select do
           select: integer()
         }
 
+  def decode_select(value) when is_integer(value), do: value
+  def decode_select(_), do: {:error, "Unexpected type when decoding Select.select"}
+
+  def encode_select(value) when is_integer(value), do: value
+  def encode_select(_), do: {:error, "Unexpected type when encoding Select.select"}
+
   def from_map(m) do
     %Select{
-      select: m["select"],
+      select: decode_select(m["select"]),
     }
   end
 
@@ -7924,9 +9256,15 @@ defmodule Self do
           self: integer()
         }
 
+  def decode_self(value) when is_integer(value), do: value
+  def decode_self(_), do: {:error, "Unexpected type when decoding Self.self"}
+
+  def encode_self(value) when is_integer(value), do: value
+  def encode_self(_), do: {:error, "Unexpected type when encoding Self.self"}
+
   def from_map(m) do
     %Self{
-      self: m["Self"],
+      self: decode_self(m["Self"]),
     }
   end
 
@@ -7957,9 +9295,15 @@ defmodule Serialize do
           serialize: integer()
         }
 
+  def decode_serialize(value) when is_integer(value), do: value
+  def decode_serialize(_), do: {:error, "Unexpected type when decoding Serialize.serialize"}
+
+  def encode_serialize(value) when is_integer(value), do: value
+  def encode_serialize(_), do: {:error, "Unexpected type when encoding Serialize.serialize"}
+
   def from_map(m) do
     %Serialize{
-      serialize: m["serialize"],
+      serialize: decode_serialize(m["serialize"]),
     }
   end
 
@@ -7990,9 +9334,15 @@ defmodule SetClass do
           set: integer()
         }
 
+  def decode_set(value) when is_integer(value), do: value
+  def decode_set(_), do: {:error, "Unexpected type when decoding SetClass.set"}
+
+  def encode_set(value) when is_integer(value), do: value
+  def encode_set(_), do: {:error, "Unexpected type when encoding SetClass.set"}
+
   def from_map(m) do
     %SetClass{
-      set: m["set"],
+      set: decode_set(m["set"]),
     }
   end
 
@@ -8023,9 +9373,15 @@ defmodule Short do
           short: integer()
         }
 
+  def decode_short(value) when is_integer(value), do: value
+  def decode_short(_), do: {:error, "Unexpected type when decoding Short.short"}
+
+  def encode_short(value) when is_integer(value), do: value
+  def encode_short(_), do: {:error, "Unexpected type when encoding Short.short"}
+
   def from_map(m) do
     %Short{
-      short: m["short"],
+      short: decode_short(m["short"]),
     }
   end
 
@@ -8056,9 +9412,15 @@ defmodule Signed do
           signed: integer()
         }
 
+  def decode_signed(value) when is_integer(value), do: value
+  def decode_signed(_), do: {:error, "Unexpected type when decoding Signed.signed"}
+
+  def encode_signed(value) when is_integer(value), do: value
+  def encode_signed(_), do: {:error, "Unexpected type when encoding Signed.signed"}
+
   def from_map(m) do
     %Signed{
-      signed: m["signed"],
+      signed: decode_signed(m["signed"]),
     }
   end
 
@@ -8089,9 +9451,15 @@ defmodule Sizeof do
           sizeof: integer()
         }
 
+  def decode_sizeof(value) when is_integer(value), do: value
+  def decode_sizeof(_), do: {:error, "Unexpected type when decoding Sizeof.sizeof"}
+
+  def encode_sizeof(value) when is_integer(value), do: value
+  def encode_sizeof(_), do: {:error, "Unexpected type when encoding Sizeof.sizeof"}
+
   def from_map(m) do
     %Sizeof{
-      sizeof: m["sizeof"],
+      sizeof: decode_sizeof(m["sizeof"]),
     }
   end
 
@@ -8122,9 +9490,15 @@ defmodule Stackalloc do
           stackalloc: integer()
         }
 
+  def decode_stackalloc(value) when is_integer(value), do: value
+  def decode_stackalloc(_), do: {:error, "Unexpected type when decoding Stackalloc.stackalloc"}
+
+  def encode_stackalloc(value) when is_integer(value), do: value
+  def encode_stackalloc(_), do: {:error, "Unexpected type when encoding Stackalloc.stackalloc"}
+
   def from_map(m) do
     %Stackalloc{
-      stackalloc: m["stackalloc"],
+      stackalloc: decode_stackalloc(m["stackalloc"]),
     }
   end
 
@@ -8155,9 +9529,15 @@ defmodule Static do
           static: integer()
         }
 
+  def decode_static(value) when is_integer(value), do: value
+  def decode_static(_), do: {:error, "Unexpected type when decoding Static.static"}
+
+  def encode_static(value) when is_integer(value), do: value
+  def encode_static(_), do: {:error, "Unexpected type when encoding Static.static"}
+
   def from_map(m) do
     %Static{
-      static: m["static"],
+      static: decode_static(m["static"]),
     }
   end
 
@@ -8188,9 +9568,15 @@ defmodule StaticAssert do
           static_assert: integer()
         }
 
+  def decode_static_assert(value) when is_integer(value), do: value
+  def decode_static_assert(_), do: {:error, "Unexpected type when decoding StaticAssert.static_assert"}
+
+  def encode_static_assert(value) when is_integer(value), do: value
+  def encode_static_assert(_), do: {:error, "Unexpected type when encoding StaticAssert.static_assert"}
+
   def from_map(m) do
     %StaticAssert{
-      static_assert: m["static_assert"],
+      static_assert: decode_static_assert(m["static_assert"]),
     }
   end
 
@@ -8221,9 +9607,15 @@ defmodule StaticCast do
           static_cast: integer()
         }
 
+  def decode_static_cast(value) when is_integer(value), do: value
+  def decode_static_cast(_), do: {:error, "Unexpected type when decoding StaticCast.static_cast"}
+
+  def encode_static_cast(value) when is_integer(value), do: value
+  def encode_static_cast(_), do: {:error, "Unexpected type when encoding StaticCast.static_cast"}
+
   def from_map(m) do
     %StaticCast{
-      static_cast: m["static_cast"],
+      static_cast: decode_static_cast(m["static_cast"]),
     }
   end
 
@@ -8254,9 +9646,15 @@ defmodule Strictfp do
           strictfp: integer()
         }
 
+  def decode_strictfp(value) when is_integer(value), do: value
+  def decode_strictfp(_), do: {:error, "Unexpected type when decoding Strictfp.strictfp"}
+
+  def encode_strictfp(value) when is_integer(value), do: value
+  def encode_strictfp(_), do: {:error, "Unexpected type when encoding Strictfp.strictfp"}
+
   def from_map(m) do
     %Strictfp{
-      strictfp: m["strictfp"],
+      strictfp: decode_strictfp(m["strictfp"]),
     }
   end
 
@@ -8287,9 +9685,15 @@ defmodule StringClass do
           string: integer()
         }
 
+  def decode_string(value) when is_integer(value), do: value
+  def decode_string(_), do: {:error, "Unexpected type when decoding StringClass.string"}
+
+  def encode_string(value) when is_integer(value), do: value
+  def encode_string(_), do: {:error, "Unexpected type when encoding StringClass.string"}
+
   def from_map(m) do
     %StringClass{
-      string: m["string"],
+      string: decode_string(m["string"]),
     }
   end
 
@@ -8320,9 +9724,15 @@ defmodule Struct do
           struct: integer()
         }
 
+  def decode_struct(value) when is_integer(value), do: value
+  def decode_struct(_), do: {:error, "Unexpected type when decoding Struct.struct"}
+
+  def encode_struct(value) when is_integer(value), do: value
+  def encode_struct(_), do: {:error, "Unexpected type when encoding Struct.struct"}
+
   def from_map(m) do
     %Struct{
-      struct: m["struct"],
+      struct: decode_struct(m["struct"]),
     }
   end
 
@@ -8353,9 +9763,15 @@ defmodule Subscript do
           subscript: integer()
         }
 
+  def decode_subscript(value) when is_integer(value), do: value
+  def decode_subscript(_), do: {:error, "Unexpected type when decoding Subscript.subscript"}
+
+  def encode_subscript(value) when is_integer(value), do: value
+  def encode_subscript(_), do: {:error, "Unexpected type when encoding Subscript.subscript"}
+
   def from_map(m) do
     %Subscript{
-      subscript: m["subscript"],
+      subscript: decode_subscript(m["subscript"]),
     }
   end
 
@@ -8386,9 +9802,15 @@ defmodule Super do
           super: integer()
         }
 
+  def decode_super(value) when is_integer(value), do: value
+  def decode_super(_), do: {:error, "Unexpected type when decoding Super.super"}
+
+  def encode_super(value) when is_integer(value), do: value
+  def encode_super(_), do: {:error, "Unexpected type when encoding Super.super"}
+
   def from_map(m) do
     %Super{
-      super: m["super"],
+      super: decode_super(m["super"]),
     }
   end
 
@@ -8419,9 +9841,15 @@ defmodule Switch do
           switch: integer()
         }
 
+  def decode_switch(value) when is_integer(value), do: value
+  def decode_switch(_), do: {:error, "Unexpected type when decoding Switch.switch"}
+
+  def encode_switch(value) when is_integer(value), do: value
+  def encode_switch(_), do: {:error, "Unexpected type when encoding Switch.switch"}
+
   def from_map(m) do
     %Switch{
-      switch: m["switch"],
+      switch: decode_switch(m["switch"]),
     }
   end
 
@@ -8452,9 +9880,15 @@ defmodule Symbol do
           symbol: integer()
         }
 
+  def decode_symbol(value) when is_integer(value), do: value
+  def decode_symbol(_), do: {:error, "Unexpected type when decoding Symbol.symbol"}
+
+  def encode_symbol(value) when is_integer(value), do: value
+  def encode_symbol(_), do: {:error, "Unexpected type when encoding Symbol.symbol"}
+
   def from_map(m) do
     %Symbol{
-      symbol: m["symbol"],
+      symbol: decode_symbol(m["symbol"]),
     }
   end
 
@@ -8485,9 +9919,15 @@ defmodule Synchronized do
           synchronized: integer()
         }
 
+  def decode_synchronized(value) when is_integer(value), do: value
+  def decode_synchronized(_), do: {:error, "Unexpected type when decoding Synchronized.synchronized"}
+
+  def encode_synchronized(value) when is_integer(value), do: value
+  def encode_synchronized(_), do: {:error, "Unexpected type when encoding Synchronized.synchronized"}
+
   def from_map(m) do
     %Synchronized{
-      synchronized: m["synchronized"],
+      synchronized: decode_synchronized(m["synchronized"]),
     }
   end
 
@@ -8518,9 +9958,15 @@ defmodule SystemClass do
           system: integer()
         }
 
+  def decode_system(value) when is_integer(value), do: value
+  def decode_system(_), do: {:error, "Unexpected type when decoding SystemClass.system"}
+
+  def encode_system(value) when is_integer(value), do: value
+  def encode_system(_), do: {:error, "Unexpected type when encoding SystemClass.system"}
+
   def from_map(m) do
     %SystemClass{
-      system: m["system"],
+      system: decode_system(m["system"]),
     }
   end
 
@@ -8551,9 +9997,15 @@ defmodule Template do
           template: integer()
         }
 
+  def decode_template(value) when is_integer(value), do: value
+  def decode_template(_), do: {:error, "Unexpected type when decoding Template.template"}
+
+  def encode_template(value) when is_integer(value), do: value
+  def encode_template(_), do: {:error, "Unexpected type when encoding Template.template"}
+
   def from_map(m) do
     %Template{
-      template: m["template"],
+      template: decode_template(m["template"]),
     }
   end
 
@@ -8584,9 +10036,15 @@ defmodule Then do
           then: integer()
         }
 
+  def decode_then(value) when is_integer(value), do: value
+  def decode_then(_), do: {:error, "Unexpected type when decoding Then.then"}
+
+  def encode_then(value) when is_integer(value), do: value
+  def encode_then(_), do: {:error, "Unexpected type when encoding Then.then"}
+
   def from_map(m) do
     %Then{
-      then: m["then"],
+      then: decode_then(m["then"]),
     }
   end
 
@@ -8617,9 +10075,15 @@ defmodule This do
           this: integer()
         }
 
+  def decode_this(value) when is_integer(value), do: value
+  def decode_this(_), do: {:error, "Unexpected type when decoding This.this"}
+
+  def encode_this(value) when is_integer(value), do: value
+  def encode_this(_), do: {:error, "Unexpected type when encoding This.this"}
+
   def from_map(m) do
     %This{
-      this: m["this"],
+      this: decode_this(m["this"]),
     }
   end
 
@@ -8650,9 +10114,15 @@ defmodule ThreadLocal do
           thread_local: integer()
         }
 
+  def decode_thread_local(value) when is_integer(value), do: value
+  def decode_thread_local(_), do: {:error, "Unexpected type when decoding ThreadLocal.thread_local"}
+
+  def encode_thread_local(value) when is_integer(value), do: value
+  def encode_thread_local(_), do: {:error, "Unexpected type when encoding ThreadLocal.thread_local"}
+
   def from_map(m) do
     %ThreadLocal{
-      thread_local: m["thread_local"],
+      thread_local: decode_thread_local(m["thread_local"]),
     }
   end
 
@@ -8683,9 +10153,15 @@ defmodule Throw do
           throw: integer()
         }
 
+  def decode_throw(value) when is_integer(value), do: value
+  def decode_throw(_), do: {:error, "Unexpected type when decoding Throw.throw"}
+
+  def encode_throw(value) when is_integer(value), do: value
+  def encode_throw(_), do: {:error, "Unexpected type when encoding Throw.throw"}
+
   def from_map(m) do
     %Throw{
-      throw: m["throw"],
+      throw: decode_throw(m["throw"]),
     }
   end
 
@@ -8716,9 +10192,15 @@ defmodule Throws do
           throws: integer()
         }
 
+  def decode_throws(value) when is_integer(value), do: value
+  def decode_throws(_), do: {:error, "Unexpected type when decoding Throws.throws"}
+
+  def encode_throws(value) when is_integer(value), do: value
+  def encode_throws(_), do: {:error, "Unexpected type when encoding Throws.throws"}
+
   def from_map(m) do
     %Throws{
-      throws: m["throws"],
+      throws: decode_throws(m["throws"]),
     }
   end
 
@@ -8749,9 +10231,15 @@ defmodule ToJSON do
           to_json: integer()
         }
 
+  def decode_to_json(value) when is_integer(value), do: value
+  def decode_to_json(_), do: {:error, "Unexpected type when decoding ToJSON.to_json"}
+
+  def encode_to_json(value) when is_integer(value), do: value
+  def encode_to_json(_), do: {:error, "Unexpected type when encoding ToJSON.to_json"}
+
   def from_map(m) do
     %ToJSON{
-      to_json: m["to_json"],
+      to_json: decode_to_json(m["to_json"]),
     }
   end
 
@@ -8782,9 +10270,15 @@ defmodule TopLevelClass do
           top_level: integer()
         }
 
+  def decode_top_level(value) when is_integer(value), do: value
+  def decode_top_level(_), do: {:error, "Unexpected type when decoding TopLevelClass.top_level"}
+
+  def encode_top_level(value) when is_integer(value), do: value
+  def encode_top_level(_), do: {:error, "Unexpected type when encoding TopLevelClass.top_level"}
+
   def from_map(m) do
     %TopLevelClass{
-      top_level: m["top_level"],
+      top_level: decode_top_level(m["top_level"]),
     }
   end
 
@@ -8815,9 +10309,15 @@ defmodule Transient do
           transient: integer()
         }
 
+  def decode_transient(value) when is_integer(value), do: value
+  def decode_transient(_), do: {:error, "Unexpected type when decoding Transient.transient"}
+
+  def encode_transient(value) when is_integer(value), do: value
+  def encode_transient(_), do: {:error, "Unexpected type when encoding Transient.transient"}
+
   def from_map(m) do
     %Transient{
-      transient: m["transient"],
+      transient: decode_transient(m["transient"]),
     }
   end
 
@@ -8848,9 +10348,15 @@ defmodule Obj4True do
           true_true: integer()
         }
 
+  def decode_true_true(value) when is_integer(value), do: value
+  def decode_true_true(_), do: {:error, "Unexpected type when decoding Obj4True.true_true"}
+
+  def encode_true_true(value) when is_integer(value), do: value
+  def encode_true_true(_), do: {:error, "Unexpected type when encoding Obj4True.true_true"}
+
   def from_map(m) do
     %Obj4True{
-      true_true: m["true"],
+      true_true: decode_true_true(m["true"]),
     }
   end
 
@@ -8881,9 +10387,15 @@ defmodule Try do
           try: integer()
         }
 
+  def decode_try(value) when is_integer(value), do: value
+  def decode_try(_), do: {:error, "Unexpected type when decoding Try.try"}
+
+  def encode_try(value) when is_integer(value), do: value
+  def encode_try(_), do: {:error, "Unexpected type when encoding Try.try"}
+
   def from_map(m) do
     %Try{
-      try: m["try"],
+      try: decode_try(m["try"]),
     }
   end
 
@@ -8914,9 +10426,15 @@ defmodule Type do
           type: integer()
         }
 
+  def decode_type(value) when is_integer(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Type.type"}
+
+  def encode_type(value) when is_integer(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Type.type"}
+
   def from_map(m) do
     %Type{
-      type: m["Type"],
+      type: decode_type(m["Type"]),
     }
   end
 
@@ -8947,9 +10465,15 @@ defmodule Typealias do
           typealias: integer()
         }
 
+  def decode_typealias(value) when is_integer(value), do: value
+  def decode_typealias(_), do: {:error, "Unexpected type when decoding Typealias.typealias"}
+
+  def encode_typealias(value) when is_integer(value), do: value
+  def encode_typealias(_), do: {:error, "Unexpected type when encoding Typealias.typealias"}
+
   def from_map(m) do
     %Typealias{
-      typealias: m["typealias"],
+      typealias: decode_typealias(m["typealias"]),
     }
   end
 
@@ -8980,9 +10504,15 @@ defmodule Typedef do
           typedef: integer()
         }
 
+  def decode_typedef(value) when is_integer(value), do: value
+  def decode_typedef(_), do: {:error, "Unexpected type when decoding Typedef.typedef"}
+
+  def encode_typedef(value) when is_integer(value), do: value
+  def encode_typedef(_), do: {:error, "Unexpected type when encoding Typedef.typedef"}
+
   def from_map(m) do
     %Typedef{
-      typedef: m["typedef"],
+      typedef: decode_typedef(m["typedef"]),
     }
   end
 
@@ -9013,9 +10543,15 @@ defmodule Typeid do
           typeid: integer()
         }
 
+  def decode_typeid(value) when is_integer(value), do: value
+  def decode_typeid(_), do: {:error, "Unexpected type when decoding Typeid.typeid"}
+
+  def encode_typeid(value) when is_integer(value), do: value
+  def encode_typeid(_), do: {:error, "Unexpected type when encoding Typeid.typeid"}
+
   def from_map(m) do
     %Typeid{
-      typeid: m["typeid"],
+      typeid: decode_typeid(m["typeid"]),
     }
   end
 
@@ -9046,9 +10582,15 @@ defmodule Typename do
           typename: integer()
         }
 
+  def decode_typename(value) when is_integer(value), do: value
+  def decode_typename(_), do: {:error, "Unexpected type when decoding Typename.typename"}
+
+  def encode_typename(value) when is_integer(value), do: value
+  def encode_typename(_), do: {:error, "Unexpected type when encoding Typename.typename"}
+
   def from_map(m) do
     %Typename{
-      typename: m["typename"],
+      typename: decode_typename(m["typename"]),
     }
   end
 
@@ -9079,9 +10621,15 @@ defmodule Typeof do
           typeof: integer()
         }
 
+  def decode_typeof(value) when is_integer(value), do: value
+  def decode_typeof(_), do: {:error, "Unexpected type when decoding Typeof.typeof"}
+
+  def encode_typeof(value) when is_integer(value), do: value
+  def encode_typeof(_), do: {:error, "Unexpected type when encoding Typeof.typeof"}
+
   def from_map(m) do
     %Typeof{
-      typeof: m["typeof"],
+      typeof: decode_typeof(m["typeof"]),
     }
   end
 
@@ -9112,9 +10660,15 @@ defmodule Uint do
           uint: integer()
         }
 
+  def decode_uint(value) when is_integer(value), do: value
+  def decode_uint(_), do: {:error, "Unexpected type when decoding Uint.uint"}
+
+  def encode_uint(value) when is_integer(value), do: value
+  def encode_uint(_), do: {:error, "Unexpected type when encoding Uint.uint"}
+
   def from_map(m) do
     %Uint{
-      uint: m["uint"],
+      uint: decode_uint(m["uint"]),
     }
   end
 
@@ -9145,9 +10699,15 @@ defmodule Ulong do
           ulong: integer()
         }
 
+  def decode_ulong(value) when is_integer(value), do: value
+  def decode_ulong(_), do: {:error, "Unexpected type when decoding Ulong.ulong"}
+
+  def encode_ulong(value) when is_integer(value), do: value
+  def encode_ulong(_), do: {:error, "Unexpected type when encoding Ulong.ulong"}
+
   def from_map(m) do
     %Ulong{
-      ulong: m["ulong"],
+      ulong: decode_ulong(m["ulong"]),
     }
   end
 
@@ -9178,9 +10738,15 @@ defmodule Unchecked do
           unchecked: integer()
         }
 
+  def decode_unchecked(value) when is_integer(value), do: value
+  def decode_unchecked(_), do: {:error, "Unexpected type when decoding Unchecked.unchecked"}
+
+  def encode_unchecked(value) when is_integer(value), do: value
+  def encode_unchecked(_), do: {:error, "Unexpected type when encoding Unchecked.unchecked"}
+
   def from_map(m) do
     %Unchecked{
-      unchecked: m["unchecked"],
+      unchecked: decode_unchecked(m["unchecked"]),
     }
   end
 
@@ -9211,9 +10777,15 @@ defmodule Undefined do
           undefined: integer()
         }
 
+  def decode_undefined(value) when is_integer(value), do: value
+  def decode_undefined(_), do: {:error, "Unexpected type when decoding Undefined.undefined"}
+
+  def encode_undefined(value) when is_integer(value), do: value
+  def encode_undefined(_), do: {:error, "Unexpected type when encoding Undefined.undefined"}
+
   def from_map(m) do
     %Undefined{
-      undefined: m["undefined"],
+      undefined: decode_undefined(m["undefined"]),
     }
   end
 
@@ -9308,9 +10880,15 @@ defmodule Obj4 do
           undefined: Undefined.t()
         }
 
+  def decode_dummy(value) when is_integer(value), do: value
+  def decode_dummy(_), do: {:error, "Unexpected type when decoding Obj4.dummy"}
+
+  def encode_dummy(value) when is_integer(value), do: value
+  def encode_dummy(_), do: {:error, "Unexpected type when encoding Obj4.dummy"}
+
   def from_map(m) do
     %Obj4{
-      dummy: m["dummy"],
+      dummy: decode_dummy(m["dummy"]),
       obj4_self: SelfClass.from_map(m["self"]),
       obj4_true: TrueClass.from_map(m["True"]),
       obj4_type: TypeClass.from_map(m["type"]),
@@ -9469,9 +11047,15 @@ defmodule Union do
           union: integer()
         }
 
+  def decode_union(value) when is_integer(value), do: value
+  def decode_union(_), do: {:error, "Unexpected type when decoding Union.union"}
+
+  def encode_union(value) when is_integer(value), do: value
+  def encode_union(_), do: {:error, "Unexpected type when encoding Union.union"}
+
   def from_map(m) do
     %Union{
-      union: m["union"],
+      union: decode_union(m["union"]),
     }
   end
 
@@ -9502,9 +11086,15 @@ defmodule Unowned do
           unowned: integer()
         }
 
+  def decode_unowned(value) when is_integer(value), do: value
+  def decode_unowned(_), do: {:error, "Unexpected type when decoding Unowned.unowned"}
+
+  def encode_unowned(value) when is_integer(value), do: value
+  def encode_unowned(_), do: {:error, "Unexpected type when encoding Unowned.unowned"}
+
   def from_map(m) do
     %Unowned{
-      unowned: m["unowned"],
+      unowned: decode_unowned(m["unowned"]),
     }
   end
 
@@ -9535,9 +11125,15 @@ defmodule Unsafe do
           unsafe: integer()
         }
 
+  def decode_unsafe(value) when is_integer(value), do: value
+  def decode_unsafe(_), do: {:error, "Unexpected type when decoding Unsafe.unsafe"}
+
+  def encode_unsafe(value) when is_integer(value), do: value
+  def encode_unsafe(_), do: {:error, "Unexpected type when encoding Unsafe.unsafe"}
+
   def from_map(m) do
     %Unsafe{
-      unsafe: m["unsafe"],
+      unsafe: decode_unsafe(m["unsafe"]),
     }
   end
 
@@ -9568,9 +11164,15 @@ defmodule Unsigned do
           unsigned: integer()
         }
 
+  def decode_unsigned(value) when is_integer(value), do: value
+  def decode_unsigned(_), do: {:error, "Unexpected type when decoding Unsigned.unsigned"}
+
+  def encode_unsigned(value) when is_integer(value), do: value
+  def encode_unsigned(_), do: {:error, "Unexpected type when encoding Unsigned.unsigned"}
+
   def from_map(m) do
     %Unsigned{
-      unsigned: m["unsigned"],
+      unsigned: decode_unsigned(m["unsigned"]),
     }
   end
 
@@ -9601,9 +11203,15 @@ defmodule Ushort do
           ushort: integer()
         }
 
+  def decode_ushort(value) when is_integer(value), do: value
+  def decode_ushort(_), do: {:error, "Unexpected type when decoding Ushort.ushort"}
+
+  def encode_ushort(value) when is_integer(value), do: value
+  def encode_ushort(_), do: {:error, "Unexpected type when encoding Ushort.ushort"}
+
   def from_map(m) do
     %Ushort{
-      ushort: m["ushort"],
+      ushort: decode_ushort(m["ushort"]),
     }
   end
 
@@ -9634,9 +11242,15 @@ defmodule Using do
           using: integer()
         }
 
+  def decode_using(value) when is_integer(value), do: value
+  def decode_using(_), do: {:error, "Unexpected type when decoding Using.using"}
+
+  def encode_using(value) when is_integer(value), do: value
+  def encode_using(_), do: {:error, "Unexpected type when encoding Using.using"}
+
   def from_map(m) do
     %Using{
-      using: m["using"],
+      using: decode_using(m["using"]),
     }
   end
 
@@ -9667,9 +11281,15 @@ defmodule Var do
           var: integer()
         }
 
+  def decode_var(value) when is_integer(value), do: value
+  def decode_var(_), do: {:error, "Unexpected type when decoding Var.var"}
+
+  def encode_var(value) when is_integer(value), do: value
+  def encode_var(_), do: {:error, "Unexpected type when encoding Var.var"}
+
   def from_map(m) do
     %Var{
-      var: m["var"],
+      var: decode_var(m["var"]),
     }
   end
 
@@ -9700,9 +11320,15 @@ defmodule Virtual do
           virtual: integer()
         }
 
+  def decode_virtual(value) when is_integer(value), do: value
+  def decode_virtual(_), do: {:error, "Unexpected type when decoding Virtual.virtual"}
+
+  def encode_virtual(value) when is_integer(value), do: value
+  def encode_virtual(_), do: {:error, "Unexpected type when encoding Virtual.virtual"}
+
   def from_map(m) do
     %Virtual{
-      virtual: m["virtual"],
+      virtual: decode_virtual(m["virtual"]),
     }
   end
 
@@ -9733,9 +11359,15 @@ defmodule Void do
           void: integer()
         }
 
+  def decode_void(value) when is_integer(value), do: value
+  def decode_void(_), do: {:error, "Unexpected type when decoding Void.void"}
+
+  def encode_void(value) when is_integer(value), do: value
+  def encode_void(_), do: {:error, "Unexpected type when encoding Void.void"}
+
   def from_map(m) do
     %Void{
-      void: m["void"],
+      void: decode_void(m["void"]),
     }
   end
 
@@ -9766,9 +11398,15 @@ defmodule Volatile do
           volatile: integer()
         }
 
+  def decode_volatile(value) when is_integer(value), do: value
+  def decode_volatile(_), do: {:error, "Unexpected type when decoding Volatile.volatile"}
+
+  def encode_volatile(value) when is_integer(value), do: value
+  def encode_volatile(_), do: {:error, "Unexpected type when encoding Volatile.volatile"}
+
   def from_map(m) do
     %Volatile{
-      volatile: m["volatile"],
+      volatile: decode_volatile(m["volatile"]),
     }
   end
 
@@ -9799,9 +11437,15 @@ defmodule WcharT do
           wchar_t: integer()
         }
 
+  def decode_wchar_t(value) when is_integer(value), do: value
+  def decode_wchar_t(_), do: {:error, "Unexpected type when decoding WcharT.wchar_t"}
+
+  def encode_wchar_t(value) when is_integer(value), do: value
+  def encode_wchar_t(_), do: {:error, "Unexpected type when encoding WcharT.wchar_t"}
+
   def from_map(m) do
     %WcharT{
-      wchar_t: m["wchar_t"],
+      wchar_t: decode_wchar_t(m["wchar_t"]),
     }
   end
 
@@ -9832,9 +11476,15 @@ defmodule Weak do
           weak: integer()
         }
 
+  def decode_weak(value) when is_integer(value), do: value
+  def decode_weak(_), do: {:error, "Unexpected type when decoding Weak.weak"}
+
+  def encode_weak(value) when is_integer(value), do: value
+  def encode_weak(_), do: {:error, "Unexpected type when encoding Weak.weak"}
+
   def from_map(m) do
     %Weak{
-      weak: m["weak"],
+      weak: decode_weak(m["weak"]),
     }
   end
 
@@ -9865,9 +11515,15 @@ defmodule Where do
           where: integer()
         }
 
+  def decode_where(value) when is_integer(value), do: value
+  def decode_where(_), do: {:error, "Unexpected type when decoding Where.where"}
+
+  def encode_where(value) when is_integer(value), do: value
+  def encode_where(_), do: {:error, "Unexpected type when encoding Where.where"}
+
   def from_map(m) do
     %Where{
-      where: m["where"],
+      where: decode_where(m["where"]),
     }
   end
 
@@ -9898,9 +11554,15 @@ defmodule While do
           while: integer()
         }
 
+  def decode_while(value) when is_integer(value), do: value
+  def decode_while(_), do: {:error, "Unexpected type when decoding While.while"}
+
+  def encode_while(value) when is_integer(value), do: value
+  def encode_while(_), do: {:error, "Unexpected type when encoding While.while"}
+
   def from_map(m) do
     %While{
-      while: m["while"],
+      while: decode_while(m["while"]),
     }
   end
 
@@ -9931,9 +11593,15 @@ defmodule WillSet do
           will_set: integer()
         }
 
+  def decode_will_set(value) when is_integer(value), do: value
+  def decode_will_set(_), do: {:error, "Unexpected type when decoding WillSet.will_set"}
+
+  def encode_will_set(value) when is_integer(value), do: value
+  def encode_will_set(_), do: {:error, "Unexpected type when encoding WillSet.will_set"}
+
   def from_map(m) do
     %WillSet{
-      will_set: m["willSet"],
+      will_set: decode_will_set(m["willSet"]),
     }
   end
 
@@ -9964,9 +11632,15 @@ defmodule With do
           with: integer()
         }
 
+  def decode_with(value) when is_integer(value), do: value
+  def decode_with(_), do: {:error, "Unexpected type when decoding With.with"}
+
+  def encode_with(value) when is_integer(value), do: value
+  def encode_with(_), do: {:error, "Unexpected type when encoding With.with"}
+
   def from_map(m) do
     %With{
-      with: m["with"],
+      with: decode_with(m["with"]),
     }
   end
 
@@ -9997,9 +11671,15 @@ defmodule Xor do
           xor: integer()
         }
 
+  def decode_xor(value) when is_integer(value), do: value
+  def decode_xor(_), do: {:error, "Unexpected type when decoding Xor.xor"}
+
+  def encode_xor(value) when is_integer(value), do: value
+  def encode_xor(_), do: {:error, "Unexpected type when encoding Xor.xor"}
+
   def from_map(m) do
     %Xor{
-      xor: m["xor"],
+      xor: decode_xor(m["xor"]),
     }
   end
 
@@ -10030,9 +11710,15 @@ defmodule XorEq do
           xor_eq: integer()
         }
 
+  def decode_xor_eq(value) when is_integer(value), do: value
+  def decode_xor_eq(_), do: {:error, "Unexpected type when decoding XorEq.xor_eq"}
+
+  def encode_xor_eq(value) when is_integer(value), do: value
+  def encode_xor_eq(_), do: {:error, "Unexpected type when encoding XorEq.xor_eq"}
+
   def from_map(m) do
     %XorEq{
-      xor_eq: m["xor_eq"],
+      xor_eq: decode_xor_eq(m["xor_eq"]),
     }
   end
 
@@ -10063,9 +11749,15 @@ defmodule Yes do
           yes: integer()
         }
 
+  def decode_yes(value) when is_integer(value), do: value
+  def decode_yes(_), do: {:error, "Unexpected type when decoding Yes.yes"}
+
+  def encode_yes(value) when is_integer(value), do: value
+  def encode_yes(_), do: {:error, "Unexpected type when encoding Yes.yes"}
+
   def from_map(m) do
     %Yes{
-      yes: m["YES"],
+      yes: decode_yes(m["YES"]),
     }
   end
 
@@ -10096,9 +11788,15 @@ defmodule Yield do
           yield: integer()
         }
 
+  def decode_yield(value) when is_integer(value), do: value
+  def decode_yield(_), do: {:error, "Unexpected type when decoding Yield.yield"}
+
+  def encode_yield(value) when is_integer(value), do: value
+  def encode_yield(_), do: {:error, "Unexpected type when encoding Yield.yield"}
+
   def from_map(m) do
     %Yield{
-      yield: m["yield"],
+      yield: decode_yield(m["yield"]),
     }
   end
 
@@ -10149,9 +11847,15 @@ defmodule Obj5 do
           yield: Yield.t()
         }
 
+  def decode_dummy(value) when is_integer(value), do: value
+  def decode_dummy(_), do: {:error, "Unexpected type when decoding Obj5.dummy"}
+
+  def encode_dummy(value) when is_integer(value), do: value
+  def encode_dummy(_), do: {:error, "Unexpected type when encoding Obj5.dummy"}
+
   def from_map(m) do
     %Obj5{
-      dummy: m["dummy"],
+      dummy: decode_dummy(m["dummy"]),
       union: Union.from_map(m["union"]),
       unowned: Unowned.from_map(m["unowned"]),
       unsafe: Unsafe.from_map(m["unsafe"]),
@@ -10227,9 +11931,15 @@ defmodule TopLevel do
           obj5: Obj5.t()
         }
 
+  def decode_dummy(value) when is_integer(value), do: value
+  def decode_dummy(_), do: {:error, "Unexpected type when decoding TopLevel.dummy"}
+
+  def encode_dummy(value) when is_integer(value), do: value
+  def encode_dummy(_), do: {:error, "Unexpected type when encoding TopLevel.dummy"}
+
   def from_map(m) do
     %TopLevel{
-      dummy: m["dummy"],
+      dummy: decode_dummy(m["dummy"]),
       obj1: Obj1.from_map(m["obj1"]),
       obj2: Obj2.from_map(m["obj2"]),
       obj3: Obj3.from_map(m["obj3"]),
diff --git a/base/elixir/test/inputs/json/priority/list.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/list.json/default/QuickType.ex
index 0cb7606..4ed635f 100644
--- a/base/elixir/test/inputs/json/priority/list.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/list.json/default/QuickType.ex
@@ -14,9 +14,15 @@ defmodule TopLevel do
           next: TopLevel.t() | nil
         }
 
+  def decode_data(value) when is_integer(value), do: value
+  def decode_data(_), do: {:error, "Unexpected type when decoding TopLevel.data"}
+
+  def encode_data(value) when is_integer(value), do: value
+  def encode_data(_), do: {:error, "Unexpected type when encoding TopLevel.data"}
+
   def from_map(m) do
     %TopLevel{
-      data: m["data"],
+      data: decode_data(m["data"]),
       next: m["next"] && TopLevel.from_map(m["next"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/priority/name-style.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/name-style.json/default/QuickType.ex
index 6f2eaec..e6e8bb3 100644
--- a/base/elixir/test/inputs/json/priority/name-style.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/name-style.json/default/QuickType.ex
@@ -19,15 +19,57 @@ defmodule TopLevel do
           zsr_hh_demo3_delmatnr: boolean()
         }
 
+  def decode_an_easy_one(value) when is_integer(value), do: value
+  def decode_an_easy_one(_), do: {:error, "Unexpected type when decoding TopLevel.an_easy_one"}
+
+  def encode_an_easy_one(value) when is_integer(value), do: value
+  def encode_an_easy_one(_), do: {:error, "Unexpected type when encoding TopLevel.an_easy_one"}
+
+  def decode_is_mnist_letter(value) when is_boolean(value), do: value
+  def decode_is_mnist_letter(_), do: {:error, "Unexpected type when decoding TopLevel.is_mnist_letter"}
+
+  def encode_is_mnist_letter(value) when is_boolean(value), do: value
+  def encode_is_mnist_letter(_), do: {:error, "Unexpected type when encoding TopLevel.is_mnist_letter"}
+
+  def decode_json_string(value) when is_binary(value), do: value
+  def decode_json_string(_), do: {:error, "Unexpected type when decoding TopLevel.json_string"}
+
+  def encode_json_string(value) when is_binary(value), do: value
+  def encode_json_string(_), do: {:error, "Unexpected type when encoding TopLevel.json_string"}
+
+  def decode_pretty_easy_too(value) when is_boolean(value), do: value
+  def decode_pretty_easy_too(_), do: {:error, "Unexpected type when decoding TopLevel.pretty_easy_too"}
+
+  def encode_pretty_easy_too(value) when is_boolean(value), do: value
+  def encode_pretty_easy_too(_), do: {:error, "Unexpected type when encoding TopLevel.pretty_easy_too"}
+
+  def decode_should_know_that_id_is_an_initialism(value) when is_binary(value), do: value
+  def decode_should_know_that_id_is_an_initialism(_), do: {:error, "Unexpected type when decoding TopLevel.should_know_that_id_is_an_initialism"}
+
+  def encode_should_know_that_id_is_an_initialism(value) when is_binary(value), do: value
+  def encode_should_know_that_id_is_an_initialism(_), do: {:error, "Unexpected type when encoding TopLevel.should_know_that_id_is_an_initialism"}
+
+  def decode_spaces_are_separators_too(value) when is_boolean(value), do: value
+  def decode_spaces_are_separators_too(_), do: {:error, "Unexpected type when decoding TopLevel.spaces_are_separators_too"}
+
+  def encode_spaces_are_separators_too(value) when is_boolean(value), do: value
+  def encode_spaces_are_separators_too(_), do: {:error, "Unexpected type when encoding TopLevel.spaces_are_separators_too"}
+
+  def decode_zsr_hh_demo3_delmatnr(value) when is_boolean(value), do: value
+  def decode_zsr_hh_demo3_delmatnr(_), do: {:error, "Unexpected type when decoding TopLevel.zsr_hh_demo3_delmatnr"}
+
+  def encode_zsr_hh_demo3_delmatnr(value) when is_boolean(value), do: value
+  def encode_zsr_hh_demo3_delmatnr(_), do: {:error, "Unexpected type when encoding TopLevel.zsr_hh_demo3_delmatnr"}
+
   def from_map(m) do
     %TopLevel{
-      an_easy_one: m["anEasyOne"],
-      is_mnist_letter: m["isMNISTLetter"],
-      json_string: m["JSONString"],
-      pretty_easy_too: m["PrettyEasyToo"],
-      should_know_that_id_is_an_initialism: m["should_know_that_id_is_an_initialism"],
-      spaces_are_separators_too: m["   spaces are separators  too  "],
-      zsr_hh_demo3_delmatnr: m["ZSR_HH_DEMO3_DELMATNR"],
+      an_easy_one: decode_an_easy_one(m["anEasyOne"]),
+      is_mnist_letter: decode_is_mnist_letter(m["isMNISTLetter"]),
+      json_string: decode_json_string(m["JSONString"]),
+      pretty_easy_too: decode_pretty_easy_too(m["PrettyEasyToo"]),
+      should_know_that_id_is_an_initialism: decode_should_know_that_id_is_an_initialism(m["should_know_that_id_is_an_initialism"]),
+      spaces_are_separators_too: decode_spaces_are_separators_too(m["   spaces are separators  too  "]),
+      zsr_hh_demo3_delmatnr: decode_zsr_hh_demo3_delmatnr(m["ZSR_HH_DEMO3_DELMATNR"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/nbl-stats.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/nbl-stats.json/default/QuickType.ex
index 7376ce5..8b3d0b5 100644
--- a/base/elixir/test/inputs/json/priority/nbl-stats.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/nbl-stats.json/default/QuickType.ex
@@ -110,12 +110,36 @@ defmodule Team do
           team_name_international: String.t()
         }
 
+  def decode_team_code(value) when is_binary(value), do: value
+  def decode_team_code(_), do: {:error, "Unexpected type when decoding Team.team_code"}
+
+  def encode_team_code(value) when is_binary(value), do: value
+  def encode_team_code(_), do: {:error, "Unexpected type when encoding Team.team_code"}
+
+  def decode_team_code_international(value) when is_binary(value), do: value
+  def decode_team_code_international(_), do: {:error, "Unexpected type when decoding Team.team_code_international"}
+
+  def encode_team_code_international(value) when is_binary(value), do: value
+  def encode_team_code_international(_), do: {:error, "Unexpected type when encoding Team.team_code_international"}
+
+  def decode_team_name(value) when is_binary(value), do: value
+  def decode_team_name(_), do: {:error, "Unexpected type when decoding Team.team_name"}
+
+  def encode_team_name(value) when is_binary(value), do: value
+  def encode_team_name(_), do: {:error, "Unexpected type when encoding Team.team_name"}
+
+  def decode_team_name_international(value) when is_binary(value), do: value
+  def decode_team_name_international(_), do: {:error, "Unexpected type when decoding Team.team_name_international"}
+
+  def encode_team_name_international(value) when is_binary(value), do: value
+  def encode_team_name_international(_), do: {:error, "Unexpected type when encoding Team.team_name_international"}
+
   def from_map(m) do
     %Team{
-      team_code: m["teamCode"],
-      team_code_international: m["teamCodeInternational"],
-      team_name: m["teamName"],
-      team_name_international: m["teamNameInternational"],
+      team_code: decode_team_code(m["teamCode"]),
+      team_code_international: decode_team_code_international(m["teamCodeInternational"]),
+      team_name: decode_team_name(m["teamName"]),
+      team_name_international: decode_team_name_international(m["teamNameInternational"]),
     }
   end
 
@@ -159,19 +183,67 @@ defmodule Othermatch do
           team2_score: integer()
         }
 
+  def decode_clock(value) when is_binary(value), do: value
+  def decode_clock(_), do: {:error, "Unexpected type when decoding Othermatch.clock"}
+
+  def encode_clock(value) when is_binary(value), do: value
+  def encode_clock(_), do: {:error, "Unexpected type when encoding Othermatch.clock"}
+
+  def decode_competition_name(value) when is_binary(value), do: value
+  def decode_competition_name(_), do: {:error, "Unexpected type when decoding Othermatch.competition_name"}
+
+  def encode_competition_name(value) when is_binary(value), do: value
+  def encode_competition_name(_), do: {:error, "Unexpected type when encoding Othermatch.competition_name"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Othermatch.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Othermatch.id"}
+
+  def decode_period(value) when is_integer(value), do: value
+  def decode_period(_), do: {:error, "Unexpected type when decoding Othermatch.period"}
+
+  def encode_period(value) when is_integer(value), do: value
+  def encode_period(_), do: {:error, "Unexpected type when encoding Othermatch.period"}
+
+  def decode_team1_name(value) when is_binary(value), do: value
+  def decode_team1_name(_), do: {:error, "Unexpected type when decoding Othermatch.team1_name"}
+
+  def encode_team1_name(value) when is_binary(value), do: value
+  def encode_team1_name(_), do: {:error, "Unexpected type when encoding Othermatch.team1_name"}
+
+  def decode_team1_score(value) when is_integer(value), do: value
+  def decode_team1_score(_), do: {:error, "Unexpected type when decoding Othermatch.team1_score"}
+
+  def encode_team1_score(value) when is_integer(value), do: value
+  def encode_team1_score(_), do: {:error, "Unexpected type when encoding Othermatch.team1_score"}
+
+  def decode_team2_name(value) when is_binary(value), do: value
+  def decode_team2_name(_), do: {:error, "Unexpected type when decoding Othermatch.team2_name"}
+
+  def encode_team2_name(value) when is_binary(value), do: value
+  def encode_team2_name(_), do: {:error, "Unexpected type when encoding Othermatch.team2_name"}
+
+  def decode_team2_score(value) when is_integer(value), do: value
+  def decode_team2_score(_), do: {:error, "Unexpected type when decoding Othermatch.team2_score"}
+
+  def encode_team2_score(value) when is_integer(value), do: value
+  def encode_team2_score(_), do: {:error, "Unexpected type when encoding Othermatch.team2_score"}
+
   def from_map(m) do
     %Othermatch{
-      clock: m["clock"],
-      competition_name: m["competitionName"],
-      id: m["id"],
-      period: m["period"],
+      clock: decode_clock(m["clock"]),
+      competition_name: decode_competition_name(m["competitionName"]),
+      id: decode_id(m["id"]),
+      period: decode_period(m["period"]),
       period_type: PerType.decode(m["periodType"]),
       team1: Team.from_map(m["team1"]),
-      team1_name: m["team1Name"],
-      team1_score: m["team1Score"],
+      team1_name: decode_team1_name(m["team1Name"]),
+      team1_score: decode_team1_score(m["team1Score"]),
       team2: Team.from_map(m["team2"]),
-      team2_name: m["team2Name"],
-      team2_score: m["team2Score"],
+      team2_name: decode_team2_name(m["team2Name"]),
+      team2_score: decode_team2_score(m["team2Score"]),
     }
   end
 
@@ -457,6 +529,84 @@ defmodule Pbp do
           tno: integer()
         }
 
+  def decode_gt(value) when is_binary(value), do: value
+  def decode_gt(_), do: {:error, "Unexpected type when decoding Pbp.gt"}
+
+  def encode_gt(value) when is_binary(value), do: value
+  def encode_gt(_), do: {:error, "Unexpected type when encoding Pbp.gt"}
+
+  def decode_lead(value) when is_integer(value), do: value
+  def decode_lead(_), do: {:error, "Unexpected type when decoding Pbp.lead"}
+
+  def encode_lead(value) when is_integer(value), do: value
+  def encode_lead(_), do: {:error, "Unexpected type when encoding Pbp.lead"}
+
+  def decode_period(value) when is_integer(value), do: value
+  def decode_period(_), do: {:error, "Unexpected type when decoding Pbp.period"}
+
+  def encode_period(value) when is_integer(value), do: value
+  def encode_period(_), do: {:error, "Unexpected type when encoding Pbp.period"}
+
+  def decode_player(value) when is_binary(value), do: value
+  def decode_player(_), do: {:error, "Unexpected type when decoding Pbp.player"}
+
+  def encode_player(value) when is_binary(value), do: value
+  def encode_player(_), do: {:error, "Unexpected type when encoding Pbp.player"}
+
+  def decode_pno(value) when is_integer(value), do: value
+  def decode_pno(_), do: {:error, "Unexpected type when decoding Pbp.pno"}
+
+  def encode_pno(value) when is_integer(value), do: value
+  def encode_pno(_), do: {:error, "Unexpected type when encoding Pbp.pno"}
+
+  def decode_qualifier(value) when is_binary(value), do: value
+  def decode_qualifier(_), do: {:error, "Unexpected type when decoding Pbp.qualifier"}
+
+  def encode_qualifier(value) when is_binary(value), do: value
+  def encode_qualifier(_), do: {:error, "Unexpected type when encoding Pbp.qualifier"}
+
+  def decode_s1(value) when is_integer(value), do: value
+  def decode_s1(_), do: {:error, "Unexpected type when decoding Pbp.s1"}
+
+  def encode_s1(value) when is_integer(value), do: value
+  def encode_s1(_), do: {:error, "Unexpected type when encoding Pbp.s1"}
+
+  def decode_s2(value) when is_integer(value), do: value
+  def decode_s2(_), do: {:error, "Unexpected type when decoding Pbp.s2"}
+
+  def encode_s2(value) when is_integer(value), do: value
+  def encode_s2(_), do: {:error, "Unexpected type when encoding Pbp.s2"}
+
+  def decode_scoring(value) when is_integer(value), do: value
+  def decode_scoring(_), do: {:error, "Unexpected type when decoding Pbp.scoring"}
+
+  def encode_scoring(value) when is_integer(value), do: value
+  def encode_scoring(_), do: {:error, "Unexpected type when encoding Pbp.scoring"}
+
+  def decode_shirt_number(value) when is_binary(value), do: value
+  def decode_shirt_number(_), do: {:error, "Unexpected type when decoding Pbp.shirt_number"}
+
+  def encode_shirt_number(value) when is_binary(value), do: value
+  def encode_shirt_number(_), do: {:error, "Unexpected type when encoding Pbp.shirt_number"}
+
+  def decode_sub_type(value) when is_binary(value), do: value
+  def decode_sub_type(_), do: {:error, "Unexpected type when decoding Pbp.sub_type"}
+
+  def encode_sub_type(value) when is_binary(value), do: value
+  def encode_sub_type(_), do: {:error, "Unexpected type when encoding Pbp.sub_type"}
+
+  def decode_success(value) when is_integer(value), do: value
+  def decode_success(_), do: {:error, "Unexpected type when decoding Pbp.success"}
+
+  def encode_success(value) when is_integer(value), do: value
+  def encode_success(_), do: {:error, "Unexpected type when encoding Pbp.success"}
+
+  def decode_tno(value) when is_integer(value), do: value
+  def decode_tno(_), do: {:error, "Unexpected type when decoding Pbp.tno"}
+
+  def encode_tno(value) when is_integer(value), do: value
+  def encode_tno(_), do: {:error, "Unexpected type when encoding Pbp.tno"}
+
   def from_map(m) do
     %Pbp{
       action_type: ActionType.decode(m["actionType"]),
@@ -464,25 +614,25 @@ defmodule Pbp do
       family_name_initial: m["familyNameInitial"] && FamilyNameInitial.decode(m["familyNameInitial"]),
       first_name: m["firstName"],
       first_name_initial: m["firstNameInitial"] && FirstNameInitial.decode(m["firstNameInitial"]),
-      gt: m["gt"],
+      gt: decode_gt(m["gt"]),
       international_family_name: m["internationalFamilyName"],
       international_family_name_initial: m["internationalFamilyNameInitial"] && FamilyNameInitial.decode(m["internationalFamilyNameInitial"]),
       international_first_name: m["internationalFirstName"],
       international_first_name_initial: m["internationalFirstNameInitial"] && FirstNameInitial.decode(m["internationalFirstNameInitial"]),
-      lead: m["lead"],
-      period: m["period"],
+      lead: decode_lead(m["lead"]),
+      period: decode_period(m["period"]),
       period_type: PerType.decode(m["periodType"]),
-      player: m["player"],
-      pno: m["pno"],
-      qualifier: m["qualifier"],
-      s1: m["s1"],
-      s2: m["s2"],
+      player: decode_player(m["player"]),
+      pno: decode_pno(m["pno"]),
+      qualifier: decode_qualifier(m["qualifier"]),
+      s1: decode_s1(m["s1"]),
+      s2: decode_s2(m["s2"]),
       scoreboard_name: m["scoreboardName"] && ScoreboardName.decode(m["scoreboardName"]),
-      scoring: m["scoring"],
-      shirt_number: m["shirtNumber"],
-      sub_type: m["subType"],
-      success: m["success"],
-      tno: m["tno"],
+      scoring: decode_scoring(m["scoring"]),
+      shirt_number: decode_shirt_number(m["shirtNumber"]),
+      sub_type: decode_sub_type(m["subType"]),
+      success: decode_success(m["success"]),
+      tno: decode_tno(m["tno"]),
     }
   end
 
@@ -538,10 +688,22 @@ defmodule TimeElement do
           per_type: PerType.t()
         }
 
+  def decode_gt(value) when is_binary(value), do: value
+  def decode_gt(_), do: {:error, "Unexpected type when decoding TimeElement.gt"}
+
+  def encode_gt(value) when is_binary(value), do: value
+  def encode_gt(_), do: {:error, "Unexpected type when encoding TimeElement.gt"}
+
+  def decode_per(value) when is_integer(value), do: value
+  def decode_per(_), do: {:error, "Unexpected type when decoding TimeElement.per"}
+
+  def encode_per(value) when is_integer(value), do: value
+  def encode_per(_), do: {:error, "Unexpected type when encoding TimeElement.per"}
+
   def from_map(m) do
     %TimeElement{
-      gt: m["gt"],
-      per: m["per"],
+      gt: decode_gt(m["gt"]),
+      per: decode_per(m["per"]),
       per_type: PerType.decode(m["perType"]),
     }
   end
@@ -594,6 +756,24 @@ defmodule Scorer do
           tot: integer() | nil
         }
 
+  def decode_pno(value) when is_integer(value), do: value
+  def decode_pno(_), do: {:error, "Unexpected type when decoding Scorer.pno"}
+
+  def encode_pno(value) when is_integer(value), do: value
+  def encode_pno(_), do: {:error, "Unexpected type when encoding Scorer.pno"}
+
+  def decode_shirt_number(value) when is_binary(value), do: value
+  def decode_shirt_number(_), do: {:error, "Unexpected type when decoding Scorer.shirt_number"}
+
+  def encode_shirt_number(value) when is_binary(value), do: value
+  def encode_shirt_number(_), do: {:error, "Unexpected type when encoding Scorer.shirt_number"}
+
+  def decode_tno(value) when is_integer(value), do: value
+  def decode_tno(_), do: {:error, "Unexpected type when decoding Scorer.tno"}
+
+  def encode_tno(value) when is_integer(value), do: value
+  def encode_tno(_), do: {:error, "Unexpected type when encoding Scorer.tno"}
+
   def from_map(m) do
     %Scorer{
       family_name: m["familyName"],
@@ -609,12 +789,12 @@ defmodule Scorer do
       per: m["per"],
       per_type: m["perType"] && PerType.decode(m["perType"]),
       player: m["player"],
-      pno: m["pno"],
+      pno: decode_pno(m["pno"]),
       scoreboard_name: m["scoreboardName"] && ScoreboardName.decode(m["scoreboardName"]),
-      shirt_number: m["shirtNumber"],
+      shirt_number: decode_shirt_number(m["shirtNumber"]),
       summary: m["summary"],
       times: m["times"] && Enum.map(m["times"], &TimeElement.from_map/1),
-      tno: m["tno"],
+      tno: decode_tno(m["tno"]),
       tot: m["tot"],
     }
   end
@@ -754,12 +934,42 @@ defmodule Comp do
           s_rebounds_total_average: float()
         }
 
+  def decode_s_assists_average(value) when is_float(value), do: value
+  def decode_s_assists_average(value) when is_integer(value), do: value
+  def decode_s_assists_average(_), do: {:error, "Unexpected type when decoding Comp.s_assists_average"}
+
+  def encode_s_assists_average(value) when is_float(value), do: value
+  def encode_s_assists_average(value) when is_integer(value), do: value
+  def encode_s_assists_average(_), do: {:error, "Unexpected type when encoding Comp.s_assists_average"}
+
+  def decode_s_minutes_average(value) when is_binary(value), do: value
+  def decode_s_minutes_average(_), do: {:error, "Unexpected type when decoding Comp.s_minutes_average"}
+
+  def encode_s_minutes_average(value) when is_binary(value), do: value
+  def encode_s_minutes_average(_), do: {:error, "Unexpected type when encoding Comp.s_minutes_average"}
+
+  def decode_s_points_average(value) when is_float(value), do: value
+  def decode_s_points_average(value) when is_integer(value), do: value
+  def decode_s_points_average(_), do: {:error, "Unexpected type when decoding Comp.s_points_average"}
+
+  def encode_s_points_average(value) when is_float(value), do: value
+  def encode_s_points_average(value) when is_integer(value), do: value
+  def encode_s_points_average(_), do: {:error, "Unexpected type when encoding Comp.s_points_average"}
+
+  def decode_s_rebounds_total_average(value) when is_float(value), do: value
+  def decode_s_rebounds_total_average(value) when is_integer(value), do: value
+  def decode_s_rebounds_total_average(_), do: {:error, "Unexpected type when decoding Comp.s_rebounds_total_average"}
+
+  def encode_s_rebounds_total_average(value) when is_float(value), do: value
+  def encode_s_rebounds_total_average(value) when is_integer(value), do: value
+  def encode_s_rebounds_total_average(_), do: {:error, "Unexpected type when encoding Comp.s_rebounds_total_average"}
+
   def from_map(m) do
     %Comp{
-      s_assists_average: m["sAssistsAverage"],
-      s_minutes_average: m["sMinutesAverage"],
-      s_points_average: m["sPointsAverage"],
-      s_rebounds_total_average: m["sReboundsTotalAverage"],
+      s_assists_average: decode_s_assists_average(m["sAssistsAverage"]),
+      s_minutes_average: decode_s_minutes_average(m["sMinutesAverage"]),
+      s_points_average: decode_s_points_average(m["sPointsAverage"]),
+      s_rebounds_total_average: decode_s_rebounds_total_average(m["sReboundsTotalAverage"]),
     }
   end
 
@@ -842,58 +1052,320 @@ defmodule Pl do
           starter: integer()
         }
 
+  def decode_active(value) when is_integer(value), do: value
+  def decode_active(_), do: {:error, "Unexpected type when decoding Pl.active"}
+
+  def encode_active(value) when is_integer(value), do: value
+  def encode_active(_), do: {:error, "Unexpected type when encoding Pl.active"}
+
+  def decode_eff_1(value) when is_integer(value), do: value
+  def decode_eff_1(_), do: {:error, "Unexpected type when decoding Pl.eff_1"}
+
+  def encode_eff_1(value) when is_integer(value), do: value
+  def encode_eff_1(_), do: {:error, "Unexpected type when encoding Pl.eff_1"}
+
+  def decode_eff_2(value) when is_integer(value), do: value
+  def decode_eff_2(_), do: {:error, "Unexpected type when decoding Pl.eff_2"}
+
+  def encode_eff_2(value) when is_integer(value), do: value
+  def encode_eff_2(_), do: {:error, "Unexpected type when encoding Pl.eff_2"}
+
+  def decode_eff_3(value) when is_float(value), do: value
+  def decode_eff_3(value) when is_integer(value), do: value
+  def decode_eff_3(_), do: {:error, "Unexpected type when decoding Pl.eff_3"}
+
+  def encode_eff_3(value) when is_float(value), do: value
+  def encode_eff_3(value) when is_integer(value), do: value
+  def encode_eff_3(_), do: {:error, "Unexpected type when encoding Pl.eff_3"}
+
+  def decode_eff_4(value) when is_float(value), do: value
+  def decode_eff_4(value) when is_integer(value), do: value
+  def decode_eff_4(_), do: {:error, "Unexpected type when decoding Pl.eff_4"}
+
+  def encode_eff_4(value) when is_float(value), do: value
+  def encode_eff_4(value) when is_integer(value), do: value
+  def encode_eff_4(_), do: {:error, "Unexpected type when encoding Pl.eff_4"}
+
+  def decode_eff_5(value) when is_integer(value), do: value
+  def decode_eff_5(_), do: {:error, "Unexpected type when decoding Pl.eff_5"}
+
+  def encode_eff_5(value) when is_integer(value), do: value
+  def encode_eff_5(_), do: {:error, "Unexpected type when encoding Pl.eff_5"}
+
+  def decode_eff_6(value) when is_integer(value), do: value
+  def decode_eff_6(_), do: {:error, "Unexpected type when decoding Pl.eff_6"}
+
+  def encode_eff_6(value) when is_integer(value), do: value
+  def encode_eff_6(_), do: {:error, "Unexpected type when encoding Pl.eff_6"}
+
+  def decode_eff_7(value) when is_integer(value), do: value
+  def decode_eff_7(_), do: {:error, "Unexpected type when decoding Pl.eff_7"}
+
+  def encode_eff_7(value) when is_integer(value), do: value
+  def encode_eff_7(_), do: {:error, "Unexpected type when encoding Pl.eff_7"}
+
+  def decode_family_name(value) when is_binary(value), do: value
+  def decode_family_name(_), do: {:error, "Unexpected type when decoding Pl.family_name"}
+
+  def encode_family_name(value) when is_binary(value), do: value
+  def encode_family_name(_), do: {:error, "Unexpected type when encoding Pl.family_name"}
+
+  def decode_first_name(value) when is_binary(value), do: value
+  def decode_first_name(_), do: {:error, "Unexpected type when decoding Pl.first_name"}
+
+  def encode_first_name(value) when is_binary(value), do: value
+  def encode_first_name(_), do: {:error, "Unexpected type when encoding Pl.first_name"}
+
+  def decode_international_family_name(value) when is_binary(value), do: value
+  def decode_international_family_name(_), do: {:error, "Unexpected type when decoding Pl.international_family_name"}
+
+  def encode_international_family_name(value) when is_binary(value), do: value
+  def encode_international_family_name(_), do: {:error, "Unexpected type when encoding Pl.international_family_name"}
+
+  def decode_international_first_name(value) when is_binary(value), do: value
+  def decode_international_first_name(_), do: {:error, "Unexpected type when decoding Pl.international_first_name"}
+
+  def encode_international_first_name(value) when is_binary(value), do: value
+  def encode_international_first_name(_), do: {:error, "Unexpected type when encoding Pl.international_first_name"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Pl.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Pl.name"}
+
+  def decode_playing_position(value) when is_binary(value), do: value
+  def decode_playing_position(_), do: {:error, "Unexpected type when decoding Pl.playing_position"}
+
+  def encode_playing_position(value) when is_binary(value), do: value
+  def encode_playing_position(_), do: {:error, "Unexpected type when encoding Pl.playing_position"}
+
+  def decode_s_assists(value) when is_integer(value), do: value
+  def decode_s_assists(_), do: {:error, "Unexpected type when decoding Pl.s_assists"}
+
+  def encode_s_assists(value) when is_integer(value), do: value
+  def encode_s_assists(_), do: {:error, "Unexpected type when encoding Pl.s_assists"}
+
+  def decode_s_blocks(value) when is_integer(value), do: value
+  def decode_s_blocks(_), do: {:error, "Unexpected type when decoding Pl.s_blocks"}
+
+  def encode_s_blocks(value) when is_integer(value), do: value
+  def encode_s_blocks(_), do: {:error, "Unexpected type when encoding Pl.s_blocks"}
+
+  def decode_s_blocks_received(value) when is_integer(value), do: value
+  def decode_s_blocks_received(_), do: {:error, "Unexpected type when decoding Pl.s_blocks_received"}
+
+  def encode_s_blocks_received(value) when is_integer(value), do: value
+  def encode_s_blocks_received(_), do: {:error, "Unexpected type when encoding Pl.s_blocks_received"}
+
+  def decode_s_field_goals_attempted(value) when is_integer(value), do: value
+  def decode_s_field_goals_attempted(_), do: {:error, "Unexpected type when decoding Pl.s_field_goals_attempted"}
+
+  def encode_s_field_goals_attempted(value) when is_integer(value), do: value
+  def encode_s_field_goals_attempted(_), do: {:error, "Unexpected type when encoding Pl.s_field_goals_attempted"}
+
+  def decode_s_field_goals_made(value) when is_integer(value), do: value
+  def decode_s_field_goals_made(_), do: {:error, "Unexpected type when decoding Pl.s_field_goals_made"}
+
+  def encode_s_field_goals_made(value) when is_integer(value), do: value
+  def encode_s_field_goals_made(_), do: {:error, "Unexpected type when encoding Pl.s_field_goals_made"}
+
+  def decode_s_field_goals_percentage(value) when is_integer(value), do: value
+  def decode_s_field_goals_percentage(_), do: {:error, "Unexpected type when decoding Pl.s_field_goals_percentage"}
+
+  def encode_s_field_goals_percentage(value) when is_integer(value), do: value
+  def encode_s_field_goals_percentage(_), do: {:error, "Unexpected type when encoding Pl.s_field_goals_percentage"}
+
+  def decode_s_fouls_on(value) when is_integer(value), do: value
+  def decode_s_fouls_on(_), do: {:error, "Unexpected type when decoding Pl.s_fouls_on"}
+
+  def encode_s_fouls_on(value) when is_integer(value), do: value
+  def encode_s_fouls_on(_), do: {:error, "Unexpected type when encoding Pl.s_fouls_on"}
+
+  def decode_s_fouls_personal(value) when is_integer(value), do: value
+  def decode_s_fouls_personal(_), do: {:error, "Unexpected type when decoding Pl.s_fouls_personal"}
+
+  def encode_s_fouls_personal(value) when is_integer(value), do: value
+  def encode_s_fouls_personal(_), do: {:error, "Unexpected type when encoding Pl.s_fouls_personal"}
+
+  def decode_s_free_throws_attempted(value) when is_integer(value), do: value
+  def decode_s_free_throws_attempted(_), do: {:error, "Unexpected type when decoding Pl.s_free_throws_attempted"}
+
+  def encode_s_free_throws_attempted(value) when is_integer(value), do: value
+  def encode_s_free_throws_attempted(_), do: {:error, "Unexpected type when encoding Pl.s_free_throws_attempted"}
+
+  def decode_s_free_throws_made(value) when is_integer(value), do: value
+  def decode_s_free_throws_made(_), do: {:error, "Unexpected type when decoding Pl.s_free_throws_made"}
+
+  def encode_s_free_throws_made(value) when is_integer(value), do: value
+  def encode_s_free_throws_made(_), do: {:error, "Unexpected type when encoding Pl.s_free_throws_made"}
+
+  def decode_s_free_throws_percentage(value) when is_integer(value), do: value
+  def decode_s_free_throws_percentage(_), do: {:error, "Unexpected type when decoding Pl.s_free_throws_percentage"}
+
+  def encode_s_free_throws_percentage(value) when is_integer(value), do: value
+  def encode_s_free_throws_percentage(_), do: {:error, "Unexpected type when encoding Pl.s_free_throws_percentage"}
+
+  def decode_s_plus_minus_points(value) when is_integer(value), do: value
+  def decode_s_plus_minus_points(_), do: {:error, "Unexpected type when decoding Pl.s_plus_minus_points"}
+
+  def encode_s_plus_minus_points(value) when is_integer(value), do: value
+  def encode_s_plus_minus_points(_), do: {:error, "Unexpected type when encoding Pl.s_plus_minus_points"}
+
+  def decode_s_points(value) when is_integer(value), do: value
+  def decode_s_points(_), do: {:error, "Unexpected type when decoding Pl.s_points"}
+
+  def encode_s_points(value) when is_integer(value), do: value
+  def encode_s_points(_), do: {:error, "Unexpected type when encoding Pl.s_points"}
+
+  def decode_s_points_fast_break(value) when is_integer(value), do: value
+  def decode_s_points_fast_break(_), do: {:error, "Unexpected type when decoding Pl.s_points_fast_break"}
+
+  def encode_s_points_fast_break(value) when is_integer(value), do: value
+  def encode_s_points_fast_break(_), do: {:error, "Unexpected type when encoding Pl.s_points_fast_break"}
+
+  def decode_s_points_in_the_paint(value) when is_integer(value), do: value
+  def decode_s_points_in_the_paint(_), do: {:error, "Unexpected type when decoding Pl.s_points_in_the_paint"}
+
+  def encode_s_points_in_the_paint(value) when is_integer(value), do: value
+  def encode_s_points_in_the_paint(_), do: {:error, "Unexpected type when encoding Pl.s_points_in_the_paint"}
+
+  def decode_s_points_second_chance(value) when is_integer(value), do: value
+  def decode_s_points_second_chance(_), do: {:error, "Unexpected type when decoding Pl.s_points_second_chance"}
+
+  def encode_s_points_second_chance(value) when is_integer(value), do: value
+  def encode_s_points_second_chance(_), do: {:error, "Unexpected type when encoding Pl.s_points_second_chance"}
+
+  def decode_s_rebounds_defensive(value) when is_integer(value), do: value
+  def decode_s_rebounds_defensive(_), do: {:error, "Unexpected type when decoding Pl.s_rebounds_defensive"}
+
+  def encode_s_rebounds_defensive(value) when is_integer(value), do: value
+  def encode_s_rebounds_defensive(_), do: {:error, "Unexpected type when encoding Pl.s_rebounds_defensive"}
+
+  def decode_s_rebounds_offensive(value) when is_integer(value), do: value
+  def decode_s_rebounds_offensive(_), do: {:error, "Unexpected type when decoding Pl.s_rebounds_offensive"}
+
+  def encode_s_rebounds_offensive(value) when is_integer(value), do: value
+  def encode_s_rebounds_offensive(_), do: {:error, "Unexpected type when encoding Pl.s_rebounds_offensive"}
+
+  def decode_s_rebounds_total(value) when is_integer(value), do: value
+  def decode_s_rebounds_total(_), do: {:error, "Unexpected type when decoding Pl.s_rebounds_total"}
+
+  def encode_s_rebounds_total(value) when is_integer(value), do: value
+  def encode_s_rebounds_total(_), do: {:error, "Unexpected type when encoding Pl.s_rebounds_total"}
+
+  def decode_s_steals(value) when is_integer(value), do: value
+  def decode_s_steals(_), do: {:error, "Unexpected type when decoding Pl.s_steals"}
+
+  def encode_s_steals(value) when is_integer(value), do: value
+  def encode_s_steals(_), do: {:error, "Unexpected type when encoding Pl.s_steals"}
+
+  def decode_s_three_pointers_attempted(value) when is_integer(value), do: value
+  def decode_s_three_pointers_attempted(_), do: {:error, "Unexpected type when decoding Pl.s_three_pointers_attempted"}
+
+  def encode_s_three_pointers_attempted(value) when is_integer(value), do: value
+  def encode_s_three_pointers_attempted(_), do: {:error, "Unexpected type when encoding Pl.s_three_pointers_attempted"}
+
+  def decode_s_three_pointers_made(value) when is_integer(value), do: value
+  def decode_s_three_pointers_made(_), do: {:error, "Unexpected type when decoding Pl.s_three_pointers_made"}
+
+  def encode_s_three_pointers_made(value) when is_integer(value), do: value
+  def encode_s_three_pointers_made(_), do: {:error, "Unexpected type when encoding Pl.s_three_pointers_made"}
+
+  def decode_s_three_pointers_percentage(value) when is_integer(value), do: value
+  def decode_s_three_pointers_percentage(_), do: {:error, "Unexpected type when decoding Pl.s_three_pointers_percentage"}
+
+  def encode_s_three_pointers_percentage(value) when is_integer(value), do: value
+  def encode_s_three_pointers_percentage(_), do: {:error, "Unexpected type when encoding Pl.s_three_pointers_percentage"}
+
+  def decode_s_turnovers(value) when is_integer(value), do: value
+  def decode_s_turnovers(_), do: {:error, "Unexpected type when decoding Pl.s_turnovers"}
+
+  def encode_s_turnovers(value) when is_integer(value), do: value
+  def encode_s_turnovers(_), do: {:error, "Unexpected type when encoding Pl.s_turnovers"}
+
+  def decode_s_two_pointers_attempted(value) when is_integer(value), do: value
+  def decode_s_two_pointers_attempted(_), do: {:error, "Unexpected type when decoding Pl.s_two_pointers_attempted"}
+
+  def encode_s_two_pointers_attempted(value) when is_integer(value), do: value
+  def encode_s_two_pointers_attempted(_), do: {:error, "Unexpected type when encoding Pl.s_two_pointers_attempted"}
+
+  def decode_s_two_pointers_made(value) when is_integer(value), do: value
+  def decode_s_two_pointers_made(_), do: {:error, "Unexpected type when decoding Pl.s_two_pointers_made"}
+
+  def encode_s_two_pointers_made(value) when is_integer(value), do: value
+  def encode_s_two_pointers_made(_), do: {:error, "Unexpected type when encoding Pl.s_two_pointers_made"}
+
+  def decode_s_two_pointers_percentage(value) when is_integer(value), do: value
+  def decode_s_two_pointers_percentage(_), do: {:error, "Unexpected type when decoding Pl.s_two_pointers_percentage"}
+
+  def encode_s_two_pointers_percentage(value) when is_integer(value), do: value
+  def encode_s_two_pointers_percentage(_), do: {:error, "Unexpected type when encoding Pl.s_two_pointers_percentage"}
+
+  def decode_shirt_number(value) when is_binary(value), do: value
+  def decode_shirt_number(_), do: {:error, "Unexpected type when decoding Pl.shirt_number"}
+
+  def encode_shirt_number(value) when is_binary(value), do: value
+  def encode_shirt_number(_), do: {:error, "Unexpected type when encoding Pl.shirt_number"}
+
+  def decode_starter(value) when is_integer(value), do: value
+  def decode_starter(_), do: {:error, "Unexpected type when decoding Pl.starter"}
+
+  def encode_starter(value) when is_integer(value), do: value
+  def encode_starter(_), do: {:error, "Unexpected type when encoding Pl.starter"}
+
   def from_map(m) do
     %Pl{
-      active: m["active"],
+      active: decode_active(m["active"]),
       captain: m["captain"],
       comp: m["comp"] && Comp.from_map(m["comp"]),
-      eff_1: m["eff_1"],
-      eff_2: m["eff_2"],
-      eff_3: m["eff_3"],
-      eff_4: m["eff_4"],
-      eff_5: m["eff_5"],
-      eff_6: m["eff_6"],
-      eff_7: m["eff_7"],
-      family_name: m["familyName"],
+      eff_1: decode_eff_1(m["eff_1"]),
+      eff_2: decode_eff_2(m["eff_2"]),
+      eff_3: decode_eff_3(m["eff_3"]),
+      eff_4: decode_eff_4(m["eff_4"]),
+      eff_5: decode_eff_5(m["eff_5"]),
+      eff_6: decode_eff_6(m["eff_6"]),
+      eff_7: decode_eff_7(m["eff_7"]),
+      family_name: decode_family_name(m["familyName"]),
       family_name_initial: FamilyNameInitial.decode(m["familyNameInitial"]),
-      first_name: m["firstName"],
+      first_name: decode_first_name(m["firstName"]),
       first_name_initial: FirstNameInitial.decode(m["firstNameInitial"]),
-      international_family_name: m["internationalFamilyName"],
+      international_family_name: decode_international_family_name(m["internationalFamilyName"]),
       international_family_name_initial: FamilyNameInitial.decode(m["internationalFamilyNameInitial"]),
-      international_first_name: m["internationalFirstName"],
+      international_first_name: decode_international_first_name(m["internationalFirstName"]),
       international_first_name_initial: FirstNameInitial.decode(m["internationalFirstNameInitial"]),
-      name: m["name"],
-      playing_position: m["playingPosition"],
-      s_assists: m["sAssists"],
-      s_blocks: m["sBlocks"],
-      s_blocks_received: m["sBlocksReceived"],
-      s_field_goals_attempted: m["sFieldGoalsAttempted"],
-      s_field_goals_made: m["sFieldGoalsMade"],
-      s_field_goals_percentage: m["sFieldGoalsPercentage"],
-      s_fouls_on: m["sFoulsOn"],
-      s_fouls_personal: m["sFoulsPersonal"],
-      s_free_throws_attempted: m["sFreeThrowsAttempted"],
-      s_free_throws_made: m["sFreeThrowsMade"],
-      s_free_throws_percentage: m["sFreeThrowsPercentage"],
+      name: decode_name(m["name"]),
+      playing_position: decode_playing_position(m["playingPosition"]),
+      s_assists: decode_s_assists(m["sAssists"]),
+      s_blocks: decode_s_blocks(m["sBlocks"]),
+      s_blocks_received: decode_s_blocks_received(m["sBlocksReceived"]),
+      s_field_goals_attempted: decode_s_field_goals_attempted(m["sFieldGoalsAttempted"]),
+      s_field_goals_made: decode_s_field_goals_made(m["sFieldGoalsMade"]),
+      s_field_goals_percentage: decode_s_field_goals_percentage(m["sFieldGoalsPercentage"]),
+      s_fouls_on: decode_s_fouls_on(m["sFoulsOn"]),
+      s_fouls_personal: decode_s_fouls_personal(m["sFoulsPersonal"]),
+      s_free_throws_attempted: decode_s_free_throws_attempted(m["sFreeThrowsAttempted"]),
+      s_free_throws_made: decode_s_free_throws_made(m["sFreeThrowsMade"]),
+      s_free_throws_percentage: decode_s_free_throws_percentage(m["sFreeThrowsPercentage"]),
       s_minutes: m["sMinutes"],
-      s_plus_minus_points: m["sPlusMinusPoints"],
-      s_points: m["sPoints"],
-      s_points_fast_break: m["sPointsFastBreak"],
-      s_points_in_the_paint: m["sPointsInThePaint"],
-      s_points_second_chance: m["sPointsSecondChance"],
-      s_rebounds_defensive: m["sReboundsDefensive"],
-      s_rebounds_offensive: m["sReboundsOffensive"],
-      s_rebounds_total: m["sReboundsTotal"],
-      s_steals: m["sSteals"],
-      s_three_pointers_attempted: m["sThreePointersAttempted"],
-      s_three_pointers_made: m["sThreePointersMade"],
-      s_three_pointers_percentage: m["sThreePointersPercentage"],
-      s_turnovers: m["sTurnovers"],
-      s_two_pointers_attempted: m["sTwoPointersAttempted"],
-      s_two_pointers_made: m["sTwoPointersMade"],
-      s_two_pointers_percentage: m["sTwoPointersPercentage"],
-      shirt_number: m["shirtNumber"],
-      starter: m["starter"],
+      s_plus_minus_points: decode_s_plus_minus_points(m["sPlusMinusPoints"]),
+      s_points: decode_s_points(m["sPoints"]),
+      s_points_fast_break: decode_s_points_fast_break(m["sPointsFastBreak"]),
+      s_points_in_the_paint: decode_s_points_in_the_paint(m["sPointsInThePaint"]),
+      s_points_second_chance: decode_s_points_second_chance(m["sPointsSecondChance"]),
+      s_rebounds_defensive: decode_s_rebounds_defensive(m["sReboundsDefensive"]),
+      s_rebounds_offensive: decode_s_rebounds_offensive(m["sReboundsOffensive"]),
+      s_rebounds_total: decode_s_rebounds_total(m["sReboundsTotal"]),
+      s_steals: decode_s_steals(m["sSteals"]),
+      s_three_pointers_attempted: decode_s_three_pointers_attempted(m["sThreePointersAttempted"]),
+      s_three_pointers_made: decode_s_three_pointers_made(m["sThreePointersMade"]),
+      s_three_pointers_percentage: decode_s_three_pointers_percentage(m["sThreePointersPercentage"]),
+      s_turnovers: decode_s_turnovers(m["sTurnovers"]),
+      s_two_pointers_attempted: decode_s_two_pointers_attempted(m["sTwoPointersAttempted"]),
+      s_two_pointers_made: decode_s_two_pointers_made(m["sTwoPointersMade"]),
+      s_two_pointers_percentage: decode_s_two_pointers_percentage(m["sTwoPointersPercentage"]),
+      shirt_number: decode_shirt_number(m["shirtNumber"]),
+      starter: decode_starter(m["starter"]),
     }
   end
 
@@ -1031,20 +1503,74 @@ defmodule Shot do
           y: integer()
         }
 
+  def decode_p(value) when is_integer(value), do: value
+  def decode_p(_), do: {:error, "Unexpected type when decoding Shot.p"}
+
+  def encode_p(value) when is_integer(value), do: value
+  def encode_p(_), do: {:error, "Unexpected type when encoding Shot.p"}
+
+  def decode_per(value) when is_integer(value), do: value
+  def decode_per(_), do: {:error, "Unexpected type when decoding Shot.per"}
+
+  def encode_per(value) when is_integer(value), do: value
+  def encode_per(_), do: {:error, "Unexpected type when encoding Shot.per"}
+
+  def decode_player(value) when is_binary(value), do: value
+  def decode_player(_), do: {:error, "Unexpected type when decoding Shot.player"}
+
+  def encode_player(value) when is_binary(value), do: value
+  def encode_player(_), do: {:error, "Unexpected type when encoding Shot.player"}
+
+  def decode_pno(value) when is_integer(value), do: value
+  def decode_pno(_), do: {:error, "Unexpected type when decoding Shot.pno"}
+
+  def encode_pno(value) when is_integer(value), do: value
+  def encode_pno(_), do: {:error, "Unexpected type when encoding Shot.pno"}
+
+  def decode_r(value) when is_integer(value), do: value
+  def decode_r(_), do: {:error, "Unexpected type when decoding Shot.r"}
+
+  def encode_r(value) when is_integer(value), do: value
+  def encode_r(_), do: {:error, "Unexpected type when encoding Shot.r"}
+
+  def decode_shirt_number(value) when is_binary(value), do: value
+  def decode_shirt_number(_), do: {:error, "Unexpected type when decoding Shot.shirt_number"}
+
+  def encode_shirt_number(value) when is_binary(value), do: value
+  def encode_shirt_number(_), do: {:error, "Unexpected type when encoding Shot.shirt_number"}
+
+  def decode_tno(value) when is_integer(value), do: value
+  def decode_tno(_), do: {:error, "Unexpected type when decoding Shot.tno"}
+
+  def encode_tno(value) when is_integer(value), do: value
+  def encode_tno(_), do: {:error, "Unexpected type when encoding Shot.tno"}
+
+  def decode_x(value) when is_integer(value), do: value
+  def decode_x(_), do: {:error, "Unexpected type when decoding Shot.x"}
+
+  def encode_x(value) when is_integer(value), do: value
+  def encode_x(_), do: {:error, "Unexpected type when encoding Shot.x"}
+
+  def decode_y(value) when is_integer(value), do: value
+  def decode_y(_), do: {:error, "Unexpected type when decoding Shot.y"}
+
+  def encode_y(value) when is_integer(value), do: value
+  def encode_y(_), do: {:error, "Unexpected type when encoding Shot.y"}
+
   def from_map(m) do
     %Shot{
       action_type: ActionType.decode(m["actionType"]),
-      p: m["p"],
-      per: m["per"],
+      p: decode_p(m["p"]),
+      per: decode_per(m["per"]),
       per_type: PerType.decode(m["perType"]),
-      player: m["player"],
-      pno: m["pno"],
-      r: m["r"],
-      shirt_number: m["shirtNumber"],
+      player: decode_player(m["player"]),
+      pno: decode_pno(m["pno"]),
+      r: decode_r(m["r"]),
+      shirt_number: decode_shirt_number(m["shirtNumber"]),
       sub_type: SubType.decode(m["subType"]),
-      tno: m["tno"],
-      x: m["x"],
-      y: m["y"],
+      tno: decode_tno(m["tno"]),
+      x: decode_x(m["x"]),
+      y: decode_y(m["y"]),
     }
   end
 
@@ -1150,74 +1676,456 @@ defmodule Tm do
           tot_s_two_pointers_percentage: integer()
         }
 
+  def decode_code(value) when is_binary(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Tm.code"}
+
+  def encode_code(value) when is_binary(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Tm.code"}
+
+  def decode_code_international(value) when is_binary(value), do: value
+  def decode_code_international(_), do: {:error, "Unexpected type when decoding Tm.code_international"}
+
+  def encode_code_international(value) when is_binary(value), do: value
+  def encode_code_international(_), do: {:error, "Unexpected type when encoding Tm.code_international"}
+
+  def decode_fouls(value) when is_integer(value), do: value
+  def decode_fouls(_), do: {:error, "Unexpected type when decoding Tm.fouls"}
+
+  def encode_fouls(value) when is_integer(value), do: value
+  def encode_fouls(_), do: {:error, "Unexpected type when encoding Tm.fouls"}
+
+  def decode_full_score(value) when is_integer(value), do: value
+  def decode_full_score(_), do: {:error, "Unexpected type when decoding Tm.full_score"}
+
+  def encode_full_score(value) when is_integer(value), do: value
+  def encode_full_score(_), do: {:error, "Unexpected type when encoding Tm.full_score"}
+
+  def decode_logo(value) when is_binary(value), do: value
+  def decode_logo(_), do: {:error, "Unexpected type when decoding Tm.logo"}
+
+  def encode_logo(value) when is_binary(value), do: value
+  def encode_logo(_), do: {:error, "Unexpected type when encoding Tm.logo"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Tm.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Tm.name"}
+
+  def decode_name_international(value) when is_binary(value), do: value
+  def decode_name_international(_), do: {:error, "Unexpected type when decoding Tm.name_international"}
+
+  def encode_name_international(value) when is_binary(value), do: value
+  def encode_name_international(_), do: {:error, "Unexpected type when encoding Tm.name_international"}
+
+  def decode_p1_score(value) when is_integer(value), do: value
+  def decode_p1_score(_), do: {:error, "Unexpected type when decoding Tm.p1_score"}
+
+  def encode_p1_score(value) when is_integer(value), do: value
+  def encode_p1_score(_), do: {:error, "Unexpected type when encoding Tm.p1_score"}
+
+  def decode_p2_score(value) when is_integer(value), do: value
+  def decode_p2_score(_), do: {:error, "Unexpected type when decoding Tm.p2_score"}
+
+  def encode_p2_score(value) when is_integer(value), do: value
+  def encode_p2_score(_), do: {:error, "Unexpected type when encoding Tm.p2_score"}
+
+  def decode_p3_score(value) when is_integer(value), do: value
+  def decode_p3_score(_), do: {:error, "Unexpected type when decoding Tm.p3_score"}
+
+  def encode_p3_score(value) when is_integer(value), do: value
+  def encode_p3_score(_), do: {:error, "Unexpected type when encoding Tm.p3_score"}
+
+  def decode_p4_score(value) when is_integer(value), do: value
+  def decode_p4_score(_), do: {:error, "Unexpected type when decoding Tm.p4_score"}
+
+  def encode_p4_score(value) when is_integer(value), do: value
+  def encode_p4_score(_), do: {:error, "Unexpected type when encoding Tm.p4_score"}
+
+  def decode_score(value) when is_integer(value), do: value
+  def decode_score(_), do: {:error, "Unexpected type when decoding Tm.score"}
+
+  def encode_score(value) when is_integer(value), do: value
+  def encode_score(_), do: {:error, "Unexpected type when encoding Tm.score"}
+
+  def decode_scoring(value) when is_list(value), do: value
+  def decode_scoring(_), do: {:error, "Unexpected type when decoding Tm.scoring"}
+
+  def encode_scoring(value) when is_list(value), do: value
+  def encode_scoring(_), do: {:error, "Unexpected type when encoding Tm.scoring"}
+
+  def decode_short_name(value) when is_binary(value), do: value
+  def decode_short_name(_), do: {:error, "Unexpected type when decoding Tm.short_name"}
+
+  def encode_short_name(value) when is_binary(value), do: value
+  def encode_short_name(_), do: {:error, "Unexpected type when encoding Tm.short_name"}
+
+  def decode_short_name_international(value) when is_binary(value), do: value
+  def decode_short_name_international(_), do: {:error, "Unexpected type when decoding Tm.short_name_international"}
+
+  def encode_short_name_international(value) when is_binary(value), do: value
+  def encode_short_name_international(_), do: {:error, "Unexpected type when encoding Tm.short_name_international"}
+
+  def decode_shot(value) when is_list(value), do: value
+  def decode_shot(_), do: {:error, "Unexpected type when decoding Tm.shot"}
+
+  def encode_shot(value) when is_list(value), do: value
+  def encode_shot(_), do: {:error, "Unexpected type when encoding Tm.shot"}
+
+  def decode_timeouts(value) when is_integer(value), do: value
+  def decode_timeouts(_), do: {:error, "Unexpected type when decoding Tm.timeouts"}
+
+  def encode_timeouts(value) when is_integer(value), do: value
+  def encode_timeouts(_), do: {:error, "Unexpected type when encoding Tm.timeouts"}
+
+  def decode_tot_eff_1(value) when is_integer(value), do: value
+  def decode_tot_eff_1(_), do: {:error, "Unexpected type when decoding Tm.tot_eff_1"}
+
+  def encode_tot_eff_1(value) when is_integer(value), do: value
+  def encode_tot_eff_1(_), do: {:error, "Unexpected type when encoding Tm.tot_eff_1"}
+
+  def decode_tot_eff_2(value) when is_integer(value), do: value
+  def decode_tot_eff_2(_), do: {:error, "Unexpected type when decoding Tm.tot_eff_2"}
+
+  def encode_tot_eff_2(value) when is_integer(value), do: value
+  def encode_tot_eff_2(_), do: {:error, "Unexpected type when encoding Tm.tot_eff_2"}
+
+  def decode_tot_eff_3(value) when is_float(value), do: value
+  def decode_tot_eff_3(value) when is_integer(value), do: value
+  def decode_tot_eff_3(_), do: {:error, "Unexpected type when decoding Tm.tot_eff_3"}
+
+  def encode_tot_eff_3(value) when is_float(value), do: value
+  def encode_tot_eff_3(value) when is_integer(value), do: value
+  def encode_tot_eff_3(_), do: {:error, "Unexpected type when encoding Tm.tot_eff_3"}
+
+  def decode_tot_eff_4(value) when is_integer(value), do: value
+  def decode_tot_eff_4(_), do: {:error, "Unexpected type when decoding Tm.tot_eff_4"}
+
+  def encode_tot_eff_4(value) when is_integer(value), do: value
+  def encode_tot_eff_4(_), do: {:error, "Unexpected type when encoding Tm.tot_eff_4"}
+
+  def decode_tot_eff_5(value) when is_integer(value), do: value
+  def decode_tot_eff_5(_), do: {:error, "Unexpected type when decoding Tm.tot_eff_5"}
+
+  def encode_tot_eff_5(value) when is_integer(value), do: value
+  def encode_tot_eff_5(_), do: {:error, "Unexpected type when encoding Tm.tot_eff_5"}
+
+  def decode_tot_eff_6(value) when is_integer(value), do: value
+  def decode_tot_eff_6(_), do: {:error, "Unexpected type when decoding Tm.tot_eff_6"}
+
+  def encode_tot_eff_6(value) when is_integer(value), do: value
+  def encode_tot_eff_6(_), do: {:error, "Unexpected type when encoding Tm.tot_eff_6"}
+
+  def decode_tot_eff_7(value) when is_integer(value), do: value
+  def decode_tot_eff_7(_), do: {:error, "Unexpected type when decoding Tm.tot_eff_7"}
+
+  def encode_tot_eff_7(value) when is_integer(value), do: value
+  def encode_tot_eff_7(_), do: {:error, "Unexpected type when encoding Tm.tot_eff_7"}
+
+  def decode_tot_s_assists(value) when is_integer(value), do: value
+  def decode_tot_s_assists(_), do: {:error, "Unexpected type when decoding Tm.tot_s_assists"}
+
+  def encode_tot_s_assists(value) when is_integer(value), do: value
+  def encode_tot_s_assists(_), do: {:error, "Unexpected type when encoding Tm.tot_s_assists"}
+
+  def decode_tot_s_bench_points(value) when is_integer(value), do: value
+  def decode_tot_s_bench_points(_), do: {:error, "Unexpected type when decoding Tm.tot_s_bench_points"}
+
+  def encode_tot_s_bench_points(value) when is_integer(value), do: value
+  def encode_tot_s_bench_points(_), do: {:error, "Unexpected type when encoding Tm.tot_s_bench_points"}
+
+  def decode_tot_s_biggest_lead(value) when is_integer(value), do: value
+  def decode_tot_s_biggest_lead(_), do: {:error, "Unexpected type when decoding Tm.tot_s_biggest_lead"}
+
+  def encode_tot_s_biggest_lead(value) when is_integer(value), do: value
+  def encode_tot_s_biggest_lead(_), do: {:error, "Unexpected type when encoding Tm.tot_s_biggest_lead"}
+
+  def decode_tot_s_biggest_scoring_run(value) when is_integer(value), do: value
+  def decode_tot_s_biggest_scoring_run(_), do: {:error, "Unexpected type when decoding Tm.tot_s_biggest_scoring_run"}
+
+  def encode_tot_s_biggest_scoring_run(value) when is_integer(value), do: value
+  def encode_tot_s_biggest_scoring_run(_), do: {:error, "Unexpected type when encoding Tm.tot_s_biggest_scoring_run"}
+
+  def decode_tot_s_blocks(value) when is_integer(value), do: value
+  def decode_tot_s_blocks(_), do: {:error, "Unexpected type when decoding Tm.tot_s_blocks"}
+
+  def encode_tot_s_blocks(value) when is_integer(value), do: value
+  def encode_tot_s_blocks(_), do: {:error, "Unexpected type when encoding Tm.tot_s_blocks"}
+
+  def decode_tot_s_blocks_received(value) when is_integer(value), do: value
+  def decode_tot_s_blocks_received(_), do: {:error, "Unexpected type when decoding Tm.tot_s_blocks_received"}
+
+  def encode_tot_s_blocks_received(value) when is_integer(value), do: value
+  def encode_tot_s_blocks_received(_), do: {:error, "Unexpected type when encoding Tm.tot_s_blocks_received"}
+
+  def decode_tot_s_field_goals_attempted(value) when is_integer(value), do: value
+  def decode_tot_s_field_goals_attempted(_), do: {:error, "Unexpected type when decoding Tm.tot_s_field_goals_attempted"}
+
+  def encode_tot_s_field_goals_attempted(value) when is_integer(value), do: value
+  def encode_tot_s_field_goals_attempted(_), do: {:error, "Unexpected type when encoding Tm.tot_s_field_goals_attempted"}
+
+  def decode_tot_s_field_goals_made(value) when is_integer(value), do: value
+  def decode_tot_s_field_goals_made(_), do: {:error, "Unexpected type when decoding Tm.tot_s_field_goals_made"}
+
+  def encode_tot_s_field_goals_made(value) when is_integer(value), do: value
+  def encode_tot_s_field_goals_made(_), do: {:error, "Unexpected type when encoding Tm.tot_s_field_goals_made"}
+
+  def decode_tot_s_field_goals_percentage(value) when is_integer(value), do: value
+  def decode_tot_s_field_goals_percentage(_), do: {:error, "Unexpected type when decoding Tm.tot_s_field_goals_percentage"}
+
+  def encode_tot_s_field_goals_percentage(value) when is_integer(value), do: value
+  def encode_tot_s_field_goals_percentage(_), do: {:error, "Unexpected type when encoding Tm.tot_s_field_goals_percentage"}
+
+  def decode_tot_s_fouls_on(value) when is_integer(value), do: value
+  def decode_tot_s_fouls_on(_), do: {:error, "Unexpected type when decoding Tm.tot_s_fouls_on"}
+
+  def encode_tot_s_fouls_on(value) when is_integer(value), do: value
+  def encode_tot_s_fouls_on(_), do: {:error, "Unexpected type when encoding Tm.tot_s_fouls_on"}
+
+  def decode_tot_s_fouls_personal(value) when is_integer(value), do: value
+  def decode_tot_s_fouls_personal(_), do: {:error, "Unexpected type when decoding Tm.tot_s_fouls_personal"}
+
+  def encode_tot_s_fouls_personal(value) when is_integer(value), do: value
+  def encode_tot_s_fouls_personal(_), do: {:error, "Unexpected type when encoding Tm.tot_s_fouls_personal"}
+
+  def decode_tot_s_fouls_team(value) when is_integer(value), do: value
+  def decode_tot_s_fouls_team(_), do: {:error, "Unexpected type when decoding Tm.tot_s_fouls_team"}
+
+  def encode_tot_s_fouls_team(value) when is_integer(value), do: value
+  def encode_tot_s_fouls_team(_), do: {:error, "Unexpected type when encoding Tm.tot_s_fouls_team"}
+
+  def decode_tot_s_free_throws_attempted(value) when is_integer(value), do: value
+  def decode_tot_s_free_throws_attempted(_), do: {:error, "Unexpected type when decoding Tm.tot_s_free_throws_attempted"}
+
+  def encode_tot_s_free_throws_attempted(value) when is_integer(value), do: value
+  def encode_tot_s_free_throws_attempted(_), do: {:error, "Unexpected type when encoding Tm.tot_s_free_throws_attempted"}
+
+  def decode_tot_s_free_throws_made(value) when is_integer(value), do: value
+  def decode_tot_s_free_throws_made(_), do: {:error, "Unexpected type when decoding Tm.tot_s_free_throws_made"}
+
+  def encode_tot_s_free_throws_made(value) when is_integer(value), do: value
+  def encode_tot_s_free_throws_made(_), do: {:error, "Unexpected type when encoding Tm.tot_s_free_throws_made"}
+
+  def decode_tot_s_free_throws_percentage(value) when is_integer(value), do: value
+  def decode_tot_s_free_throws_percentage(_), do: {:error, "Unexpected type when decoding Tm.tot_s_free_throws_percentage"}
+
+  def encode_tot_s_free_throws_percentage(value) when is_integer(value), do: value
+  def encode_tot_s_free_throws_percentage(_), do: {:error, "Unexpected type when encoding Tm.tot_s_free_throws_percentage"}
+
+  def decode_tot_s_lead_changes(value) when is_integer(value), do: value
+  def decode_tot_s_lead_changes(_), do: {:error, "Unexpected type when decoding Tm.tot_s_lead_changes"}
+
+  def encode_tot_s_lead_changes(value) when is_integer(value), do: value
+  def encode_tot_s_lead_changes(_), do: {:error, "Unexpected type when encoding Tm.tot_s_lead_changes"}
+
+  def decode_tot_s_minutes(value) when is_integer(value), do: value
+  def decode_tot_s_minutes(_), do: {:error, "Unexpected type when decoding Tm.tot_s_minutes"}
+
+  def encode_tot_s_minutes(value) when is_integer(value), do: value
+  def encode_tot_s_minutes(_), do: {:error, "Unexpected type when encoding Tm.tot_s_minutes"}
+
+  def decode_tot_s_points(value) when is_integer(value), do: value
+  def decode_tot_s_points(_), do: {:error, "Unexpected type when decoding Tm.tot_s_points"}
+
+  def encode_tot_s_points(value) when is_integer(value), do: value
+  def encode_tot_s_points(_), do: {:error, "Unexpected type when encoding Tm.tot_s_points"}
+
+  def decode_tot_s_points_fast_break(value) when is_integer(value), do: value
+  def decode_tot_s_points_fast_break(_), do: {:error, "Unexpected type when decoding Tm.tot_s_points_fast_break"}
+
+  def encode_tot_s_points_fast_break(value) when is_integer(value), do: value
+  def encode_tot_s_points_fast_break(_), do: {:error, "Unexpected type when encoding Tm.tot_s_points_fast_break"}
+
+  def decode_tot_s_points_from_turnovers(value) when is_integer(value), do: value
+  def decode_tot_s_points_from_turnovers(_), do: {:error, "Unexpected type when decoding Tm.tot_s_points_from_turnovers"}
+
+  def encode_tot_s_points_from_turnovers(value) when is_integer(value), do: value
+  def encode_tot_s_points_from_turnovers(_), do: {:error, "Unexpected type when encoding Tm.tot_s_points_from_turnovers"}
+
+  def decode_tot_s_points_in_the_paint(value) when is_integer(value), do: value
+  def decode_tot_s_points_in_the_paint(_), do: {:error, "Unexpected type when decoding Tm.tot_s_points_in_the_paint"}
+
+  def encode_tot_s_points_in_the_paint(value) when is_integer(value), do: value
+  def encode_tot_s_points_in_the_paint(_), do: {:error, "Unexpected type when encoding Tm.tot_s_points_in_the_paint"}
+
+  def decode_tot_s_points_second_chance(value) when is_integer(value), do: value
+  def decode_tot_s_points_second_chance(_), do: {:error, "Unexpected type when decoding Tm.tot_s_points_second_chance"}
+
+  def encode_tot_s_points_second_chance(value) when is_integer(value), do: value
+  def encode_tot_s_points_second_chance(_), do: {:error, "Unexpected type when encoding Tm.tot_s_points_second_chance"}
+
+  def decode_tot_s_rebounds_defensive(value) when is_integer(value), do: value
+  def decode_tot_s_rebounds_defensive(_), do: {:error, "Unexpected type when decoding Tm.tot_s_rebounds_defensive"}
+
+  def encode_tot_s_rebounds_defensive(value) when is_integer(value), do: value
+  def encode_tot_s_rebounds_defensive(_), do: {:error, "Unexpected type when encoding Tm.tot_s_rebounds_defensive"}
+
+  def decode_tot_s_rebounds_offensive(value) when is_integer(value), do: value
+  def decode_tot_s_rebounds_offensive(_), do: {:error, "Unexpected type when decoding Tm.tot_s_rebounds_offensive"}
+
+  def encode_tot_s_rebounds_offensive(value) when is_integer(value), do: value
+  def encode_tot_s_rebounds_offensive(_), do: {:error, "Unexpected type when encoding Tm.tot_s_rebounds_offensive"}
+
+  def decode_tot_s_rebounds_team(value) when is_integer(value), do: value
+  def decode_tot_s_rebounds_team(_), do: {:error, "Unexpected type when decoding Tm.tot_s_rebounds_team"}
+
+  def encode_tot_s_rebounds_team(value) when is_integer(value), do: value
+  def encode_tot_s_rebounds_team(_), do: {:error, "Unexpected type when encoding Tm.tot_s_rebounds_team"}
+
+  def decode_tot_s_rebounds_team_defensive(value) when is_integer(value), do: value
+  def decode_tot_s_rebounds_team_defensive(_), do: {:error, "Unexpected type when decoding Tm.tot_s_rebounds_team_defensive"}
+
+  def encode_tot_s_rebounds_team_defensive(value) when is_integer(value), do: value
+  def encode_tot_s_rebounds_team_defensive(_), do: {:error, "Unexpected type when encoding Tm.tot_s_rebounds_team_defensive"}
+
+  def decode_tot_s_rebounds_team_offensive(value) when is_integer(value), do: value
+  def decode_tot_s_rebounds_team_offensive(_), do: {:error, "Unexpected type when decoding Tm.tot_s_rebounds_team_offensive"}
+
+  def encode_tot_s_rebounds_team_offensive(value) when is_integer(value), do: value
+  def encode_tot_s_rebounds_team_offensive(_), do: {:error, "Unexpected type when encoding Tm.tot_s_rebounds_team_offensive"}
+
+  def decode_tot_s_rebounds_total(value) when is_integer(value), do: value
+  def decode_tot_s_rebounds_total(_), do: {:error, "Unexpected type when decoding Tm.tot_s_rebounds_total"}
+
+  def encode_tot_s_rebounds_total(value) when is_integer(value), do: value
+  def encode_tot_s_rebounds_total(_), do: {:error, "Unexpected type when encoding Tm.tot_s_rebounds_total"}
+
+  def decode_tot_s_steals(value) when is_integer(value), do: value
+  def decode_tot_s_steals(_), do: {:error, "Unexpected type when decoding Tm.tot_s_steals"}
+
+  def encode_tot_s_steals(value) when is_integer(value), do: value
+  def encode_tot_s_steals(_), do: {:error, "Unexpected type when encoding Tm.tot_s_steals"}
+
+  def decode_tot_s_three_pointers_attempted(value) when is_integer(value), do: value
+  def decode_tot_s_three_pointers_attempted(_), do: {:error, "Unexpected type when decoding Tm.tot_s_three_pointers_attempted"}
+
+  def encode_tot_s_three_pointers_attempted(value) when is_integer(value), do: value
+  def encode_tot_s_three_pointers_attempted(_), do: {:error, "Unexpected type when encoding Tm.tot_s_three_pointers_attempted"}
+
+  def decode_tot_s_three_pointers_made(value) when is_integer(value), do: value
+  def decode_tot_s_three_pointers_made(_), do: {:error, "Unexpected type when decoding Tm.tot_s_three_pointers_made"}
+
+  def encode_tot_s_three_pointers_made(value) when is_integer(value), do: value
+  def encode_tot_s_three_pointers_made(_), do: {:error, "Unexpected type when encoding Tm.tot_s_three_pointers_made"}
+
+  def decode_tot_s_three_pointers_percentage(value) when is_integer(value), do: value
+  def decode_tot_s_three_pointers_percentage(_), do: {:error, "Unexpected type when decoding Tm.tot_s_three_pointers_percentage"}
+
+  def encode_tot_s_three_pointers_percentage(value) when is_integer(value), do: value
+  def encode_tot_s_three_pointers_percentage(_), do: {:error, "Unexpected type when encoding Tm.tot_s_three_pointers_percentage"}
+
+  def decode_tot_s_time_leading(value) when is_float(value), do: value
+  def decode_tot_s_time_leading(value) when is_integer(value), do: value
+  def decode_tot_s_time_leading(_), do: {:error, "Unexpected type when decoding Tm.tot_s_time_leading"}
+
+  def encode_tot_s_time_leading(value) when is_float(value), do: value
+  def encode_tot_s_time_leading(value) when is_integer(value), do: value
+  def encode_tot_s_time_leading(_), do: {:error, "Unexpected type when encoding Tm.tot_s_time_leading"}
+
+  def decode_tot_s_times_scores_level(value) when is_integer(value), do: value
+  def decode_tot_s_times_scores_level(_), do: {:error, "Unexpected type when decoding Tm.tot_s_times_scores_level"}
+
+  def encode_tot_s_times_scores_level(value) when is_integer(value), do: value
+  def encode_tot_s_times_scores_level(_), do: {:error, "Unexpected type when encoding Tm.tot_s_times_scores_level"}
+
+  def decode_tot_s_turnovers(value) when is_integer(value), do: value
+  def decode_tot_s_turnovers(_), do: {:error, "Unexpected type when decoding Tm.tot_s_turnovers"}
+
+  def encode_tot_s_turnovers(value) when is_integer(value), do: value
+  def encode_tot_s_turnovers(_), do: {:error, "Unexpected type when encoding Tm.tot_s_turnovers"}
+
+  def decode_tot_s_turnovers_team(value) when is_integer(value), do: value
+  def decode_tot_s_turnovers_team(_), do: {:error, "Unexpected type when decoding Tm.tot_s_turnovers_team"}
+
+  def encode_tot_s_turnovers_team(value) when is_integer(value), do: value
+  def encode_tot_s_turnovers_team(_), do: {:error, "Unexpected type when encoding Tm.tot_s_turnovers_team"}
+
+  def decode_tot_s_two_pointers_attempted(value) when is_integer(value), do: value
+  def decode_tot_s_two_pointers_attempted(_), do: {:error, "Unexpected type when decoding Tm.tot_s_two_pointers_attempted"}
+
+  def encode_tot_s_two_pointers_attempted(value) when is_integer(value), do: value
+  def encode_tot_s_two_pointers_attempted(_), do: {:error, "Unexpected type when encoding Tm.tot_s_two_pointers_attempted"}
+
+  def decode_tot_s_two_pointers_made(value) when is_integer(value), do: value
+  def decode_tot_s_two_pointers_made(_), do: {:error, "Unexpected type when decoding Tm.tot_s_two_pointers_made"}
+
+  def encode_tot_s_two_pointers_made(value) when is_integer(value), do: value
+  def encode_tot_s_two_pointers_made(_), do: {:error, "Unexpected type when encoding Tm.tot_s_two_pointers_made"}
+
+  def decode_tot_s_two_pointers_percentage(value) when is_integer(value), do: value
+  def decode_tot_s_two_pointers_percentage(_), do: {:error, "Unexpected type when decoding Tm.tot_s_two_pointers_percentage"}
+
+  def encode_tot_s_two_pointers_percentage(value) when is_integer(value), do: value
+  def encode_tot_s_two_pointers_percentage(_), do: {:error, "Unexpected type when encoding Tm.tot_s_two_pointers_percentage"}
+
   def from_map(m) do
     %Tm{
-      code: m["code"],
-      code_international: m["codeInternational"],
-      fouls: m["fouls"],
-      full_score: m["full_score"],
+      code: decode_code(m["code"]),
+      code_international: decode_code_international(m["codeInternational"]),
+      fouls: decode_fouls(m["fouls"]),
+      full_score: decode_full_score(m["full_score"]),
       lds: Lds.from_map(m["lds"]),
-      logo: m["logo"],
-      name: m["name"],
-      name_international: m["nameInternational"],
-      p1_score: m["p1_score"],
-      p2_score: m["p2_score"],
-      p3_score: m["p3_score"],
-      p4_score: m["p4_score"],
+      logo: decode_logo(m["logo"]),
+      name: decode_name(m["name"]),
+      name_international: decode_name_international(m["nameInternational"]),
+      p1_score: decode_p1_score(m["p1_score"]),
+      p2_score: decode_p2_score(m["p2_score"]),
+      p3_score: decode_p3_score(m["p3_score"]),
+      p4_score: decode_p4_score(m["p4_score"]),
       pl: m["pl"]
       |> Map.new(fn {key, value} -> {key, Pl.from_map(value)} end),
-      score: m["score"],
+      score: decode_score(m["score"]),
       scoring: Enum.map(m["scoring"], &Scorer.from_map/1),
-      short_name: m["shortName"],
-      short_name_international: m["shortNameInternational"],
+      short_name: decode_short_name(m["shortName"]),
+      short_name_international: decode_short_name_international(m["shortNameInternational"]),
       shot: Enum.map(m["shot"], &Shot.from_map/1),
-      timeouts: m["timeouts"],
-      tot_eff_1: m["tot_eff_1"],
-      tot_eff_2: m["tot_eff_2"],
-      tot_eff_3: m["tot_eff_3"],
-      tot_eff_4: m["tot_eff_4"],
-      tot_eff_5: m["tot_eff_5"],
-      tot_eff_6: m["tot_eff_6"],
-      tot_eff_7: m["tot_eff_7"],
-      tot_s_assists: m["tot_sAssists"],
-      tot_s_bench_points: m["tot_sBenchPoints"],
-      tot_s_biggest_lead: m["tot_sBiggestLead"],
-      tot_s_biggest_scoring_run: m["tot_sBiggestScoringRun"],
-      tot_s_blocks: m["tot_sBlocks"],
-      tot_s_blocks_received: m["tot_sBlocksReceived"],
-      tot_s_field_goals_attempted: m["tot_sFieldGoalsAttempted"],
-      tot_s_field_goals_made: m["tot_sFieldGoalsMade"],
-      tot_s_field_goals_percentage: m["tot_sFieldGoalsPercentage"],
-      tot_s_fouls_on: m["tot_sFoulsOn"],
-      tot_s_fouls_personal: m["tot_sFoulsPersonal"],
-      tot_s_fouls_team: m["tot_sFoulsTeam"],
-      tot_s_free_throws_attempted: m["tot_sFreeThrowsAttempted"],
-      tot_s_free_throws_made: m["tot_sFreeThrowsMade"],
-      tot_s_free_throws_percentage: m["tot_sFreeThrowsPercentage"],
-      tot_s_lead_changes: m["tot_sLeadChanges"],
-      tot_s_minutes: m["tot_sMinutes"],
-      tot_s_points: m["tot_sPoints"],
-      tot_s_points_fast_break: m["tot_sPointsFastBreak"],
-      tot_s_points_from_turnovers: m["tot_sPointsFromTurnovers"],
-      tot_s_points_in_the_paint: m["tot_sPointsInThePaint"],
-      tot_s_points_second_chance: m["tot_sPointsSecondChance"],
-      tot_s_rebounds_defensive: m["tot_sReboundsDefensive"],
-      tot_s_rebounds_offensive: m["tot_sReboundsOffensive"],
-      tot_s_rebounds_team: m["tot_sReboundsTeam"],
-      tot_s_rebounds_team_defensive: m["tot_sReboundsTeamDefensive"],
-      tot_s_rebounds_team_offensive: m["tot_sReboundsTeamOffensive"],
-      tot_s_rebounds_total: m["tot_sReboundsTotal"],
-      tot_s_steals: m["tot_sSteals"],
-      tot_s_three_pointers_attempted: m["tot_sThreePointersAttempted"],
-      tot_s_three_pointers_made: m["tot_sThreePointersMade"],
-      tot_s_three_pointers_percentage: m["tot_sThreePointersPercentage"],
-      tot_s_time_leading: m["tot_sTimeLeading"],
-      tot_s_times_scores_level: m["tot_sTimesScoresLevel"],
-      tot_s_turnovers: m["tot_sTurnovers"],
-      tot_s_turnovers_team: m["tot_sTurnoversTeam"],
-      tot_s_two_pointers_attempted: m["tot_sTwoPointersAttempted"],
-      tot_s_two_pointers_made: m["tot_sTwoPointersMade"],
-      tot_s_two_pointers_percentage: m["tot_sTwoPointersPercentage"],
+      timeouts: decode_timeouts(m["timeouts"]),
+      tot_eff_1: decode_tot_eff_1(m["tot_eff_1"]),
+      tot_eff_2: decode_tot_eff_2(m["tot_eff_2"]),
+      tot_eff_3: decode_tot_eff_3(m["tot_eff_3"]),
+      tot_eff_4: decode_tot_eff_4(m["tot_eff_4"]),
+      tot_eff_5: decode_tot_eff_5(m["tot_eff_5"]),
+      tot_eff_6: decode_tot_eff_6(m["tot_eff_6"]),
+      tot_eff_7: decode_tot_eff_7(m["tot_eff_7"]),
+      tot_s_assists: decode_tot_s_assists(m["tot_sAssists"]),
+      tot_s_bench_points: decode_tot_s_bench_points(m["tot_sBenchPoints"]),
+      tot_s_biggest_lead: decode_tot_s_biggest_lead(m["tot_sBiggestLead"]),
+      tot_s_biggest_scoring_run: decode_tot_s_biggest_scoring_run(m["tot_sBiggestScoringRun"]),
+      tot_s_blocks: decode_tot_s_blocks(m["tot_sBlocks"]),
+      tot_s_blocks_received: decode_tot_s_blocks_received(m["tot_sBlocksReceived"]),
+      tot_s_field_goals_attempted: decode_tot_s_field_goals_attempted(m["tot_sFieldGoalsAttempted"]),
+      tot_s_field_goals_made: decode_tot_s_field_goals_made(m["tot_sFieldGoalsMade"]),
+      tot_s_field_goals_percentage: decode_tot_s_field_goals_percentage(m["tot_sFieldGoalsPercentage"]),
+      tot_s_fouls_on: decode_tot_s_fouls_on(m["tot_sFoulsOn"]),
+      tot_s_fouls_personal: decode_tot_s_fouls_personal(m["tot_sFoulsPersonal"]),
+      tot_s_fouls_team: decode_tot_s_fouls_team(m["tot_sFoulsTeam"]),
+      tot_s_free_throws_attempted: decode_tot_s_free_throws_attempted(m["tot_sFreeThrowsAttempted"]),
+      tot_s_free_throws_made: decode_tot_s_free_throws_made(m["tot_sFreeThrowsMade"]),
+      tot_s_free_throws_percentage: decode_tot_s_free_throws_percentage(m["tot_sFreeThrowsPercentage"]),
+      tot_s_lead_changes: decode_tot_s_lead_changes(m["tot_sLeadChanges"]),
+      tot_s_minutes: decode_tot_s_minutes(m["tot_sMinutes"]),
+      tot_s_points: decode_tot_s_points(m["tot_sPoints"]),
+      tot_s_points_fast_break: decode_tot_s_points_fast_break(m["tot_sPointsFastBreak"]),
+      tot_s_points_from_turnovers: decode_tot_s_points_from_turnovers(m["tot_sPointsFromTurnovers"]),
+      tot_s_points_in_the_paint: decode_tot_s_points_in_the_paint(m["tot_sPointsInThePaint"]),
+      tot_s_points_second_chance: decode_tot_s_points_second_chance(m["tot_sPointsSecondChance"]),
+      tot_s_rebounds_defensive: decode_tot_s_rebounds_defensive(m["tot_sReboundsDefensive"]),
+      tot_s_rebounds_offensive: decode_tot_s_rebounds_offensive(m["tot_sReboundsOffensive"]),
+      tot_s_rebounds_team: decode_tot_s_rebounds_team(m["tot_sReboundsTeam"]),
+      tot_s_rebounds_team_defensive: decode_tot_s_rebounds_team_defensive(m["tot_sReboundsTeamDefensive"]),
+      tot_s_rebounds_team_offensive: decode_tot_s_rebounds_team_offensive(m["tot_sReboundsTeamOffensive"]),
+      tot_s_rebounds_total: decode_tot_s_rebounds_total(m["tot_sReboundsTotal"]),
+      tot_s_steals: decode_tot_s_steals(m["tot_sSteals"]),
+      tot_s_three_pointers_attempted: decode_tot_s_three_pointers_attempted(m["tot_sThreePointersAttempted"]),
+      tot_s_three_pointers_made: decode_tot_s_three_pointers_made(m["tot_sThreePointersMade"]),
+      tot_s_three_pointers_percentage: decode_tot_s_three_pointers_percentage(m["tot_sThreePointersPercentage"]),
+      tot_s_time_leading: decode_tot_s_time_leading(m["tot_sTimeLeading"]),
+      tot_s_times_scores_level: decode_tot_s_times_scores_level(m["tot_sTimesScoresLevel"]),
+      tot_s_turnovers: decode_tot_s_turnovers(m["tot_sTurnovers"]),
+      tot_s_turnovers_team: decode_tot_s_turnovers_team(m["tot_sTurnoversTeam"]),
+      tot_s_two_pointers_attempted: decode_tot_s_two_pointers_attempted(m["tot_sTwoPointersAttempted"]),
+      tot_s_two_pointers_made: decode_tot_s_two_pointers_made(m["tot_sTwoPointersMade"]),
+      tot_s_two_pointers_percentage: decode_tot_s_two_pointers_percentage(m["tot_sTwoPointersPercentage"]),
     }
   end
 
@@ -1387,28 +2295,124 @@ defmodule TopLevel do
           totallds: Totallds.t()
         }
 
+  def decode_attendance(value) when is_integer(value), do: value
+  def decode_attendance(_), do: {:error, "Unexpected type when decoding TopLevel.attendance"}
+
+  def encode_attendance(value) when is_integer(value), do: value
+  def encode_attendance(_), do: {:error, "Unexpected type when encoding TopLevel.attendance"}
+
+  def decode_clock(value) when is_binary(value), do: value
+  def decode_clock(_), do: {:error, "Unexpected type when decoding TopLevel.clock"}
+
+  def encode_clock(value) when is_binary(value), do: value
+  def encode_clock(_), do: {:error, "Unexpected type when encoding TopLevel.clock"}
+
+  def decode_disable_match(value) when is_integer(value), do: value
+  def decode_disable_match(_), do: {:error, "Unexpected type when decoding TopLevel.disable_match"}
+
+  def encode_disable_match(value) when is_integer(value), do: value
+  def encode_disable_match(_), do: {:error, "Unexpected type when encoding TopLevel.disable_match"}
+
+  def decode_in_ot(value) when is_integer(value), do: value
+  def decode_in_ot(_), do: {:error, "Unexpected type when decoding TopLevel.in_ot"}
+
+  def encode_in_ot(value) when is_integer(value), do: value
+  def encode_in_ot(_), do: {:error, "Unexpected type when encoding TopLevel.in_ot"}
+
+  def decode_leaddata(value) when is_list(value), do: value
+  def decode_leaddata(_), do: {:error, "Unexpected type when decoding TopLevel.leaddata"}
+
+  def encode_leaddata(value) when is_list(value), do: value
+  def encode_leaddata(_), do: {:error, "Unexpected type when encoding TopLevel.leaddata"}
+
+  def decode_officials_referee1(value) when is_binary(value), do: value
+  def decode_officials_referee1(_), do: {:error, "Unexpected type when decoding TopLevel.officials_referee1"}
+
+  def encode_officials_referee1(value) when is_binary(value), do: value
+  def encode_officials_referee1(_), do: {:error, "Unexpected type when encoding TopLevel.officials_referee1"}
+
+  def decode_officials_referee2(value) when is_binary(value), do: value
+  def decode_officials_referee2(_), do: {:error, "Unexpected type when decoding TopLevel.officials_referee2"}
+
+  def encode_officials_referee2(value) when is_binary(value), do: value
+  def encode_officials_referee2(_), do: {:error, "Unexpected type when encoding TopLevel.officials_referee2"}
+
+  def decode_officials_referee3(value) when is_binary(value), do: value
+  def decode_officials_referee3(_), do: {:error, "Unexpected type when decoding TopLevel.officials_referee3"}
+
+  def encode_officials_referee3(value) when is_binary(value), do: value
+  def encode_officials_referee3(_), do: {:error, "Unexpected type when encoding TopLevel.officials_referee3"}
+
+  def decode_othermatches(value) when is_list(value), do: value
+  def decode_othermatches(_), do: {:error, "Unexpected type when decoding TopLevel.othermatches"}
+
+  def encode_othermatches(value) when is_list(value), do: value
+  def encode_othermatches(_), do: {:error, "Unexpected type when encoding TopLevel.othermatches"}
+
+  def decode_pbp(value) when is_list(value), do: value
+  def decode_pbp(_), do: {:error, "Unexpected type when decoding TopLevel.pbp"}
+
+  def encode_pbp(value) when is_list(value), do: value
+  def encode_pbp(_), do: {:error, "Unexpected type when encoding TopLevel.pbp"}
+
+  def decode_period(value) when is_integer(value), do: value
+  def decode_period(_), do: {:error, "Unexpected type when decoding TopLevel.period"}
+
+  def encode_period(value) when is_integer(value), do: value
+  def encode_period(_), do: {:error, "Unexpected type when encoding TopLevel.period"}
+
+  def decode_period_length_overtime(value) when is_integer(value), do: value
+  def decode_period_length_overtime(_), do: {:error, "Unexpected type when decoding TopLevel.period_length_overtime"}
+
+  def encode_period_length_overtime(value) when is_integer(value), do: value
+  def encode_period_length_overtime(_), do: {:error, "Unexpected type when encoding TopLevel.period_length_overtime"}
+
+  def decode_period_length_regular(value) when is_integer(value), do: value
+  def decode_period_length_regular(_), do: {:error, "Unexpected type when decoding TopLevel.period_length_regular"}
+
+  def encode_period_length_regular(value) when is_integer(value), do: value
+  def encode_period_length_regular(_), do: {:error, "Unexpected type when encoding TopLevel.period_length_regular"}
+
+  def decode_periods_max(value) when is_integer(value), do: value
+  def decode_periods_max(_), do: {:error, "Unexpected type when decoding TopLevel.periods_max"}
+
+  def encode_periods_max(value) when is_integer(value), do: value
+  def encode_periods_max(_), do: {:error, "Unexpected type when encoding TopLevel.periods_max"}
+
+  def decode_timeline(value) when is_list(value), do: value
+  def decode_timeline(_), do: {:error, "Unexpected type when decoding TopLevel.timeline"}
+
+  def encode_timeline(value) when is_list(value), do: value
+  def encode_timeline(_), do: {:error, "Unexpected type when encoding TopLevel.timeline"}
+
+  def decode_total_time_added(value) when is_integer(value), do: value
+  def decode_total_time_added(_), do: {:error, "Unexpected type when decoding TopLevel.total_time_added"}
+
+  def encode_total_time_added(value) when is_integer(value), do: value
+  def encode_total_time_added(_), do: {:error, "Unexpected type when encoding TopLevel.total_time_added"}
+
   def from_map(m) do
     %TopLevel{
-      attendance: m["attendance"],
-      clock: m["clock"],
-      disable_match: m["disableMatch"],
-      in_ot: m["inOT"],
-      leaddata: m["leaddata"],
-      officials_referee1: m["officials_referee1"],
-      officials_referee2: m["officials_referee2"],
-      officials_referee3: m["officials_referee3"],
+      attendance: decode_attendance(m["attendance"]),
+      clock: decode_clock(m["clock"]),
+      disable_match: decode_disable_match(m["disableMatch"]),
+      in_ot: decode_in_ot(m["inOT"]),
+      leaddata: decode_leaddata(m["leaddata"]),
+      officials_referee1: decode_officials_referee1(m["officials_referee1"]),
+      officials_referee2: decode_officials_referee2(m["officials_referee2"]),
+      officials_referee3: decode_officials_referee3(m["officials_referee3"]),
       othermatches: Enum.map(m["othermatches"], &Othermatch.from_map/1),
       pbp: Enum.map(m["pbp"], &Pbp.from_map/1),
-      period: m["period"],
-      period_length_overtime: m["periodLengthOVERTIME"],
-      period_length_regular: m["periodLengthREGULAR"],
+      period: decode_period(m["period"]),
+      period_length_overtime: decode_period_length_overtime(m["periodLengthOVERTIME"]),
+      period_length_regular: decode_period_length_regular(m["periodLengthREGULAR"]),
       period_type: PerType.decode(m["periodType"]),
-      periods_max: m["periodsMax"],
+      periods_max: decode_periods_max(m["periodsMax"]),
       scorers: m["scorers"],
-      timeline: m["timeline"],
+      timeline: decode_timeline(m["timeline"]),
       tm: m["tm"]
       |> Map.new(fn {key, value} -> {key, Tm.from_map(value)} end),
-      total_time_added: m["totalTimeAdded"],
+      total_time_added: decode_total_time_added(m["totalTimeAdded"]),
       totallds: Totallds.from_map(m["totallds"]),
     }
   end
diff --git a/base/elixir/test/inputs/json/priority/nested-objects.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/nested-objects.json/default/QuickType.ex
index 5a795fe..8c3a757 100644
--- a/base/elixir/test/inputs/json/priority/nested-objects.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/nested-objects.json/default/QuickType.ex
@@ -14,10 +14,24 @@ defmodule TopLevel do
           b: %{String.t() => integer()}
         }
 
+  def decode_a_value(value) when is_integer(value), do: value
+  def decode_a_value(_), do: {:error, "Unexpected type when decoding TopLevel.a"}
+
+  def encode_a_value(value) when is_integer(value), do: value
+  def encode_a_value(_), do: {:error, "Unexpected type when encoding TopLevel.a"}
+
+  def decode_b_value(value) when is_integer(value), do: value
+  def decode_b_value(_), do: {:error, "Unexpected type when decoding TopLevel.b"}
+
+  def encode_b_value(value) when is_integer(value), do: value
+  def encode_b_value(_), do: {:error, "Unexpected type when encoding TopLevel.b"}
+
   def from_map(m) do
     %TopLevel{
-      a: m["a"],
-      b: m["b"],
+      a: m["a"]
+      |> Map.new(fn {key, value} -> {key, decode_a_value(value)} end),
+      b: m["b"]
+      |> Map.new(fn {key, value} -> {key, decode_b_value(value)} end),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/nst-test-suite.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/nst-test-suite.json/default/QuickType.ex
index dbc31c2..e709dec 100644
--- a/base/elixir/test/inputs/json/priority/nst-test-suite.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/nst-test-suite.json/default/QuickType.ex
@@ -42,9 +42,15 @@ defmodule YObjectBasicJSON do
           asd: String.t()
         }
 
+  def decode_asd(value) when is_binary(value), do: value
+  def decode_asd(_), do: {:error, "Unexpected type when decoding YObjectBasicJSON.asd"}
+
+  def encode_asd(value) when is_binary(value), do: value
+  def encode_asd(_), do: {:error, "Unexpected type when encoding YObjectBasicJSON.asd"}
+
   def from_map(m) do
     %YObjectBasicJSON{
-      asd: m["asd"],
+      asd: decode_asd(m["asd"]),
     }
   end
 
@@ -75,9 +81,15 @@ defmodule YObjectEmptyKeyJSON do
           empty: integer()
         }
 
+  def decode_empty(value) when is_integer(value), do: value
+  def decode_empty(_), do: {:error, "Unexpected type when decoding YObjectEmptyKeyJSON.empty"}
+
+  def encode_empty(value) when is_integer(value), do: value
+  def encode_empty(_), do: {:error, "Unexpected type when encoding YObjectEmptyKeyJSON.empty"}
+
   def from_map(m) do
     %YObjectEmptyKeyJSON{
-      empty: m[""],
+      empty: decode_empty(m[""]),
     }
   end
 
@@ -108,9 +120,15 @@ defmodule YObjectEscapedNullInKeyJSON do
           foo_bar: integer()
         }
 
+  def decode_foo_bar(value) when is_integer(value), do: value
+  def decode_foo_bar(_), do: {:error, "Unexpected type when decoding YObjectEscapedNullInKeyJSON.foo_bar"}
+
+  def encode_foo_bar(value) when is_integer(value), do: value
+  def encode_foo_bar(_), do: {:error, "Unexpected type when encoding YObjectEscapedNullInKeyJSON.foo_bar"}
+
   def from_map(m) do
     %YObjectEscapedNullInKeyJSON{
-      foo_bar: m["foo bar"],
+      foo_bar: decode_foo_bar(m["foo bar"]),
     }
   end
 
@@ -142,10 +160,26 @@ defmodule YObjectExtremeNumbersJSON do
           min: float()
         }
 
+  def decode_max(value) when is_float(value), do: value
+  def decode_max(value) when is_integer(value), do: value
+  def decode_max(_), do: {:error, "Unexpected type when decoding YObjectExtremeNumbersJSON.max"}
+
+  def encode_max(value) when is_float(value), do: value
+  def encode_max(value) when is_integer(value), do: value
+  def encode_max(_), do: {:error, "Unexpected type when encoding YObjectExtremeNumbersJSON.max"}
+
+  def decode_min(value) when is_float(value), do: value
+  def decode_min(value) when is_integer(value), do: value
+  def decode_min(_), do: {:error, "Unexpected type when decoding YObjectExtremeNumbersJSON.min"}
+
+  def encode_min(value) when is_float(value), do: value
+  def encode_min(value) when is_integer(value), do: value
+  def encode_min(_), do: {:error, "Unexpected type when encoding YObjectExtremeNumbersJSON.min"}
+
   def from_map(m) do
     %YObjectExtremeNumbersJSON{
-      max: m["max"],
-      min: m["min"],
+      max: decode_max(m["max"]),
+      min: decode_min(m["min"]),
     }
   end
 
@@ -178,10 +212,22 @@ defmodule YObjectJSON do
           dfg: String.t()
         }
 
+  def decode_asd(value) when is_binary(value), do: value
+  def decode_asd(_), do: {:error, "Unexpected type when decoding YObjectJSON.asd"}
+
+  def encode_asd(value) when is_binary(value), do: value
+  def encode_asd(_), do: {:error, "Unexpected type when encoding YObjectJSON.asd"}
+
+  def decode_dfg(value) when is_binary(value), do: value
+  def decode_dfg(_), do: {:error, "Unexpected type when decoding YObjectJSON.dfg"}
+
+  def encode_dfg(value) when is_binary(value), do: value
+  def encode_dfg(_), do: {:error, "Unexpected type when encoding YObjectJSON.dfg"}
+
   def from_map(m) do
     %YObjectJSON{
-      asd: m["asd"],
-      dfg: m["dfg"],
+      asd: decode_asd(m["asd"]),
+      dfg: decode_dfg(m["dfg"]),
     }
   end
 
@@ -213,9 +259,15 @@ defmodule X do
           id: String.t()
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding X.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding X.id"}
+
   def from_map(m) do
     %X{
-      id: m["id"],
+      id: decode_id(m["id"]),
     }
   end
 
@@ -247,9 +299,21 @@ defmodule YObjectLongStringsJSON do
           x: [X.t()]
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding YObjectLongStringsJSON.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding YObjectLongStringsJSON.id"}
+
+  def decode_x(value) when is_list(value), do: value
+  def decode_x(_), do: {:error, "Unexpected type when decoding YObjectLongStringsJSON.x"}
+
+  def encode_x(value) when is_list(value), do: value
+  def encode_x(_), do: {:error, "Unexpected type when encoding YObjectLongStringsJSON.x"}
+
   def from_map(m) do
     %YObjectLongStringsJSON{
-      id: m["id"],
+      id: decode_id(m["id"]),
       x: Enum.map(m["x"], &X.from_map/1),
     }
   end
@@ -282,9 +346,15 @@ defmodule YObjectSimpleJSON do
           a: [any()]
         }
 
+  def decode_a(value) when is_list(value), do: value
+  def decode_a(_), do: {:error, "Unexpected type when decoding YObjectSimpleJSON.a"}
+
+  def encode_a(value) when is_list(value), do: value
+  def encode_a(_), do: {:error, "Unexpected type when encoding YObjectSimpleJSON.a"}
+
   def from_map(m) do
     %YObjectSimpleJSON{
-      a: m["a"],
+      a: decode_a(m["a"]),
     }
   end
 
@@ -315,9 +385,15 @@ defmodule YObjectStringUnicodeJSON do
           title: String.t()
         }
 
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding YObjectStringUnicodeJSON.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding YObjectStringUnicodeJSON.title"}
+
   def from_map(m) do
     %YObjectStringUnicodeJSON{
-      title: m["title"],
+      title: decode_title(m["title"]),
     }
   end
 
@@ -348,9 +424,15 @@ defmodule YObjectWithNewlinesJSON do
           a: String.t()
         }
 
+  def decode_a(value) when is_binary(value), do: value
+  def decode_a(_), do: {:error, "Unexpected type when decoding YObjectWithNewlinesJSON.a"}
+
+  def encode_a(value) when is_binary(value), do: value
+  def encode_a(_), do: {:error, "Unexpected type when encoding YObjectWithNewlinesJSON.a"}
+
   def from_map(m) do
     %YObjectWithNewlinesJSON{
-      a: m["a"],
+      a: decode_a(m["a"]),
     }
   end
 
@@ -473,6 +555,42 @@ defmodule TopLevel do
           y_structure_whitespace_array_json: [any()]
         }
 
+  def decode_y_array_arrays_with_spaces_json(value) when is_list(value), do: value
+  def decode_y_array_arrays_with_spaces_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_array_arrays_with_spaces_json"}
+
+  def encode_y_array_arrays_with_spaces_json(value) when is_list(value), do: value
+  def encode_y_array_arrays_with_spaces_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_array_arrays_with_spaces_json"}
+
+  def decode_y_array_empty_json(value) when is_list(value), do: value
+  def decode_y_array_empty_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_array_empty_json"}
+
+  def encode_y_array_empty_json(value) when is_list(value), do: value
+  def encode_y_array_empty_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_array_empty_json"}
+
+  def decode_y_array_empty_string_json(value) when is_list(value), do: value
+  def decode_y_array_empty_string_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_array_empty_string_json"}
+
+  def encode_y_array_empty_string_json(value) when is_list(value), do: value
+  def encode_y_array_empty_string_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_array_empty_string_json"}
+
+  def decode_y_array_ending_with_newline_json(value) when is_list(value), do: value
+  def decode_y_array_ending_with_newline_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_array_ending_with_newline_json"}
+
+  def encode_y_array_ending_with_newline_json(value) when is_list(value), do: value
+  def encode_y_array_ending_with_newline_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_array_ending_with_newline_json"}
+
+  def decode_y_array_false_json(value) when is_list(value), do: value
+  def decode_y_array_false_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_array_false_json"}
+
+  def encode_y_array_false_json(value) when is_list(value), do: value
+  def encode_y_array_false_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_array_false_json"}
+
+  def decode_y_array_heterogeneous_json(value) when is_list(value), do: value
+  def decode_y_array_heterogeneous_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_array_heterogeneous_json"}
+
+  def encode_y_array_heterogeneous_json(value) when is_list(value), do: value
+  def encode_y_array_heterogeneous_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_array_heterogeneous_json"}
+
   def decode_y_array_heterogeneous_json_element(%{} = value), do: JSON.from_map(value)
   def decode_y_array_heterogeneous_json_element(value) when is_integer(value), do: value
   def decode_y_array_heterogeneous_json_element(value) when is_nil(value), do: value
@@ -485,6 +603,30 @@ defmodule TopLevel do
   def encode_y_array_heterogeneous_json_element(value) when is_binary(value), do: value
   def encode_y_array_heterogeneous_json_element(_), do: {:error, "Unexpected type when encoding TopLevel.y_array_heterogeneous_json"}
 
+  def decode_y_array_null_json(value) when is_list(value), do: value
+  def decode_y_array_null_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_array_null_json"}
+
+  def encode_y_array_null_json(value) when is_list(value), do: value
+  def encode_y_array_null_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_array_null_json"}
+
+  def decode_y_array_with_1__and_newline_json(value) when is_list(value), do: value
+  def decode_y_array_with_1__and_newline_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_array_with_1__and_newline_json"}
+
+  def encode_y_array_with_1__and_newline_json(value) when is_list(value), do: value
+  def encode_y_array_with_1__and_newline_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_array_with_1__and_newline_json"}
+
+  def decode_y_array_with_leading_space_json(value) when is_list(value), do: value
+  def decode_y_array_with_leading_space_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_array_with_leading_space_json"}
+
+  def encode_y_array_with_leading_space_json(value) when is_list(value), do: value
+  def encode_y_array_with_leading_space_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_array_with_leading_space_json"}
+
+  def decode_y_array_with_several_null_json(value) when is_list(value), do: value
+  def decode_y_array_with_several_null_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_array_with_several_null_json"}
+
+  def encode_y_array_with_several_null_json(value) when is_list(value), do: value
+  def encode_y_array_with_several_null_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_array_with_several_null_json"}
+
   def decode_y_array_with_several_null_json_element(value) when is_integer(value), do: value
   def decode_y_array_with_several_null_json_element(value) when is_nil(value), do: value
   def decode_y_array_with_several_null_json_element(_), do: {:error, "Unexpected type when decoding TopLevel.y_array_with_several_null_json"}
@@ -493,38 +635,478 @@ defmodule TopLevel do
   def encode_y_array_with_several_null_json_element(value) when is_nil(value), do: value
   def encode_y_array_with_several_null_json_element(_), do: {:error, "Unexpected type when encoding TopLevel.y_array_with_several_null_json"}
 
+  def decode_y_array_with_trailing_space_json(value) when is_list(value), do: value
+  def decode_y_array_with_trailing_space_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_array_with_trailing_space_json"}
+
+  def encode_y_array_with_trailing_space_json(value) when is_list(value), do: value
+  def encode_y_array_with_trailing_space_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_array_with_trailing_space_json"}
+
+  def decode_y_number_0_e1_json(value) when is_list(value), do: value
+  def decode_y_number_0_e1_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_0_e1_json"}
+
+  def encode_y_number_0_e1_json(value) when is_list(value), do: value
+  def encode_y_number_0_e1_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_0_e1_json"}
+
+  def decode_y_number_0_e_1_json(value) when is_list(value), do: value
+  def decode_y_number_0_e_1_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_0_e_1_json"}
+
+  def encode_y_number_0_e_1_json(value) when is_list(value), do: value
+  def encode_y_number_0_e_1_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_0_e_1_json"}
+
+  def decode_y_number_after_space_json(value) when is_list(value), do: value
+  def decode_y_number_after_space_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_after_space_json"}
+
+  def encode_y_number_after_space_json(value) when is_list(value), do: value
+  def encode_y_number_after_space_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_after_space_json"}
+
+  def decode_y_number_double_close_to_zero_json(value) when is_list(value), do: value
+  def decode_y_number_double_close_to_zero_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_double_close_to_zero_json"}
+
+  def encode_y_number_double_close_to_zero_json(value) when is_list(value), do: value
+  def encode_y_number_double_close_to_zero_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_double_close_to_zero_json"}
+
+  def decode_y_number_int_with_exp_json(value) when is_list(value), do: value
+  def decode_y_number_int_with_exp_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_int_with_exp_json"}
+
+  def encode_y_number_int_with_exp_json(value) when is_list(value), do: value
+  def encode_y_number_int_with_exp_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_int_with_exp_json"}
+
+  def decode_y_number_json(value) when is_list(value), do: value
+  def decode_y_number_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_json"}
+
+  def encode_y_number_json(value) when is_list(value), do: value
+  def encode_y_number_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_json"}
+
+  def decode_y_number_minus_zero_json(value) when is_list(value), do: value
+  def decode_y_number_minus_zero_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_minus_zero_json"}
+
+  def encode_y_number_minus_zero_json(value) when is_list(value), do: value
+  def encode_y_number_minus_zero_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_minus_zero_json"}
+
+  def decode_y_number_negative_int_json(value) when is_list(value), do: value
+  def decode_y_number_negative_int_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_negative_int_json"}
+
+  def encode_y_number_negative_int_json(value) when is_list(value), do: value
+  def encode_y_number_negative_int_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_negative_int_json"}
+
+  def decode_y_number_negative_one_json(value) when is_list(value), do: value
+  def decode_y_number_negative_one_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_negative_one_json"}
+
+  def encode_y_number_negative_one_json(value) when is_list(value), do: value
+  def encode_y_number_negative_one_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_negative_one_json"}
+
+  def decode_y_number_negative_zero_json(value) when is_list(value), do: value
+  def decode_y_number_negative_zero_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_negative_zero_json"}
+
+  def encode_y_number_negative_zero_json(value) when is_list(value), do: value
+  def encode_y_number_negative_zero_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_negative_zero_json"}
+
+  def decode_y_number_real_capital_e_json(value) when is_list(value), do: value
+  def decode_y_number_real_capital_e_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_real_capital_e_json"}
+
+  def encode_y_number_real_capital_e_json(value) when is_list(value), do: value
+  def encode_y_number_real_capital_e_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_real_capital_e_json"}
+
+  def decode_y_number_real_capital_e_neg_exp_json(value) when is_list(value), do: value
+  def decode_y_number_real_capital_e_neg_exp_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_real_capital_e_neg_exp_json"}
+
+  def encode_y_number_real_capital_e_neg_exp_json(value) when is_list(value), do: value
+  def encode_y_number_real_capital_e_neg_exp_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_real_capital_e_neg_exp_json"}
+
+  def decode_y_number_real_capital_e_pos_exp_json(value) when is_list(value), do: value
+  def decode_y_number_real_capital_e_pos_exp_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_real_capital_e_pos_exp_json"}
+
+  def encode_y_number_real_capital_e_pos_exp_json(value) when is_list(value), do: value
+  def encode_y_number_real_capital_e_pos_exp_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_real_capital_e_pos_exp_json"}
+
+  def decode_y_number_real_exponent_json(value) when is_list(value), do: value
+  def decode_y_number_real_exponent_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_real_exponent_json"}
+
+  def encode_y_number_real_exponent_json(value) when is_list(value), do: value
+  def encode_y_number_real_exponent_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_real_exponent_json"}
+
+  def decode_y_number_real_fraction_exponent_json(value) when is_list(value), do: value
+  def decode_y_number_real_fraction_exponent_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_real_fraction_exponent_json"}
+
+  def encode_y_number_real_fraction_exponent_json(value) when is_list(value), do: value
+  def encode_y_number_real_fraction_exponent_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_real_fraction_exponent_json"}
+
+  def decode_y_number_real_neg_exp_json(value) when is_list(value), do: value
+  def decode_y_number_real_neg_exp_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_real_neg_exp_json"}
+
+  def encode_y_number_real_neg_exp_json(value) when is_list(value), do: value
+  def encode_y_number_real_neg_exp_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_real_neg_exp_json"}
+
+  def decode_y_number_real_pos_exponent_json(value) when is_list(value), do: value
+  def decode_y_number_real_pos_exponent_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_real_pos_exponent_json"}
+
+  def encode_y_number_real_pos_exponent_json(value) when is_list(value), do: value
+  def encode_y_number_real_pos_exponent_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_real_pos_exponent_json"}
+
+  def decode_y_number_simple_int_json(value) when is_list(value), do: value
+  def decode_y_number_simple_int_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_simple_int_json"}
+
+  def encode_y_number_simple_int_json(value) when is_list(value), do: value
+  def encode_y_number_simple_int_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_simple_int_json"}
+
+  def decode_y_number_simple_real_json(value) when is_list(value), do: value
+  def decode_y_number_simple_real_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_number_simple_real_json"}
+
+  def encode_y_number_simple_real_json(value) when is_list(value), do: value
+  def encode_y_number_simple_real_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_number_simple_real_json"}
+
+  def decode_y_string_1_2_3__bytes_utf_8__sequences_json(value) when is_list(value), do: value
+  def decode_y_string_1_2_3__bytes_utf_8__sequences_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_1_2_3__bytes_utf_8__sequences_json"}
+
+  def encode_y_string_1_2_3__bytes_utf_8__sequences_json(value) when is_list(value), do: value
+  def encode_y_string_1_2_3__bytes_utf_8__sequences_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_1_2_3__bytes_utf_8__sequences_json"}
+
+  def decode_y_string_accepted_surrogate_pair_json(value) when is_list(value), do: value
+  def decode_y_string_accepted_surrogate_pair_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_accepted_surrogate_pair_json"}
+
+  def encode_y_string_accepted_surrogate_pair_json(value) when is_list(value), do: value
+  def encode_y_string_accepted_surrogate_pair_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_accepted_surrogate_pair_json"}
+
+  def decode_y_string_accepted_surrogate_pairs_json(value) when is_list(value), do: value
+  def decode_y_string_accepted_surrogate_pairs_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_accepted_surrogate_pairs_json"}
+
+  def encode_y_string_accepted_surrogate_pairs_json(value) when is_list(value), do: value
+  def encode_y_string_accepted_surrogate_pairs_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_accepted_surrogate_pairs_json"}
+
+  def decode_y_string_allowed_escapes_json(value) when is_list(value), do: value
+  def decode_y_string_allowed_escapes_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_allowed_escapes_json"}
+
+  def encode_y_string_allowed_escapes_json(value) when is_list(value), do: value
+  def encode_y_string_allowed_escapes_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_allowed_escapes_json"}
+
+  def decode_y_string_backslash_and_u_escaped_zero_json(value) when is_list(value), do: value
+  def decode_y_string_backslash_and_u_escaped_zero_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_backslash_and_u_escaped_zero_json"}
+
+  def encode_y_string_backslash_and_u_escaped_zero_json(value) when is_list(value), do: value
+  def encode_y_string_backslash_and_u_escaped_zero_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_backslash_and_u_escaped_zero_json"}
+
+  def decode_y_string_backslash_doublequotes_json(value) when is_list(value), do: value
+  def decode_y_string_backslash_doublequotes_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_backslash_doublequotes_json"}
+
+  def encode_y_string_backslash_doublequotes_json(value) when is_list(value), do: value
+  def encode_y_string_backslash_doublequotes_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_backslash_doublequotes_json"}
+
+  def decode_y_string_comments_json(value) when is_list(value), do: value
+  def decode_y_string_comments_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_comments_json"}
+
+  def encode_y_string_comments_json(value) when is_list(value), do: value
+  def encode_y_string_comments_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_comments_json"}
+
+  def decode_y_string_double_escape_a_json(value) when is_list(value), do: value
+  def decode_y_string_double_escape_a_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_double_escape_a_json"}
+
+  def encode_y_string_double_escape_a_json(value) when is_list(value), do: value
+  def encode_y_string_double_escape_a_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_double_escape_a_json"}
+
+  def decode_y_string_double_escape_n_json(value) when is_list(value), do: value
+  def decode_y_string_double_escape_n_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_double_escape_n_json"}
+
+  def encode_y_string_double_escape_n_json(value) when is_list(value), do: value
+  def encode_y_string_double_escape_n_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_double_escape_n_json"}
+
+  def decode_y_string_escaped_control_character_json(value) when is_list(value), do: value
+  def decode_y_string_escaped_control_character_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_escaped_control_character_json"}
+
+  def encode_y_string_escaped_control_character_json(value) when is_list(value), do: value
+  def encode_y_string_escaped_control_character_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_escaped_control_character_json"}
+
+  def decode_y_string_escaped_noncharacter_json(value) when is_list(value), do: value
+  def decode_y_string_escaped_noncharacter_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_escaped_noncharacter_json"}
+
+  def encode_y_string_escaped_noncharacter_json(value) when is_list(value), do: value
+  def encode_y_string_escaped_noncharacter_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_escaped_noncharacter_json"}
+
+  def decode_y_string_in_array_json(value) when is_list(value), do: value
+  def decode_y_string_in_array_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_in_array_json"}
+
+  def encode_y_string_in_array_json(value) when is_list(value), do: value
+  def encode_y_string_in_array_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_in_array_json"}
+
+  def decode_y_string_in_array_with_leading_space_json(value) when is_list(value), do: value
+  def decode_y_string_in_array_with_leading_space_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_in_array_with_leading_space_json"}
+
+  def encode_y_string_in_array_with_leading_space_json(value) when is_list(value), do: value
+  def encode_y_string_in_array_with_leading_space_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_in_array_with_leading_space_json"}
+
+  def decode_y_string_last_surrogates_1__and_2_json(value) when is_list(value), do: value
+  def decode_y_string_last_surrogates_1__and_2_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_last_surrogates_1__and_2_json"}
+
+  def encode_y_string_last_surrogates_1__and_2_json(value) when is_list(value), do: value
+  def encode_y_string_last_surrogates_1__and_2_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_last_surrogates_1__and_2_json"}
+
+  def decode_y_string_nbsp_uescaped_json(value) when is_list(value), do: value
+  def decode_y_string_nbsp_uescaped_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_nbsp_uescaped_json"}
+
+  def encode_y_string_nbsp_uescaped_json(value) when is_list(value), do: value
+  def encode_y_string_nbsp_uescaped_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_nbsp_uescaped_json"}
+
+  def decode_y_string_non_character_in_utf_8__u_10_ffff_json(value) when is_list(value), do: value
+  def decode_y_string_non_character_in_utf_8__u_10_ffff_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_non_character_in_utf_8__u_10_ffff_json"}
+
+  def encode_y_string_non_character_in_utf_8__u_10_ffff_json(value) when is_list(value), do: value
+  def encode_y_string_non_character_in_utf_8__u_10_ffff_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_non_character_in_utf_8__u_10_ffff_json"}
+
+  def decode_y_string_non_character_in_utf_8__u_1_ffff_json(value) when is_list(value), do: value
+  def decode_y_string_non_character_in_utf_8__u_1_ffff_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_non_character_in_utf_8__u_1_ffff_json"}
+
+  def encode_y_string_non_character_in_utf_8__u_1_ffff_json(value) when is_list(value), do: value
+  def encode_y_string_non_character_in_utf_8__u_1_ffff_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_non_character_in_utf_8__u_1_ffff_json"}
+
+  def decode_y_string_non_character_in_utf_8__u_ffff_json(value) when is_list(value), do: value
+  def decode_y_string_non_character_in_utf_8__u_ffff_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_non_character_in_utf_8__u_ffff_json"}
+
+  def encode_y_string_non_character_in_utf_8__u_ffff_json(value) when is_list(value), do: value
+  def encode_y_string_non_character_in_utf_8__u_ffff_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_non_character_in_utf_8__u_ffff_json"}
+
+  def decode_y_string_null_escape_json(value) when is_list(value), do: value
+  def decode_y_string_null_escape_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_null_escape_json"}
+
+  def encode_y_string_null_escape_json(value) when is_list(value), do: value
+  def encode_y_string_null_escape_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_null_escape_json"}
+
+  def decode_y_string_one_byte_utf_8_json(value) when is_list(value), do: value
+  def decode_y_string_one_byte_utf_8_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_one_byte_utf_8_json"}
+
+  def encode_y_string_one_byte_utf_8_json(value) when is_list(value), do: value
+  def encode_y_string_one_byte_utf_8_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_one_byte_utf_8_json"}
+
+  def decode_y_string_pi_json(value) when is_list(value), do: value
+  def decode_y_string_pi_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_pi_json"}
+
+  def encode_y_string_pi_json(value) when is_list(value), do: value
+  def encode_y_string_pi_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_pi_json"}
+
+  def decode_y_string_simple_ascii_json(value) when is_list(value), do: value
+  def decode_y_string_simple_ascii_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_simple_ascii_json"}
+
+  def encode_y_string_simple_ascii_json(value) when is_list(value), do: value
+  def encode_y_string_simple_ascii_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_simple_ascii_json"}
+
+  def decode_y_string_space_json(value) when is_binary(value), do: value
+  def decode_y_string_space_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_space_json"}
+
+  def encode_y_string_space_json(value) when is_binary(value), do: value
+  def encode_y_string_space_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_space_json"}
+
+  def decode_y_string_surrogates_u_1_d11_e_musical_symbol_g_clef_json(value) when is_list(value), do: value
+  def decode_y_string_surrogates_u_1_d11_e_musical_symbol_g_clef_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_surrogates_u_1_d11_e_musical_symbol_g_clef_json"}
+
+  def encode_y_string_surrogates_u_1_d11_e_musical_symbol_g_clef_json(value) when is_list(value), do: value
+  def encode_y_string_surrogates_u_1_d11_e_musical_symbol_g_clef_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_surrogates_u_1_d11_e_musical_symbol_g_clef_json"}
+
+  def decode_y_string_three_byte_utf_8_json(value) when is_list(value), do: value
+  def decode_y_string_three_byte_utf_8_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_three_byte_utf_8_json"}
+
+  def encode_y_string_three_byte_utf_8_json(value) when is_list(value), do: value
+  def encode_y_string_three_byte_utf_8_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_three_byte_utf_8_json"}
+
+  def decode_y_string_two_byte_utf_8_json(value) when is_list(value), do: value
+  def decode_y_string_two_byte_utf_8_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_two_byte_utf_8_json"}
+
+  def encode_y_string_two_byte_utf_8_json(value) when is_list(value), do: value
+  def encode_y_string_two_byte_utf_8_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_two_byte_utf_8_json"}
+
+  def decode_y_string_u_2028__line_sep_json(value) when is_list(value), do: value
+  def decode_y_string_u_2028__line_sep_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_u_2028__line_sep_json"}
+
+  def encode_y_string_u_2028__line_sep_json(value) when is_list(value), do: value
+  def encode_y_string_u_2028__line_sep_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_u_2028__line_sep_json"}
+
+  def decode_y_string_u_2029__par_sep_json(value) when is_list(value), do: value
+  def decode_y_string_u_2029__par_sep_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_u_2029__par_sep_json"}
+
+  def encode_y_string_u_2029__par_sep_json(value) when is_list(value), do: value
+  def encode_y_string_u_2029__par_sep_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_u_2029__par_sep_json"}
+
+  def decode_y_string_u_escape_json(value) when is_list(value), do: value
+  def decode_y_string_u_escape_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_u_escape_json"}
+
+  def encode_y_string_u_escape_json(value) when is_list(value), do: value
+  def encode_y_string_u_escape_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_u_escape_json"}
+
+  def decode_y_string_uescaped_newline_json(value) when is_list(value), do: value
+  def decode_y_string_uescaped_newline_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_uescaped_newline_json"}
+
+  def encode_y_string_uescaped_newline_json(value) when is_list(value), do: value
+  def encode_y_string_uescaped_newline_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_uescaped_newline_json"}
+
+  def decode_y_string_unescaped_char_delete_json(value) when is_list(value), do: value
+  def decode_y_string_unescaped_char_delete_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_unescaped_char_delete_json"}
+
+  def encode_y_string_unescaped_char_delete_json(value) when is_list(value), do: value
+  def encode_y_string_unescaped_char_delete_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_unescaped_char_delete_json"}
+
+  def decode_y_string_unicode_2_json(value) when is_list(value), do: value
+  def decode_y_string_unicode_2_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_unicode_2_json"}
+
+  def encode_y_string_unicode_2_json(value) when is_list(value), do: value
+  def encode_y_string_unicode_2_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_unicode_2_json"}
+
+  def decode_y_string_unicode_escaped_backslash_json(value) when is_list(value), do: value
+  def decode_y_string_unicode_escaped_backslash_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_unicode_escaped_backslash_json"}
+
+  def encode_y_string_unicode_escaped_backslash_json(value) when is_list(value), do: value
+  def encode_y_string_unicode_escaped_backslash_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_unicode_escaped_backslash_json"}
+
+  def decode_y_string_unicode_escaped_double_quote_json(value) when is_list(value), do: value
+  def decode_y_string_unicode_escaped_double_quote_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_unicode_escaped_double_quote_json"}
+
+  def encode_y_string_unicode_escaped_double_quote_json(value) when is_list(value), do: value
+  def encode_y_string_unicode_escaped_double_quote_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_unicode_escaped_double_quote_json"}
+
+  def decode_y_string_unicode_json(value) when is_list(value), do: value
+  def decode_y_string_unicode_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_unicode_json"}
+
+  def encode_y_string_unicode_json(value) when is_list(value), do: value
+  def encode_y_string_unicode_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_unicode_json"}
+
+  def decode_y_string_unicode_u_10_fffe_nonchar_json(value) when is_list(value), do: value
+  def decode_y_string_unicode_u_10_fffe_nonchar_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_unicode_u_10_fffe_nonchar_json"}
+
+  def encode_y_string_unicode_u_10_fffe_nonchar_json(value) when is_list(value), do: value
+  def encode_y_string_unicode_u_10_fffe_nonchar_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_unicode_u_10_fffe_nonchar_json"}
+
+  def decode_y_string_unicode_u_1_fffe_nonchar_json(value) when is_list(value), do: value
+  def decode_y_string_unicode_u_1_fffe_nonchar_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_unicode_u_1_fffe_nonchar_json"}
+
+  def encode_y_string_unicode_u_1_fffe_nonchar_json(value) when is_list(value), do: value
+  def encode_y_string_unicode_u_1_fffe_nonchar_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_unicode_u_1_fffe_nonchar_json"}
+
+  def decode_y_string_unicode_u_200_b_zero_width_space_json(value) when is_list(value), do: value
+  def decode_y_string_unicode_u_200_b_zero_width_space_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_unicode_u_200_b_zero_width_space_json"}
+
+  def encode_y_string_unicode_u_200_b_zero_width_space_json(value) when is_list(value), do: value
+  def encode_y_string_unicode_u_200_b_zero_width_space_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_unicode_u_200_b_zero_width_space_json"}
+
+  def decode_y_string_unicode_u_2064__invisible_plus_json(value) when is_list(value), do: value
+  def decode_y_string_unicode_u_2064__invisible_plus_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_unicode_u_2064__invisible_plus_json"}
+
+  def encode_y_string_unicode_u_2064__invisible_plus_json(value) when is_list(value), do: value
+  def encode_y_string_unicode_u_2064__invisible_plus_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_unicode_u_2064__invisible_plus_json"}
+
+  def decode_y_string_unicode_u_fdd0_nonchar_json(value) when is_list(value), do: value
+  def decode_y_string_unicode_u_fdd0_nonchar_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_unicode_u_fdd0_nonchar_json"}
+
+  def encode_y_string_unicode_u_fdd0_nonchar_json(value) when is_list(value), do: value
+  def encode_y_string_unicode_u_fdd0_nonchar_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_unicode_u_fdd0_nonchar_json"}
+
+  def decode_y_string_unicode_u_fffe_nonchar_json(value) when is_list(value), do: value
+  def decode_y_string_unicode_u_fffe_nonchar_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_unicode_u_fffe_nonchar_json"}
+
+  def encode_y_string_unicode_u_fffe_nonchar_json(value) when is_list(value), do: value
+  def encode_y_string_unicode_u_fffe_nonchar_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_unicode_u_fffe_nonchar_json"}
+
+  def decode_y_string_utf8_json(value) when is_list(value), do: value
+  def decode_y_string_utf8_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_utf8_json"}
+
+  def encode_y_string_utf8_json(value) when is_list(value), do: value
+  def encode_y_string_utf8_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_utf8_json"}
+
+  def decode_y_string_with_del_character_json(value) when is_list(value), do: value
+  def decode_y_string_with_del_character_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_string_with_del_character_json"}
+
+  def encode_y_string_with_del_character_json(value) when is_list(value), do: value
+  def encode_y_string_with_del_character_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_string_with_del_character_json"}
+
+  def decode_y_structure_lonely_false_json(value) when is_boolean(value), do: value
+  def decode_y_structure_lonely_false_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_structure_lonely_false_json"}
+
+  def encode_y_structure_lonely_false_json(value) when is_boolean(value), do: value
+  def encode_y_structure_lonely_false_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_structure_lonely_false_json"}
+
+  def decode_y_structure_lonely_int_json(value) when is_integer(value), do: value
+  def decode_y_structure_lonely_int_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_structure_lonely_int_json"}
+
+  def encode_y_structure_lonely_int_json(value) when is_integer(value), do: value
+  def encode_y_structure_lonely_int_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_structure_lonely_int_json"}
+
+  def decode_y_structure_lonely_negative_real_json(value) when is_float(value), do: value
+  def decode_y_structure_lonely_negative_real_json(value) when is_integer(value), do: value
+  def decode_y_structure_lonely_negative_real_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_structure_lonely_negative_real_json"}
+
+  def encode_y_structure_lonely_negative_real_json(value) when is_float(value), do: value
+  def encode_y_structure_lonely_negative_real_json(value) when is_integer(value), do: value
+  def encode_y_structure_lonely_negative_real_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_structure_lonely_negative_real_json"}
+
+  def decode_y_structure_lonely_null_json(value) when is_nil(value), do: value
+  def decode_y_structure_lonely_null_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_structure_lonely_null_json"}
+
+  def encode_y_structure_lonely_null_json(value) when is_nil(value), do: value
+  def encode_y_structure_lonely_null_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_structure_lonely_null_json"}
+
+  def decode_y_structure_lonely_string_json(value) when is_binary(value), do: value
+  def decode_y_structure_lonely_string_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_structure_lonely_string_json"}
+
+  def encode_y_structure_lonely_string_json(value) when is_binary(value), do: value
+  def encode_y_structure_lonely_string_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_structure_lonely_string_json"}
+
+  def decode_y_structure_lonely_true_json(value) when is_boolean(value), do: value
+  def decode_y_structure_lonely_true_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_structure_lonely_true_json"}
+
+  def encode_y_structure_lonely_true_json(value) when is_boolean(value), do: value
+  def encode_y_structure_lonely_true_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_structure_lonely_true_json"}
+
+  def decode_y_structure_string_empty_json(value) when is_binary(value), do: value
+  def decode_y_structure_string_empty_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_structure_string_empty_json"}
+
+  def encode_y_structure_string_empty_json(value) when is_binary(value), do: value
+  def encode_y_structure_string_empty_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_structure_string_empty_json"}
+
+  def decode_y_structure_trailing_newline_json(value) when is_list(value), do: value
+  def decode_y_structure_trailing_newline_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_structure_trailing_newline_json"}
+
+  def encode_y_structure_trailing_newline_json(value) when is_list(value), do: value
+  def encode_y_structure_trailing_newline_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_structure_trailing_newline_json"}
+
+  def decode_y_structure_true_in_array_json(value) when is_list(value), do: value
+  def decode_y_structure_true_in_array_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_structure_true_in_array_json"}
+
+  def encode_y_structure_true_in_array_json(value) when is_list(value), do: value
+  def encode_y_structure_true_in_array_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_structure_true_in_array_json"}
+
+  def decode_y_structure_whitespace_array_json(value) when is_list(value), do: value
+  def decode_y_structure_whitespace_array_json(_), do: {:error, "Unexpected type when decoding TopLevel.y_structure_whitespace_array_json"}
+
+  def encode_y_structure_whitespace_array_json(value) when is_list(value), do: value
+  def encode_y_structure_whitespace_array_json(_), do: {:error, "Unexpected type when encoding TopLevel.y_structure_whitespace_array_json"}
+
   def from_map(m) do
     %TopLevel{
-      y_array_arrays_with_spaces_json: m["y_array_arraysWithSpaces.json"],
-      y_array_empty_json: m["y_array_empty.json"],
-      y_array_empty_string_json: m["y_array_empty-string.json"],
-      y_array_ending_with_newline_json: m["y_array_ending_with_newline.json"],
-      y_array_false_json: m["y_array_false.json"],
+      y_array_arrays_with_spaces_json: decode_y_array_arrays_with_spaces_json(m["y_array_arraysWithSpaces.json"]),
+      y_array_empty_json: decode_y_array_empty_json(m["y_array_empty.json"]),
+      y_array_empty_string_json: decode_y_array_empty_string_json(m["y_array_empty-string.json"]),
+      y_array_ending_with_newline_json: decode_y_array_ending_with_newline_json(m["y_array_ending_with_newline.json"]),
+      y_array_false_json: decode_y_array_false_json(m["y_array_false.json"]),
       y_array_heterogeneous_json: Enum.map(m["y_array_heterogeneous.json"], &decode_y_array_heterogeneous_json_element/1),
-      y_array_null_json: m["y_array_null.json"],
-      y_array_with_1__and_newline_json: m["y_array_with_1_and_newline.json"],
-      y_array_with_leading_space_json: m["y_array_with_leading_space.json"],
+      y_array_null_json: decode_y_array_null_json(m["y_array_null.json"]),
+      y_array_with_1__and_newline_json: decode_y_array_with_1__and_newline_json(m["y_array_with_1_and_newline.json"]),
+      y_array_with_leading_space_json: decode_y_array_with_leading_space_json(m["y_array_with_leading_space.json"]),
       y_array_with_several_null_json: Enum.map(m["y_array_with_several_null.json"], &decode_y_array_with_several_null_json_element/1),
-      y_array_with_trailing_space_json: m["y_array_with_trailing_space.json"],
-      y_number_0_e1_json: m["y_number_0e1.json"],
-      y_number_0_e_1_json: m["y_number_0e+1.json"],
-      y_number_after_space_json: m["y_number_after_space.json"],
-      y_number_double_close_to_zero_json: m["y_number_double_close_to_zero.json"],
-      y_number_int_with_exp_json: m["y_number_int_with_exp.json"],
-      y_number_json: m["y_number.json"],
-      y_number_minus_zero_json: m["y_number_minus_zero.json"],
-      y_number_negative_int_json: m["y_number_negative_int.json"],
-      y_number_negative_one_json: m["y_number_negative_one.json"],
-      y_number_negative_zero_json: m["y_number_negative_zero.json"],
-      y_number_real_capital_e_json: m["y_number_real_capital_e.json"],
-      y_number_real_capital_e_neg_exp_json: m["y_number_real_capital_e_neg_exp.json"],
-      y_number_real_capital_e_pos_exp_json: m["y_number_real_capital_e_pos_exp.json"],
-      y_number_real_exponent_json: m["y_number_real_exponent.json"],
-      y_number_real_fraction_exponent_json: m["y_number_real_fraction_exponent.json"],
-      y_number_real_neg_exp_json: m["y_number_real_neg_exp.json"],
-      y_number_real_pos_exponent_json: m["y_number_real_pos_exponent.json"],
-      y_number_simple_int_json: m["y_number_simple_int.json"],
-      y_number_simple_real_json: m["y_number_simple_real.json"],
+      y_array_with_trailing_space_json: decode_y_array_with_trailing_space_json(m["y_array_with_trailing_space.json"]),
+      y_number_0_e1_json: decode_y_number_0_e1_json(m["y_number_0e1.json"]),
+      y_number_0_e_1_json: decode_y_number_0_e_1_json(m["y_number_0e+1.json"]),
+      y_number_after_space_json: decode_y_number_after_space_json(m["y_number_after_space.json"]),
+      y_number_double_close_to_zero_json: decode_y_number_double_close_to_zero_json(m["y_number_double_close_to_zero.json"]),
+      y_number_int_with_exp_json: decode_y_number_int_with_exp_json(m["y_number_int_with_exp.json"]),
+      y_number_json: decode_y_number_json(m["y_number.json"]),
+      y_number_minus_zero_json: decode_y_number_minus_zero_json(m["y_number_minus_zero.json"]),
+      y_number_negative_int_json: decode_y_number_negative_int_json(m["y_number_negative_int.json"]),
+      y_number_negative_one_json: decode_y_number_negative_one_json(m["y_number_negative_one.json"]),
+      y_number_negative_zero_json: decode_y_number_negative_zero_json(m["y_number_negative_zero.json"]),
+      y_number_real_capital_e_json: decode_y_number_real_capital_e_json(m["y_number_real_capital_e.json"]),
+      y_number_real_capital_e_neg_exp_json: decode_y_number_real_capital_e_neg_exp_json(m["y_number_real_capital_e_neg_exp.json"]),
+      y_number_real_capital_e_pos_exp_json: decode_y_number_real_capital_e_pos_exp_json(m["y_number_real_capital_e_pos_exp.json"]),
+      y_number_real_exponent_json: decode_y_number_real_exponent_json(m["y_number_real_exponent.json"]),
+      y_number_real_fraction_exponent_json: decode_y_number_real_fraction_exponent_json(m["y_number_real_fraction_exponent.json"]),
+      y_number_real_neg_exp_json: decode_y_number_real_neg_exp_json(m["y_number_real_neg_exp.json"]),
+      y_number_real_pos_exponent_json: decode_y_number_real_pos_exponent_json(m["y_number_real_pos_exponent.json"]),
+      y_number_simple_int_json: decode_y_number_simple_int_json(m["y_number_simple_int.json"]),
+      y_number_simple_real_json: decode_y_number_simple_real_json(m["y_number_simple_real.json"]),
       y_object_basic_json: YObjectBasicJSON.from_map(m["y_object_basic.json"]),
       y_object_empty_json: JSON.from_map(m["y_object_empty.json"]),
       y_object_empty_key_json: YObjectEmptyKeyJSON.from_map(m["y_object_empty_key.json"]),
@@ -535,59 +1117,59 @@ defmodule TopLevel do
       y_object_simple_json: YObjectSimpleJSON.from_map(m["y_object_simple.json"]),
       y_object_string_unicode_json: YObjectStringUnicodeJSON.from_map(m["y_object_string_unicode.json"]),
       y_object_with_newlines_json: YObjectWithNewlinesJSON.from_map(m["y_object_with_newlines.json"]),
-      y_string_1_2_3__bytes_utf_8__sequences_json: m["y_string_1_2_3_bytes_UTF-8_sequences.json"],
-      y_string_accepted_surrogate_pair_json: m["y_string_accepted_surrogate_pair.json"],
-      y_string_accepted_surrogate_pairs_json: m["y_string_accepted_surrogate_pairs.json"],
-      y_string_allowed_escapes_json: m["y_string_allowed_escapes.json"],
-      y_string_backslash_and_u_escaped_zero_json: m["y_string_backslash_and_u_escaped_zero.json"],
-      y_string_backslash_doublequotes_json: m["y_string_backslash_doublequotes.json"],
-      y_string_comments_json: m["y_string_comments.json"],
-      y_string_double_escape_a_json: m["y_string_double_escape_a.json"],
-      y_string_double_escape_n_json: m["y_string_double_escape_n.json"],
-      y_string_escaped_control_character_json: m["y_string_escaped_control_character.json"],
-      y_string_escaped_noncharacter_json: m["y_string_escaped_noncharacter.json"],
-      y_string_in_array_json: m["y_string_in_array.json"],
-      y_string_in_array_with_leading_space_json: m["y_string_in_array_with_leading_space.json"],
-      y_string_last_surrogates_1__and_2_json: m["y_string_last_surrogates_1_and_2.json"],
-      y_string_nbsp_uescaped_json: m["y_string_nbsp_uescaped.json"],
-      y_string_non_character_in_utf_8__u_10_ffff_json: m["y_string_nonCharacterInUTF-8_U+10FFFF.json"],
-      y_string_non_character_in_utf_8__u_1_ffff_json: m["y_string_nonCharacterInUTF-8_U+1FFFF.json"],
-      y_string_non_character_in_utf_8__u_ffff_json: m["y_string_nonCharacterInUTF-8_U+FFFF.json"],
-      y_string_null_escape_json: m["y_string_null_escape.json"],
-      y_string_one_byte_utf_8_json: m["y_string_one-byte-utf-8.json"],
-      y_string_pi_json: m["y_string_pi.json"],
-      y_string_simple_ascii_json: m["y_string_simple_ascii.json"],
-      y_string_space_json: m["y_string_space.json"],
-      y_string_surrogates_u_1_d11_e_musical_symbol_g_clef_json: m["y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json"],
-      y_string_three_byte_utf_8_json: m["y_string_three-byte-utf-8.json"],
-      y_string_two_byte_utf_8_json: m["y_string_two-byte-utf-8.json"],
-      y_string_u_2028__line_sep_json: m["y_string_u+2028_line_sep.json"],
-      y_string_u_2029__par_sep_json: m["y_string_u+2029_par_sep.json"],
-      y_string_u_escape_json: m["y_string_uEscape.json"],
-      y_string_uescaped_newline_json: m["y_string_uescaped_newline.json"],
-      y_string_unescaped_char_delete_json: m["y_string_unescaped_char_delete.json"],
-      y_string_unicode_2_json: m["y_string_unicode_2.json"],
-      y_string_unicode_escaped_backslash_json: m["y_string_unicodeEscapedBackslash.json"],
-      y_string_unicode_escaped_double_quote_json: m["y_string_unicode_escaped_double_quote.json"],
-      y_string_unicode_json: m["y_string_unicode.json"],
-      y_string_unicode_u_10_fffe_nonchar_json: m["y_string_unicode_U+10FFFE_nonchar.json"],
-      y_string_unicode_u_1_fffe_nonchar_json: m["y_string_unicode_U+1FFFE_nonchar.json"],
-      y_string_unicode_u_200_b_zero_width_space_json: m["y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json"],
-      y_string_unicode_u_2064__invisible_plus_json: m["y_string_unicode_U+2064_invisible_plus.json"],
-      y_string_unicode_u_fdd0_nonchar_json: m["y_string_unicode_U+FDD0_nonchar.json"],
-      y_string_unicode_u_fffe_nonchar_json: m["y_string_unicode_U+FFFE_nonchar.json"],
-      y_string_utf8_json: m["y_string_utf8.json"],
-      y_string_with_del_character_json: m["y_string_with_del_character.json"],
-      y_structure_lonely_false_json: m["y_structure_lonely_false.json"],
-      y_structure_lonely_int_json: m["y_structure_lonely_int.json"],
-      y_structure_lonely_negative_real_json: m["y_structure_lonely_negative_real.json"],
-      y_structure_lonely_null_json: m["y_structure_lonely_null.json"],
-      y_structure_lonely_string_json: m["y_structure_lonely_string.json"],
-      y_structure_lonely_true_json: m["y_structure_lonely_true.json"],
-      y_structure_string_empty_json: m["y_structure_string_empty.json"],
-      y_structure_trailing_newline_json: m["y_structure_trailing_newline.json"],
-      y_structure_true_in_array_json: m["y_structure_true_in_array.json"],
-      y_structure_whitespace_array_json: m["y_structure_whitespace_array.json"],
+      y_string_1_2_3__bytes_utf_8__sequences_json: decode_y_string_1_2_3__bytes_utf_8__sequences_json(m["y_string_1_2_3_bytes_UTF-8_sequences.json"]),
+      y_string_accepted_surrogate_pair_json: decode_y_string_accepted_surrogate_pair_json(m["y_string_accepted_surrogate_pair.json"]),
+      y_string_accepted_surrogate_pairs_json: decode_y_string_accepted_surrogate_pairs_json(m["y_string_accepted_surrogate_pairs.json"]),
+      y_string_allowed_escapes_json: decode_y_string_allowed_escapes_json(m["y_string_allowed_escapes.json"]),
+      y_string_backslash_and_u_escaped_zero_json: decode_y_string_backslash_and_u_escaped_zero_json(m["y_string_backslash_and_u_escaped_zero.json"]),
+      y_string_backslash_doublequotes_json: decode_y_string_backslash_doublequotes_json(m["y_string_backslash_doublequotes.json"]),
+      y_string_comments_json: decode_y_string_comments_json(m["y_string_comments.json"]),
+      y_string_double_escape_a_json: decode_y_string_double_escape_a_json(m["y_string_double_escape_a.json"]),
+      y_string_double_escape_n_json: decode_y_string_double_escape_n_json(m["y_string_double_escape_n.json"]),
+      y_string_escaped_control_character_json: decode_y_string_escaped_control_character_json(m["y_string_escaped_control_character.json"]),
+      y_string_escaped_noncharacter_json: decode_y_string_escaped_noncharacter_json(m["y_string_escaped_noncharacter.json"]),
+      y_string_in_array_json: decode_y_string_in_array_json(m["y_string_in_array.json"]),
+      y_string_in_array_with_leading_space_json: decode_y_string_in_array_with_leading_space_json(m["y_string_in_array_with_leading_space.json"]),
+      y_string_last_surrogates_1__and_2_json: decode_y_string_last_surrogates_1__and_2_json(m["y_string_last_surrogates_1_and_2.json"]),
+      y_string_nbsp_uescaped_json: decode_y_string_nbsp_uescaped_json(m["y_string_nbsp_uescaped.json"]),
+      y_string_non_character_in_utf_8__u_10_ffff_json: decode_y_string_non_character_in_utf_8__u_10_ffff_json(m["y_string_nonCharacterInUTF-8_U+10FFFF.json"]),
+      y_string_non_character_in_utf_8__u_1_ffff_json: decode_y_string_non_character_in_utf_8__u_1_ffff_json(m["y_string_nonCharacterInUTF-8_U+1FFFF.json"]),
+      y_string_non_character_in_utf_8__u_ffff_json: decode_y_string_non_character_in_utf_8__u_ffff_json(m["y_string_nonCharacterInUTF-8_U+FFFF.json"]),
+      y_string_null_escape_json: decode_y_string_null_escape_json(m["y_string_null_escape.json"]),
+      y_string_one_byte_utf_8_json: decode_y_string_one_byte_utf_8_json(m["y_string_one-byte-utf-8.json"]),
+      y_string_pi_json: decode_y_string_pi_json(m["y_string_pi.json"]),
+      y_string_simple_ascii_json: decode_y_string_simple_ascii_json(m["y_string_simple_ascii.json"]),
+      y_string_space_json: decode_y_string_space_json(m["y_string_space.json"]),
+      y_string_surrogates_u_1_d11_e_musical_symbol_g_clef_json: decode_y_string_surrogates_u_1_d11_e_musical_symbol_g_clef_json(m["y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json"]),
+      y_string_three_byte_utf_8_json: decode_y_string_three_byte_utf_8_json(m["y_string_three-byte-utf-8.json"]),
+      y_string_two_byte_utf_8_json: decode_y_string_two_byte_utf_8_json(m["y_string_two-byte-utf-8.json"]),
+      y_string_u_2028__line_sep_json: decode_y_string_u_2028__line_sep_json(m["y_string_u+2028_line_sep.json"]),
+      y_string_u_2029__par_sep_json: decode_y_string_u_2029__par_sep_json(m["y_string_u+2029_par_sep.json"]),
+      y_string_u_escape_json: decode_y_string_u_escape_json(m["y_string_uEscape.json"]),
+      y_string_uescaped_newline_json: decode_y_string_uescaped_newline_json(m["y_string_uescaped_newline.json"]),
+      y_string_unescaped_char_delete_json: decode_y_string_unescaped_char_delete_json(m["y_string_unescaped_char_delete.json"]),
+      y_string_unicode_2_json: decode_y_string_unicode_2_json(m["y_string_unicode_2.json"]),
+      y_string_unicode_escaped_backslash_json: decode_y_string_unicode_escaped_backslash_json(m["y_string_unicodeEscapedBackslash.json"]),
+      y_string_unicode_escaped_double_quote_json: decode_y_string_unicode_escaped_double_quote_json(m["y_string_unicode_escaped_double_quote.json"]),
+      y_string_unicode_json: decode_y_string_unicode_json(m["y_string_unicode.json"]),
+      y_string_unicode_u_10_fffe_nonchar_json: decode_y_string_unicode_u_10_fffe_nonchar_json(m["y_string_unicode_U+10FFFE_nonchar.json"]),
+      y_string_unicode_u_1_fffe_nonchar_json: decode_y_string_unicode_u_1_fffe_nonchar_json(m["y_string_unicode_U+1FFFE_nonchar.json"]),
+      y_string_unicode_u_200_b_zero_width_space_json: decode_y_string_unicode_u_200_b_zero_width_space_json(m["y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json"]),
+      y_string_unicode_u_2064__invisible_plus_json: decode_y_string_unicode_u_2064__invisible_plus_json(m["y_string_unicode_U+2064_invisible_plus.json"]),
+      y_string_unicode_u_fdd0_nonchar_json: decode_y_string_unicode_u_fdd0_nonchar_json(m["y_string_unicode_U+FDD0_nonchar.json"]),
+      y_string_unicode_u_fffe_nonchar_json: decode_y_string_unicode_u_fffe_nonchar_json(m["y_string_unicode_U+FFFE_nonchar.json"]),
+      y_string_utf8_json: decode_y_string_utf8_json(m["y_string_utf8.json"]),
+      y_string_with_del_character_json: decode_y_string_with_del_character_json(m["y_string_with_del_character.json"]),
+      y_structure_lonely_false_json: decode_y_structure_lonely_false_json(m["y_structure_lonely_false.json"]),
+      y_structure_lonely_int_json: decode_y_structure_lonely_int_json(m["y_structure_lonely_int.json"]),
+      y_structure_lonely_negative_real_json: decode_y_structure_lonely_negative_real_json(m["y_structure_lonely_negative_real.json"]),
+      y_structure_lonely_null_json: decode_y_structure_lonely_null_json(m["y_structure_lonely_null.json"]),
+      y_structure_lonely_string_json: decode_y_structure_lonely_string_json(m["y_structure_lonely_string.json"]),
+      y_structure_lonely_true_json: decode_y_structure_lonely_true_json(m["y_structure_lonely_true.json"]),
+      y_structure_string_empty_json: decode_y_structure_string_empty_json(m["y_structure_string_empty.json"]),
+      y_structure_trailing_newline_json: decode_y_structure_trailing_newline_json(m["y_structure_trailing_newline.json"]),
+      y_structure_true_in_array_json: decode_y_structure_true_in_array_json(m["y_structure_true_in_array.json"]),
+      y_structure_whitespace_array_json: decode_y_structure_whitespace_array_json(m["y_structure_whitespace_array.json"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/number-map.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/number-map.json/default/QuickType.ex
index 2850840..23ff7f7 100644
--- a/base/elixir/test/inputs/json/priority/number-map.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/number-map.json/default/QuickType.ex
@@ -13,9 +13,18 @@ defmodule TopLevel do
           foo: %{String.t() => float()}
         }
 
+  def decode_foo_value(value) when is_float(value), do: value
+  def decode_foo_value(value) when is_integer(value), do: value
+  def decode_foo_value(_), do: {:error, "Unexpected type when decoding TopLevel.foo"}
+
+  def encode_foo_value(value) when is_float(value), do: value
+  def encode_foo_value(value) when is_integer(value), do: value
+  def encode_foo_value(_), do: {:error, "Unexpected type when encoding TopLevel.foo"}
+
   def from_map(m) do
     %TopLevel{
-      foo: m["foo"],
+      foo: m["foo"]
+      |> Map.new(fn {key, value} -> {key, decode_foo_value(value)} end),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/omit-empty.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/omit-empty.json/default/QuickType.ex
index 7e91aa3..44c338e 100644
--- a/base/elixir/test/inputs/json/priority/omit-empty.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/omit-empty.json/default/QuickType.ex
@@ -14,9 +14,15 @@ defmodule Result do
           name: nil | nil
         }
 
+  def decode_age(value) when is_integer(value), do: value
+  def decode_age(_), do: {:error, "Unexpected type when decoding Result.age"}
+
+  def encode_age(value) when is_integer(value), do: value
+  def encode_age(_), do: {:error, "Unexpected type when encoding Result.age"}
+
   def from_map(m) do
     %Result{
-      age: m["age"],
+      age: decode_age(m["age"]),
       name: m["name"],
     }
   end
@@ -49,6 +55,12 @@ defmodule TopLevel do
           results: [Result.t()]
         }
 
+  def decode_results(value) when is_list(value), do: value
+  def decode_results(_), do: {:error, "Unexpected type when decoding TopLevel.results"}
+
+  def encode_results(value) when is_list(value), do: value
+  def encode_results(_), do: {:error, "Unexpected type when encoding TopLevel.results"}
+
   def from_map(m) do
     %TopLevel{
       results: Enum.map(m["results"], &Result.from_map/1),
diff --git a/base/elixir/test/inputs/json/priority/php-mixed-union.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/php-mixed-union.json/default/QuickType.ex
index dc0ce66..b3e1274 100644
--- a/base/elixir/test/inputs/json/priority/php-mixed-union.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/php-mixed-union.json/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule MixedClass do
           nested: String.t()
         }
 
+  def decode_nested(value) when is_binary(value), do: value
+  def decode_nested(_), do: {:error, "Unexpected type when decoding MixedClass.nested"}
+
+  def encode_nested(value) when is_binary(value), do: value
+  def encode_nested(_), do: {:error, "Unexpected type when encoding MixedClass.nested"}
+
   def from_map(m) do
     %MixedClass{
-      nested: m["nested"],
+      nested: decode_nested(m["nested"]),
     }
   end
 
@@ -46,6 +52,12 @@ defmodule TopLevel do
           mixed: [boolean() | MixedClass.t() | integer() | nil | String.t()]
         }
 
+  def decode_mixed(value) when is_list(value), do: value
+  def decode_mixed(_), do: {:error, "Unexpected type when decoding TopLevel.mixed"}
+
+  def encode_mixed(value) when is_list(value), do: value
+  def encode_mixed(_), do: {:error, "Unexpected type when encoding TopLevel.mixed"}
+
   def decode_mixed_element(%{"nested" => _,} = value), do: MixedClass.from_map(value)
   def decode_mixed_element(value) when is_boolean(value), do: value
   def decode_mixed_element(value) when is_integer(value), do: value
diff --git a/base/elixir/test/inputs/json/priority/php-validation.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/php-validation.json/default/QuickType.ex
index 8ff1f23..55b3dd3 100644
--- a/base/elixir/test/inputs/json/priority/php-validation.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/php-validation.json/default/QuickType.ex
@@ -17,13 +17,45 @@ defmodule TopLevel do
           string: String.t()
         }
 
+  def decode_boolean(value) when is_boolean(value), do: value
+  def decode_boolean(_), do: {:error, "Unexpected type when decoding TopLevel.boolean"}
+
+  def encode_boolean(value) when is_boolean(value), do: value
+  def encode_boolean(_), do: {:error, "Unexpected type when encoding TopLevel.boolean"}
+
+  def decode_integer(value) when is_integer(value), do: value
+  def decode_integer(_), do: {:error, "Unexpected type when decoding TopLevel.integer"}
+
+  def encode_integer(value) when is_integer(value), do: value
+  def encode_integer(_), do: {:error, "Unexpected type when encoding TopLevel.integer"}
+
+  def decode_integers(value) when is_list(value), do: value
+  def decode_integers(_), do: {:error, "Unexpected type when decoding TopLevel.integers"}
+
+  def encode_integers(value) when is_list(value), do: value
+  def encode_integers(_), do: {:error, "Unexpected type when encoding TopLevel.integers"}
+
+  def decode_number(value) when is_float(value), do: value
+  def decode_number(value) when is_integer(value), do: value
+  def decode_number(_), do: {:error, "Unexpected type when decoding TopLevel.number"}
+
+  def encode_number(value) when is_float(value), do: value
+  def encode_number(value) when is_integer(value), do: value
+  def encode_number(_), do: {:error, "Unexpected type when encoding TopLevel.number"}
+
+  def decode_string(value) when is_binary(value), do: value
+  def decode_string(_), do: {:error, "Unexpected type when decoding TopLevel.string"}
+
+  def encode_string(value) when is_binary(value), do: value
+  def encode_string(_), do: {:error, "Unexpected type when encoding TopLevel.string"}
+
   def from_map(m) do
     %TopLevel{
-      boolean: m["boolean"],
-      integer: m["integer"],
-      integers: m["integers"],
-      number: m["number"],
-      string: m["string"],
+      boolean: decode_boolean(m["boolean"]),
+      integer: decode_integer(m["integer"]),
+      integers: decode_integers(m["integers"]),
+      number: decode_number(m["number"]),
+      string: decode_string(m["string"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/recursive.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/recursive.json/default/QuickType.ex
index 18a95b1..21e26c8 100644
--- a/base/elixir/test/inputs/json/priority/recursive.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/recursive.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule LinkLink do
           url: String.t()
         }
 
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding LinkLink.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding LinkLink.type"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding LinkLink.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding LinkLink.url"}
+
   def from_map(m) do
     %LinkLink{
-      type: m["type"],
-      url: m["url"],
+      type: decode_type(m["type"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -82,9 +94,15 @@ defmodule CategoryThumbnail do
           url: String.t()
         }
 
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding CategoryThumbnail.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding CategoryThumbnail.url"}
+
   def from_map(m) do
     %CategoryThumbnail{
-      url: m["url"],
+      url: decode_url(m["url"]),
     }
   end
 
@@ -122,15 +140,57 @@ defmodule Category do
           thumbnail: CategoryThumbnail.t()
         }
 
+  def decode_concatenatecategoryname(value) when is_boolean(value), do: value
+  def decode_concatenatecategoryname(_), do: {:error, "Unexpected type when decoding Category.concatenatecategoryname"}
+
+  def encode_concatenatecategoryname(value) when is_boolean(value), do: value
+  def encode_concatenatecategoryname(_), do: {:error, "Unexpected type when encoding Category.concatenatecategoryname"}
+
+  def decode_hasoffer(value) when is_boolean(value), do: value
+  def decode_hasoffer(_), do: {:error, "Unexpected type when decoding Category.hasoffer"}
+
+  def encode_hasoffer(value) when is_boolean(value), do: value
+  def encode_hasoffer(_), do: {:error, "Unexpected type when encoding Category.hasoffer"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Category.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Category.id"}
+
+  def decode_isfinal(value) when is_boolean(value), do: value
+  def decode_isfinal(_), do: {:error, "Unexpected type when decoding Category.isfinal"}
+
+  def encode_isfinal(value) when is_boolean(value), do: value
+  def encode_isfinal(_), do: {:error, "Unexpected type when encoding Category.isfinal"}
+
+  def decode_links(value) when is_list(value), do: value
+  def decode_links(_), do: {:error, "Unexpected type when decoding Category.links"}
+
+  def encode_links(value) when is_list(value), do: value
+  def encode_links(_), do: {:error, "Unexpected type when encoding Category.links"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Category.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Category.name"}
+
+  def decode_parentcategoryid(value) when is_integer(value), do: value
+  def decode_parentcategoryid(_), do: {:error, "Unexpected type when decoding Category.parentcategoryid"}
+
+  def encode_parentcategoryid(value) when is_integer(value), do: value
+  def encode_parentcategoryid(_), do: {:error, "Unexpected type when encoding Category.parentcategoryid"}
+
   def from_map(m) do
     %Category{
-      concatenatecategoryname: m["concatenatecategoryname"],
-      hasoffer: m["hasoffer"],
-      id: m["id"],
-      isfinal: m["isfinal"],
+      concatenatecategoryname: decode_concatenatecategoryname(m["concatenatecategoryname"]),
+      hasoffer: decode_hasoffer(m["hasoffer"]),
+      id: decode_id(m["id"]),
+      isfinal: decode_isfinal(m["isfinal"]),
       links: Enum.map(m["links"], &LinkElement.from_map/1),
-      name: m["name"],
-      parentcategoryid: m["parentcategoryid"],
+      name: decode_name(m["name"]),
+      parentcategoryid: decode_parentcategoryid(m["parentcategoryid"]),
       thumbnail: CategoryThumbnail.from_map(m["thumbnail"]),
     }
   end
@@ -169,9 +229,15 @@ defmodule Eonandyear do
           lowestsetbit: integer()
         }
 
+  def decode_lowestsetbit(value) when is_integer(value), do: value
+  def decode_lowestsetbit(_), do: {:error, "Unexpected type when decoding Eonandyear.lowestsetbit"}
+
+  def encode_lowestsetbit(value) when is_integer(value), do: value
+  def encode_lowestsetbit(_), do: {:error, "Unexpected type when encoding Eonandyear.lowestsetbit"}
+
   def from_map(m) do
     %Eonandyear{
-      lowestsetbit: m["lowestsetbit"],
+      lowestsetbit: decode_lowestsetbit(m["lowestsetbit"]),
     }
   end
 
@@ -204,11 +270,29 @@ defmodule Xmlschematype do
           prefix: String.t()
         }
 
+  def decode_localpart(value) when is_binary(value), do: value
+  def decode_localpart(_), do: {:error, "Unexpected type when decoding Xmlschematype.localpart"}
+
+  def encode_localpart(value) when is_binary(value), do: value
+  def encode_localpart(_), do: {:error, "Unexpected type when encoding Xmlschematype.localpart"}
+
+  def decode_namespaceuri(value) when is_binary(value), do: value
+  def decode_namespaceuri(_), do: {:error, "Unexpected type when decoding Xmlschematype.namespaceuri"}
+
+  def encode_namespaceuri(value) when is_binary(value), do: value
+  def encode_namespaceuri(_), do: {:error, "Unexpected type when encoding Xmlschematype.namespaceuri"}
+
+  def decode_prefix(value) when is_binary(value), do: value
+  def decode_prefix(_), do: {:error, "Unexpected type when decoding Xmlschematype.prefix"}
+
+  def encode_prefix(value) when is_binary(value), do: value
+  def encode_prefix(_), do: {:error, "Unexpected type when encoding Xmlschematype.prefix"}
+
   def from_map(m) do
     %Xmlschematype{
-      localpart: m["localpart"],
-      namespaceuri: m["namespaceuri"],
-      prefix: m["prefix"],
+      localpart: decode_localpart(m["localpart"]),
+      namespaceuri: decode_namespaceuri(m["namespaceuri"]),
+      prefix: decode_prefix(m["prefix"]),
     }
   end
 
@@ -251,19 +335,73 @@ defmodule DateClass do
           year: integer()
         }
 
+  def decode_day(value) when is_integer(value), do: value
+  def decode_day(_), do: {:error, "Unexpected type when decoding DateClass.day"}
+
+  def encode_day(value) when is_integer(value), do: value
+  def encode_day(_), do: {:error, "Unexpected type when encoding DateClass.day"}
+
+  def decode_hour(value) when is_integer(value), do: value
+  def decode_hour(_), do: {:error, "Unexpected type when decoding DateClass.hour"}
+
+  def encode_hour(value) when is_integer(value), do: value
+  def encode_hour(_), do: {:error, "Unexpected type when encoding DateClass.hour"}
+
+  def decode_millisecond(value) when is_integer(value), do: value
+  def decode_millisecond(_), do: {:error, "Unexpected type when decoding DateClass.millisecond"}
+
+  def encode_millisecond(value) when is_integer(value), do: value
+  def encode_millisecond(_), do: {:error, "Unexpected type when encoding DateClass.millisecond"}
+
+  def decode_minute(value) when is_integer(value), do: value
+  def decode_minute(_), do: {:error, "Unexpected type when decoding DateClass.minute"}
+
+  def encode_minute(value) when is_integer(value), do: value
+  def encode_minute(_), do: {:error, "Unexpected type when encoding DateClass.minute"}
+
+  def decode_month(value) when is_integer(value), do: value
+  def decode_month(_), do: {:error, "Unexpected type when decoding DateClass.month"}
+
+  def encode_month(value) when is_integer(value), do: value
+  def encode_month(_), do: {:error, "Unexpected type when encoding DateClass.month"}
+
+  def decode_second(value) when is_integer(value), do: value
+  def decode_second(_), do: {:error, "Unexpected type when decoding DateClass.second"}
+
+  def encode_second(value) when is_integer(value), do: value
+  def encode_second(_), do: {:error, "Unexpected type when encoding DateClass.second"}
+
+  def decode_timezone(value) when is_integer(value), do: value
+  def decode_timezone(_), do: {:error, "Unexpected type when decoding DateClass.timezone"}
+
+  def encode_timezone(value) when is_integer(value), do: value
+  def encode_timezone(_), do: {:error, "Unexpected type when encoding DateClass.timezone"}
+
+  def decode_valid(value) when is_boolean(value), do: value
+  def decode_valid(_), do: {:error, "Unexpected type when decoding DateClass.valid"}
+
+  def encode_valid(value) when is_boolean(value), do: value
+  def encode_valid(_), do: {:error, "Unexpected type when encoding DateClass.valid"}
+
+  def decode_year(value) when is_integer(value), do: value
+  def decode_year(_), do: {:error, "Unexpected type when decoding DateClass.year"}
+
+  def encode_year(value) when is_integer(value), do: value
+  def encode_year(_), do: {:error, "Unexpected type when encoding DateClass.year"}
+
   def from_map(m) do
     %DateClass{
-      day: m["day"],
+      day: decode_day(m["day"]),
       eonandyear: Eonandyear.from_map(m["eonandyear"]),
-      hour: m["hour"],
-      millisecond: m["millisecond"],
-      minute: m["minute"],
-      month: m["month"],
-      second: m["second"],
-      timezone: m["timezone"],
-      valid: m["valid"],
+      hour: decode_hour(m["hour"]),
+      millisecond: decode_millisecond(m["millisecond"]),
+      minute: decode_minute(m["minute"]),
+      month: decode_month(m["month"]),
+      second: decode_second(m["second"]),
+      timezone: decode_timezone(m["timezone"]),
+      valid: decode_valid(m["valid"]),
       xmlschematype: Xmlschematype.from_map(m["xmlschematype"]),
-      year: m["year"],
+      year: decode_year(m["year"]),
     }
   end
 
@@ -310,15 +448,51 @@ defmodule Details do
           status: String.t()
         }
 
+  def decode_applicationid(value) when is_binary(value), do: value
+  def decode_applicationid(_), do: {:error, "Unexpected type when decoding Details.applicationid"}
+
+  def encode_applicationid(value) when is_binary(value), do: value
+  def encode_applicationid(_), do: {:error, "Unexpected type when encoding Details.applicationid"}
+
+  def decode_applicationversion(value) when is_binary(value), do: value
+  def decode_applicationversion(_), do: {:error, "Unexpected type when decoding Details.applicationversion"}
+
+  def encode_applicationversion(value) when is_binary(value), do: value
+  def encode_applicationversion(_), do: {:error, "Unexpected type when encoding Details.applicationversion"}
+
+  def decode_code(value) when is_integer(value), do: value
+  def decode_code(_), do: {:error, "Unexpected type when decoding Details.code"}
+
+  def encode_code(value) when is_integer(value), do: value
+  def encode_code(_), do: {:error, "Unexpected type when encoding Details.code"}
+
+  def decode_elapsedtime(value) when is_integer(value), do: value
+  def decode_elapsedtime(_), do: {:error, "Unexpected type when decoding Details.elapsedtime"}
+
+  def encode_elapsedtime(value) when is_integer(value), do: value
+  def encode_elapsedtime(_), do: {:error, "Unexpected type when encoding Details.elapsedtime"}
+
+  def decode_message(value) when is_binary(value), do: value
+  def decode_message(_), do: {:error, "Unexpected type when decoding Details.message"}
+
+  def encode_message(value) when is_binary(value), do: value
+  def encode_message(_), do: {:error, "Unexpected type when encoding Details.message"}
+
+  def decode_status(value) when is_binary(value), do: value
+  def decode_status(_), do: {:error, "Unexpected type when decoding Details.status"}
+
+  def encode_status(value) when is_binary(value), do: value
+  def encode_status(_), do: {:error, "Unexpected type when encoding Details.status"}
+
   def from_map(m) do
     %Details{
-      applicationid: m["applicationid"],
-      applicationversion: m["applicationversion"],
-      code: m["code"],
+      applicationid: decode_applicationid(m["applicationid"]),
+      applicationversion: decode_applicationversion(m["applicationversion"]),
+      code: decode_code(m["code"]),
       date: DateClass.from_map(m["date"]),
-      elapsedtime: m["elapsedtime"],
-      message: m["message"],
-      status: m["status"],
+      elapsedtime: decode_elapsedtime(m["elapsedtime"]),
+      message: decode_message(m["message"]),
+      status: decode_status(m["status"]),
     }
   end
 
@@ -355,9 +529,15 @@ defmodule Currency do
           abbreviation: String.t()
         }
 
+  def decode_abbreviation(value) when is_binary(value), do: value
+  def decode_abbreviation(_), do: {:error, "Unexpected type when decoding Currency.abbreviation"}
+
+  def encode_abbreviation(value) when is_binary(value), do: value
+  def encode_abbreviation(_), do: {:error, "Unexpected type when encoding Currency.abbreviation"}
+
   def from_map(m) do
     %Currency{
-      abbreviation: m["abbreviation"],
+      abbreviation: decode_abbreviation(m["abbreviation"]),
     }
   end
 
@@ -390,11 +570,29 @@ defmodule Useraveragerating do
           rating: String.t()
         }
 
+  def decode_links(value) when is_list(value), do: value
+  def decode_links(_), do: {:error, "Unexpected type when decoding Useraveragerating.links"}
+
+  def encode_links(value) when is_list(value), do: value
+  def encode_links(_), do: {:error, "Unexpected type when encoding Useraveragerating.links"}
+
+  def decode_numcomments(value) when is_integer(value), do: value
+  def decode_numcomments(_), do: {:error, "Unexpected type when decoding Useraveragerating.numcomments"}
+
+  def encode_numcomments(value) when is_integer(value), do: value
+  def encode_numcomments(_), do: {:error, "Unexpected type when encoding Useraveragerating.numcomments"}
+
+  def decode_rating(value) when is_binary(value), do: value
+  def decode_rating(_), do: {:error, "Unexpected type when decoding Useraveragerating.rating"}
+
+  def encode_rating(value) when is_binary(value), do: value
+  def encode_rating(_), do: {:error, "Unexpected type when encoding Useraveragerating.rating"}
+
   def from_map(m) do
     %Useraveragerating{
       links: Enum.map(m["links"], &LinkElement.from_map/1),
-      numcomments: m["numcomments"],
-      rating: m["rating"],
+      numcomments: decode_numcomments(m["numcomments"]),
+      rating: decode_rating(m["rating"]),
     }
   end
 
@@ -460,6 +658,12 @@ defmodule Specification do
           links: [LinkElement.t()]
         }
 
+  def decode_links(value) when is_list(value), do: value
+  def decode_links(_), do: {:error, "Unexpected type when decoding Specification.links"}
+
+  def encode_links(value) when is_list(value), do: value
+  def encode_links(_), do: {:error, "Unexpected type when encoding Specification.links"}
+
   def from_map(m) do
     %Specification{
       links: Enum.map(m["links"], &LinkElement.from_map/1),
@@ -529,12 +733,30 @@ defmodule FormatsClass do
           width: integer()
         }
 
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding FormatsClass.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding FormatsClass.height"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding FormatsClass.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding FormatsClass.url"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding FormatsClass.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding FormatsClass.width"}
+
   def from_map(m) do
     %FormatsClass{
       formats: m["formats"] && Enum.map(m["formats"], &Format.from_map/1),
-      height: m["height"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -583,24 +805,96 @@ defmodule ProductProduct do
           totalsellers: integer()
         }
 
+  def decode_categoryid(value) when is_integer(value), do: value
+  def decode_categoryid(_), do: {:error, "Unexpected type when decoding ProductProduct.categoryid"}
+
+  def encode_categoryid(value) when is_integer(value), do: value
+  def encode_categoryid(_), do: {:error, "Unexpected type when encoding ProductProduct.categoryid"}
+
+  def decode_eco(value) when is_boolean(value), do: value
+  def decode_eco(_), do: {:error, "Unexpected type when decoding ProductProduct.eco"}
+
+  def encode_eco(value) when is_boolean(value), do: value
+  def encode_eco(_), do: {:error, "Unexpected type when encoding ProductProduct.eco"}
+
+  def decode_fulldescription(value) when is_boolean(value), do: value
+  def decode_fulldescription(_), do: {:error, "Unexpected type when decoding ProductProduct.fulldescription"}
+
+  def encode_fulldescription(value) when is_boolean(value), do: value
+  def encode_fulldescription(_), do: {:error, "Unexpected type when encoding ProductProduct.fulldescription"}
+
+  def decode_hasmetasearch(value) when is_boolean(value), do: value
+  def decode_hasmetasearch(_), do: {:error, "Unexpected type when decoding ProductProduct.hasmetasearch"}
+
+  def encode_hasmetasearch(value) when is_boolean(value), do: value
+  def encode_hasmetasearch(_), do: {:error, "Unexpected type when encoding ProductProduct.hasmetasearch"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding ProductProduct.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding ProductProduct.id"}
+
+  def decode_links(value) when is_list(value), do: value
+  def decode_links(_), do: {:error, "Unexpected type when decoding ProductProduct.links"}
+
+  def encode_links(value) when is_list(value), do: value
+  def encode_links(_), do: {:error, "Unexpected type when encoding ProductProduct.links"}
+
+  def decode_numoffers(value) when is_integer(value), do: value
+  def decode_numoffers(_), do: {:error, "Unexpected type when decoding ProductProduct.numoffers"}
+
+  def encode_numoffers(value) when is_integer(value), do: value
+  def encode_numoffers(_), do: {:error, "Unexpected type when encoding ProductProduct.numoffers"}
+
+  def decode_pricemax(value) when is_binary(value), do: value
+  def decode_pricemax(_), do: {:error, "Unexpected type when decoding ProductProduct.pricemax"}
+
+  def encode_pricemax(value) when is_binary(value), do: value
+  def encode_pricemax(_), do: {:error, "Unexpected type when encoding ProductProduct.pricemax"}
+
+  def decode_pricemin(value) when is_binary(value), do: value
+  def decode_pricemin(_), do: {:error, "Unexpected type when decoding ProductProduct.pricemin"}
+
+  def encode_pricemin(value) when is_binary(value), do: value
+  def encode_pricemin(_), do: {:error, "Unexpected type when encoding ProductProduct.pricemin"}
+
+  def decode_productname(value) when is_binary(value), do: value
+  def decode_productname(_), do: {:error, "Unexpected type when decoding ProductProduct.productname"}
+
+  def encode_productname(value) when is_binary(value), do: value
+  def encode_productname(_), do: {:error, "Unexpected type when encoding ProductProduct.productname"}
+
+  def decode_quantity(value) when is_integer(value), do: value
+  def decode_quantity(_), do: {:error, "Unexpected type when decoding ProductProduct.quantity"}
+
+  def encode_quantity(value) when is_integer(value), do: value
+  def encode_quantity(_), do: {:error, "Unexpected type when encoding ProductProduct.quantity"}
+
+  def decode_totalsellers(value) when is_integer(value), do: value
+  def decode_totalsellers(_), do: {:error, "Unexpected type when decoding ProductProduct.totalsellers"}
+
+  def encode_totalsellers(value) when is_integer(value), do: value
+  def encode_totalsellers(_), do: {:error, "Unexpected type when encoding ProductProduct.totalsellers"}
+
   def from_map(m) do
     %ProductProduct{
-      categoryid: m["categoryid"],
+      categoryid: decode_categoryid(m["categoryid"]),
       currency: Currency.from_map(m["currency"]),
-      eco: m["eco"],
-      fulldescription: m["fulldescription"],
-      hasmetasearch: m["hasmetasearch"],
-      id: m["id"],
+      eco: decode_eco(m["eco"]),
+      fulldescription: decode_fulldescription(m["fulldescription"]),
+      hasmetasearch: decode_hasmetasearch(m["hasmetasearch"]),
+      id: decode_id(m["id"]),
       links: Enum.map(m["links"], &LinkElement.from_map/1),
-      numoffers: m["numoffers"],
-      pricemax: m["pricemax"],
-      pricemin: m["pricemin"],
-      productname: m["productname"],
-      quantity: m["quantity"],
+      numoffers: decode_numoffers(m["numoffers"]),
+      pricemax: decode_pricemax(m["pricemax"]),
+      pricemin: decode_pricemin(m["pricemin"]),
+      productname: decode_productname(m["productname"]),
+      quantity: decode_quantity(m["quantity"]),
       rating: Rating.from_map(m["rating"]),
       specification: Specification.from_map(m["specification"]),
       thumbnail: FormatsClass.from_map(m["thumbnail"]),
-      totalsellers: m["totalsellers"],
+      totalsellers: decode_totalsellers(m["totalsellers"]),
     }
   end
 
@@ -688,18 +982,66 @@ defmodule TopLevel do
           totalresultsreturned: integer()
         }
 
+  def decode_match(value) when is_binary(value), do: value
+  def decode_match(_), do: {:error, "Unexpected type when decoding TopLevel.match"}
+
+  def encode_match(value) when is_binary(value), do: value
+  def encode_match(_), do: {:error, "Unexpected type when encoding TopLevel.match"}
+
+  def decode_page(value) when is_integer(value), do: value
+  def decode_page(_), do: {:error, "Unexpected type when decoding TopLevel.page"}
+
+  def encode_page(value) when is_integer(value), do: value
+  def encode_page(_), do: {:error, "Unexpected type when encoding TopLevel.page"}
+
+  def decode_product(value) when is_list(value), do: value
+  def decode_product(_), do: {:error, "Unexpected type when decoding TopLevel.product"}
+
+  def encode_product(value) when is_list(value), do: value
+  def encode_product(_), do: {:error, "Unexpected type when encoding TopLevel.product"}
+
+  def decode_schk(value) when is_boolean(value), do: value
+  def decode_schk(_), do: {:error, "Unexpected type when decoding TopLevel.schk"}
+
+  def encode_schk(value) when is_boolean(value), do: value
+  def encode_schk(_), do: {:error, "Unexpected type when encoding TopLevel.schk"}
+
+  def decode_totallooseoffers(value) when is_integer(value), do: value
+  def decode_totallooseoffers(_), do: {:error, "Unexpected type when decoding TopLevel.totallooseoffers"}
+
+  def encode_totallooseoffers(value) when is_integer(value), do: value
+  def encode_totallooseoffers(_), do: {:error, "Unexpected type when encoding TopLevel.totallooseoffers"}
+
+  def decode_totalpages(value) when is_integer(value), do: value
+  def decode_totalpages(_), do: {:error, "Unexpected type when decoding TopLevel.totalpages"}
+
+  def encode_totalpages(value) when is_integer(value), do: value
+  def encode_totalpages(_), do: {:error, "Unexpected type when encoding TopLevel.totalpages"}
+
+  def decode_totalresultsavailable(value) when is_integer(value), do: value
+  def decode_totalresultsavailable(_), do: {:error, "Unexpected type when decoding TopLevel.totalresultsavailable"}
+
+  def encode_totalresultsavailable(value) when is_integer(value), do: value
+  def encode_totalresultsavailable(_), do: {:error, "Unexpected type when encoding TopLevel.totalresultsavailable"}
+
+  def decode_totalresultsreturned(value) when is_integer(value), do: value
+  def decode_totalresultsreturned(_), do: {:error, "Unexpected type when decoding TopLevel.totalresultsreturned"}
+
+  def encode_totalresultsreturned(value) when is_integer(value), do: value
+  def encode_totalresultsreturned(_), do: {:error, "Unexpected type when encoding TopLevel.totalresultsreturned"}
+
   def from_map(m) do
     %TopLevel{
       category: Category.from_map(m["category"]),
       details: Details.from_map(m["details"]),
-      match: m["match"],
-      page: m["page"],
+      match: decode_match(m["match"]),
+      page: decode_page(m["page"]),
       product: Enum.map(m["product"], &ProductElement.from_map/1),
-      schk: m["schk"],
-      totallooseoffers: m["totallooseoffers"],
-      totalpages: m["totalpages"],
-      totalresultsavailable: m["totalresultsavailable"],
-      totalresultsreturned: m["totalresultsreturned"],
+      schk: decode_schk(m["schk"]),
+      totallooseoffers: decode_totallooseoffers(m["totallooseoffers"]),
+      totalpages: decode_totalpages(m["totalpages"]),
+      totalresultsavailable: decode_totalresultsavailable(m["totalresultsavailable"]),
+      totalresultsreturned: decode_totalresultsreturned(m["totalresultsreturned"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/simple-identifiers.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/simple-identifiers.json/default/QuickType.ex
index 3663eb9..6305a6f 100644
--- a/base/elixir/test/inputs/json/priority/simple-identifiers.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/simple-identifiers.json/default/QuickType.ex
@@ -21,17 +21,71 @@ defmodule TopLevel do
           x_y: String.t()
         }
 
+  def decode_continue(value) when is_binary(value), do: value
+  def decode_continue(_), do: {:error, "Unexpected type when decoding TopLevel.continue"}
+
+  def encode_continue(value) when is_binary(value), do: value
+  def encode_continue(_), do: {:error, "Unexpected type when encoding TopLevel.continue"}
+
+  def decode_empty(value) when is_binary(value), do: value
+  def decode_empty(_), do: {:error, "Unexpected type when decoding TopLevel.empty"}
+
+  def encode_empty(value) when is_binary(value), do: value
+  def encode_empty(_), do: {:error, "Unexpected type when encoding TopLevel.empty"}
+
+  def decode_null(value) when is_binary(value), do: value
+  def decode_null(_), do: {:error, "Unexpected type when decoding TopLevel.null"}
+
+  def encode_null(value) when is_binary(value), do: value
+  def encode_null(_), do: {:error, "Unexpected type when encoding TopLevel.null"}
+
+  def decode_top_level(value) when is_binary(value), do: value
+  def decode_top_level(_), do: {:error, "Unexpected type when decoding TopLevel.top_level"}
+
+  def encode_top_level(value) when is_binary(value), do: value
+  def encode_top_level(_), do: {:error, "Unexpected type when encoding TopLevel.top_level"}
+
+  def decode_top_level_x(value) when is_binary(value), do: value
+  def decode_top_level_x(_), do: {:error, "Unexpected type when decoding TopLevel.top_level_x"}
+
+  def encode_top_level_x(value) when is_binary(value), do: value
+  def encode_top_level_x(_), do: {:error, "Unexpected type when encoding TopLevel.top_level_x"}
+
+  def decode_undefined(value) when is_binary(value), do: value
+  def decode_undefined(_), do: {:error, "Unexpected type when decoding TopLevel.undefined"}
+
+  def encode_undefined(value) when is_binary(value), do: value
+  def encode_undefined(_), do: {:error, "Unexpected type when encoding TopLevel.undefined"}
+
+  def decode_x(value) when is_binary(value), do: value
+  def decode_x(_), do: {:error, "Unexpected type when decoding TopLevel.x"}
+
+  def encode_x(value) when is_binary(value), do: value
+  def encode_x(_), do: {:error, "Unexpected type when encoding TopLevel.x"}
+
+  def decode_x_1(value) when is_binary(value), do: value
+  def decode_x_1(_), do: {:error, "Unexpected type when decoding TopLevel.x_1"}
+
+  def encode_x_1(value) when is_binary(value), do: value
+  def encode_x_1(_), do: {:error, "Unexpected type when encoding TopLevel.x_1"}
+
+  def decode_x_y(value) when is_binary(value), do: value
+  def decode_x_y(_), do: {:error, "Unexpected type when decoding TopLevel.x_y"}
+
+  def encode_x_y(value) when is_binary(value), do: value
+  def encode_x_y(_), do: {:error, "Unexpected type when encoding TopLevel.x_y"}
+
   def from_map(m) do
     %TopLevel{
-      continue: m["continue"],
-      empty: m[""],
-      null: m["null"],
-      top_level: m["{}"],
-      top_level_x: m["x\""],
-      undefined: m["undefined"],
-      x: m["x"],
-      x_1: m["x'"],
-      x_y: m["x y"],
+      continue: decode_continue(m["continue"]),
+      empty: decode_empty(m[""]),
+      null: decode_null(m["null"]),
+      top_level: decode_top_level(m["{}"]),
+      top_level_x: decode_top_level_x(m["x\""]),
+      undefined: decode_undefined(m["undefined"]),
+      x: decode_x(m["x"]),
+      x_1: decode_x_1(m["x'"]),
+      x_y: decode_x_y(m["x y"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/union-constructor-clash.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/union-constructor-clash.json/default/QuickType.ex
index b86d143..967efbf 100644
--- a/base/elixir/test/inputs/json/priority/union-constructor-clash.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/union-constructor-clash.json/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule BoolInUnion do
           a: boolean()
         }
 
+  def decode_a(value) when is_boolean(value), do: value
+  def decode_a(_), do: {:error, "Unexpected type when decoding BoolInUnion.a"}
+
+  def encode_a(value) when is_boolean(value), do: value
+  def encode_a(_), do: {:error, "Unexpected type when encoding BoolInUnion.a"}
+
   def from_map(m) do
     %BoolInUnion{
-      a: m["a"],
+      a: decode_a(m["a"]),
     }
   end
 
@@ -47,6 +53,12 @@ defmodule TopLevel do
           union: [boolean() | integer()]
         }
 
+  def decode_union(value) when is_list(value), do: value
+  def decode_union(_), do: {:error, "Unexpected type when decoding TopLevel.union"}
+
+  def encode_union(value) when is_list(value), do: value
+  def encode_union(_), do: {:error, "Unexpected type when encoding TopLevel.union"}
+
   def decode_union_element(value) when is_boolean(value), do: value
   def decode_union_element(value) when is_integer(value), do: value
   def decode_union_element(_), do: {:error, "Unexpected type when decoding TopLevel.union"}
diff --git a/base/elixir/test/inputs/json/priority/unions.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/unions.json/default/QuickType.ex
index 9927771..37e4330 100644
--- a/base/elixir/test/inputs/json/priority/unions.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/unions.json/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule ZClass do
           a: boolean()
         }
 
+  def decode_a(value) when is_boolean(value), do: value
+  def decode_a(_), do: {:error, "Unexpected type when decoding ZClass.a"}
+
+  def encode_a(value) when is_boolean(value), do: value
+  def encode_a(_), do: {:error, "Unexpected type when encoding ZClass.a"}
+
   def from_map(m) do
     %ZClass{
-      a: m["a"],
+      a: decode_a(m["a"]),
     }
   end
 
@@ -48,6 +54,12 @@ defmodule TopLevel do
           z: [[integer()] | ZClass.t() | integer()]
         }
 
+  def decode_x(value) when is_list(value), do: value
+  def decode_x(_), do: {:error, "Unexpected type when decoding TopLevel.x"}
+
+  def encode_x(value) when is_list(value), do: value
+  def encode_x(_), do: {:error, "Unexpected type when encoding TopLevel.x"}
+
   def decode_x_element(value) when is_integer(value), do: value
   def decode_x_element(value) when is_nil(value), do: value
   def decode_x_element(value) when is_binary(value), do: value
@@ -58,6 +70,12 @@ defmodule TopLevel do
   def encode_x_element(value) when is_binary(value), do: value
   def encode_x_element(_), do: {:error, "Unexpected type when encoding TopLevel.x"}
 
+  def decode_y(value) when is_list(value), do: value
+  def decode_y(_), do: {:error, "Unexpected type when decoding TopLevel.y"}
+
+  def encode_y(value) when is_list(value), do: value
+  def encode_y(_), do: {:error, "Unexpected type when encoding TopLevel.y"}
+
   def decode_y_element(value) when is_integer(value), do: value
   def decode_y_element(value) when is_nil(value), do: value
   def decode_y_element(_), do: {:error, "Unexpected type when decoding TopLevel.y"}
@@ -66,6 +84,12 @@ defmodule TopLevel do
   def encode_y_element(value) when is_nil(value), do: value
   def encode_y_element(_), do: {:error, "Unexpected type when encoding TopLevel.y"}
 
+  def decode_z(value) when is_list(value), do: value
+  def decode_z(_), do: {:error, "Unexpected type when decoding TopLevel.z"}
+
+  def encode_z(value) when is_list(value), do: value
+  def encode_z(_), do: {:error, "Unexpected type when encoding TopLevel.z"}
+
   def decode_z_element(%{"a" => _,} = value), do: ZClass.from_map(value)
   def decode_z_element(value) when is_integer(value), do: value
   def decode_z_element(value) when is_list(value), do: value
diff --git a/base/elixir/test/inputs/json/priority/url.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/url.json/default/QuickType.ex
index 437fc31..100fde1 100644
--- a/base/elixir/test/inputs/json/priority/url.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/url.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule TopLevel do
           url: String.t()
         }
 
+  def decode_from_url(value) when is_binary(value), do: value
+  def decode_from_url(_), do: {:error, "Unexpected type when decoding TopLevel.from_url"}
+
+  def encode_from_url(value) when is_binary(value), do: value
+  def encode_from_url(_), do: {:error, "Unexpected type when encoding TopLevel.from_url"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding TopLevel.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding TopLevel.url"}
+
   def from_map(m) do
     %TopLevel{
-      from_url: m["fromURL"],
-      url: m["url"],
+      from_url: decode_from_url(m["fromURL"]),
+      url: decode_url(m["url"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/priority/uuids.json/default/QuickType.ex b/head/elixir/test/inputs/json/priority/uuids.json/default/QuickType.ex
index 23d4a2b..0c5a5e9 100644
--- a/base/elixir/test/inputs/json/priority/uuids.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/priority/uuids.json/default/QuickType.ex
@@ -18,14 +18,52 @@ defmodule TopLevel do
           uuid_values: [String.t()]
         }
 
+  def decode_boolean_value(value) when is_boolean(value), do: value
+  def decode_boolean_value(_), do: {:error, "Unexpected type when decoding TopLevel.boolean_value"}
+
+  def encode_boolean_value(value) when is_boolean(value), do: value
+  def encode_boolean_value(_), do: {:error, "Unexpected type when encoding TopLevel.boolean_value"}
+
+  def decode_double_value(value) when is_float(value), do: value
+  def decode_double_value(value) when is_integer(value), do: value
+  def decode_double_value(_), do: {:error, "Unexpected type when decoding TopLevel.double_value"}
+
+  def encode_double_value(value) when is_float(value), do: value
+  def encode_double_value(value) when is_integer(value), do: value
+  def encode_double_value(_), do: {:error, "Unexpected type when encoding TopLevel.double_value"}
+
+  def decode_int_value(value) when is_integer(value), do: value
+  def decode_int_value(_), do: {:error, "Unexpected type when decoding TopLevel.int_value"}
+
+  def encode_int_value(value) when is_integer(value), do: value
+  def encode_int_value(_), do: {:error, "Unexpected type when encoding TopLevel.int_value"}
+
+  def decode_string_value(value) when is_binary(value), do: value
+  def decode_string_value(_), do: {:error, "Unexpected type when decoding TopLevel.string_value"}
+
+  def encode_string_value(value) when is_binary(value), do: value
+  def encode_string_value(_), do: {:error, "Unexpected type when encoding TopLevel.string_value"}
+
+  def decode_uuid_value(value) when is_binary(value), do: value
+  def decode_uuid_value(_), do: {:error, "Unexpected type when decoding TopLevel.uuid_value"}
+
+  def encode_uuid_value(value) when is_binary(value), do: value
+  def encode_uuid_value(_), do: {:error, "Unexpected type when encoding TopLevel.uuid_value"}
+
+  def decode_uuid_values(value) when is_list(value), do: value
+  def decode_uuid_values(_), do: {:error, "Unexpected type when decoding TopLevel.uuid_values"}
+
+  def encode_uuid_values(value) when is_list(value), do: value
+  def encode_uuid_values(_), do: {:error, "Unexpected type when encoding TopLevel.uuid_values"}
+
   def from_map(m) do
     %TopLevel{
-      boolean_value: m["booleanValue"],
-      double_value: m["doubleValue"],
-      int_value: m["intValue"],
-      string_value: m["stringValue"],
-      uuid_value: m["uuidValue"],
-      uuid_values: m["uuidValues"],
+      boolean_value: decode_boolean_value(m["booleanValue"]),
+      double_value: decode_double_value(m["doubleValue"]),
+      int_value: decode_int_value(m["intValue"]),
+      string_value: decode_string_value(m["stringValue"]),
+      uuid_value: decode_uuid_value(m["uuidValue"]),
+      uuid_values: decode_uuid_values(m["uuidValues"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/samples/bitcoin-block.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/bitcoin-block.json/default/QuickType.ex
index 474700a..0c83b4d 100644
--- a/base/elixir/test/inputs/json/samples/bitcoin-block.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/samples/bitcoin-block.json/default/QuickType.ex
@@ -17,13 +17,43 @@ defmodule TopLevel do
           tx_indexes: [integer()]
         }
 
+  def decode_block_index(value) when is_integer(value), do: value
+  def decode_block_index(_), do: {:error, "Unexpected type when decoding TopLevel.block_index"}
+
+  def encode_block_index(value) when is_integer(value), do: value
+  def encode_block_index(_), do: {:error, "Unexpected type when encoding TopLevel.block_index"}
+
+  def decode_hash(value) when is_binary(value), do: value
+  def decode_hash(_), do: {:error, "Unexpected type when decoding TopLevel.hash"}
+
+  def encode_hash(value) when is_binary(value), do: value
+  def encode_hash(_), do: {:error, "Unexpected type when encoding TopLevel.hash"}
+
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding TopLevel.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding TopLevel.height"}
+
+  def decode_time(value) when is_integer(value), do: value
+  def decode_time(_), do: {:error, "Unexpected type when decoding TopLevel.time"}
+
+  def encode_time(value) when is_integer(value), do: value
+  def encode_time(_), do: {:error, "Unexpected type when encoding TopLevel.time"}
+
+  def decode_tx_indexes(value) when is_list(value), do: value
+  def decode_tx_indexes(_), do: {:error, "Unexpected type when decoding TopLevel.tx_indexes"}
+
+  def encode_tx_indexes(value) when is_list(value), do: value
+  def encode_tx_indexes(_), do: {:error, "Unexpected type when encoding TopLevel.tx_indexes"}
+
   def from_map(m) do
     %TopLevel{
-      block_index: m["block_index"],
-      hash: m["hash"],
-      height: m["height"],
-      time: m["time"],
-      tx_indexes: m["txIndexes"],
+      block_index: decode_block_index(m["block_index"]),
+      hash: decode_hash(m["hash"]),
+      height: decode_height(m["height"]),
+      time: decode_time(m["time"]),
+      tx_indexes: decode_tx_indexes(m["txIndexes"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/samples/getting-started.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/getting-started.json/default/QuickType.ex
index fc9c3eb..4a48ada 100644
--- a/base/elixir/test/inputs/json/samples/getting-started.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/samples/getting-started.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule TopLevel do
           instructions: [String.t()]
         }
 
+  def decode_greeting(value) when is_binary(value), do: value
+  def decode_greeting(_), do: {:error, "Unexpected type when decoding TopLevel.greeting"}
+
+  def encode_greeting(value) when is_binary(value), do: value
+  def encode_greeting(_), do: {:error, "Unexpected type when encoding TopLevel.greeting"}
+
+  def decode_instructions(value) when is_list(value), do: value
+  def decode_instructions(_), do: {:error, "Unexpected type when decoding TopLevel.instructions"}
+
+  def encode_instructions(value) when is_list(value), do: value
+  def encode_instructions(_), do: {:error, "Unexpected type when encoding TopLevel.instructions"}
+
   def from_map(m) do
     %TopLevel{
-      greeting: m["greeting"],
-      instructions: m["instructions"],
+      greeting: decode_greeting(m["greeting"]),
+      instructions: decode_instructions(m["instructions"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/samples/github-events.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/github-events.json/default/QuickType.ex
index 15cdbe1..ca7b787 100644
--- a/base/elixir/test/inputs/json/samples/github-events.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/samples/github-events.json/default/QuickType.ex
@@ -18,14 +18,44 @@ defmodule Actor do
           url: String.t()
         }
 
+  def decode_avatar_url(value) when is_binary(value), do: value
+  def decode_avatar_url(_), do: {:error, "Unexpected type when decoding Actor.avatar_url"}
+
+  def encode_avatar_url(value) when is_binary(value), do: value
+  def encode_avatar_url(_), do: {:error, "Unexpected type when encoding Actor.avatar_url"}
+
+  def decode_gravatar_id(value) when is_binary(value), do: value
+  def decode_gravatar_id(_), do: {:error, "Unexpected type when decoding Actor.gravatar_id"}
+
+  def encode_gravatar_id(value) when is_binary(value), do: value
+  def encode_gravatar_id(_), do: {:error, "Unexpected type when encoding Actor.gravatar_id"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Actor.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Actor.id"}
+
+  def decode_login(value) when is_binary(value), do: value
+  def decode_login(_), do: {:error, "Unexpected type when decoding Actor.login"}
+
+  def encode_login(value) when is_binary(value), do: value
+  def encode_login(_), do: {:error, "Unexpected type when encoding Actor.login"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Actor.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Actor.url"}
+
   def from_map(m) do
     %Actor{
-      avatar_url: m["avatar_url"],
+      avatar_url: decode_avatar_url(m["avatar_url"]),
       display_login: m["display_login"],
-      gravatar_id: m["gravatar_id"],
-      id: m["id"],
-      login: m["login"],
-      url: m["url"],
+      gravatar_id: decode_gravatar_id(m["gravatar_id"]),
+      id: decode_id(m["id"]),
+      login: decode_login(m["login"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -123,25 +153,121 @@ defmodule User do
           url: String.t()
         }
 
+  def decode_avatar_url(value) when is_binary(value), do: value
+  def decode_avatar_url(_), do: {:error, "Unexpected type when decoding User.avatar_url"}
+
+  def encode_avatar_url(value) when is_binary(value), do: value
+  def encode_avatar_url(_), do: {:error, "Unexpected type when encoding User.avatar_url"}
+
+  def decode_events_url(value) when is_binary(value), do: value
+  def decode_events_url(_), do: {:error, "Unexpected type when decoding User.events_url"}
+
+  def encode_events_url(value) when is_binary(value), do: value
+  def encode_events_url(_), do: {:error, "Unexpected type when encoding User.events_url"}
+
+  def decode_followers_url(value) when is_binary(value), do: value
+  def decode_followers_url(_), do: {:error, "Unexpected type when decoding User.followers_url"}
+
+  def encode_followers_url(value) when is_binary(value), do: value
+  def encode_followers_url(_), do: {:error, "Unexpected type when encoding User.followers_url"}
+
+  def decode_following_url(value) when is_binary(value), do: value
+  def decode_following_url(_), do: {:error, "Unexpected type when decoding User.following_url"}
+
+  def encode_following_url(value) when is_binary(value), do: value
+  def encode_following_url(_), do: {:error, "Unexpected type when encoding User.following_url"}
+
+  def decode_gists_url(value) when is_binary(value), do: value
+  def decode_gists_url(_), do: {:error, "Unexpected type when decoding User.gists_url"}
+
+  def encode_gists_url(value) when is_binary(value), do: value
+  def encode_gists_url(_), do: {:error, "Unexpected type when encoding User.gists_url"}
+
+  def decode_gravatar_id(value) when is_binary(value), do: value
+  def decode_gravatar_id(_), do: {:error, "Unexpected type when decoding User.gravatar_id"}
+
+  def encode_gravatar_id(value) when is_binary(value), do: value
+  def encode_gravatar_id(_), do: {:error, "Unexpected type when encoding User.gravatar_id"}
+
+  def decode_html_url(value) when is_binary(value), do: value
+  def decode_html_url(_), do: {:error, "Unexpected type when decoding User.html_url"}
+
+  def encode_html_url(value) when is_binary(value), do: value
+  def encode_html_url(_), do: {:error, "Unexpected type when encoding User.html_url"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding User.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding User.id"}
+
+  def decode_login(value) when is_binary(value), do: value
+  def decode_login(_), do: {:error, "Unexpected type when decoding User.login"}
+
+  def encode_login(value) when is_binary(value), do: value
+  def encode_login(_), do: {:error, "Unexpected type when encoding User.login"}
+
+  def decode_organizations_url(value) when is_binary(value), do: value
+  def decode_organizations_url(_), do: {:error, "Unexpected type when decoding User.organizations_url"}
+
+  def encode_organizations_url(value) when is_binary(value), do: value
+  def encode_organizations_url(_), do: {:error, "Unexpected type when encoding User.organizations_url"}
+
+  def decode_received_events_url(value) when is_binary(value), do: value
+  def decode_received_events_url(_), do: {:error, "Unexpected type when decoding User.received_events_url"}
+
+  def encode_received_events_url(value) when is_binary(value), do: value
+  def encode_received_events_url(_), do: {:error, "Unexpected type when encoding User.received_events_url"}
+
+  def decode_repos_url(value) when is_binary(value), do: value
+  def decode_repos_url(_), do: {:error, "Unexpected type when decoding User.repos_url"}
+
+  def encode_repos_url(value) when is_binary(value), do: value
+  def encode_repos_url(_), do: {:error, "Unexpected type when encoding User.repos_url"}
+
+  def decode_site_admin(value) when is_boolean(value), do: value
+  def decode_site_admin(_), do: {:error, "Unexpected type when decoding User.site_admin"}
+
+  def encode_site_admin(value) when is_boolean(value), do: value
+  def encode_site_admin(_), do: {:error, "Unexpected type when encoding User.site_admin"}
+
+  def decode_starred_url(value) when is_binary(value), do: value
+  def decode_starred_url(_), do: {:error, "Unexpected type when decoding User.starred_url"}
+
+  def encode_starred_url(value) when is_binary(value), do: value
+  def encode_starred_url(_), do: {:error, "Unexpected type when encoding User.starred_url"}
+
+  def decode_subscriptions_url(value) when is_binary(value), do: value
+  def decode_subscriptions_url(_), do: {:error, "Unexpected type when decoding User.subscriptions_url"}
+
+  def encode_subscriptions_url(value) when is_binary(value), do: value
+  def encode_subscriptions_url(_), do: {:error, "Unexpected type when encoding User.subscriptions_url"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding User.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding User.url"}
+
   def from_map(m) do
     %User{
-      avatar_url: m["avatar_url"],
-      events_url: m["events_url"],
-      followers_url: m["followers_url"],
-      following_url: m["following_url"],
-      gists_url: m["gists_url"],
-      gravatar_id: m["gravatar_id"],
-      html_url: m["html_url"],
-      id: m["id"],
-      login: m["login"],
-      organizations_url: m["organizations_url"],
-      received_events_url: m["received_events_url"],
-      repos_url: m["repos_url"],
-      site_admin: m["site_admin"],
-      starred_url: m["starred_url"],
-      subscriptions_url: m["subscriptions_url"],
+      avatar_url: decode_avatar_url(m["avatar_url"]),
+      events_url: decode_events_url(m["events_url"]),
+      followers_url: decode_followers_url(m["followers_url"]),
+      following_url: decode_following_url(m["following_url"]),
+      gists_url: decode_gists_url(m["gists_url"]),
+      gravatar_id: decode_gravatar_id(m["gravatar_id"]),
+      html_url: decode_html_url(m["html_url"]),
+      id: decode_id(m["id"]),
+      login: decode_login(m["login"]),
+      organizations_url: decode_organizations_url(m["organizations_url"]),
+      received_events_url: decode_received_events_url(m["received_events_url"]),
+      repos_url: decode_repos_url(m["repos_url"]),
+      site_admin: decode_site_admin(m["site_admin"]),
+      starred_url: decode_starred_url(m["starred_url"]),
+      subscriptions_url: decode_subscriptions_url(m["subscriptions_url"]),
       type: Type.decode(m["type"]),
-      url: m["url"],
+      url: decode_url(m["url"]),
     }
   end
 
@@ -195,15 +321,57 @@ defmodule Comment do
           user: User.t()
         }
 
+  def decode_body(value) when is_binary(value), do: value
+  def decode_body(_), do: {:error, "Unexpected type when decoding Comment.body"}
+
+  def encode_body(value) when is_binary(value), do: value
+  def encode_body(_), do: {:error, "Unexpected type when encoding Comment.body"}
+
+  def decode_created_at(value) when is_binary(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding Comment.created_at"}
+
+  def encode_created_at(value) when is_binary(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding Comment.created_at"}
+
+  def decode_html_url(value) when is_binary(value), do: value
+  def decode_html_url(_), do: {:error, "Unexpected type when decoding Comment.html_url"}
+
+  def encode_html_url(value) when is_binary(value), do: value
+  def encode_html_url(_), do: {:error, "Unexpected type when encoding Comment.html_url"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Comment.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Comment.id"}
+
+  def decode_issue_url(value) when is_binary(value), do: value
+  def decode_issue_url(_), do: {:error, "Unexpected type when decoding Comment.issue_url"}
+
+  def encode_issue_url(value) when is_binary(value), do: value
+  def encode_issue_url(_), do: {:error, "Unexpected type when encoding Comment.issue_url"}
+
+  def decode_updated_at(value) when is_binary(value), do: value
+  def decode_updated_at(_), do: {:error, "Unexpected type when decoding Comment.updated_at"}
+
+  def encode_updated_at(value) when is_binary(value), do: value
+  def encode_updated_at(_), do: {:error, "Unexpected type when encoding Comment.updated_at"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Comment.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Comment.url"}
+
   def from_map(m) do
     %Comment{
-      body: m["body"],
-      created_at: m["created_at"],
-      html_url: m["html_url"],
-      id: m["id"],
-      issue_url: m["issue_url"],
-      updated_at: m["updated_at"],
-      url: m["url"],
+      body: decode_body(m["body"]),
+      created_at: decode_created_at(m["created_at"]),
+      html_url: decode_html_url(m["html_url"]),
+      id: decode_id(m["id"]),
+      issue_url: decode_issue_url(m["issue_url"]),
+      updated_at: decode_updated_at(m["updated_at"]),
+      url: decode_url(m["url"]),
       user: User.from_map(m["user"]),
     }
   end
@@ -243,10 +411,22 @@ defmodule Author do
           name: String.t()
         }
 
+  def decode_email(value) when is_binary(value), do: value
+  def decode_email(_), do: {:error, "Unexpected type when decoding Author.email"}
+
+  def encode_email(value) when is_binary(value), do: value
+  def encode_email(_), do: {:error, "Unexpected type when encoding Author.email"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Author.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Author.name"}
+
   def from_map(m) do
     %Author{
-      email: m["email"],
-      name: m["name"],
+      email: decode_email(m["email"]),
+      name: decode_name(m["name"]),
     }
   end
 
@@ -282,13 +462,37 @@ defmodule Commit do
           url: String.t()
         }
 
+  def decode_distinct(value) when is_boolean(value), do: value
+  def decode_distinct(_), do: {:error, "Unexpected type when decoding Commit.distinct"}
+
+  def encode_distinct(value) when is_boolean(value), do: value
+  def encode_distinct(_), do: {:error, "Unexpected type when encoding Commit.distinct"}
+
+  def decode_message(value) when is_binary(value), do: value
+  def decode_message(_), do: {:error, "Unexpected type when decoding Commit.message"}
+
+  def encode_message(value) when is_binary(value), do: value
+  def encode_message(_), do: {:error, "Unexpected type when encoding Commit.message"}
+
+  def decode_sha(value) when is_binary(value), do: value
+  def decode_sha(_), do: {:error, "Unexpected type when decoding Commit.sha"}
+
+  def encode_sha(value) when is_binary(value), do: value
+  def encode_sha(_), do: {:error, "Unexpected type when encoding Commit.sha"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Commit.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Commit.url"}
+
   def from_map(m) do
     %Commit{
       author: Author.from_map(m["author"]),
-      distinct: m["distinct"],
-      message: m["message"],
-      sha: m["sha"],
-      url: m["url"],
+      distinct: decode_distinct(m["distinct"]),
+      message: decode_message(m["message"]),
+      sha: decode_sha(m["sha"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -327,13 +531,43 @@ defmodule Label do
           url: String.t()
         }
 
+  def decode_color(value) when is_binary(value), do: value
+  def decode_color(_), do: {:error, "Unexpected type when decoding Label.color"}
+
+  def encode_color(value) when is_binary(value), do: value
+  def encode_color(_), do: {:error, "Unexpected type when encoding Label.color"}
+
+  def decode_default(value) when is_boolean(value), do: value
+  def decode_default(_), do: {:error, "Unexpected type when decoding Label.default"}
+
+  def encode_default(value) when is_boolean(value), do: value
+  def encode_default(_), do: {:error, "Unexpected type when encoding Label.default"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Label.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Label.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Label.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Label.name"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Label.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Label.url"}
+
   def from_map(m) do
     %Label{
-      color: m["color"],
-      default: m["default"],
-      id: m["id"],
-      name: m["name"],
-      url: m["url"],
+      color: decode_color(m["color"]),
+      default: decode_default(m["default"]),
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -382,23 +616,101 @@ defmodule Milestone do
           url: String.t()
         }
 
+  def decode_closed_at(value) when is_nil(value), do: value
+  def decode_closed_at(_), do: {:error, "Unexpected type when decoding Milestone.closed_at"}
+
+  def encode_closed_at(value) when is_nil(value), do: value
+  def encode_closed_at(_), do: {:error, "Unexpected type when encoding Milestone.closed_at"}
+
+  def decode_closed_issues(value) when is_integer(value), do: value
+  def decode_closed_issues(_), do: {:error, "Unexpected type when decoding Milestone.closed_issues"}
+
+  def encode_closed_issues(value) when is_integer(value), do: value
+  def encode_closed_issues(_), do: {:error, "Unexpected type when encoding Milestone.closed_issues"}
+
+  def decode_created_at(value) when is_binary(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding Milestone.created_at"}
+
+  def encode_created_at(value) when is_binary(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding Milestone.created_at"}
+
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Milestone.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Milestone.description"}
+
+  def decode_html_url(value) when is_binary(value), do: value
+  def decode_html_url(_), do: {:error, "Unexpected type when decoding Milestone.html_url"}
+
+  def encode_html_url(value) when is_binary(value), do: value
+  def encode_html_url(_), do: {:error, "Unexpected type when encoding Milestone.html_url"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Milestone.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Milestone.id"}
+
+  def decode_labels_url(value) when is_binary(value), do: value
+  def decode_labels_url(_), do: {:error, "Unexpected type when decoding Milestone.labels_url"}
+
+  def encode_labels_url(value) when is_binary(value), do: value
+  def encode_labels_url(_), do: {:error, "Unexpected type when encoding Milestone.labels_url"}
+
+  def decode_number(value) when is_integer(value), do: value
+  def decode_number(_), do: {:error, "Unexpected type when decoding Milestone.number"}
+
+  def encode_number(value) when is_integer(value), do: value
+  def encode_number(_), do: {:error, "Unexpected type when encoding Milestone.number"}
+
+  def decode_open_issues(value) when is_integer(value), do: value
+  def decode_open_issues(_), do: {:error, "Unexpected type when decoding Milestone.open_issues"}
+
+  def encode_open_issues(value) when is_integer(value), do: value
+  def encode_open_issues(_), do: {:error, "Unexpected type when encoding Milestone.open_issues"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding Milestone.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding Milestone.state"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Milestone.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Milestone.title"}
+
+  def decode_updated_at(value) when is_binary(value), do: value
+  def decode_updated_at(_), do: {:error, "Unexpected type when decoding Milestone.updated_at"}
+
+  def encode_updated_at(value) when is_binary(value), do: value
+  def encode_updated_at(_), do: {:error, "Unexpected type when encoding Milestone.updated_at"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Milestone.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Milestone.url"}
+
   def from_map(m) do
     %Milestone{
-      closed_at: m["closed_at"],
-      closed_issues: m["closed_issues"],
-      created_at: m["created_at"],
+      closed_at: decode_closed_at(m["closed_at"]),
+      closed_issues: decode_closed_issues(m["closed_issues"]),
+      created_at: decode_created_at(m["created_at"]),
       creator: User.from_map(m["creator"]),
-      description: m["description"],
+      description: decode_description(m["description"]),
       due_on: m["due_on"],
-      html_url: m["html_url"],
-      id: m["id"],
-      labels_url: m["labels_url"],
-      number: m["number"],
-      open_issues: m["open_issues"],
-      state: m["state"],
-      title: m["title"],
-      updated_at: m["updated_at"],
-      url: m["url"],
+      html_url: decode_html_url(m["html_url"]),
+      id: decode_id(m["id"]),
+      labels_url: decode_labels_url(m["labels_url"]),
+      number: decode_number(m["number"]),
+      open_issues: decode_open_issues(m["open_issues"]),
+      state: decode_state(m["state"]),
+      title: decode_title(m["title"]),
+      updated_at: decode_updated_at(m["updated_at"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -446,12 +758,36 @@ defmodule IssuePullRequest do
           url: String.t()
         }
 
+  def decode_diff_url(value) when is_binary(value), do: value
+  def decode_diff_url(_), do: {:error, "Unexpected type when decoding IssuePullRequest.diff_url"}
+
+  def encode_diff_url(value) when is_binary(value), do: value
+  def encode_diff_url(_), do: {:error, "Unexpected type when encoding IssuePullRequest.diff_url"}
+
+  def decode_html_url(value) when is_binary(value), do: value
+  def decode_html_url(_), do: {:error, "Unexpected type when decoding IssuePullRequest.html_url"}
+
+  def encode_html_url(value) when is_binary(value), do: value
+  def encode_html_url(_), do: {:error, "Unexpected type when encoding IssuePullRequest.html_url"}
+
+  def decode_patch_url(value) when is_binary(value), do: value
+  def decode_patch_url(_), do: {:error, "Unexpected type when decoding IssuePullRequest.patch_url"}
+
+  def encode_patch_url(value) when is_binary(value), do: value
+  def encode_patch_url(_), do: {:error, "Unexpected type when encoding IssuePullRequest.patch_url"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding IssuePullRequest.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding IssuePullRequest.url"}
+
   def from_map(m) do
     %IssuePullRequest{
-      diff_url: m["diff_url"],
-      html_url: m["html_url"],
-      patch_url: m["patch_url"],
-      url: m["url"],
+      diff_url: decode_diff_url(m["diff_url"]),
+      html_url: decode_html_url(m["html_url"]),
+      patch_url: decode_patch_url(m["patch_url"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -506,29 +842,137 @@ defmodule Issue do
           user: User.t()
         }
 
+  def decode_assignee(value) when is_nil(value), do: value
+  def decode_assignee(_), do: {:error, "Unexpected type when decoding Issue.assignee"}
+
+  def encode_assignee(value) when is_nil(value), do: value
+  def encode_assignee(_), do: {:error, "Unexpected type when encoding Issue.assignee"}
+
+  def decode_assignees(value) when is_list(value), do: value
+  def decode_assignees(_), do: {:error, "Unexpected type when decoding Issue.assignees"}
+
+  def encode_assignees(value) when is_list(value), do: value
+  def encode_assignees(_), do: {:error, "Unexpected type when encoding Issue.assignees"}
+
+  def decode_body(value) when is_binary(value), do: value
+  def decode_body(_), do: {:error, "Unexpected type when decoding Issue.body"}
+
+  def encode_body(value) when is_binary(value), do: value
+  def encode_body(_), do: {:error, "Unexpected type when encoding Issue.body"}
+
+  def decode_comments(value) when is_integer(value), do: value
+  def decode_comments(_), do: {:error, "Unexpected type when decoding Issue.comments"}
+
+  def encode_comments(value) when is_integer(value), do: value
+  def encode_comments(_), do: {:error, "Unexpected type when encoding Issue.comments"}
+
+  def decode_comments_url(value) when is_binary(value), do: value
+  def decode_comments_url(_), do: {:error, "Unexpected type when decoding Issue.comments_url"}
+
+  def encode_comments_url(value) when is_binary(value), do: value
+  def encode_comments_url(_), do: {:error, "Unexpected type when encoding Issue.comments_url"}
+
+  def decode_created_at(value) when is_binary(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding Issue.created_at"}
+
+  def encode_created_at(value) when is_binary(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding Issue.created_at"}
+
+  def decode_events_url(value) when is_binary(value), do: value
+  def decode_events_url(_), do: {:error, "Unexpected type when decoding Issue.events_url"}
+
+  def encode_events_url(value) when is_binary(value), do: value
+  def encode_events_url(_), do: {:error, "Unexpected type when encoding Issue.events_url"}
+
+  def decode_html_url(value) when is_binary(value), do: value
+  def decode_html_url(_), do: {:error, "Unexpected type when decoding Issue.html_url"}
+
+  def encode_html_url(value) when is_binary(value), do: value
+  def encode_html_url(_), do: {:error, "Unexpected type when encoding Issue.html_url"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Issue.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Issue.id"}
+
+  def decode_labels(value) when is_list(value), do: value
+  def decode_labels(_), do: {:error, "Unexpected type when decoding Issue.labels"}
+
+  def encode_labels(value) when is_list(value), do: value
+  def encode_labels(_), do: {:error, "Unexpected type when encoding Issue.labels"}
+
+  def decode_labels_url(value) when is_binary(value), do: value
+  def decode_labels_url(_), do: {:error, "Unexpected type when decoding Issue.labels_url"}
+
+  def encode_labels_url(value) when is_binary(value), do: value
+  def encode_labels_url(_), do: {:error, "Unexpected type when encoding Issue.labels_url"}
+
+  def decode_locked(value) when is_boolean(value), do: value
+  def decode_locked(_), do: {:error, "Unexpected type when decoding Issue.locked"}
+
+  def encode_locked(value) when is_boolean(value), do: value
+  def encode_locked(_), do: {:error, "Unexpected type when encoding Issue.locked"}
+
+  def decode_number(value) when is_integer(value), do: value
+  def decode_number(_), do: {:error, "Unexpected type when decoding Issue.number"}
+
+  def encode_number(value) when is_integer(value), do: value
+  def encode_number(_), do: {:error, "Unexpected type when encoding Issue.number"}
+
+  def decode_repository_url(value) when is_binary(value), do: value
+  def decode_repository_url(_), do: {:error, "Unexpected type when decoding Issue.repository_url"}
+
+  def encode_repository_url(value) when is_binary(value), do: value
+  def encode_repository_url(_), do: {:error, "Unexpected type when encoding Issue.repository_url"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding Issue.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding Issue.state"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Issue.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Issue.title"}
+
+  def decode_updated_at(value) when is_binary(value), do: value
+  def decode_updated_at(_), do: {:error, "Unexpected type when decoding Issue.updated_at"}
+
+  def encode_updated_at(value) when is_binary(value), do: value
+  def encode_updated_at(_), do: {:error, "Unexpected type when encoding Issue.updated_at"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Issue.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Issue.url"}
+
   def from_map(m) do
     %Issue{
-      assignee: m["assignee"],
-      assignees: m["assignees"],
-      body: m["body"],
+      assignee: decode_assignee(m["assignee"]),
+      assignees: decode_assignees(m["assignees"]),
+      body: decode_body(m["body"]),
       closed_at: m["closed_at"],
-      comments: m["comments"],
-      comments_url: m["comments_url"],
-      created_at: m["created_at"],
-      events_url: m["events_url"],
-      html_url: m["html_url"],
-      id: m["id"],
+      comments: decode_comments(m["comments"]),
+      comments_url: decode_comments_url(m["comments_url"]),
+      created_at: decode_created_at(m["created_at"]),
+      events_url: decode_events_url(m["events_url"]),
+      html_url: decode_html_url(m["html_url"]),
+      id: decode_id(m["id"]),
       labels: Enum.map(m["labels"], &Label.from_map/1),
-      labels_url: m["labels_url"],
-      locked: m["locked"],
+      labels_url: decode_labels_url(m["labels_url"]),
+      locked: decode_locked(m["locked"]),
       milestone: m["milestone"] && Milestone.from_map(m["milestone"]),
-      number: m["number"],
+      number: decode_number(m["number"]),
       pull_request: m["pull_request"] && IssuePullRequest.from_map(m["pull_request"]),
-      repository_url: m["repository_url"],
-      state: m["state"],
-      title: m["title"],
-      updated_at: m["updated_at"],
-      url: m["url"],
+      repository_url: decode_repository_url(m["repository_url"]),
+      state: decode_state(m["state"]),
+      title: decode_title(m["title"]),
+      updated_at: decode_updated_at(m["updated_at"]),
+      url: decode_url(m["url"]),
       user: User.from_map(m["user"]),
     }
   end
@@ -649,77 +1093,485 @@ defmodule BaseRepo do
           watchers_count: integer()
         }
 
+  def decode_archive_url(value) when is_binary(value), do: value
+  def decode_archive_url(_), do: {:error, "Unexpected type when decoding BaseRepo.archive_url"}
+
+  def encode_archive_url(value) when is_binary(value), do: value
+  def encode_archive_url(_), do: {:error, "Unexpected type when encoding BaseRepo.archive_url"}
+
+  def decode_assignees_url(value) when is_binary(value), do: value
+  def decode_assignees_url(_), do: {:error, "Unexpected type when decoding BaseRepo.assignees_url"}
+
+  def encode_assignees_url(value) when is_binary(value), do: value
+  def encode_assignees_url(_), do: {:error, "Unexpected type when encoding BaseRepo.assignees_url"}
+
+  def decode_blobs_url(value) when is_binary(value), do: value
+  def decode_blobs_url(_), do: {:error, "Unexpected type when decoding BaseRepo.blobs_url"}
+
+  def encode_blobs_url(value) when is_binary(value), do: value
+  def encode_blobs_url(_), do: {:error, "Unexpected type when encoding BaseRepo.blobs_url"}
+
+  def decode_branches_url(value) when is_binary(value), do: value
+  def decode_branches_url(_), do: {:error, "Unexpected type when decoding BaseRepo.branches_url"}
+
+  def encode_branches_url(value) when is_binary(value), do: value
+  def encode_branches_url(_), do: {:error, "Unexpected type when encoding BaseRepo.branches_url"}
+
+  def decode_clone_url(value) when is_binary(value), do: value
+  def decode_clone_url(_), do: {:error, "Unexpected type when decoding BaseRepo.clone_url"}
+
+  def encode_clone_url(value) when is_binary(value), do: value
+  def encode_clone_url(_), do: {:error, "Unexpected type when encoding BaseRepo.clone_url"}
+
+  def decode_collaborators_url(value) when is_binary(value), do: value
+  def decode_collaborators_url(_), do: {:error, "Unexpected type when decoding BaseRepo.collaborators_url"}
+
+  def encode_collaborators_url(value) when is_binary(value), do: value
+  def encode_collaborators_url(_), do: {:error, "Unexpected type when encoding BaseRepo.collaborators_url"}
+
+  def decode_comments_url(value) when is_binary(value), do: value
+  def decode_comments_url(_), do: {:error, "Unexpected type when decoding BaseRepo.comments_url"}
+
+  def encode_comments_url(value) when is_binary(value), do: value
+  def encode_comments_url(_), do: {:error, "Unexpected type when encoding BaseRepo.comments_url"}
+
+  def decode_commits_url(value) when is_binary(value), do: value
+  def decode_commits_url(_), do: {:error, "Unexpected type when decoding BaseRepo.commits_url"}
+
+  def encode_commits_url(value) when is_binary(value), do: value
+  def encode_commits_url(_), do: {:error, "Unexpected type when encoding BaseRepo.commits_url"}
+
+  def decode_compare_url(value) when is_binary(value), do: value
+  def decode_compare_url(_), do: {:error, "Unexpected type when decoding BaseRepo.compare_url"}
+
+  def encode_compare_url(value) when is_binary(value), do: value
+  def encode_compare_url(_), do: {:error, "Unexpected type when encoding BaseRepo.compare_url"}
+
+  def decode_contents_url(value) when is_binary(value), do: value
+  def decode_contents_url(_), do: {:error, "Unexpected type when decoding BaseRepo.contents_url"}
+
+  def encode_contents_url(value) when is_binary(value), do: value
+  def encode_contents_url(_), do: {:error, "Unexpected type when encoding BaseRepo.contents_url"}
+
+  def decode_contributors_url(value) when is_binary(value), do: value
+  def decode_contributors_url(_), do: {:error, "Unexpected type when decoding BaseRepo.contributors_url"}
+
+  def encode_contributors_url(value) when is_binary(value), do: value
+  def encode_contributors_url(_), do: {:error, "Unexpected type when encoding BaseRepo.contributors_url"}
+
+  def decode_created_at(value) when is_binary(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding BaseRepo.created_at"}
+
+  def encode_created_at(value) when is_binary(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding BaseRepo.created_at"}
+
+  def decode_default_branch(value) when is_binary(value), do: value
+  def decode_default_branch(_), do: {:error, "Unexpected type when decoding BaseRepo.default_branch"}
+
+  def encode_default_branch(value) when is_binary(value), do: value
+  def encode_default_branch(_), do: {:error, "Unexpected type when encoding BaseRepo.default_branch"}
+
+  def decode_deployments_url(value) when is_binary(value), do: value
+  def decode_deployments_url(_), do: {:error, "Unexpected type when decoding BaseRepo.deployments_url"}
+
+  def encode_deployments_url(value) when is_binary(value), do: value
+  def encode_deployments_url(_), do: {:error, "Unexpected type when encoding BaseRepo.deployments_url"}
+
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding BaseRepo.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding BaseRepo.description"}
+
+  def decode_downloads_url(value) when is_binary(value), do: value
+  def decode_downloads_url(_), do: {:error, "Unexpected type when decoding BaseRepo.downloads_url"}
+
+  def encode_downloads_url(value) when is_binary(value), do: value
+  def encode_downloads_url(_), do: {:error, "Unexpected type when encoding BaseRepo.downloads_url"}
+
+  def decode_events_url(value) when is_binary(value), do: value
+  def decode_events_url(_), do: {:error, "Unexpected type when decoding BaseRepo.events_url"}
+
+  def encode_events_url(value) when is_binary(value), do: value
+  def encode_events_url(_), do: {:error, "Unexpected type when encoding BaseRepo.events_url"}
+
+  def decode_fork(value) when is_boolean(value), do: value
+  def decode_fork(_), do: {:error, "Unexpected type when decoding BaseRepo.fork"}
+
+  def encode_fork(value) when is_boolean(value), do: value
+  def encode_fork(_), do: {:error, "Unexpected type when encoding BaseRepo.fork"}
+
+  def decode_forks(value) when is_integer(value), do: value
+  def decode_forks(_), do: {:error, "Unexpected type when decoding BaseRepo.forks"}
+
+  def encode_forks(value) when is_integer(value), do: value
+  def encode_forks(_), do: {:error, "Unexpected type when encoding BaseRepo.forks"}
+
+  def decode_forks_count(value) when is_integer(value), do: value
+  def decode_forks_count(_), do: {:error, "Unexpected type when decoding BaseRepo.forks_count"}
+
+  def encode_forks_count(value) when is_integer(value), do: value
+  def encode_forks_count(_), do: {:error, "Unexpected type when encoding BaseRepo.forks_count"}
+
+  def decode_forks_url(value) when is_binary(value), do: value
+  def decode_forks_url(_), do: {:error, "Unexpected type when decoding BaseRepo.forks_url"}
+
+  def encode_forks_url(value) when is_binary(value), do: value
+  def encode_forks_url(_), do: {:error, "Unexpected type when encoding BaseRepo.forks_url"}
+
+  def decode_full_name(value) when is_binary(value), do: value
+  def decode_full_name(_), do: {:error, "Unexpected type when decoding BaseRepo.full_name"}
+
+  def encode_full_name(value) when is_binary(value), do: value
+  def encode_full_name(_), do: {:error, "Unexpected type when encoding BaseRepo.full_name"}
+
+  def decode_git_commits_url(value) when is_binary(value), do: value
+  def decode_git_commits_url(_), do: {:error, "Unexpected type when decoding BaseRepo.git_commits_url"}
+
+  def encode_git_commits_url(value) when is_binary(value), do: value
+  def encode_git_commits_url(_), do: {:error, "Unexpected type when encoding BaseRepo.git_commits_url"}
+
+  def decode_git_refs_url(value) when is_binary(value), do: value
+  def decode_git_refs_url(_), do: {:error, "Unexpected type when decoding BaseRepo.git_refs_url"}
+
+  def encode_git_refs_url(value) when is_binary(value), do: value
+  def encode_git_refs_url(_), do: {:error, "Unexpected type when encoding BaseRepo.git_refs_url"}
+
+  def decode_git_tags_url(value) when is_binary(value), do: value
+  def decode_git_tags_url(_), do: {:error, "Unexpected type when decoding BaseRepo.git_tags_url"}
+
+  def encode_git_tags_url(value) when is_binary(value), do: value
+  def encode_git_tags_url(_), do: {:error, "Unexpected type when encoding BaseRepo.git_tags_url"}
+
+  def decode_git_url(value) when is_binary(value), do: value
+  def decode_git_url(_), do: {:error, "Unexpected type when decoding BaseRepo.git_url"}
+
+  def encode_git_url(value) when is_binary(value), do: value
+  def encode_git_url(_), do: {:error, "Unexpected type when encoding BaseRepo.git_url"}
+
+  def decode_has_downloads(value) when is_boolean(value), do: value
+  def decode_has_downloads(_), do: {:error, "Unexpected type when decoding BaseRepo.has_downloads"}
+
+  def encode_has_downloads(value) when is_boolean(value), do: value
+  def encode_has_downloads(_), do: {:error, "Unexpected type when encoding BaseRepo.has_downloads"}
+
+  def decode_has_issues(value) when is_boolean(value), do: value
+  def decode_has_issues(_), do: {:error, "Unexpected type when decoding BaseRepo.has_issues"}
+
+  def encode_has_issues(value) when is_boolean(value), do: value
+  def encode_has_issues(_), do: {:error, "Unexpected type when encoding BaseRepo.has_issues"}
+
+  def decode_has_pages(value) when is_boolean(value), do: value
+  def decode_has_pages(_), do: {:error, "Unexpected type when decoding BaseRepo.has_pages"}
+
+  def encode_has_pages(value) when is_boolean(value), do: value
+  def encode_has_pages(_), do: {:error, "Unexpected type when encoding BaseRepo.has_pages"}
+
+  def decode_has_projects(value) when is_boolean(value), do: value
+  def decode_has_projects(_), do: {:error, "Unexpected type when decoding BaseRepo.has_projects"}
+
+  def encode_has_projects(value) when is_boolean(value), do: value
+  def encode_has_projects(_), do: {:error, "Unexpected type when encoding BaseRepo.has_projects"}
+
+  def decode_has_wiki(value) when is_boolean(value), do: value
+  def decode_has_wiki(_), do: {:error, "Unexpected type when decoding BaseRepo.has_wiki"}
+
+  def encode_has_wiki(value) when is_boolean(value), do: value
+  def encode_has_wiki(_), do: {:error, "Unexpected type when encoding BaseRepo.has_wiki"}
+
+  def decode_homepage(value) when is_binary(value), do: value
+  def decode_homepage(_), do: {:error, "Unexpected type when decoding BaseRepo.homepage"}
+
+  def encode_homepage(value) when is_binary(value), do: value
+  def encode_homepage(_), do: {:error, "Unexpected type when encoding BaseRepo.homepage"}
+
+  def decode_hooks_url(value) when is_binary(value), do: value
+  def decode_hooks_url(_), do: {:error, "Unexpected type when decoding BaseRepo.hooks_url"}
+
+  def encode_hooks_url(value) when is_binary(value), do: value
+  def encode_hooks_url(_), do: {:error, "Unexpected type when encoding BaseRepo.hooks_url"}
+
+  def decode_html_url(value) when is_binary(value), do: value
+  def decode_html_url(_), do: {:error, "Unexpected type when decoding BaseRepo.html_url"}
+
+  def encode_html_url(value) when is_binary(value), do: value
+  def encode_html_url(_), do: {:error, "Unexpected type when encoding BaseRepo.html_url"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding BaseRepo.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding BaseRepo.id"}
+
+  def decode_issue_comment_url(value) when is_binary(value), do: value
+  def decode_issue_comment_url(_), do: {:error, "Unexpected type when decoding BaseRepo.issue_comment_url"}
+
+  def encode_issue_comment_url(value) when is_binary(value), do: value
+  def encode_issue_comment_url(_), do: {:error, "Unexpected type when encoding BaseRepo.issue_comment_url"}
+
+  def decode_issue_events_url(value) when is_binary(value), do: value
+  def decode_issue_events_url(_), do: {:error, "Unexpected type when decoding BaseRepo.issue_events_url"}
+
+  def encode_issue_events_url(value) when is_binary(value), do: value
+  def encode_issue_events_url(_), do: {:error, "Unexpected type when encoding BaseRepo.issue_events_url"}
+
+  def decode_issues_url(value) when is_binary(value), do: value
+  def decode_issues_url(_), do: {:error, "Unexpected type when decoding BaseRepo.issues_url"}
+
+  def encode_issues_url(value) when is_binary(value), do: value
+  def encode_issues_url(_), do: {:error, "Unexpected type when encoding BaseRepo.issues_url"}
+
+  def decode_keys_url(value) when is_binary(value), do: value
+  def decode_keys_url(_), do: {:error, "Unexpected type when decoding BaseRepo.keys_url"}
+
+  def encode_keys_url(value) when is_binary(value), do: value
+  def encode_keys_url(_), do: {:error, "Unexpected type when encoding BaseRepo.keys_url"}
+
+  def decode_labels_url(value) when is_binary(value), do: value
+  def decode_labels_url(_), do: {:error, "Unexpected type when decoding BaseRepo.labels_url"}
+
+  def encode_labels_url(value) when is_binary(value), do: value
+  def encode_labels_url(_), do: {:error, "Unexpected type when encoding BaseRepo.labels_url"}
+
+  def decode_language(value) when is_binary(value), do: value
+  def decode_language(_), do: {:error, "Unexpected type when decoding BaseRepo.language"}
+
+  def encode_language(value) when is_binary(value), do: value
+  def encode_language(_), do: {:error, "Unexpected type when encoding BaseRepo.language"}
+
+  def decode_languages_url(value) when is_binary(value), do: value
+  def decode_languages_url(_), do: {:error, "Unexpected type when decoding BaseRepo.languages_url"}
+
+  def encode_languages_url(value) when is_binary(value), do: value
+  def encode_languages_url(_), do: {:error, "Unexpected type when encoding BaseRepo.languages_url"}
+
+  def decode_merges_url(value) when is_binary(value), do: value
+  def decode_merges_url(_), do: {:error, "Unexpected type when decoding BaseRepo.merges_url"}
+
+  def encode_merges_url(value) when is_binary(value), do: value
+  def encode_merges_url(_), do: {:error, "Unexpected type when encoding BaseRepo.merges_url"}
+
+  def decode_milestones_url(value) when is_binary(value), do: value
+  def decode_milestones_url(_), do: {:error, "Unexpected type when decoding BaseRepo.milestones_url"}
+
+  def encode_milestones_url(value) when is_binary(value), do: value
+  def encode_milestones_url(_), do: {:error, "Unexpected type when encoding BaseRepo.milestones_url"}
+
+  def decode_mirror_url(value) when is_nil(value), do: value
+  def decode_mirror_url(_), do: {:error, "Unexpected type when decoding BaseRepo.mirror_url"}
+
+  def encode_mirror_url(value) when is_nil(value), do: value
+  def encode_mirror_url(_), do: {:error, "Unexpected type when encoding BaseRepo.mirror_url"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding BaseRepo.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding BaseRepo.name"}
+
+  def decode_notifications_url(value) when is_binary(value), do: value
+  def decode_notifications_url(_), do: {:error, "Unexpected type when decoding BaseRepo.notifications_url"}
+
+  def encode_notifications_url(value) when is_binary(value), do: value
+  def encode_notifications_url(_), do: {:error, "Unexpected type when encoding BaseRepo.notifications_url"}
+
+  def decode_open_issues(value) when is_integer(value), do: value
+  def decode_open_issues(_), do: {:error, "Unexpected type when decoding BaseRepo.open_issues"}
+
+  def encode_open_issues(value) when is_integer(value), do: value
+  def encode_open_issues(_), do: {:error, "Unexpected type when encoding BaseRepo.open_issues"}
+
+  def decode_open_issues_count(value) when is_integer(value), do: value
+  def decode_open_issues_count(_), do: {:error, "Unexpected type when decoding BaseRepo.open_issues_count"}
+
+  def encode_open_issues_count(value) when is_integer(value), do: value
+  def encode_open_issues_count(_), do: {:error, "Unexpected type when encoding BaseRepo.open_issues_count"}
+
+  def decode_private(value) when is_boolean(value), do: value
+  def decode_private(_), do: {:error, "Unexpected type when decoding BaseRepo.private"}
+
+  def encode_private(value) when is_boolean(value), do: value
+  def encode_private(_), do: {:error, "Unexpected type when encoding BaseRepo.private"}
+
+  def decode_pulls_url(value) when is_binary(value), do: value
+  def decode_pulls_url(_), do: {:error, "Unexpected type when decoding BaseRepo.pulls_url"}
+
+  def encode_pulls_url(value) when is_binary(value), do: value
+  def encode_pulls_url(_), do: {:error, "Unexpected type when encoding BaseRepo.pulls_url"}
+
+  def decode_pushed_at(value) when is_binary(value), do: value
+  def decode_pushed_at(_), do: {:error, "Unexpected type when decoding BaseRepo.pushed_at"}
+
+  def encode_pushed_at(value) when is_binary(value), do: value
+  def encode_pushed_at(_), do: {:error, "Unexpected type when encoding BaseRepo.pushed_at"}
+
+  def decode_releases_url(value) when is_binary(value), do: value
+  def decode_releases_url(_), do: {:error, "Unexpected type when decoding BaseRepo.releases_url"}
+
+  def encode_releases_url(value) when is_binary(value), do: value
+  def encode_releases_url(_), do: {:error, "Unexpected type when encoding BaseRepo.releases_url"}
+
+  def decode_size(value) when is_integer(value), do: value
+  def decode_size(_), do: {:error, "Unexpected type when decoding BaseRepo.size"}
+
+  def encode_size(value) when is_integer(value), do: value
+  def encode_size(_), do: {:error, "Unexpected type when encoding BaseRepo.size"}
+
+  def decode_ssh_url(value) when is_binary(value), do: value
+  def decode_ssh_url(_), do: {:error, "Unexpected type when decoding BaseRepo.ssh_url"}
+
+  def encode_ssh_url(value) when is_binary(value), do: value
+  def encode_ssh_url(_), do: {:error, "Unexpected type when encoding BaseRepo.ssh_url"}
+
+  def decode_stargazers_count(value) when is_integer(value), do: value
+  def decode_stargazers_count(_), do: {:error, "Unexpected type when decoding BaseRepo.stargazers_count"}
+
+  def encode_stargazers_count(value) when is_integer(value), do: value
+  def encode_stargazers_count(_), do: {:error, "Unexpected type when encoding BaseRepo.stargazers_count"}
+
+  def decode_stargazers_url(value) when is_binary(value), do: value
+  def decode_stargazers_url(_), do: {:error, "Unexpected type when decoding BaseRepo.stargazers_url"}
+
+  def encode_stargazers_url(value) when is_binary(value), do: value
+  def encode_stargazers_url(_), do: {:error, "Unexpected type when encoding BaseRepo.stargazers_url"}
+
+  def decode_statuses_url(value) when is_binary(value), do: value
+  def decode_statuses_url(_), do: {:error, "Unexpected type when decoding BaseRepo.statuses_url"}
+
+  def encode_statuses_url(value) when is_binary(value), do: value
+  def encode_statuses_url(_), do: {:error, "Unexpected type when encoding BaseRepo.statuses_url"}
+
+  def decode_subscribers_url(value) when is_binary(value), do: value
+  def decode_subscribers_url(_), do: {:error, "Unexpected type when decoding BaseRepo.subscribers_url"}
+
+  def encode_subscribers_url(value) when is_binary(value), do: value
+  def encode_subscribers_url(_), do: {:error, "Unexpected type when encoding BaseRepo.subscribers_url"}
+
+  def decode_subscription_url(value) when is_binary(value), do: value
+  def decode_subscription_url(_), do: {:error, "Unexpected type when decoding BaseRepo.subscription_url"}
+
+  def encode_subscription_url(value) when is_binary(value), do: value
+  def encode_subscription_url(_), do: {:error, "Unexpected type when encoding BaseRepo.subscription_url"}
+
+  def decode_svn_url(value) when is_binary(value), do: value
+  def decode_svn_url(_), do: {:error, "Unexpected type when decoding BaseRepo.svn_url"}
+
+  def encode_svn_url(value) when is_binary(value), do: value
+  def encode_svn_url(_), do: {:error, "Unexpected type when encoding BaseRepo.svn_url"}
+
+  def decode_tags_url(value) when is_binary(value), do: value
+  def decode_tags_url(_), do: {:error, "Unexpected type when decoding BaseRepo.tags_url"}
+
+  def encode_tags_url(value) when is_binary(value), do: value
+  def encode_tags_url(_), do: {:error, "Unexpected type when encoding BaseRepo.tags_url"}
+
+  def decode_teams_url(value) when is_binary(value), do: value
+  def decode_teams_url(_), do: {:error, "Unexpected type when decoding BaseRepo.teams_url"}
+
+  def encode_teams_url(value) when is_binary(value), do: value
+  def encode_teams_url(_), do: {:error, "Unexpected type when encoding BaseRepo.teams_url"}
+
+  def decode_trees_url(value) when is_binary(value), do: value
+  def decode_trees_url(_), do: {:error, "Unexpected type when decoding BaseRepo.trees_url"}
+
+  def encode_trees_url(value) when is_binary(value), do: value
+  def encode_trees_url(_), do: {:error, "Unexpected type when encoding BaseRepo.trees_url"}
+
+  def decode_updated_at(value) when is_binary(value), do: value
+  def decode_updated_at(_), do: {:error, "Unexpected type when decoding BaseRepo.updated_at"}
+
+  def encode_updated_at(value) when is_binary(value), do: value
+  def encode_updated_at(_), do: {:error, "Unexpected type when encoding BaseRepo.updated_at"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding BaseRepo.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding BaseRepo.url"}
+
+  def decode_watchers(value) when is_integer(value), do: value
+  def decode_watchers(_), do: {:error, "Unexpected type when decoding BaseRepo.watchers"}
+
+  def encode_watchers(value) when is_integer(value), do: value
+  def encode_watchers(_), do: {:error, "Unexpected type when encoding BaseRepo.watchers"}
+
+  def decode_watchers_count(value) when is_integer(value), do: value
+  def decode_watchers_count(_), do: {:error, "Unexpected type when decoding BaseRepo.watchers_count"}
+
+  def encode_watchers_count(value) when is_integer(value), do: value
+  def encode_watchers_count(_), do: {:error, "Unexpected type when encoding BaseRepo.watchers_count"}
+
   def from_map(m) do
     %BaseRepo{
-      archive_url: m["archive_url"],
-      assignees_url: m["assignees_url"],
-      blobs_url: m["blobs_url"],
-      branches_url: m["branches_url"],
-      clone_url: m["clone_url"],
-      collaborators_url: m["collaborators_url"],
-      comments_url: m["comments_url"],
-      commits_url: m["commits_url"],
-      compare_url: m["compare_url"],
-      contents_url: m["contents_url"],
-      contributors_url: m["contributors_url"],
-      created_at: m["created_at"],
-      default_branch: m["default_branch"],
-      deployments_url: m["deployments_url"],
-      description: m["description"],
-      downloads_url: m["downloads_url"],
-      events_url: m["events_url"],
-      fork: m["fork"],
-      forks: m["forks"],
-      forks_count: m["forks_count"],
-      forks_url: m["forks_url"],
-      full_name: m["full_name"],
-      git_commits_url: m["git_commits_url"],
-      git_refs_url: m["git_refs_url"],
-      git_tags_url: m["git_tags_url"],
-      git_url: m["git_url"],
-      has_downloads: m["has_downloads"],
-      has_issues: m["has_issues"],
-      has_pages: m["has_pages"],
-      has_projects: m["has_projects"],
-      has_wiki: m["has_wiki"],
-      homepage: m["homepage"],
-      hooks_url: m["hooks_url"],
-      html_url: m["html_url"],
-      id: m["id"],
-      issue_comment_url: m["issue_comment_url"],
-      issue_events_url: m["issue_events_url"],
-      issues_url: m["issues_url"],
-      keys_url: m["keys_url"],
-      labels_url: m["labels_url"],
-      language: m["language"],
-      languages_url: m["languages_url"],
-      merges_url: m["merges_url"],
-      milestones_url: m["milestones_url"],
-      mirror_url: m["mirror_url"],
-      name: m["name"],
-      notifications_url: m["notifications_url"],
-      open_issues: m["open_issues"],
-      open_issues_count: m["open_issues_count"],
+      archive_url: decode_archive_url(m["archive_url"]),
+      assignees_url: decode_assignees_url(m["assignees_url"]),
+      blobs_url: decode_blobs_url(m["blobs_url"]),
+      branches_url: decode_branches_url(m["branches_url"]),
+      clone_url: decode_clone_url(m["clone_url"]),
+      collaborators_url: decode_collaborators_url(m["collaborators_url"]),
+      comments_url: decode_comments_url(m["comments_url"]),
+      commits_url: decode_commits_url(m["commits_url"]),
+      compare_url: decode_compare_url(m["compare_url"]),
+      contents_url: decode_contents_url(m["contents_url"]),
+      contributors_url: decode_contributors_url(m["contributors_url"]),
+      created_at: decode_created_at(m["created_at"]),
+      default_branch: decode_default_branch(m["default_branch"]),
+      deployments_url: decode_deployments_url(m["deployments_url"]),
+      description: decode_description(m["description"]),
+      downloads_url: decode_downloads_url(m["downloads_url"]),
+      events_url: decode_events_url(m["events_url"]),
+      fork: decode_fork(m["fork"]),
+      forks: decode_forks(m["forks"]),
+      forks_count: decode_forks_count(m["forks_count"]),
+      forks_url: decode_forks_url(m["forks_url"]),
+      full_name: decode_full_name(m["full_name"]),
+      git_commits_url: decode_git_commits_url(m["git_commits_url"]),
+      git_refs_url: decode_git_refs_url(m["git_refs_url"]),
+      git_tags_url: decode_git_tags_url(m["git_tags_url"]),
+      git_url: decode_git_url(m["git_url"]),
+      has_downloads: decode_has_downloads(m["has_downloads"]),
+      has_issues: decode_has_issues(m["has_issues"]),
+      has_pages: decode_has_pages(m["has_pages"]),
+      has_projects: decode_has_projects(m["has_projects"]),
+      has_wiki: decode_has_wiki(m["has_wiki"]),
+      homepage: decode_homepage(m["homepage"]),
+      hooks_url: decode_hooks_url(m["hooks_url"]),
+      html_url: decode_html_url(m["html_url"]),
+      id: decode_id(m["id"]),
+      issue_comment_url: decode_issue_comment_url(m["issue_comment_url"]),
+      issue_events_url: decode_issue_events_url(m["issue_events_url"]),
+      issues_url: decode_issues_url(m["issues_url"]),
+      keys_url: decode_keys_url(m["keys_url"]),
+      labels_url: decode_labels_url(m["labels_url"]),
+      language: decode_language(m["language"]),
+      languages_url: decode_languages_url(m["languages_url"]),
+      merges_url: decode_merges_url(m["merges_url"]),
+      milestones_url: decode_milestones_url(m["milestones_url"]),
+      mirror_url: decode_mirror_url(m["mirror_url"]),
+      name: decode_name(m["name"]),
+      notifications_url: decode_notifications_url(m["notifications_url"]),
+      open_issues: decode_open_issues(m["open_issues"]),
+      open_issues_count: decode_open_issues_count(m["open_issues_count"]),
       owner: User.from_map(m["owner"]),
-      private: m["private"],
-      pulls_url: m["pulls_url"],
-      pushed_at: m["pushed_at"],
-      releases_url: m["releases_url"],
-      size: m["size"],
-      ssh_url: m["ssh_url"],
-      stargazers_count: m["stargazers_count"],
-      stargazers_url: m["stargazers_url"],
-      statuses_url: m["statuses_url"],
-      subscribers_url: m["subscribers_url"],
-      subscription_url: m["subscription_url"],
-      svn_url: m["svn_url"],
-      tags_url: m["tags_url"],
-      teams_url: m["teams_url"],
-      trees_url: m["trees_url"],
-      updated_at: m["updated_at"],
-      url: m["url"],
-      watchers: m["watchers"],
-      watchers_count: m["watchers_count"],
+      private: decode_private(m["private"]),
+      pulls_url: decode_pulls_url(m["pulls_url"]),
+      pushed_at: decode_pushed_at(m["pushed_at"]),
+      releases_url: decode_releases_url(m["releases_url"]),
+      size: decode_size(m["size"]),
+      ssh_url: decode_ssh_url(m["ssh_url"]),
+      stargazers_count: decode_stargazers_count(m["stargazers_count"]),
+      stargazers_url: decode_stargazers_url(m["stargazers_url"]),
+      statuses_url: decode_statuses_url(m["statuses_url"]),
+      subscribers_url: decode_subscribers_url(m["subscribers_url"]),
+      subscription_url: decode_subscription_url(m["subscription_url"]),
+      svn_url: decode_svn_url(m["svn_url"]),
+      tags_url: decode_tags_url(m["tags_url"]),
+      teams_url: decode_teams_url(m["teams_url"]),
+      trees_url: decode_trees_url(m["trees_url"]),
+      updated_at: decode_updated_at(m["updated_at"]),
+      url: decode_url(m["url"]),
+      watchers: decode_watchers(m["watchers"]),
+      watchers_count: decode_watchers_count(m["watchers_count"]),
     }
   end
 
@@ -822,12 +1674,30 @@ defmodule BaseClass do
           user: User.t()
         }
 
+  def decode_label(value) when is_binary(value), do: value
+  def decode_label(_), do: {:error, "Unexpected type when decoding BaseClass.label"}
+
+  def encode_label(value) when is_binary(value), do: value
+  def encode_label(_), do: {:error, "Unexpected type when encoding BaseClass.label"}
+
+  def decode_ref(value) when is_binary(value), do: value
+  def decode_ref(_), do: {:error, "Unexpected type when decoding BaseClass.ref"}
+
+  def encode_ref(value) when is_binary(value), do: value
+  def encode_ref(_), do: {:error, "Unexpected type when encoding BaseClass.ref"}
+
+  def decode_sha(value) when is_binary(value), do: value
+  def decode_sha(_), do: {:error, "Unexpected type when decoding BaseClass.sha"}
+
+  def encode_sha(value) when is_binary(value), do: value
+  def encode_sha(_), do: {:error, "Unexpected type when encoding BaseClass.sha"}
+
   def from_map(m) do
     %BaseClass{
-      label: m["label"],
-      ref: m["ref"],
+      label: decode_label(m["label"]),
+      ref: decode_ref(m["ref"]),
       repo: BaseRepo.from_map(m["repo"]),
-      sha: m["sha"],
+      sha: decode_sha(m["sha"]),
       user: User.from_map(m["user"]),
     }
   end
@@ -863,9 +1733,15 @@ defmodule Comments do
           href: String.t()
         }
 
+  def decode_href(value) when is_binary(value), do: value
+  def decode_href(_), do: {:error, "Unexpected type when decoding Comments.href"}
+
+  def encode_href(value) when is_binary(value), do: value
+  def encode_href(_), do: {:error, "Unexpected type when encoding Comments.href"}
+
   def from_map(m) do
     %Comments{
-      href: m["href"],
+      href: decode_href(m["href"]),
     }
   end
 
@@ -990,48 +1866,264 @@ defmodule PayloadPullRequest do
           user: User.t()
         }
 
+  def decode_additions(value) when is_integer(value), do: value
+  def decode_additions(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.additions"}
+
+  def encode_additions(value) when is_integer(value), do: value
+  def encode_additions(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.additions"}
+
+  def decode_assignee(value) when is_nil(value), do: value
+  def decode_assignee(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.assignee"}
+
+  def encode_assignee(value) when is_nil(value), do: value
+  def encode_assignee(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.assignee"}
+
+  def decode_assignees(value) when is_list(value), do: value
+  def decode_assignees(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.assignees"}
+
+  def encode_assignees(value) when is_list(value), do: value
+  def encode_assignees(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.assignees"}
+
+  def decode_body(value) when is_binary(value), do: value
+  def decode_body(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.body"}
+
+  def encode_body(value) when is_binary(value), do: value
+  def encode_body(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.body"}
+
+  def decode_changed_files(value) when is_integer(value), do: value
+  def decode_changed_files(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.changed_files"}
+
+  def encode_changed_files(value) when is_integer(value), do: value
+  def encode_changed_files(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.changed_files"}
+
+  def decode_closed_at(value) when is_binary(value), do: value
+  def decode_closed_at(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.closed_at"}
+
+  def encode_closed_at(value) when is_binary(value), do: value
+  def encode_closed_at(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.closed_at"}
+
+  def decode_comments(value) when is_integer(value), do: value
+  def decode_comments(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.comments"}
+
+  def encode_comments(value) when is_integer(value), do: value
+  def encode_comments(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.comments"}
+
+  def decode_comments_url(value) when is_binary(value), do: value
+  def decode_comments_url(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.comments_url"}
+
+  def encode_comments_url(value) when is_binary(value), do: value
+  def encode_comments_url(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.comments_url"}
+
+  def decode_commits(value) when is_integer(value), do: value
+  def decode_commits(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.commits"}
+
+  def encode_commits(value) when is_integer(value), do: value
+  def encode_commits(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.commits"}
+
+  def decode_commits_url(value) when is_binary(value), do: value
+  def decode_commits_url(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.commits_url"}
+
+  def encode_commits_url(value) when is_binary(value), do: value
+  def encode_commits_url(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.commits_url"}
+
+  def decode_created_at(value) when is_binary(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.created_at"}
+
+  def encode_created_at(value) when is_binary(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.created_at"}
+
+  def decode_deletions(value) when is_integer(value), do: value
+  def decode_deletions(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.deletions"}
+
+  def encode_deletions(value) when is_integer(value), do: value
+  def encode_deletions(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.deletions"}
+
+  def decode_diff_url(value) when is_binary(value), do: value
+  def decode_diff_url(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.diff_url"}
+
+  def encode_diff_url(value) when is_binary(value), do: value
+  def encode_diff_url(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.diff_url"}
+
+  def decode_html_url(value) when is_binary(value), do: value
+  def decode_html_url(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.html_url"}
+
+  def encode_html_url(value) when is_binary(value), do: value
+  def encode_html_url(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.html_url"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.id"}
+
+  def decode_issue_url(value) when is_binary(value), do: value
+  def decode_issue_url(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.issue_url"}
+
+  def encode_issue_url(value) when is_binary(value), do: value
+  def encode_issue_url(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.issue_url"}
+
+  def decode_locked(value) when is_boolean(value), do: value
+  def decode_locked(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.locked"}
+
+  def encode_locked(value) when is_boolean(value), do: value
+  def encode_locked(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.locked"}
+
+  def decode_maintainer_can_modify(value) when is_boolean(value), do: value
+  def decode_maintainer_can_modify(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.maintainer_can_modify"}
+
+  def encode_maintainer_can_modify(value) when is_boolean(value), do: value
+  def encode_maintainer_can_modify(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.maintainer_can_modify"}
+
+  def decode_merge_commit_sha(value) when is_binary(value), do: value
+  def decode_merge_commit_sha(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.merge_commit_sha"}
+
+  def encode_merge_commit_sha(value) when is_binary(value), do: value
+  def encode_merge_commit_sha(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.merge_commit_sha"}
+
+  def decode_mergeable(value) when is_nil(value), do: value
+  def decode_mergeable(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.mergeable"}
+
+  def encode_mergeable(value) when is_nil(value), do: value
+  def encode_mergeable(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.mergeable"}
+
+  def decode_mergeable_state(value) when is_binary(value), do: value
+  def decode_mergeable_state(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.mergeable_state"}
+
+  def encode_mergeable_state(value) when is_binary(value), do: value
+  def encode_mergeable_state(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.mergeable_state"}
+
+  def decode_merged(value) when is_boolean(value), do: value
+  def decode_merged(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.merged"}
+
+  def encode_merged(value) when is_boolean(value), do: value
+  def encode_merged(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.merged"}
+
+  def decode_merged_at(value) when is_binary(value), do: value
+  def decode_merged_at(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.merged_at"}
+
+  def encode_merged_at(value) when is_binary(value), do: value
+  def encode_merged_at(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.merged_at"}
+
+  def decode_milestone(value) when is_nil(value), do: value
+  def decode_milestone(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.milestone"}
+
+  def encode_milestone(value) when is_nil(value), do: value
+  def encode_milestone(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.milestone"}
+
+  def decode_number(value) when is_integer(value), do: value
+  def decode_number(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.number"}
+
+  def encode_number(value) when is_integer(value), do: value
+  def encode_number(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.number"}
+
+  def decode_patch_url(value) when is_binary(value), do: value
+  def decode_patch_url(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.patch_url"}
+
+  def encode_patch_url(value) when is_binary(value), do: value
+  def encode_patch_url(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.patch_url"}
+
+  def decode_rebaseable(value) when is_nil(value), do: value
+  def decode_rebaseable(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.rebaseable"}
+
+  def encode_rebaseable(value) when is_nil(value), do: value
+  def encode_rebaseable(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.rebaseable"}
+
+  def decode_requested_reviewers(value) when is_list(value), do: value
+  def decode_requested_reviewers(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.requested_reviewers"}
+
+  def encode_requested_reviewers(value) when is_list(value), do: value
+  def encode_requested_reviewers(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.requested_reviewers"}
+
+  def decode_review_comment_url(value) when is_binary(value), do: value
+  def decode_review_comment_url(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.review_comment_url"}
+
+  def encode_review_comment_url(value) when is_binary(value), do: value
+  def encode_review_comment_url(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.review_comment_url"}
+
+  def decode_review_comments(value) when is_integer(value), do: value
+  def decode_review_comments(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.review_comments"}
+
+  def encode_review_comments(value) when is_integer(value), do: value
+  def encode_review_comments(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.review_comments"}
+
+  def decode_review_comments_url(value) when is_binary(value), do: value
+  def decode_review_comments_url(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.review_comments_url"}
+
+  def encode_review_comments_url(value) when is_binary(value), do: value
+  def encode_review_comments_url(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.review_comments_url"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.state"}
+
+  def decode_statuses_url(value) when is_binary(value), do: value
+  def decode_statuses_url(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.statuses_url"}
+
+  def encode_statuses_url(value) when is_binary(value), do: value
+  def encode_statuses_url(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.statuses_url"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.title"}
+
+  def decode_updated_at(value) when is_binary(value), do: value
+  def decode_updated_at(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.updated_at"}
+
+  def encode_updated_at(value) when is_binary(value), do: value
+  def encode_updated_at(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.updated_at"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding PayloadPullRequest.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding PayloadPullRequest.url"}
+
   def from_map(m) do
     %PayloadPullRequest{
-      additions: m["additions"],
-      assignee: m["assignee"],
-      assignees: m["assignees"],
+      additions: decode_additions(m["additions"]),
+      assignee: decode_assignee(m["assignee"]),
+      assignees: decode_assignees(m["assignees"]),
       base: BaseClass.from_map(m["base"]),
-      body: m["body"],
-      changed_files: m["changed_files"],
-      closed_at: m["closed_at"],
-      comments: m["comments"],
-      comments_url: m["comments_url"],
-      commits: m["commits"],
-      commits_url: m["commits_url"],
-      created_at: m["created_at"],
-      deletions: m["deletions"],
-      diff_url: m["diff_url"],
+      body: decode_body(m["body"]),
+      changed_files: decode_changed_files(m["changed_files"]),
+      closed_at: decode_closed_at(m["closed_at"]),
+      comments: decode_comments(m["comments"]),
+      comments_url: decode_comments_url(m["comments_url"]),
+      commits: decode_commits(m["commits"]),
+      commits_url: decode_commits_url(m["commits_url"]),
+      created_at: decode_created_at(m["created_at"]),
+      deletions: decode_deletions(m["deletions"]),
+      diff_url: decode_diff_url(m["diff_url"]),
       head: BaseClass.from_map(m["head"]),
-      html_url: m["html_url"],
-      id: m["id"],
-      issue_url: m["issue_url"],
+      html_url: decode_html_url(m["html_url"]),
+      id: decode_id(m["id"]),
+      issue_url: decode_issue_url(m["issue_url"]),
       links: Links.from_map(m["_links"]),
-      locked: m["locked"],
-      maintainer_can_modify: m["maintainer_can_modify"],
-      merge_commit_sha: m["merge_commit_sha"],
-      mergeable: m["mergeable"],
-      mergeable_state: m["mergeable_state"],
-      merged: m["merged"],
-      merged_at: m["merged_at"],
+      locked: decode_locked(m["locked"]),
+      maintainer_can_modify: decode_maintainer_can_modify(m["maintainer_can_modify"]),
+      merge_commit_sha: decode_merge_commit_sha(m["merge_commit_sha"]),
+      mergeable: decode_mergeable(m["mergeable"]),
+      mergeable_state: decode_mergeable_state(m["mergeable_state"]),
+      merged: decode_merged(m["merged"]),
+      merged_at: decode_merged_at(m["merged_at"]),
       merged_by: User.from_map(m["merged_by"]),
-      milestone: m["milestone"],
-      number: m["number"],
-      patch_url: m["patch_url"],
-      rebaseable: m["rebaseable"],
-      requested_reviewers: m["requested_reviewers"],
-      review_comment_url: m["review_comment_url"],
-      review_comments: m["review_comments"],
-      review_comments_url: m["review_comments_url"],
-      state: m["state"],
-      statuses_url: m["statuses_url"],
-      title: m["title"],
-      updated_at: m["updated_at"],
-      url: m["url"],
+      milestone: decode_milestone(m["milestone"]),
+      number: decode_number(m["number"]),
+      patch_url: decode_patch_url(m["patch_url"]),
+      rebaseable: decode_rebaseable(m["rebaseable"]),
+      requested_reviewers: decode_requested_reviewers(m["requested_reviewers"]),
+      review_comment_url: decode_review_comment_url(m["review_comment_url"]),
+      review_comments: decode_review_comments(m["review_comments"]),
+      review_comments_url: decode_review_comments_url(m["review_comments_url"]),
+      state: decode_state(m["state"]),
+      statuses_url: decode_statuses_url(m["statuses_url"]),
+      title: decode_title(m["title"]),
+      updated_at: decode_updated_at(m["updated_at"]),
+      url: decode_url(m["url"]),
       user: User.from_map(m["user"]),
     }
   end
@@ -1182,11 +2274,29 @@ defmodule TopLevelRepo do
           url: String.t()
         }
 
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelRepo.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelRepo.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevelRepo.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevelRepo.name"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding TopLevelRepo.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding TopLevelRepo.url"}
+
   def from_map(m) do
     %TopLevelRepo{
-      id: m["id"],
-      name: m["name"],
-      url: m["url"],
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
+      url: decode_url(m["url"]),
     }
   end
 
@@ -1226,16 +2336,40 @@ defmodule TopLevelElement do
           type: String.t()
         }
 
+  def decode_created_at(value) when is_binary(value), do: value
+  def decode_created_at(_), do: {:error, "Unexpected type when decoding TopLevelElement.created_at"}
+
+  def encode_created_at(value) when is_binary(value), do: value
+  def encode_created_at(_), do: {:error, "Unexpected type when encoding TopLevelElement.created_at"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevelElement.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevelElement.id"}
+
+  def decode_public(value) when is_boolean(value), do: value
+  def decode_public(_), do: {:error, "Unexpected type when decoding TopLevelElement.public"}
+
+  def encode_public(value) when is_boolean(value), do: value
+  def encode_public(_), do: {:error, "Unexpected type when encoding TopLevelElement.public"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding TopLevelElement.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding TopLevelElement.type"}
+
   def from_map(m) do
     %TopLevelElement{
       actor: Actor.from_map(m["actor"]),
-      created_at: m["created_at"],
-      id: m["id"],
+      created_at: decode_created_at(m["created_at"]),
+      id: decode_id(m["id"]),
       org: m["org"] && Actor.from_map(m["org"]),
       payload: Payload.from_map(m["payload"]),
-      public: m["public"],
+      public: decode_public(m["public"]),
       repo: TopLevelRepo.from_map(m["repo"]),
-      type: m["type"],
+      type: decode_type(m["type"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/samples/kitchen-sink.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/kitchen-sink.json/default/QuickType.ex
index 77eee54..8d5aac5 100644
--- a/base/elixir/test/inputs/json/samples/kitchen-sink.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/samples/kitchen-sink.json/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule DifferentThingClass do
           name: String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding DifferentThingClass.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding DifferentThingClass.name"}
+
   def from_map(m) do
     %DifferentThingClass{
-      name: m["name"],
+      name: decode_name(m["name"]),
     }
   end
 
@@ -48,10 +54,16 @@ defmodule PersonElement do
           optional_value: boolean() | nil
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding PersonElement.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding PersonElement.name"}
+
   def from_map(m) do
     %PersonElement{
       int_or_string: m["intOrString"],
-      name: m["name"],
+      name: decode_name(m["name"]),
       optional_value: m["optionalValue"],
     }
   end
@@ -86,10 +98,22 @@ defmodule Person1 do
           name: String.t()
         }
 
+  def decode_int_or_string(value) when is_integer(value), do: value
+  def decode_int_or_string(_), do: {:error, "Unexpected type when decoding Person1.int_or_string"}
+
+  def encode_int_or_string(value) when is_integer(value), do: value
+  def encode_int_or_string(_), do: {:error, "Unexpected type when encoding Person1.int_or_string"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Person1.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Person1.name"}
+
   def from_map(m) do
     %Person1{
-      int_or_string: m["intOrString"],
-      name: m["name"],
+      int_or_string: decode_int_or_string(m["intOrString"]),
+      name: decode_name(m["name"]),
     }
   end
 
@@ -134,6 +158,24 @@ defmodule TopLevel do
           uuid_value: String.t()
         }
 
+  def decode_boolean_value(value) when is_boolean(value), do: value
+  def decode_boolean_value(_), do: {:error, "Unexpected type when decoding TopLevel.boolean_value"}
+
+  def encode_boolean_value(value) when is_boolean(value), do: value
+  def encode_boolean_value(_), do: {:error, "Unexpected type when encoding TopLevel.boolean_value"}
+
+  def decode_date_value(value) when is_binary(value), do: value
+  def decode_date_value(_), do: {:error, "Unexpected type when decoding TopLevel.date_value"}
+
+  def encode_date_value(value) when is_binary(value), do: value
+  def encode_date_value(_), do: {:error, "Unexpected type when encoding TopLevel.date_value"}
+
+  def decode_different_things(value) when is_list(value), do: value
+  def decode_different_things(_), do: {:error, "Unexpected type when decoding TopLevel.different_things"}
+
+  def encode_different_things(value) when is_list(value), do: value
+  def encode_different_things(_), do: {:error, "Unexpected type when encoding TopLevel.different_things"}
+
   def decode_different_things_element(%{"name" => _,} = value), do: DifferentThingClass.from_map(value)
   def decode_different_things_element(value) when is_integer(value), do: value
   def decode_different_things_element(value) when is_binary(value), do: value
@@ -144,6 +186,20 @@ defmodule TopLevel do
   def encode_different_things_element(value) when is_binary(value), do: value
   def encode_different_things_element(_), do: {:error, "Unexpected type when encoding TopLevel.different_things"}
 
+  def decode_double_value(value) when is_float(value), do: value
+  def decode_double_value(value) when is_integer(value), do: value
+  def decode_double_value(_), do: {:error, "Unexpected type when decoding TopLevel.double_value"}
+
+  def encode_double_value(value) when is_float(value), do: value
+  def encode_double_value(value) when is_integer(value), do: value
+  def encode_double_value(_), do: {:error, "Unexpected type when encoding TopLevel.double_value"}
+
+  def decode_int_value(value) when is_integer(value), do: value
+  def decode_int_value(_), do: {:error, "Unexpected type when decoding TopLevel.int_value"}
+
+  def encode_int_value(value) when is_integer(value), do: value
+  def encode_int_value(_), do: {:error, "Unexpected type when encoding TopLevel.int_value"}
+
   def decode_map_value_value(value) when is_integer(value), do: value
   def decode_map_value_value(value) when is_nil(value), do: value
   def decode_map_value_value(_), do: {:error, "Unexpected type when decoding TopLevel.map_value"}
@@ -152,6 +208,18 @@ defmodule TopLevel do
   def encode_map_value_value(value) when is_nil(value), do: value
   def encode_map_value_value(_), do: {:error, "Unexpected type when encoding TopLevel.map_value"}
 
+  def decode_name_with_spaces(value) when is_nil(value), do: value
+  def decode_name_with_spaces(_), do: {:error, "Unexpected type when decoding TopLevel.name_with_spaces"}
+
+  def encode_name_with_spaces(value) when is_nil(value), do: value
+  def encode_name_with_spaces(_), do: {:error, "Unexpected type when encoding TopLevel.name_with_spaces"}
+
+  def decode_null_value(value) when is_nil(value), do: value
+  def decode_null_value(_), do: {:error, "Unexpected type when decoding TopLevel.null_value"}
+
+  def encode_null_value(value) when is_nil(value), do: value
+  def encode_null_value(_), do: {:error, "Unexpected type when encoding TopLevel.null_value"}
+
   def decode_nullable_map_value_value(value) when is_integer(value), do: value
   def decode_nullable_map_value_value(value) when is_nil(value), do: value
   def decode_nullable_map_value_value(_), do: {:error, "Unexpected type when decoding TopLevel.nullable_map_value"}
@@ -160,22 +228,48 @@ defmodule TopLevel do
   def encode_nullable_map_value_value(value) when is_nil(value), do: value
   def encode_nullable_map_value_value(_), do: {:error, "Unexpected type when encoding TopLevel.nullable_map_value"}
 
+  def decode_people(value) when is_list(value), do: value
+  def decode_people(_), do: {:error, "Unexpected type when decoding TopLevel.people"}
+
+  def encode_people(value) when is_list(value), do: value
+  def encode_people(_), do: {:error, "Unexpected type when encoding TopLevel.people"}
+
+  def decode_string_value(value) when is_binary(value), do: value
+  def decode_string_value(_), do: {:error, "Unexpected type when decoding TopLevel.string_value"}
+
+  def encode_string_value(value) when is_binary(value), do: value
+  def encode_string_value(_), do: {:error, "Unexpected type when encoding TopLevel.string_value"}
+
+  def decode_tuples(value) when is_list(value), do: value
+  def decode_tuples(_), do: {:error, "Unexpected type when decoding TopLevel.tuples"}
+
+  def encode_tuples(value) when is_list(value), do: value
+  def encode_tuples(_), do: {:error, "Unexpected type when encoding TopLevel.tuples"}
+
+  def decode_uuid_value(value) when is_binary(value), do: value
+  def decode_uuid_value(_), do: {:error, "Unexpected type when decoding TopLevel.uuid_value"}
+
+  def encode_uuid_value(value) when is_binary(value), do: value
+  def encode_uuid_value(_), do: {:error, "Unexpected type when encoding TopLevel.uuid_value"}
+
   def from_map(m) do
     %TopLevel{
-      boolean_value: m["booleanValue"],
-      date_value: m["dateValue"],
+      boolean_value: decode_boolean_value(m["booleanValue"]),
+      date_value: decode_date_value(m["dateValue"]),
       different_things: Enum.map(m["differentThings"], &decode_different_things_element/1),
-      double_value: m["doubleValue"],
-      int_value: m["intValue"],
-      map_value: m["mapValue"],
-      name_with_spaces: m["name with spaces"],
-      null_value: m["nullValue"],
-      nullable_map_value: m["nullableMapValue"],
+      double_value: decode_double_value(m["doubleValue"]),
+      int_value: decode_int_value(m["intValue"]),
+      map_value: m["mapValue"]
+      |> Map.new(fn {key, value} -> {key, decode_map_value_value(value)} end),
+      name_with_spaces: decode_name_with_spaces(m["name with spaces"]),
+      null_value: decode_null_value(m["nullValue"]),
+      nullable_map_value: m["nullableMapValue"]
+      |> Map.new(fn {key, value} -> {key, decode_nullable_map_value_value(value)} end),
       people: Enum.map(m["people"], &PersonElement.from_map/1),
       person: Person1.from_map(m["person"]),
-      string_value: m["stringValue"],
-      tuples: m["tuples"],
-      uuid_value: m["uuidValue"],
+      string_value: decode_string_value(m["stringValue"]),
+      tuples: decode_tuples(m["tuples"]),
+      uuid_value: decode_uuid_value(m["uuidValue"]),
     }
   end
 
@@ -192,10 +286,12 @@ defmodule TopLevel do
       "differentThings" => struct.different_things && Enum.map(struct.different_things, &encode_different_things_element/1),
       "doubleValue" => struct.double_value,
       "intValue" => struct.int_value,
-      "mapValue" => struct.map_value,
+      "mapValue" => struct.map_value
+      |> Map.new(fn {key, value} -> {key, encode_map_value_value(value)} end),
       "name with spaces" => struct.name_with_spaces,
       "nullValue" => struct.null_value,
-      "nullableMapValue" => struct.nullable_map_value,
+      "nullableMapValue" => struct.nullable_map_value
+      |> Map.new(fn {key, value} -> {key, encode_nullable_map_value_value(value)} end),
       "people" => struct.people && Enum.map(struct.people, &PersonElement.to_map/1),
       "person" => Person1.to_map(struct.person),
       "stringValue" => struct.string_value,
diff --git a/base/elixir/test/inputs/json/samples/null-safe.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/null-safe.json/default/QuickType.ex
index 9d068c0..479bbf8 100644
--- a/base/elixir/test/inputs/json/samples/null-safe.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/samples/null-safe.json/default/QuickType.ex
@@ -15,11 +15,29 @@ defmodule Address do
           street: String.t()
         }
 
+  def decode_city(value) when is_binary(value), do: value
+  def decode_city(_), do: {:error, "Unexpected type when decoding Address.city"}
+
+  def encode_city(value) when is_binary(value), do: value
+  def encode_city(_), do: {:error, "Unexpected type when encoding Address.city"}
+
+  def decode_country(value) when is_binary(value), do: value
+  def decode_country(_), do: {:error, "Unexpected type when decoding Address.country"}
+
+  def encode_country(value) when is_binary(value), do: value
+  def encode_country(_), do: {:error, "Unexpected type when encoding Address.country"}
+
+  def decode_street(value) when is_binary(value), do: value
+  def decode_street(_), do: {:error, "Unexpected type when decoding Address.street"}
+
+  def encode_street(value) when is_binary(value), do: value
+  def encode_street(_), do: {:error, "Unexpected type when encoding Address.street"}
+
   def from_map(m) do
     %Address{
-      city: m["city"],
-      country: m["country"],
-      street: m["street"],
+      city: decode_city(m["city"]),
+      country: decode_country(m["country"]),
+      street: decode_street(m["street"]),
     }
   end
 
@@ -55,11 +73,17 @@ defmodule Item do
           sex: integer() | nil
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Item.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Item.name"}
+
   def from_map(m) do
     %Item{
       address: m["address"] && Address.from_map(m["address"]),
       created_at: m["created_at"],
-      name: m["name"],
+      name: decode_name(m["name"]),
       sex: m["sex"],
     }
   end
@@ -94,6 +118,12 @@ defmodule TopLevel do
           item: [Item.t()]
         }
 
+  def decode_item(value) when is_list(value), do: value
+  def decode_item(_), do: {:error, "Unexpected type when decoding TopLevel.item"}
+
+  def encode_item(value) when is_list(value), do: value
+  def encode_item(_), do: {:error, "Unexpected type when encoding TopLevel.item"}
+
   def from_map(m) do
     %TopLevel{
       item: Enum.map(m["item"], &Item.from_map/1),
diff --git a/base/elixir/test/inputs/json/samples/pokedex.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/pokedex.json/default/QuickType.ex
index 216242c..d78f11b 100644
--- a/base/elixir/test/inputs/json/samples/pokedex.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/samples/pokedex.json/default/QuickType.ex
@@ -63,10 +63,22 @@ defmodule Evolution do
           num: String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Evolution.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Evolution.name"}
+
+  def decode_num(value) when is_binary(value), do: value
+  def decode_num(_), do: {:error, "Unexpected type when decoding Evolution.num"}
+
+  def encode_num(value) when is_binary(value), do: value
+  def encode_num(_), do: {:error, "Unexpected type when encoding Evolution.num"}
+
   def from_map(m) do
     %Evolution{
-      name: m["name"],
-      num: m["num"],
+      name: decode_name(m["name"]),
+      num: decode_num(m["num"]),
     }
   end
 
@@ -176,25 +188,109 @@ defmodule Pokemon do
           weight: String.t()
         }
 
+  def decode_avg_spawns(value) when is_float(value), do: value
+  def decode_avg_spawns(value) when is_integer(value), do: value
+  def decode_avg_spawns(_), do: {:error, "Unexpected type when decoding Pokemon.avg_spawns"}
+
+  def encode_avg_spawns(value) when is_float(value), do: value
+  def encode_avg_spawns(value) when is_integer(value), do: value
+  def encode_avg_spawns(_), do: {:error, "Unexpected type when encoding Pokemon.avg_spawns"}
+
+  def decode_candy(value) when is_binary(value), do: value
+  def decode_candy(_), do: {:error, "Unexpected type when decoding Pokemon.candy"}
+
+  def encode_candy(value) when is_binary(value), do: value
+  def encode_candy(_), do: {:error, "Unexpected type when encoding Pokemon.candy"}
+
+  def decode_height(value) when is_binary(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Pokemon.height"}
+
+  def encode_height(value) when is_binary(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Pokemon.height"}
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Pokemon.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Pokemon.id"}
+
+  def decode_img(value) when is_binary(value), do: value
+  def decode_img(_), do: {:error, "Unexpected type when decoding Pokemon.img"}
+
+  def encode_img(value) when is_binary(value), do: value
+  def encode_img(_), do: {:error, "Unexpected type when encoding Pokemon.img"}
+
+  def decode_multipliers_element(value) when is_float(value), do: value
+  def decode_multipliers_element(value) when is_integer(value), do: value
+  def decode_multipliers_element(_), do: {:error, "Unexpected type when decoding Pokemon.multipliers"}
+
+  def encode_multipliers_element(value) when is_float(value), do: value
+  def encode_multipliers_element(value) when is_integer(value), do: value
+  def encode_multipliers_element(_), do: {:error, "Unexpected type when encoding Pokemon.multipliers"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Pokemon.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Pokemon.name"}
+
+  def decode_num(value) when is_binary(value), do: value
+  def decode_num(_), do: {:error, "Unexpected type when decoding Pokemon.num"}
+
+  def encode_num(value) when is_binary(value), do: value
+  def encode_num(_), do: {:error, "Unexpected type when encoding Pokemon.num"}
+
+  def decode_spawn_chance(value) when is_float(value), do: value
+  def decode_spawn_chance(value) when is_integer(value), do: value
+  def decode_spawn_chance(_), do: {:error, "Unexpected type when decoding Pokemon.spawn_chance"}
+
+  def encode_spawn_chance(value) when is_float(value), do: value
+  def encode_spawn_chance(value) when is_integer(value), do: value
+  def encode_spawn_chance(_), do: {:error, "Unexpected type when encoding Pokemon.spawn_chance"}
+
+  def decode_spawn_time(value) when is_binary(value), do: value
+  def decode_spawn_time(_), do: {:error, "Unexpected type when decoding Pokemon.spawn_time"}
+
+  def encode_spawn_time(value) when is_binary(value), do: value
+  def encode_spawn_time(_), do: {:error, "Unexpected type when encoding Pokemon.spawn_time"}
+
+  def decode_type(value) when is_list(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Pokemon.type"}
+
+  def encode_type(value) when is_list(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Pokemon.type"}
+
+  def decode_weaknesses(value) when is_list(value), do: value
+  def decode_weaknesses(_), do: {:error, "Unexpected type when decoding Pokemon.weaknesses"}
+
+  def encode_weaknesses(value) when is_list(value), do: value
+  def encode_weaknesses(_), do: {:error, "Unexpected type when encoding Pokemon.weaknesses"}
+
+  def decode_weight(value) when is_binary(value), do: value
+  def decode_weight(_), do: {:error, "Unexpected type when decoding Pokemon.weight"}
+
+  def encode_weight(value) when is_binary(value), do: value
+  def encode_weight(_), do: {:error, "Unexpected type when encoding Pokemon.weight"}
+
   def from_map(m) do
     %Pokemon{
-      avg_spawns: m["avg_spawns"],
-      candy: m["candy"],
+      avg_spawns: decode_avg_spawns(m["avg_spawns"]),
+      candy: decode_candy(m["candy"]),
       candy_count: m["candy_count"],
       egg: Egg.decode(m["egg"]),
-      height: m["height"],
-      id: m["id"],
-      img: m["img"],
+      height: decode_height(m["height"]),
+      id: decode_id(m["id"]),
+      img: decode_img(m["img"]),
       multipliers: m["multipliers"],
-      name: m["name"],
+      name: decode_name(m["name"]),
       next_evolution: m["next_evolution"] && Enum.map(m["next_evolution"], &Evolution.from_map/1),
-      num: m["num"],
+      num: decode_num(m["num"]),
       prev_evolution: m["prev_evolution"] && Enum.map(m["prev_evolution"], &Evolution.from_map/1),
-      spawn_chance: m["spawn_chance"],
-      spawn_time: m["spawn_time"],
+      spawn_chance: decode_spawn_chance(m["spawn_chance"]),
+      spawn_time: decode_spawn_time(m["spawn_time"]),
       type: Enum.map(m["type"], &Type.decode/1),
       weaknesses: Enum.map(m["weaknesses"], &Type.decode/1),
-      weight: m["weight"],
+      weight: decode_weight(m["weight"]),
     }
   end
 
@@ -241,6 +337,12 @@ defmodule TopLevel do
           pokemon: [Pokemon.t()]
         }
 
+  def decode_pokemon(value) when is_list(value), do: value
+  def decode_pokemon(_), do: {:error, "Unexpected type when decoding TopLevel.pokemon"}
+
+  def encode_pokemon(value) when is_list(value), do: value
+  def encode_pokemon(_), do: {:error, "Unexpected type when encoding TopLevel.pokemon"}
+
   def from_map(m) do
     %TopLevel{
       pokemon: Enum.map(m["pokemon"], &Pokemon.from_map/1),
diff --git a/base/elixir/test/inputs/json/samples/reddit.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/reddit.json/default/QuickType.ex
index f4b2050..4445417 100644
--- a/base/elixir/test/inputs/json/samples/reddit.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/samples/reddit.json/default/QuickType.ex
@@ -183,11 +183,29 @@ defmodule Source do
           width: integer()
         }
 
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Source.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Source.height"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Source.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Source.url"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Source.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Source.width"}
+
   def from_map(m) do
     %Source{
-      height: m["height"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -221,6 +239,12 @@ defmodule GIF do
           source: Source.t()
         }
 
+  def decode_resolutions(value) when is_list(value), do: value
+  def decode_resolutions(_), do: {:error, "Unexpected type when decoding GIF.resolutions"}
+
+  def encode_resolutions(value) when is_list(value), do: value
+  def encode_resolutions(_), do: {:error, "Unexpected type when encoding GIF.resolutions"}
+
   def from_map(m) do
     %GIF{
       resolutions: Enum.map(m["resolutions"], &Source.from_map/1),
@@ -294,9 +318,21 @@ defmodule Image do
           variants: Variants.t()
         }
 
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Image.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Image.id"}
+
+  def decode_resolutions(value) when is_list(value), do: value
+  def decode_resolutions(_), do: {:error, "Unexpected type when decoding Image.resolutions"}
+
+  def encode_resolutions(value) when is_list(value), do: value
+  def encode_resolutions(_), do: {:error, "Unexpected type when encoding Image.resolutions"}
+
   def from_map(m) do
     %Image{
-      id: m["id"],
+      id: decode_id(m["id"]),
       resolutions: Enum.map(m["resolutions"], &Source.from_map/1),
       source: Source.from_map(m["source"]),
       variants: Variants.from_map(m["variants"]),
@@ -334,9 +370,21 @@ defmodule Preview do
           images: [Image.t()]
         }
 
+  def decode_enabled(value) when is_boolean(value), do: value
+  def decode_enabled(_), do: {:error, "Unexpected type when decoding Preview.enabled"}
+
+  def encode_enabled(value) when is_boolean(value), do: value
+  def encode_enabled(_), do: {:error, "Unexpected type when encoding Preview.enabled"}
+
+  def decode_images(value) when is_list(value), do: value
+  def decode_images(_), do: {:error, "Unexpected type when decoding Preview.images"}
+
+  def encode_images(value) when is_list(value), do: value
+  def encode_images(_), do: {:error, "Unexpected type when encoding Preview.images"}
+
   def from_map(m) do
     %Preview{
-      enabled: m["enabled"],
+      enabled: decode_enabled(m["enabled"]),
       images: Enum.map(m["images"], &Image.from_map/1),
     }
   end
@@ -614,73 +662,373 @@ defmodule ChildData do
           whitelist_status: WhitelistStatus.t()
         }
 
+  def decode_approved_at_utc(value) when is_nil(value), do: value
+  def decode_approved_at_utc(_), do: {:error, "Unexpected type when decoding ChildData.approved_at_utc"}
+
+  def encode_approved_at_utc(value) when is_nil(value), do: value
+  def encode_approved_at_utc(_), do: {:error, "Unexpected type when encoding ChildData.approved_at_utc"}
+
+  def decode_approved_by(value) when is_nil(value), do: value
+  def decode_approved_by(_), do: {:error, "Unexpected type when decoding ChildData.approved_by"}
+
+  def encode_approved_by(value) when is_nil(value), do: value
+  def encode_approved_by(_), do: {:error, "Unexpected type when encoding ChildData.approved_by"}
+
+  def decode_archived(value) when is_boolean(value), do: value
+  def decode_archived(_), do: {:error, "Unexpected type when decoding ChildData.archived"}
+
+  def encode_archived(value) when is_boolean(value), do: value
+  def encode_archived(_), do: {:error, "Unexpected type when encoding ChildData.archived"}
+
+  def decode_author(value) when is_binary(value), do: value
+  def decode_author(_), do: {:error, "Unexpected type when decoding ChildData.author"}
+
+  def encode_author(value) when is_binary(value), do: value
+  def encode_author(_), do: {:error, "Unexpected type when encoding ChildData.author"}
+
+  def decode_banned_at_utc(value) when is_nil(value), do: value
+  def decode_banned_at_utc(_), do: {:error, "Unexpected type when decoding ChildData.banned_at_utc"}
+
+  def encode_banned_at_utc(value) when is_nil(value), do: value
+  def encode_banned_at_utc(_), do: {:error, "Unexpected type when encoding ChildData.banned_at_utc"}
+
+  def decode_banned_by(value) when is_nil(value), do: value
+  def decode_banned_by(_), do: {:error, "Unexpected type when decoding ChildData.banned_by"}
+
+  def encode_banned_by(value) when is_nil(value), do: value
+  def encode_banned_by(_), do: {:error, "Unexpected type when encoding ChildData.banned_by"}
+
+  def decode_brand_safe(value) when is_boolean(value), do: value
+  def decode_brand_safe(_), do: {:error, "Unexpected type when decoding ChildData.brand_safe"}
+
+  def encode_brand_safe(value) when is_boolean(value), do: value
+  def encode_brand_safe(_), do: {:error, "Unexpected type when encoding ChildData.brand_safe"}
+
+  def decode_can_gild(value) when is_boolean(value), do: value
+  def decode_can_gild(_), do: {:error, "Unexpected type when decoding ChildData.can_gild"}
+
+  def encode_can_gild(value) when is_boolean(value), do: value
+  def encode_can_gild(_), do: {:error, "Unexpected type when encoding ChildData.can_gild"}
+
+  def decode_can_mod_post(value) when is_boolean(value), do: value
+  def decode_can_mod_post(_), do: {:error, "Unexpected type when decoding ChildData.can_mod_post"}
+
+  def encode_can_mod_post(value) when is_boolean(value), do: value
+  def encode_can_mod_post(_), do: {:error, "Unexpected type when encoding ChildData.can_mod_post"}
+
+  def decode_clicked(value) when is_boolean(value), do: value
+  def decode_clicked(_), do: {:error, "Unexpected type when decoding ChildData.clicked"}
+
+  def encode_clicked(value) when is_boolean(value), do: value
+  def encode_clicked(_), do: {:error, "Unexpected type when encoding ChildData.clicked"}
+
+  def decode_contest_mode(value) when is_boolean(value), do: value
+  def decode_contest_mode(_), do: {:error, "Unexpected type when decoding ChildData.contest_mode"}
+
+  def encode_contest_mode(value) when is_boolean(value), do: value
+  def encode_contest_mode(_), do: {:error, "Unexpected type when encoding ChildData.contest_mode"}
+
+  def decode_created(value) when is_integer(value), do: value
+  def decode_created(_), do: {:error, "Unexpected type when decoding ChildData.created"}
+
+  def encode_created(value) when is_integer(value), do: value
+  def encode_created(_), do: {:error, "Unexpected type when encoding ChildData.created"}
+
+  def decode_created_utc(value) when is_integer(value), do: value
+  def decode_created_utc(_), do: {:error, "Unexpected type when decoding ChildData.created_utc"}
+
+  def encode_created_utc(value) when is_integer(value), do: value
+  def encode_created_utc(_), do: {:error, "Unexpected type when encoding ChildData.created_utc"}
+
+  def decode_downs(value) when is_integer(value), do: value
+  def decode_downs(_), do: {:error, "Unexpected type when decoding ChildData.downs"}
+
+  def encode_downs(value) when is_integer(value), do: value
+  def encode_downs(_), do: {:error, "Unexpected type when encoding ChildData.downs"}
+
+  def decode_edited(value) when is_boolean(value), do: value
+  def decode_edited(_), do: {:error, "Unexpected type when decoding ChildData.edited"}
+
+  def encode_edited(value) when is_boolean(value), do: value
+  def encode_edited(_), do: {:error, "Unexpected type when encoding ChildData.edited"}
+
+  def decode_gilded(value) when is_integer(value), do: value
+  def decode_gilded(_), do: {:error, "Unexpected type when decoding ChildData.gilded"}
+
+  def encode_gilded(value) when is_integer(value), do: value
+  def encode_gilded(_), do: {:error, "Unexpected type when encoding ChildData.gilded"}
+
+  def decode_hidden(value) when is_boolean(value), do: value
+  def decode_hidden(_), do: {:error, "Unexpected type when decoding ChildData.hidden"}
+
+  def encode_hidden(value) when is_boolean(value), do: value
+  def encode_hidden(_), do: {:error, "Unexpected type when encoding ChildData.hidden"}
+
+  def decode_hide_score(value) when is_boolean(value), do: value
+  def decode_hide_score(_), do: {:error, "Unexpected type when decoding ChildData.hide_score"}
+
+  def encode_hide_score(value) when is_boolean(value), do: value
+  def encode_hide_score(_), do: {:error, "Unexpected type when encoding ChildData.hide_score"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding ChildData.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding ChildData.id"}
+
+  def decode_is_self(value) when is_boolean(value), do: value
+  def decode_is_self(_), do: {:error, "Unexpected type when decoding ChildData.is_self"}
+
+  def encode_is_self(value) when is_boolean(value), do: value
+  def encode_is_self(_), do: {:error, "Unexpected type when encoding ChildData.is_self"}
+
+  def decode_is_video(value) when is_boolean(value), do: value
+  def decode_is_video(_), do: {:error, "Unexpected type when decoding ChildData.is_video"}
+
+  def encode_is_video(value) when is_boolean(value), do: value
+  def encode_is_video(_), do: {:error, "Unexpected type when encoding ChildData.is_video"}
+
+  def decode_likes(value) when is_nil(value), do: value
+  def decode_likes(_), do: {:error, "Unexpected type when decoding ChildData.likes"}
+
+  def encode_likes(value) when is_nil(value), do: value
+  def encode_likes(_), do: {:error, "Unexpected type when encoding ChildData.likes"}
+
+  def decode_locked(value) when is_boolean(value), do: value
+  def decode_locked(_), do: {:error, "Unexpected type when decoding ChildData.locked"}
+
+  def encode_locked(value) when is_boolean(value), do: value
+  def encode_locked(_), do: {:error, "Unexpected type when encoding ChildData.locked"}
+
+  def decode_media(value) when is_nil(value), do: value
+  def decode_media(_), do: {:error, "Unexpected type when decoding ChildData.media"}
+
+  def encode_media(value) when is_nil(value), do: value
+  def encode_media(_), do: {:error, "Unexpected type when encoding ChildData.media"}
+
+  def decode_mod_reports(value) when is_list(value), do: value
+  def decode_mod_reports(_), do: {:error, "Unexpected type when decoding ChildData.mod_reports"}
+
+  def encode_mod_reports(value) when is_list(value), do: value
+  def encode_mod_reports(_), do: {:error, "Unexpected type when encoding ChildData.mod_reports"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding ChildData.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding ChildData.name"}
+
+  def decode_num_comments(value) when is_integer(value), do: value
+  def decode_num_comments(_), do: {:error, "Unexpected type when decoding ChildData.num_comments"}
+
+  def encode_num_comments(value) when is_integer(value), do: value
+  def encode_num_comments(_), do: {:error, "Unexpected type when encoding ChildData.num_comments"}
+
+  def decode_num_reports(value) when is_nil(value), do: value
+  def decode_num_reports(_), do: {:error, "Unexpected type when decoding ChildData.num_reports"}
+
+  def encode_num_reports(value) when is_nil(value), do: value
+  def encode_num_reports(_), do: {:error, "Unexpected type when encoding ChildData.num_reports"}
+
+  def decode_over_18(value) when is_boolean(value), do: value
+  def decode_over_18(_), do: {:error, "Unexpected type when decoding ChildData.over_18"}
+
+  def encode_over_18(value) when is_boolean(value), do: value
+  def encode_over_18(_), do: {:error, "Unexpected type when encoding ChildData.over_18"}
+
+  def decode_permalink(value) when is_binary(value), do: value
+  def decode_permalink(_), do: {:error, "Unexpected type when decoding ChildData.permalink"}
+
+  def encode_permalink(value) when is_binary(value), do: value
+  def encode_permalink(_), do: {:error, "Unexpected type when encoding ChildData.permalink"}
+
+  def decode_quarantine(value) when is_boolean(value), do: value
+  def decode_quarantine(_), do: {:error, "Unexpected type when decoding ChildData.quarantine"}
+
+  def encode_quarantine(value) when is_boolean(value), do: value
+  def encode_quarantine(_), do: {:error, "Unexpected type when encoding ChildData.quarantine"}
+
+  def decode_removal_reason(value) when is_nil(value), do: value
+  def decode_removal_reason(_), do: {:error, "Unexpected type when decoding ChildData.removal_reason"}
+
+  def encode_removal_reason(value) when is_nil(value), do: value
+  def encode_removal_reason(_), do: {:error, "Unexpected type when encoding ChildData.removal_reason"}
+
+  def decode_report_reasons(value) when is_nil(value), do: value
+  def decode_report_reasons(_), do: {:error, "Unexpected type when decoding ChildData.report_reasons"}
+
+  def encode_report_reasons(value) when is_nil(value), do: value
+  def encode_report_reasons(_), do: {:error, "Unexpected type when encoding ChildData.report_reasons"}
+
+  def decode_saved(value) when is_boolean(value), do: value
+  def decode_saved(_), do: {:error, "Unexpected type when decoding ChildData.saved"}
+
+  def encode_saved(value) when is_boolean(value), do: value
+  def encode_saved(_), do: {:error, "Unexpected type when encoding ChildData.saved"}
+
+  def decode_score(value) when is_integer(value), do: value
+  def decode_score(_), do: {:error, "Unexpected type when decoding ChildData.score"}
+
+  def encode_score(value) when is_integer(value), do: value
+  def encode_score(_), do: {:error, "Unexpected type when encoding ChildData.score"}
+
+  def decode_secure_media(value) when is_nil(value), do: value
+  def decode_secure_media(_), do: {:error, "Unexpected type when decoding ChildData.secure_media"}
+
+  def encode_secure_media(value) when is_nil(value), do: value
+  def encode_secure_media(_), do: {:error, "Unexpected type when encoding ChildData.secure_media"}
+
+  def decode_selftext(value) when is_binary(value), do: value
+  def decode_selftext(_), do: {:error, "Unexpected type when decoding ChildData.selftext"}
+
+  def encode_selftext(value) when is_binary(value), do: value
+  def encode_selftext(_), do: {:error, "Unexpected type when encoding ChildData.selftext"}
+
+  def decode_selftext_html(value) when is_nil(value), do: value
+  def decode_selftext_html(_), do: {:error, "Unexpected type when decoding ChildData.selftext_html"}
+
+  def encode_selftext_html(value) when is_nil(value), do: value
+  def encode_selftext_html(_), do: {:error, "Unexpected type when encoding ChildData.selftext_html"}
+
+  def decode_spoiler(value) when is_boolean(value), do: value
+  def decode_spoiler(_), do: {:error, "Unexpected type when decoding ChildData.spoiler"}
+
+  def encode_spoiler(value) when is_boolean(value), do: value
+  def encode_spoiler(_), do: {:error, "Unexpected type when encoding ChildData.spoiler"}
+
+  def decode_stickied(value) when is_boolean(value), do: value
+  def decode_stickied(_), do: {:error, "Unexpected type when decoding ChildData.stickied"}
+
+  def encode_stickied(value) when is_boolean(value), do: value
+  def encode_stickied(_), do: {:error, "Unexpected type when encoding ChildData.stickied"}
+
+  def decode_suggested_sort(value) when is_nil(value), do: value
+  def decode_suggested_sort(_), do: {:error, "Unexpected type when decoding ChildData.suggested_sort"}
+
+  def encode_suggested_sort(value) when is_nil(value), do: value
+  def encode_suggested_sort(_), do: {:error, "Unexpected type when encoding ChildData.suggested_sort"}
+
+  def decode_thumbnail(value) when is_binary(value), do: value
+  def decode_thumbnail(_), do: {:error, "Unexpected type when decoding ChildData.thumbnail"}
+
+  def encode_thumbnail(value) when is_binary(value), do: value
+  def encode_thumbnail(_), do: {:error, "Unexpected type when encoding ChildData.thumbnail"}
+
+  def decode_thumbnail_height(value) when is_integer(value), do: value
+  def decode_thumbnail_height(_), do: {:error, "Unexpected type when decoding ChildData.thumbnail_height"}
+
+  def encode_thumbnail_height(value) when is_integer(value), do: value
+  def encode_thumbnail_height(_), do: {:error, "Unexpected type when encoding ChildData.thumbnail_height"}
+
+  def decode_thumbnail_width(value) when is_integer(value), do: value
+  def decode_thumbnail_width(_), do: {:error, "Unexpected type when decoding ChildData.thumbnail_width"}
+
+  def encode_thumbnail_width(value) when is_integer(value), do: value
+  def encode_thumbnail_width(_), do: {:error, "Unexpected type when encoding ChildData.thumbnail_width"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding ChildData.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding ChildData.title"}
+
+  def decode_ups(value) when is_integer(value), do: value
+  def decode_ups(_), do: {:error, "Unexpected type when decoding ChildData.ups"}
+
+  def encode_ups(value) when is_integer(value), do: value
+  def encode_ups(_), do: {:error, "Unexpected type when encoding ChildData.ups"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding ChildData.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding ChildData.url"}
+
+  def decode_user_reports(value) when is_list(value), do: value
+  def decode_user_reports(_), do: {:error, "Unexpected type when decoding ChildData.user_reports"}
+
+  def encode_user_reports(value) when is_list(value), do: value
+  def encode_user_reports(_), do: {:error, "Unexpected type when encoding ChildData.user_reports"}
+
+  def decode_view_count(value) when is_nil(value), do: value
+  def decode_view_count(_), do: {:error, "Unexpected type when decoding ChildData.view_count"}
+
+  def encode_view_count(value) when is_nil(value), do: value
+  def encode_view_count(_), do: {:error, "Unexpected type when encoding ChildData.view_count"}
+
+  def decode_visited(value) when is_boolean(value), do: value
+  def decode_visited(_), do: {:error, "Unexpected type when decoding ChildData.visited"}
+
+  def encode_visited(value) when is_boolean(value), do: value
+  def encode_visited(_), do: {:error, "Unexpected type when encoding ChildData.visited"}
+
   def from_map(m) do
     %ChildData{
-      approved_at_utc: m["approved_at_utc"],
-      approved_by: m["approved_by"],
-      archived: m["archived"],
-      author: m["author"],
+      approved_at_utc: decode_approved_at_utc(m["approved_at_utc"]),
+      approved_by: decode_approved_by(m["approved_by"]),
+      archived: decode_archived(m["archived"]),
+      author: decode_author(m["author"]),
       author_flair_css_class: m["author_flair_css_class"],
       author_flair_text: m["author_flair_text"],
-      banned_at_utc: m["banned_at_utc"],
-      banned_by: m["banned_by"],
-      brand_safe: m["brand_safe"],
-      can_gild: m["can_gild"],
-      can_mod_post: m["can_mod_post"],
-      clicked: m["clicked"],
-      contest_mode: m["contest_mode"],
-      created: m["created"],
-      created_utc: m["created_utc"],
+      banned_at_utc: decode_banned_at_utc(m["banned_at_utc"]),
+      banned_by: decode_banned_by(m["banned_by"]),
+      brand_safe: decode_brand_safe(m["brand_safe"]),
+      can_gild: decode_can_gild(m["can_gild"]),
+      can_mod_post: decode_can_mod_post(m["can_mod_post"]),
+      clicked: decode_clicked(m["clicked"]),
+      contest_mode: decode_contest_mode(m["contest_mode"]),
+      created: decode_created(m["created"]),
+      created_utc: decode_created_utc(m["created_utc"]),
       distinguished: m["distinguished"],
       domain: Domain.decode(m["domain"]),
-      downs: m["downs"],
-      edited: m["edited"],
-      gilded: m["gilded"],
-      hidden: m["hidden"],
-      hide_score: m["hide_score"],
-      id: m["id"],
-      is_self: m["is_self"],
-      is_video: m["is_video"],
-      likes: m["likes"],
+      downs: decode_downs(m["downs"]),
+      edited: decode_edited(m["edited"]),
+      gilded: decode_gilded(m["gilded"]),
+      hidden: decode_hidden(m["hidden"]),
+      hide_score: decode_hide_score(m["hide_score"]),
+      id: decode_id(m["id"]),
+      is_self: decode_is_self(m["is_self"]),
+      is_video: decode_is_video(m["is_video"]),
+      likes: decode_likes(m["likes"]),
       link_flair_css_class: m["link_flair_css_class"],
       link_flair_text: m["link_flair_text"],
-      locked: m["locked"],
-      media: m["media"],
+      locked: decode_locked(m["locked"]),
+      media: decode_media(m["media"]),
       media_embed: MediaEmbed.from_map(m["media_embed"]),
-      mod_reports: m["mod_reports"],
-      name: m["name"],
-      num_comments: m["num_comments"],
-      num_reports: m["num_reports"],
-      over_18: m["over_18"],
+      mod_reports: decode_mod_reports(m["mod_reports"]),
+      name: decode_name(m["name"]),
+      num_comments: decode_num_comments(m["num_comments"]),
+      num_reports: decode_num_reports(m["num_reports"]),
+      over_18: decode_over_18(m["over_18"]),
       parent_whitelist_status: WhitelistStatus.decode(m["parent_whitelist_status"]),
-      permalink: m["permalink"],
+      permalink: decode_permalink(m["permalink"]),
       post_hint: PostHint.decode(m["post_hint"]),
       preview: Preview.from_map(m["preview"]),
-      quarantine: m["quarantine"],
-      removal_reason: m["removal_reason"],
-      report_reasons: m["report_reasons"],
-      saved: m["saved"],
-      score: m["score"],
-      secure_media: m["secure_media"],
+      quarantine: decode_quarantine(m["quarantine"]),
+      removal_reason: decode_removal_reason(m["removal_reason"]),
+      report_reasons: decode_report_reasons(m["report_reasons"]),
+      saved: decode_saved(m["saved"]),
+      score: decode_score(m["score"]),
+      secure_media: decode_secure_media(m["secure_media"]),
       secure_media_embed: MediaEmbed.from_map(m["secure_media_embed"]),
-      selftext: m["selftext"],
-      selftext_html: m["selftext_html"],
-      spoiler: m["spoiler"],
-      stickied: m["stickied"],
+      selftext: decode_selftext(m["selftext"]),
+      selftext_html: decode_selftext_html(m["selftext_html"]),
+      spoiler: decode_spoiler(m["spoiler"]),
+      stickied: decode_stickied(m["stickied"]),
       subreddit: Subreddit.decode(m["subreddit"]),
       subreddit_id: SubredditID.decode(m["subreddit_id"]),
       subreddit_name_prefixed: SubredditNamePrefixed.decode(m["subreddit_name_prefixed"]),
       subreddit_type: SubredditType.decode(m["subreddit_type"]),
-      suggested_sort: m["suggested_sort"],
-      thumbnail: m["thumbnail"],
-      thumbnail_height: m["thumbnail_height"],
-      thumbnail_width: m["thumbnail_width"],
-      title: m["title"],
-      ups: m["ups"],
-      url: m["url"],
-      user_reports: m["user_reports"],
-      view_count: m["view_count"],
-      visited: m["visited"],
+      suggested_sort: decode_suggested_sort(m["suggested_sort"]),
+      thumbnail: decode_thumbnail(m["thumbnail"]),
+      thumbnail_height: decode_thumbnail_height(m["thumbnail_height"]),
+      thumbnail_width: decode_thumbnail_width(m["thumbnail_width"]),
+      title: decode_title(m["title"]),
+      ups: decode_ups(m["ups"]),
+      url: decode_url(m["url"]),
+      user_reports: decode_user_reports(m["user_reports"]),
+      view_count: decode_view_count(m["view_count"]),
+      visited: decode_visited(m["visited"]),
       whitelist_status: WhitelistStatus.decode(m["whitelist_status"]),
     }
   end
@@ -861,12 +1209,36 @@ defmodule TopLevelData do
           modhash: String.t()
         }
 
+  def decode_before(value) when is_nil(value), do: value
+  def decode_before(_), do: {:error, "Unexpected type when decoding TopLevelData.before"}
+
+  def encode_before(value) when is_nil(value), do: value
+  def encode_before(_), do: {:error, "Unexpected type when encoding TopLevelData.before"}
+
+  def decode_children(value) when is_list(value), do: value
+  def decode_children(_), do: {:error, "Unexpected type when decoding TopLevelData.children"}
+
+  def encode_children(value) when is_list(value), do: value
+  def encode_children(_), do: {:error, "Unexpected type when encoding TopLevelData.children"}
+
+  def decode_data_after(value) when is_binary(value), do: value
+  def decode_data_after(_), do: {:error, "Unexpected type when decoding TopLevelData.data_after"}
+
+  def encode_data_after(value) when is_binary(value), do: value
+  def encode_data_after(_), do: {:error, "Unexpected type when encoding TopLevelData.data_after"}
+
+  def decode_modhash(value) when is_binary(value), do: value
+  def decode_modhash(_), do: {:error, "Unexpected type when decoding TopLevelData.modhash"}
+
+  def encode_modhash(value) when is_binary(value), do: value
+  def encode_modhash(_), do: {:error, "Unexpected type when encoding TopLevelData.modhash"}
+
   def from_map(m) do
     %TopLevelData{
-      before: m["before"],
+      before: decode_before(m["before"]),
       children: Enum.map(m["children"], &Child.from_map/1),
-      data_after: m["after"],
-      modhash: m["modhash"],
+      data_after: decode_data_after(m["after"]),
+      modhash: decode_modhash(m["modhash"]),
     }
   end
 
@@ -901,10 +1273,16 @@ defmodule TopLevel do
           kind: String.t()
         }
 
+  def decode_kind(value) when is_binary(value), do: value
+  def decode_kind(_), do: {:error, "Unexpected type when decoding TopLevel.kind"}
+
+  def encode_kind(value) when is_binary(value), do: value
+  def encode_kind(_), do: {:error, "Unexpected type when encoding TopLevel.kind"}
+
   def from_map(m) do
     %TopLevel{
       data: TopLevelData.from_map(m["data"]),
-      kind: m["kind"],
+      kind: decode_kind(m["kind"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/samples/simple-object.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/simple-object.json/default/QuickType.ex
index f5b30d5..2496807 100644
--- a/base/elixir/test/inputs/json/samples/simple-object.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/samples/simple-object.json/default/QuickType.ex
@@ -15,11 +15,29 @@ defmodule TopLevel do
           validity: boolean()
         }
 
+  def decode_date(value) when is_integer(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel.date"}
+
+  def encode_date(value) when is_integer(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel.date"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding TopLevel.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding TopLevel.title"}
+
+  def decode_validity(value) when is_boolean(value), do: value
+  def decode_validity(_), do: {:error, "Unexpected type when decoding TopLevel.validity"}
+
+  def encode_validity(value) when is_boolean(value), do: value
+  def encode_validity(_), do: {:error, "Unexpected type when encoding TopLevel.validity"}
+
   def from_map(m) do
     %TopLevel{
-      date: m["date"],
-      title: m["title"],
-      validity: m["validity"],
+      date: decode_date(m["date"]),
+      title: decode_title(m["title"]),
+      validity: decode_validity(m["validity"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/samples/spotify-album.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/spotify-album.json/default/QuickType.ex
index e81ef5d..41b1f2e 100644
--- a/base/elixir/test/inputs/json/samples/spotify-album.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/samples/spotify-album.json/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule ExternalUrls do
           spotify: String.t()
         }
 
+  def decode_spotify(value) when is_binary(value), do: value
+  def decode_spotify(_), do: {:error, "Unexpected type when decoding ExternalUrls.spotify"}
+
+  def encode_spotify(value) when is_binary(value), do: value
+  def encode_spotify(_), do: {:error, "Unexpected type when encoding ExternalUrls.spotify"}
+
   def from_map(m) do
     %ExternalUrls{
-      spotify: m["spotify"],
+      spotify: decode_spotify(m["spotify"]),
     }
   end
 
@@ -51,14 +57,44 @@ defmodule Artist do
           uri: String.t()
         }
 
+  def decode_href(value) when is_binary(value), do: value
+  def decode_href(_), do: {:error, "Unexpected type when decoding Artist.href"}
+
+  def encode_href(value) when is_binary(value), do: value
+  def encode_href(_), do: {:error, "Unexpected type when encoding Artist.href"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Artist.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Artist.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Artist.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Artist.name"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Artist.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Artist.type"}
+
+  def decode_uri(value) when is_binary(value), do: value
+  def decode_uri(_), do: {:error, "Unexpected type when decoding Artist.uri"}
+
+  def encode_uri(value) when is_binary(value), do: value
+  def encode_uri(_), do: {:error, "Unexpected type when encoding Artist.uri"}
+
   def from_map(m) do
     %Artist{
       external_urls: ExternalUrls.from_map(m["external_urls"]),
-      href: m["href"],
-      id: m["id"],
-      name: m["name"],
-      type: m["type"],
-      uri: m["uri"],
+      href: decode_href(m["href"]),
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
+      type: decode_type(m["type"]),
+      uri: decode_uri(m["uri"]),
     }
   end
 
@@ -95,10 +131,22 @@ defmodule Copyright do
           type: String.t()
         }
 
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding Copyright.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding Copyright.text"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Copyright.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Copyright.type"}
+
   def from_map(m) do
     %Copyright{
-      text: m["text"],
-      type: m["type"],
+      text: decode_text(m["text"]),
+      type: decode_type(m["type"]),
     }
   end
 
@@ -130,9 +178,15 @@ defmodule ExternalIDS do
           upc: String.t()
         }
 
+  def decode_upc(value) when is_binary(value), do: value
+  def decode_upc(_), do: {:error, "Unexpected type when decoding ExternalIDS.upc"}
+
+  def encode_upc(value) when is_binary(value), do: value
+  def encode_upc(_), do: {:error, "Unexpected type when encoding ExternalIDS.upc"}
+
   def from_map(m) do
     %ExternalIDS{
-      upc: m["upc"],
+      upc: decode_upc(m["upc"]),
     }
   end
 
@@ -165,11 +219,29 @@ defmodule Image do
           width: integer()
         }
 
+  def decode_height(value) when is_integer(value), do: value
+  def decode_height(_), do: {:error, "Unexpected type when decoding Image.height"}
+
+  def encode_height(value) when is_integer(value), do: value
+  def encode_height(_), do: {:error, "Unexpected type when encoding Image.height"}
+
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding Image.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding Image.url"}
+
+  def decode_width(value) when is_integer(value), do: value
+  def decode_width(_), do: {:error, "Unexpected type when decoding Image.width"}
+
+  def encode_width(value) when is_integer(value), do: value
+  def encode_width(_), do: {:error, "Unexpected type when encoding Image.width"}
+
   def from_map(m) do
     %Image{
-      height: m["height"],
-      url: m["url"],
-      width: m["width"],
+      height: decode_height(m["height"]),
+      url: decode_url(m["url"]),
+      width: decode_width(m["width"]),
     }
   end
 
@@ -214,21 +286,93 @@ defmodule Item do
           uri: String.t()
         }
 
+  def decode_artists(value) when is_list(value), do: value
+  def decode_artists(_), do: {:error, "Unexpected type when decoding Item.artists"}
+
+  def encode_artists(value) when is_list(value), do: value
+  def encode_artists(_), do: {:error, "Unexpected type when encoding Item.artists"}
+
+  def decode_available_markets(value) when is_list(value), do: value
+  def decode_available_markets(_), do: {:error, "Unexpected type when decoding Item.available_markets"}
+
+  def encode_available_markets(value) when is_list(value), do: value
+  def encode_available_markets(_), do: {:error, "Unexpected type when encoding Item.available_markets"}
+
+  def decode_disc_number(value) when is_integer(value), do: value
+  def decode_disc_number(_), do: {:error, "Unexpected type when decoding Item.disc_number"}
+
+  def encode_disc_number(value) when is_integer(value), do: value
+  def encode_disc_number(_), do: {:error, "Unexpected type when encoding Item.disc_number"}
+
+  def decode_duration_ms(value) when is_integer(value), do: value
+  def decode_duration_ms(_), do: {:error, "Unexpected type when decoding Item.duration_ms"}
+
+  def encode_duration_ms(value) when is_integer(value), do: value
+  def encode_duration_ms(_), do: {:error, "Unexpected type when encoding Item.duration_ms"}
+
+  def decode_explicit(value) when is_boolean(value), do: value
+  def decode_explicit(_), do: {:error, "Unexpected type when decoding Item.explicit"}
+
+  def encode_explicit(value) when is_boolean(value), do: value
+  def encode_explicit(_), do: {:error, "Unexpected type when encoding Item.explicit"}
+
+  def decode_href(value) when is_binary(value), do: value
+  def decode_href(_), do: {:error, "Unexpected type when decoding Item.href"}
+
+  def encode_href(value) when is_binary(value), do: value
+  def encode_href(_), do: {:error, "Unexpected type when encoding Item.href"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding Item.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding Item.id"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Item.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Item.name"}
+
+  def decode_preview_url(value) when is_binary(value), do: value
+  def decode_preview_url(_), do: {:error, "Unexpected type when decoding Item.preview_url"}
+
+  def encode_preview_url(value) when is_binary(value), do: value
+  def encode_preview_url(_), do: {:error, "Unexpected type when encoding Item.preview_url"}
+
+  def decode_track_number(value) when is_integer(value), do: value
+  def decode_track_number(_), do: {:error, "Unexpected type when decoding Item.track_number"}
+
+  def encode_track_number(value) when is_integer(value), do: value
+  def encode_track_number(_), do: {:error, "Unexpected type when encoding Item.track_number"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding Item.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding Item.type"}
+
+  def decode_uri(value) when is_binary(value), do: value
+  def decode_uri(_), do: {:error, "Unexpected type when decoding Item.uri"}
+
+  def encode_uri(value) when is_binary(value), do: value
+  def encode_uri(_), do: {:error, "Unexpected type when encoding Item.uri"}
+
   def from_map(m) do
     %Item{
       artists: Enum.map(m["artists"], &Artist.from_map/1),
-      available_markets: m["available_markets"],
-      disc_number: m["disc_number"],
-      duration_ms: m["duration_ms"],
-      explicit: m["explicit"],
+      available_markets: decode_available_markets(m["available_markets"]),
+      disc_number: decode_disc_number(m["disc_number"]),
+      duration_ms: decode_duration_ms(m["duration_ms"]),
+      explicit: decode_explicit(m["explicit"]),
       external_urls: ExternalUrls.from_map(m["external_urls"]),
-      href: m["href"],
-      id: m["id"],
-      name: m["name"],
-      preview_url: m["preview_url"],
-      track_number: m["track_number"],
-      type: m["type"],
-      uri: m["uri"],
+      href: decode_href(m["href"]),
+      id: decode_id(m["id"]),
+      name: decode_name(m["name"]),
+      preview_url: decode_preview_url(m["preview_url"]),
+      track_number: decode_track_number(m["track_number"]),
+      type: decode_type(m["type"]),
+      uri: decode_uri(m["uri"]),
     }
   end
 
@@ -277,15 +421,57 @@ defmodule Tracks do
           total: integer()
         }
 
+  def decode_href(value) when is_binary(value), do: value
+  def decode_href(_), do: {:error, "Unexpected type when decoding Tracks.href"}
+
+  def encode_href(value) when is_binary(value), do: value
+  def encode_href(_), do: {:error, "Unexpected type when encoding Tracks.href"}
+
+  def decode_items(value) when is_list(value), do: value
+  def decode_items(_), do: {:error, "Unexpected type when decoding Tracks.items"}
+
+  def encode_items(value) when is_list(value), do: value
+  def encode_items(_), do: {:error, "Unexpected type when encoding Tracks.items"}
+
+  def decode_limit(value) when is_integer(value), do: value
+  def decode_limit(_), do: {:error, "Unexpected type when decoding Tracks.limit"}
+
+  def encode_limit(value) when is_integer(value), do: value
+  def encode_limit(_), do: {:error, "Unexpected type when encoding Tracks.limit"}
+
+  def decode_next(value) when is_nil(value), do: value
+  def decode_next(_), do: {:error, "Unexpected type when decoding Tracks.next"}
+
+  def encode_next(value) when is_nil(value), do: value
+  def encode_next(_), do: {:error, "Unexpected type when encoding Tracks.next"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding Tracks.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding Tracks.offset"}
+
+  def decode_previous(value) when is_nil(value), do: value
+  def decode_previous(_), do: {:error, "Unexpected type when decoding Tracks.previous"}
+
+  def encode_previous(value) when is_nil(value), do: value
+  def encode_previous(_), do: {:error, "Unexpected type when encoding Tracks.previous"}
+
+  def decode_total(value) when is_integer(value), do: value
+  def decode_total(_), do: {:error, "Unexpected type when decoding Tracks.total"}
+
+  def encode_total(value) when is_integer(value), do: value
+  def encode_total(_), do: {:error, "Unexpected type when encoding Tracks.total"}
+
   def from_map(m) do
     %Tracks{
-      href: m["href"],
+      href: decode_href(m["href"]),
       items: Enum.map(m["items"], &Item.from_map/1),
-      limit: m["limit"],
-      next: m["next"],
-      offset: m["offset"],
-      previous: m["previous"],
-      total: m["total"],
+      limit: decode_limit(m["limit"]),
+      next: decode_next(m["next"]),
+      offset: decode_offset(m["offset"]),
+      previous: decode_previous(m["previous"]),
+      total: decode_total(m["total"]),
     }
   end
 
@@ -338,25 +524,109 @@ defmodule TopLevel do
           uri: String.t()
         }
 
+  def decode_album_type(value) when is_binary(value), do: value
+  def decode_album_type(_), do: {:error, "Unexpected type when decoding TopLevel.album_type"}
+
+  def encode_album_type(value) when is_binary(value), do: value
+  def encode_album_type(_), do: {:error, "Unexpected type when encoding TopLevel.album_type"}
+
+  def decode_artists(value) when is_list(value), do: value
+  def decode_artists(_), do: {:error, "Unexpected type when decoding TopLevel.artists"}
+
+  def encode_artists(value) when is_list(value), do: value
+  def encode_artists(_), do: {:error, "Unexpected type when encoding TopLevel.artists"}
+
+  def decode_available_markets(value) when is_list(value), do: value
+  def decode_available_markets(_), do: {:error, "Unexpected type when decoding TopLevel.available_markets"}
+
+  def encode_available_markets(value) when is_list(value), do: value
+  def encode_available_markets(_), do: {:error, "Unexpected type when encoding TopLevel.available_markets"}
+
+  def decode_copyrights(value) when is_list(value), do: value
+  def decode_copyrights(_), do: {:error, "Unexpected type when decoding TopLevel.copyrights"}
+
+  def encode_copyrights(value) when is_list(value), do: value
+  def encode_copyrights(_), do: {:error, "Unexpected type when encoding TopLevel.copyrights"}
+
+  def decode_genres(value) when is_list(value), do: value
+  def decode_genres(_), do: {:error, "Unexpected type when decoding TopLevel.genres"}
+
+  def encode_genres(value) when is_list(value), do: value
+  def encode_genres(_), do: {:error, "Unexpected type when encoding TopLevel.genres"}
+
+  def decode_href(value) when is_binary(value), do: value
+  def decode_href(_), do: {:error, "Unexpected type when decoding TopLevel.href"}
+
+  def encode_href(value) when is_binary(value), do: value
+  def encode_href(_), do: {:error, "Unexpected type when encoding TopLevel.href"}
+
+  def decode_id(value) when is_binary(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevel.id"}
+
+  def encode_id(value) when is_binary(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevel.id"}
+
+  def decode_images(value) when is_list(value), do: value
+  def decode_images(_), do: {:error, "Unexpected type when decoding TopLevel.images"}
+
+  def encode_images(value) when is_list(value), do: value
+  def encode_images(_), do: {:error, "Unexpected type when encoding TopLevel.images"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
+  def decode_popularity(value) when is_integer(value), do: value
+  def decode_popularity(_), do: {:error, "Unexpected type when decoding TopLevel.popularity"}
+
+  def encode_popularity(value) when is_integer(value), do: value
+  def encode_popularity(_), do: {:error, "Unexpected type when encoding TopLevel.popularity"}
+
+  def decode_release_date(value) when is_binary(value), do: value
+  def decode_release_date(_), do: {:error, "Unexpected type when decoding TopLevel.release_date"}
+
+  def encode_release_date(value) when is_binary(value), do: value
+  def encode_release_date(_), do: {:error, "Unexpected type when encoding TopLevel.release_date"}
+
+  def decode_release_date_precision(value) when is_binary(value), do: value
+  def decode_release_date_precision(_), do: {:error, "Unexpected type when decoding TopLevel.release_date_precision"}
+
+  def encode_release_date_precision(value) when is_binary(value), do: value
+  def encode_release_date_precision(_), do: {:error, "Unexpected type when encoding TopLevel.release_date_precision"}
+
+  def decode_type(value) when is_binary(value), do: value
+  def decode_type(_), do: {:error, "Unexpected type when decoding TopLevel.type"}
+
+  def encode_type(value) when is_binary(value), do: value
+  def encode_type(_), do: {:error, "Unexpected type when encoding TopLevel.type"}
+
+  def decode_uri(value) when is_binary(value), do: value
+  def decode_uri(_), do: {:error, "Unexpected type when decoding TopLevel.uri"}
+
+  def encode_uri(value) when is_binary(value), do: value
+  def encode_uri(_), do: {:error, "Unexpected type when encoding TopLevel.uri"}
+
   def from_map(m) do
     %TopLevel{
-      album_type: m["album_type"],
+      album_type: decode_album_type(m["album_type"]),
       artists: Enum.map(m["artists"], &Artist.from_map/1),
-      available_markets: m["available_markets"],
+      available_markets: decode_available_markets(m["available_markets"]),
       copyrights: Enum.map(m["copyrights"], &Copyright.from_map/1),
       external_ids: ExternalIDS.from_map(m["external_ids"]),
       external_urls: ExternalUrls.from_map(m["external_urls"]),
-      genres: m["genres"],
-      href: m["href"],
-      id: m["id"],
+      genres: decode_genres(m["genres"]),
+      href: decode_href(m["href"]),
+      id: decode_id(m["id"]),
       images: Enum.map(m["images"], &Image.from_map/1),
-      name: m["name"],
-      popularity: m["popularity"],
-      release_date: m["release_date"],
-      release_date_precision: m["release_date_precision"],
+      name: decode_name(m["name"]),
+      popularity: decode_popularity(m["popularity"]),
+      release_date: decode_release_date(m["release_date"]),
+      release_date_precision: decode_release_date_precision(m["release_date_precision"]),
       tracks: Tracks.from_map(m["tracks"]),
-      type: m["type"],
-      uri: m["uri"],
+      type: decode_type(m["type"]),
+      uri: decode_uri(m["uri"]),
     }
   end
 
diff --git a/base/elixir/test/inputs/json/samples/us-avg-temperatures.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/us-avg-temperatures.json/default/QuickType.ex
index e9923e5..bc204fb 100644
--- a/base/elixir/test/inputs/json/samples/us-avg-temperatures.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/samples/us-avg-temperatures.json/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule Datum do
           value: String.t()
         }
 
+  def decode_anomaly(value) when is_binary(value), do: value
+  def decode_anomaly(_), do: {:error, "Unexpected type when decoding Datum.anomaly"}
+
+  def encode_anomaly(value) when is_binary(value), do: value
+  def encode_anomaly(_), do: {:error, "Unexpected type when encoding Datum.anomaly"}
+
+  def decode_value(value) when is_binary(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding Datum.value"}
+
+  def encode_value(value) when is_binary(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding Datum.value"}
+
   def from_map(m) do
     %Datum{
-      anomaly: m["anomaly"],
-      value: m["value"],
+      anomaly: decode_anomaly(m["anomaly"]),
+      value: decode_value(m["value"]),
     }
   end
 
@@ -52,12 +64,36 @@ defmodule Description do
           units: String.t()
         }
 
+  def decode_base_period(value) when is_binary(value), do: value
+  def decode_base_period(_), do: {:error, "Unexpected type when decoding Description.base_period"}
+
+  def encode_base_period(value) when is_binary(value), do: value
+  def encode_base_period(_), do: {:error, "Unexpected type when encoding Description.base_period"}
+
+  def decode_missing(value) when is_integer(value), do: value
+  def decode_missing(_), do: {:error, "Unexpected type when decoding Description.missing"}
+
+  def encode_missing(value) when is_integer(value), do: value
+  def encode_missing(_), do: {:error, "Unexpected type when encoding Description.missing"}
+
+  def decode_title(value) when is_binary(value), do: value
+  def decode_title(_), do: {:error, "Unexpected type when decoding Description.title"}
+
+  def encode_title(value) when is_binary(value), do: value
+  def encode_title(_), do: {:error, "Unexpected type when encoding Description.title"}
+
+  def decode_units(value) when is_binary(value), do: value
+  def decode_units(_), do: {:error, "Unexpected type when decoding Description.units"}
+
+  def encode_units(value) when is_binary(value), do: value
+  def encode_units(_), do: {:error, "Unexpected type when encoding Description.units"}
+
   def from_map(m) do
     %Description{
-      base_period: m["base_period"],
-      missing: m["missing"],
-      title: m["title"],
-      units: m["units"],
+      base_period: decode_base_period(m["base_period"]),
+      missing: decode_missing(m["missing"]),
+      title: decode_title(m["title"]),
+      units: decode_units(m["units"]),
     }
   end
 
@@ -94,7 +130,8 @@ defmodule TopLevel do
 
   def from_map(m) do
     %TopLevel{
-      data: m["data"],
+      data: m["data"]
+      |> Map.new(fn {key, value} -> {key, Datum.from_map(value)} end),
       description: Description.from_map(m["description"]),
     }
   end
@@ -107,7 +144,8 @@ defmodule TopLevel do
 
   def to_map(struct) do
     %{
-      "data" => struct.data,
+      "data" => struct.data
+      |> Map.new(fn {key, value} -> {key, Datum.to_map(value)} end),
       "description" => Description.to_map(struct.description),
     }
   end
diff --git a/base/elixir/test/inputs/json/samples/us-senators.json/default/QuickType.ex b/head/elixir/test/inputs/json/samples/us-senators.json/default/QuickType.ex
index e53e56e..d3fd31b 100644
--- a/base/elixir/test/inputs/json/samples/us-senators.json/default/QuickType.ex
+++ b/head/elixir/test/inputs/json/samples/us-senators.json/default/QuickType.ex
@@ -15,11 +15,29 @@ defmodule Meta do
           total_count: integer()
         }
 
+  def decode_limit(value) when is_integer(value), do: value
+  def decode_limit(_), do: {:error, "Unexpected type when decoding Meta.limit"}
+
+  def encode_limit(value) when is_integer(value), do: value
+  def encode_limit(_), do: {:error, "Unexpected type when encoding Meta.limit"}
+
+  def decode_offset(value) when is_integer(value), do: value
+  def decode_offset(_), do: {:error, "Unexpected type when decoding Meta.offset"}
+
+  def encode_offset(value) when is_integer(value), do: value
+  def encode_offset(_), do: {:error, "Unexpected type when encoding Meta.offset"}
+
+  def decode_total_count(value) when is_integer(value), do: value
+  def decode_total_count(_), do: {:error, "Unexpected type when decoding Meta.total_count"}
+
+  def encode_total_count(value) when is_integer(value), do: value
+  def encode_total_count(_), do: {:error, "Unexpected type when encoding Meta.total_count"}
+
   def from_map(m) do
     %Meta{
-      limit: m["limit"],
-      offset: m["offset"],
-      total_count: m["total_count"],
+      limit: decode_limit(m["limit"]),
+      offset: decode_offset(m["offset"]),
+      total_count: decode_total_count(m["total_count"]),
     }
   end
 
@@ -103,12 +121,30 @@ defmodule Extra do
           rss_url: String.t() | nil
         }
 
+  def decode_address(value) when is_binary(value), do: value
+  def decode_address(_), do: {:error, "Unexpected type when decoding Extra.address"}
+
+  def encode_address(value) when is_binary(value), do: value
+  def encode_address(_), do: {:error, "Unexpected type when encoding Extra.address"}
+
+  def decode_contact_form(value) when is_binary(value), do: value
+  def decode_contact_form(_), do: {:error, "Unexpected type when decoding Extra.contact_form"}
+
+  def encode_contact_form(value) when is_binary(value), do: value
+  def encode_contact_form(_), do: {:error, "Unexpected type when encoding Extra.contact_form"}
+
+  def decode_office(value) when is_binary(value), do: value
+  def decode_office(_), do: {:error, "Unexpected type when decoding Extra.office"}
+
+  def encode_office(value) when is_binary(value), do: value
+  def encode_office(_), do: {:error, "Unexpected type when encoding Extra.office"}
+
   def from_map(m) do
     %Extra{
-      address: m["address"],
-      contact_form: m["contact_form"],
+      address: decode_address(m["address"]),
+      contact_form: decode_contact_form(m["contact_form"]),
       fax: m["fax"],
-      office: m["office"],
+      office: decode_office(m["office"]),
       rss_url: m["rss_url"],
     }
   end
@@ -299,23 +335,95 @@ defmodule Person do
           youtubeid: nil | String.t()
         }
 
+  def decode_bioguideid(value) when is_binary(value), do: value
+  def decode_bioguideid(_), do: {:error, "Unexpected type when decoding Person.bioguideid"}
+
+  def encode_bioguideid(value) when is_binary(value), do: value
+  def encode_bioguideid(_), do: {:error, "Unexpected type when encoding Person.bioguideid"}
+
+  def decode_birthday(value) when is_binary(value), do: value
+  def decode_birthday(_), do: {:error, "Unexpected type when decoding Person.birthday"}
+
+  def encode_birthday(value) when is_binary(value), do: value
+  def encode_birthday(_), do: {:error, "Unexpected type when encoding Person.birthday"}
+
+  def decode_cspanid(value) when is_integer(value), do: value
+  def decode_cspanid(_), do: {:error, "Unexpected type when decoding Person.cspanid"}
+
+  def encode_cspanid(value) when is_integer(value), do: value
+  def encode_cspanid(_), do: {:error, "Unexpected type when encoding Person.cspanid"}
+
+  def decode_firstname(value) when is_binary(value), do: value
+  def decode_firstname(_), do: {:error, "Unexpected type when decoding Person.firstname"}
+
+  def encode_firstname(value) when is_binary(value), do: value
+  def encode_firstname(_), do: {:error, "Unexpected type when encoding Person.firstname"}
+
+  def decode_lastname(value) when is_binary(value), do: value
+  def decode_lastname(_), do: {:error, "Unexpected type when decoding Person.lastname"}
+
+  def encode_lastname(value) when is_binary(value), do: value
+  def encode_lastname(_), do: {:error, "Unexpected type when encoding Person.lastname"}
+
+  def decode_link(value) when is_binary(value), do: value
+  def decode_link(_), do: {:error, "Unexpected type when decoding Person.link"}
+
+  def encode_link(value) when is_binary(value), do: value
+  def encode_link(_), do: {:error, "Unexpected type when encoding Person.link"}
+
+  def decode_middlename(value) when is_binary(value), do: value
+  def decode_middlename(_), do: {:error, "Unexpected type when decoding Person.middlename"}
+
+  def encode_middlename(value) when is_binary(value), do: value
+  def encode_middlename(_), do: {:error, "Unexpected type when encoding Person.middlename"}
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Person.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Person.name"}
+
+  def decode_nickname(value) when is_binary(value), do: value
+  def decode_nickname(_), do: {:error, "Unexpected type when decoding Person.nickname"}
+
+  def encode_nickname(value) when is_binary(value), do: value
+  def encode_nickname(_), do: {:error, "Unexpected type when encoding Person.nickname"}
+
+  def decode_osid(value) when is_binary(value), do: value
+  def decode_osid(_), do: {:error, "Unexpected type when decoding Person.osid"}
+
+  def encode_osid(value) when is_binary(value), do: value
+  def encode_osid(_), do: {:error, "Unexpected type when encoding Person.osid"}
+
+  def decode_pvsid(value) when is_binary(value), do: value
+  def decode_pvsid(_), do: {:error, "Unexpected type when decoding Person.pvsid"}
+
+  def encode_pvsid(value) when is_binary(value), do: value
+  def encode_pvsid(_), do: {:error, "Unexpected type when encoding Person.pvsid"}
+
+  def decode_sortname(value) when is_binary(value), do: value
+  def decode_sortname(_), do: {:error, "Unexpected type when decoding Person.sortname"}
+
+  def encode_sortname(value) when is_binary(value), do: value
+  def encode_sortname(_), do: {:error, "Unexpected type when encoding Person.sortname"}
+
   def from_map(m) do
     %Person{
-      bioguideid: m["bioguideid"],
-      birthday: m["birthday"],
-      cspanid: m["cspanid"],
-      firstname: m["firstname"],
+      bioguideid: decode_bioguideid(m["bioguideid"]),
+      birthday: decode_birthday(m["birthday"]),
+      cspanid: decode_cspanid(m["cspanid"]),
+      firstname: decode_firstname(m["firstname"]),
       gender: Gender.decode(m["gender"]),
       gender_label: GenderLabel.decode(m["gender_label"]),
-      lastname: m["lastname"],
-      link: m["link"],
-      middlename: m["middlename"],
-      name: m["name"],
+      lastname: decode_lastname(m["lastname"]),
+      link: decode_link(m["link"]),
+      middlename: decode_middlename(m["middlename"]),
+      name: decode_name(m["name"]),
       namemod: Namemod.decode(m["namemod"]),
-      nickname: m["nickname"],
-      osid: m["osid"],
-      pvsid: m["pvsid"],
-      sortname: m["sortname"],
+      nickname: decode_nickname(m["nickname"]),
+      osid: decode_osid(m["osid"]),
+      pvsid: decode_pvsid(m["pvsid"]),
+      sortname: decode_sortname(m["sortname"]),
       twitterid: m["twitterid"],
       youtubeid: m["youtubeid"],
     }
@@ -706,30 +814,84 @@ defmodule Object do
           website: String.t()
         }
 
+  def decode_congress_numbers(value) when is_list(value), do: value
+  def decode_congress_numbers(_), do: {:error, "Unexpected type when decoding Object.congress_numbers"}
+
+  def encode_congress_numbers(value) when is_list(value), do: value
+  def encode_congress_numbers(_), do: {:error, "Unexpected type when encoding Object.congress_numbers"}
+
+  def decode_current(value) when is_boolean(value), do: value
+  def decode_current(_), do: {:error, "Unexpected type when decoding Object.current"}
+
+  def encode_current(value) when is_boolean(value), do: value
+  def encode_current(_), do: {:error, "Unexpected type when encoding Object.current"}
+
+  def decode_description(value) when is_binary(value), do: value
+  def decode_description(_), do: {:error, "Unexpected type when decoding Object.description"}
+
+  def encode_description(value) when is_binary(value), do: value
+  def encode_description(_), do: {:error, "Unexpected type when encoding Object.description"}
+
+  def decode_district(value) when is_nil(value), do: value
+  def decode_district(_), do: {:error, "Unexpected type when decoding Object.district"}
+
+  def encode_district(value) when is_nil(value), do: value
+  def encode_district(_), do: {:error, "Unexpected type when encoding Object.district"}
+
+  def decode_enddate(value) when is_binary(value), do: value
+  def decode_enddate(_), do: {:error, "Unexpected type when decoding Object.enddate"}
+
+  def encode_enddate(value) when is_binary(value), do: value
+  def encode_enddate(_), do: {:error, "Unexpected type when encoding Object.enddate"}
+
+  def decode_phone(value) when is_binary(value), do: value
+  def decode_phone(_), do: {:error, "Unexpected type when decoding Object.phone"}
+
+  def encode_phone(value) when is_binary(value), do: value
+  def encode_phone(_), do: {:error, "Unexpected type when encoding Object.phone"}
+
+  def decode_startdate(value) when is_binary(value), do: value
+  def decode_startdate(_), do: {:error, "Unexpected type when decoding Object.startdate"}
+
+  def encode_startdate(value) when is_binary(value), do: value
+  def encode_startdate(_), do: {:error, "Unexpected type when encoding Object.startdate"}
+
+  def decode_state(value) when is_binary(value), do: value
+  def decode_state(_), do: {:error, "Unexpected type when decoding Object.state"}
+
+  def encode_state(value) when is_binary(value), do: value
+  def encode_state(_), do: {:error, "Unexpected type when encoding Object.state"}
+
+  def decode_website(value) when is_binary(value), do: value
+  def decode_website(_), do: {:error, "Unexpected type when decoding Object.website"}
+
+  def encode_website(value) when is_binary(value), do: value
+  def encode_website(_), do: {:error, "Unexpected type when encoding Object.website"}
+
   def from_map(m) do
     %Object{
       caucus: m["caucus"] && Party.decode(m["caucus"]),
-      congress_numbers: m["congress_numbers"],
-      current: m["current"],
-      description: m["description"],
-      district: m["district"],
-      enddate: m["enddate"],
+      congress_numbers: decode_congress_numbers(m["congress_numbers"]),
+      current: decode_current(m["current"]),
+      description: decode_description(m["description"]),
+      district: decode_district(m["district"]),
+      enddate: decode_enddate(m["enddate"]),
       extra: Extra.from_map(m["extra"]),
       leadership_title: m["leadership_title"],
       party: Party.decode(m["party"]),
       person: Person.from_map(m["person"]),
-      phone: m["phone"],
+      phone: decode_phone(m["phone"]),
       role_type: RoleType.decode(m["role_type"]),
       role_type_label: RoleTypeLabel.decode(m["role_type_label"]),
       senator_class: SenatorClass.decode(m["senator_class"]),
       senator_class_label: SenatorClassLabel.decode(m["senator_class_label"]),
       senator_rank: SenatorRank.decode(m["senator_rank"]),
       senator_rank_label: SenatorRankLabel.decode(m["senator_rank_label"]),
-      startdate: m["startdate"],
-      state: m["state"],
+      startdate: decode_startdate(m["startdate"]),
+      state: decode_state(m["state"]),
       title: Title.decode(m["title"]),
       title_long: RoleTypeLabel.decode(m["title_long"]),
-      website: m["website"],
+      website: decode_website(m["website"]),
     }
   end
 
@@ -782,6 +944,12 @@ defmodule TopLevel do
           objects: [Object.t()]
         }
 
+  def decode_objects(value) when is_list(value), do: value
+  def decode_objects(_), do: {:error, "Unexpected type when decoding TopLevel.objects"}
+
+  def encode_objects(value) when is_list(value), do: value
+  def encode_objects(_), do: {:error, "Unexpected type when encoding TopLevel.objects"}
+
   def from_map(m) do
     %TopLevel{
       meta: Meta.from_map(m["meta"]),
diff --git a/base/graphql-elixir/test/inputs/graphql/github1.graphql/default/QuickType.ex b/head/graphql-elixir/test/inputs/graphql/github1.graphql/default/QuickType.ex
index 64994e1..7b8cb1d 100644
--- a/base/graphql-elixir/test/inputs/graphql/github1.graphql/default/QuickType.ex
+++ b/head/graphql-elixir/test/inputs/graphql/github1.graphql/default/QuickType.ex
@@ -14,9 +14,15 @@ defmodule User do
           real_name: nil | String.t()
         }
 
+  def decode_login(value) when is_binary(value), do: value
+  def decode_login(_), do: {:error, "Unexpected type when decoding User.login"}
+
+  def encode_login(value) when is_binary(value), do: value
+  def encode_login(_), do: {:error, "Unexpected type when encoding User.login"}
+
   def from_map(m) do
     %User{
-      login: m["login"],
+      login: decode_login(m["login"]),
       real_name: m["realName"],
     }
   end
@@ -82,9 +88,15 @@ defmodule Error do
           message: String.t()
         }
 
+  def decode_message(value) when is_binary(value), do: value
+  def decode_message(_), do: {:error, "Unexpected type when decoding Error.message"}
+
+  def encode_message(value) when is_binary(value), do: value
+  def encode_message(_), do: {:error, "Unexpected type when encoding Error.message"}
+
   def from_map(m) do
     %Error{
-      message: m["message"],
+      message: decode_message(m["message"]),
     }
   end
 
diff --git a/base/graphql-elixir/test/inputs/graphql/github2.graphql/default/QuickType.ex b/head/graphql-elixir/test/inputs/graphql/github2.graphql/default/QuickType.ex
index 95c8d7b..ae266e4 100644
--- a/base/graphql-elixir/test/inputs/graphql/github2.graphql/default/QuickType.ex
+++ b/head/graphql-elixir/test/inputs/graphql/github2.graphql/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule Repository do
           name: String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Repository.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Repository.name"}
+
   def from_map(m) do
     %Repository{
-      name: m["name"],
+      name: decode_name(m["name"]),
     }
   end
 
@@ -47,6 +53,12 @@ defmodule RepositoryConnection do
           nodes: [Repository.t() | nil] | nil
         }
 
+  def decode_total_count(value) when is_integer(value), do: value
+  def decode_total_count(_), do: {:error, "Unexpected type when decoding RepositoryConnection.total_count"}
+
+  def encode_total_count(value) when is_integer(value), do: value
+  def encode_total_count(_), do: {:error, "Unexpected type when encoding RepositoryConnection.total_count"}
+
   def decode_nodes_element(%{"name" => _,} = value), do: Repository.from_map(value)
   def decode_nodes_element(value) when is_nil(value), do: value
   def decode_nodes_element(_), do: {:error, "Unexpected type when decoding RepositoryConnection.nodes"}
@@ -57,7 +69,7 @@ defmodule RepositoryConnection do
 
   def from_map(m) do
     %RepositoryConnection{
-      total_count: m["totalCount"],
+      total_count: decode_total_count(m["totalCount"]),
       nodes: m["nodes"] && Enum.map(m["nodes"], &decode_nodes_element/1),
     }
   end
@@ -91,9 +103,15 @@ defmodule User do
           repositories: RepositoryConnection.t()
         }
 
+  def decode_login(value) when is_binary(value), do: value
+  def decode_login(_), do: {:error, "Unexpected type when decoding User.login"}
+
+  def encode_login(value) when is_binary(value), do: value
+  def encode_login(_), do: {:error, "Unexpected type when encoding User.login"}
+
   def from_map(m) do
     %User{
-      login: m["login"],
+      login: decode_login(m["login"]),
       repositories: RepositoryConnection.from_map(m["repositories"]),
     }
   end
@@ -159,9 +177,15 @@ defmodule Error do
           message: String.t()
         }
 
+  def decode_message(value) when is_binary(value), do: value
+  def decode_message(_), do: {:error, "Unexpected type when decoding Error.message"}
+
+  def encode_message(value) when is_binary(value), do: value
+  def encode_message(_), do: {:error, "Unexpected type when encoding Error.message"}
+
   def from_map(m) do
     %Error{
-      message: m["message"],
+      message: decode_message(m["message"]),
     }
   end
 
diff --git a/base/graphql-elixir/test/inputs/graphql/github3.graphql/default/QuickType.ex b/head/graphql-elixir/test/inputs/graphql/github3.graphql/default/QuickType.ex
index c79fadb..c3471b9 100644
--- a/base/graphql-elixir/test/inputs/graphql/github3.graphql/default/QuickType.ex
+++ b/head/graphql-elixir/test/inputs/graphql/github3.graphql/default/QuickType.ex
@@ -168,9 +168,15 @@ defmodule User do
           repository: Repository.t() | nil
         }
 
+  def decode_login(value) when is_binary(value), do: value
+  def decode_login(_), do: {:error, "Unexpected type when decoding User.login"}
+
+  def encode_login(value) when is_binary(value), do: value
+  def encode_login(_), do: {:error, "Unexpected type when encoding User.login"}
+
   def from_map(m) do
     %User{
-      login: m["login"],
+      login: decode_login(m["login"]),
       repository: m["repository"] && Repository.from_map(m["repository"]),
     }
   end
@@ -236,9 +242,15 @@ defmodule Error do
           message: String.t()
         }
 
+  def decode_message(value) when is_binary(value), do: value
+  def decode_message(_), do: {:error, "Unexpected type when decoding Error.message"}
+
+  def encode_message(value) when is_binary(value), do: value
+  def encode_message(_), do: {:error, "Unexpected type when encoding Error.message"}
+
   def from_map(m) do
     %Error{
-      message: m["message"],
+      message: decode_message(m["message"]),
     }
   end
 
diff --git a/base/graphql-elixir/test/inputs/graphql/github4.graphql/default/QuickType.ex b/head/graphql-elixir/test/inputs/graphql/github4.graphql/default/QuickType.ex
index 4157aad..ecb43e3 100644
--- a/base/graphql-elixir/test/inputs/graphql/github4.graphql/default/QuickType.ex
+++ b/head/graphql-elixir/test/inputs/graphql/github4.graphql/default/QuickType.ex
@@ -169,9 +169,15 @@ defmodule User do
           repository: Repository.t() | nil
         }
 
+  def decode_login(value) when is_binary(value), do: value
+  def decode_login(_), do: {:error, "Unexpected type when decoding User.login"}
+
+  def encode_login(value) when is_binary(value), do: value
+  def encode_login(_), do: {:error, "Unexpected type when encoding User.login"}
+
   def from_map(m) do
     %User{
-      login: m["login"],
+      login: decode_login(m["login"]),
       name: m["name"],
       repository: m["repository"] && Repository.from_map(m["repository"]),
     }
@@ -239,9 +245,15 @@ defmodule Error do
           message: String.t()
         }
 
+  def decode_message(value) when is_binary(value), do: value
+  def decode_message(_), do: {:error, "Unexpected type when decoding Error.message"}
+
+  def encode_message(value) when is_binary(value), do: value
+  def encode_message(_), do: {:error, "Unexpected type when encoding Error.message"}
+
   def from_map(m) do
     %Error{
-      message: m["message"],
+      message: decode_message(m["message"]),
     }
   end
 
diff --git a/base/graphql-elixir/test/inputs/graphql/github5.graphql/default/QuickType.ex b/head/graphql-elixir/test/inputs/graphql/github5.graphql/default/QuickType.ex
index d3f7ba1..5325506 100644
--- a/base/graphql-elixir/test/inputs/graphql/github5.graphql/default/QuickType.ex
+++ b/head/graphql-elixir/test/inputs/graphql/github5.graphql/default/QuickType.ex
@@ -14,9 +14,15 @@ defmodule User do
           name: nil | String.t() | nil
         }
 
+  def decode_login(value) when is_binary(value), do: value
+  def decode_login(_), do: {:error, "Unexpected type when decoding User.login"}
+
+  def encode_login(value) when is_binary(value), do: value
+  def encode_login(_), do: {:error, "Unexpected type when encoding User.login"}
+
   def from_map(m) do
     %User{
-      login: m["login"],
+      login: decode_login(m["login"]),
       name: m["name"],
     }
   end
@@ -82,9 +88,15 @@ defmodule Error do
           message: String.t()
         }
 
+  def decode_message(value) when is_binary(value), do: value
+  def decode_message(_), do: {:error, "Unexpected type when decoding Error.message"}
+
+  def encode_message(value) when is_binary(value), do: value
+  def encode_message(_), do: {:error, "Unexpected type when encoding Error.message"}
+
   def from_map(m) do
     %Error{
-      message: m["message"],
+      message: decode_message(m["message"]),
     }
   end
 
diff --git a/base/graphql-elixir/test/inputs/graphql/github6.graphql/default/QuickType.ex b/head/graphql-elixir/test/inputs/graphql/github6.graphql/default/QuickType.ex
index 1455474..4be2413 100644
--- a/base/graphql-elixir/test/inputs/graphql/github6.graphql/default/QuickType.ex
+++ b/head/graphql-elixir/test/inputs/graphql/github6.graphql/default/QuickType.ex
@@ -14,9 +14,15 @@ defmodule UniformResourceLocatable do
           login: String.t() | nil
         }
 
+  def decode_url(value) when is_binary(value), do: value
+  def decode_url(_), do: {:error, "Unexpected type when decoding UniformResourceLocatable.url"}
+
+  def encode_url(value) when is_binary(value), do: value
+  def encode_url(_), do: {:error, "Unexpected type when encoding UniformResourceLocatable.url"}
+
   def from_map(m) do
     %UniformResourceLocatable{
-      url: m["url"],
+      url: decode_url(m["url"]),
       login: m["login"],
     }
   end
@@ -82,9 +88,15 @@ defmodule Error do
           message: String.t()
         }
 
+  def decode_message(value) when is_binary(value), do: value
+  def decode_message(_), do: {:error, "Unexpected type when decoding Error.message"}
+
+  def encode_message(value) when is_binary(value), do: value
+  def encode_message(_), do: {:error, "Unexpected type when encoding Error.message"}
+
   def from_map(m) do
     %Error{
-      message: m["message"],
+      message: decode_message(m["message"]),
     }
   end
 
diff --git a/base/graphql-elixir/test/inputs/graphql/github7.graphql/default/QuickType.ex b/head/graphql-elixir/test/inputs/graphql/github7.graphql/default/QuickType.ex
index 9d7f346..12712e3 100644
--- a/base/graphql-elixir/test/inputs/graphql/github7.graphql/default/QuickType.ex
+++ b/head/graphql-elixir/test/inputs/graphql/github7.graphql/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule Connection do
           total_count: integer()
         }
 
+  def decode_total_count(value) when is_integer(value), do: value
+  def decode_total_count(_), do: {:error, "Unexpected type when decoding Connection.total_count"}
+
+  def encode_total_count(value) when is_integer(value), do: value
+  def encode_total_count(_), do: {:error, "Unexpected type when encoding Connection.total_count"}
+
   def from_map(m) do
     %Connection{
-      total_count: m["totalCount"],
+      total_count: decode_total_count(m["totalCount"]),
     }
   end
 
@@ -50,9 +56,15 @@ defmodule Repository do
           issues: Connection.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Repository.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Repository.name"}
+
   def from_map(m) do
     %Repository{
-      name: m["name"],
+      name: decode_name(m["name"]),
       stargazers: Connection.from_map(m["stargazers"]),
       forks: Connection.from_map(m["forks"]),
       watchers: Connection.from_map(m["watchers"]),
@@ -167,9 +179,15 @@ defmodule User do
           repositories: RepositoryConnection.t()
         }
 
+  def decode_login(value) when is_binary(value), do: value
+  def decode_login(_), do: {:error, "Unexpected type when decoding User.login"}
+
+  def encode_login(value) when is_binary(value), do: value
+  def encode_login(_), do: {:error, "Unexpected type when encoding User.login"}
+
   def from_map(m) do
     %User{
-      login: m["login"],
+      login: decode_login(m["login"]),
       starred_repositories: Connection.from_map(m["starredRepositories"]),
       repositories: RepositoryConnection.from_map(m["repositories"]),
     }
@@ -237,9 +255,15 @@ defmodule Error do
           message: String.t()
         }
 
+  def decode_message(value) when is_binary(value), do: value
+  def decode_message(_), do: {:error, "Unexpected type when decoding Error.message"}
+
+  def encode_message(value) when is_binary(value), do: value
+  def encode_message(_), do: {:error, "Unexpected type when encoding Error.message"}
+
   def from_map(m) do
     %Error{
-      message: m["message"],
+      message: decode_message(m["message"]),
     }
   end
 
diff --git a/base/graphql-elixir/test/inputs/graphql/github8.graphql/default/QuickType.ex b/head/graphql-elixir/test/inputs/graphql/github8.graphql/default/QuickType.ex
index 25a49df..6231fe6 100644
--- a/base/graphql-elixir/test/inputs/graphql/github8.graphql/default/QuickType.ex
+++ b/head/graphql-elixir/test/inputs/graphql/github8.graphql/default/QuickType.ex
@@ -99,9 +99,15 @@ defmodule Repository do
           n307: IssueOrPullRequest.t() | nil
         }
 
+  def decode_name_with_owner(value) when is_binary(value), do: value
+  def decode_name_with_owner(_), do: {:error, "Unexpected type when decoding Repository.name_with_owner"}
+
+  def encode_name_with_owner(value) when is_binary(value), do: value
+  def encode_name_with_owner(_), do: {:error, "Unexpected type when encoding Repository.name_with_owner"}
+
   def from_map(m) do
     %Repository{
-      name_with_owner: m["nameWithOwner"],
+      name_with_owner: decode_name_with_owner(m["nameWithOwner"]),
       n303: m["n303"] && IssueOrPullRequest.from_map(m["n303"]),
       n307: m["n307"] && IssueOrPullRequest.from_map(m["n307"]),
     }
@@ -169,9 +175,15 @@ defmodule Error do
           message: String.t()
         }
 
+  def decode_message(value) when is_binary(value), do: value
+  def decode_message(_), do: {:error, "Unexpected type when decoding Error.message"}
+
+  def encode_message(value) when is_binary(value), do: value
+  def encode_message(_), do: {:error, "Unexpected type when encoding Error.message"}
+
   def from_map(m) do
     %Error{
-      message: m["message"],
+      message: decode_message(m["message"]),
     }
   end
 
diff --git a/base/graphql-elixir/test/inputs/graphql/github9.graphql/default/QuickType.ex b/head/graphql-elixir/test/inputs/graphql/github9.graphql/default/QuickType.ex
index ee70a8b..f0c632c 100644
--- a/base/graphql-elixir/test/inputs/graphql/github9.graphql/default/QuickType.ex
+++ b/head/graphql-elixir/test/inputs/graphql/github9.graphql/default/QuickType.ex
@@ -97,9 +97,21 @@ defmodule Reactable do
           reaction_groups: [Reaction.t()] | nil
         }
 
+  def decode_viewer_can_react(value) when is_boolean(value), do: value
+  def decode_viewer_can_react(_), do: {:error, "Unexpected type when decoding Reactable.viewer_can_react"}
+
+  def encode_viewer_can_react(value) when is_boolean(value), do: value
+  def encode_viewer_can_react(_), do: {:error, "Unexpected type when encoding Reactable.viewer_can_react"}
+
+  def decode_reaction_groups_element(%{"content" => _,} = value), do: Reaction.from_map(value)
+  def decode_reaction_groups_element(_), do: {:error, "Unexpected type when decoding Reactable.reaction_groups"}
+
+  def encode_reaction_groups_element(%Reaction{} = value), do: Reaction.to_map(value)
+  def encode_reaction_groups_element(_), do: {:error, "Unexpected type when encoding Reactable.reaction_groups"}
+
   def from_map(m) do
     %Reactable{
-      viewer_can_react: m["viewerCanReact"],
+      viewer_can_react: decode_viewer_can_react(m["viewerCanReact"]),
       reaction_groups: m["reactionGroups"] && Enum.map(m["reactionGroups"], &Reaction.from_map/1),
     }
   end
@@ -204,9 +216,15 @@ defmodule Error do
           message: String.t()
         }
 
+  def decode_message(value) when is_binary(value), do: value
+  def decode_message(_), do: {:error, "Unexpected type when decoding Error.message"}
+
+  def encode_message(value) when is_binary(value), do: value
+  def encode_message(_), do: {:error, "Unexpected type when encoding Error.message"}
+
   def from_map(m) do
     %Error{
-      message: m["message"],
+      message: decode_message(m["message"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/accessors.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/accessors.schema/default/QuickType.ex
index f6d9cf3..fe5f9ab 100644
--- a/base/schema-elixir/test/inputs/schema/accessors.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/accessors.schema/default/QuickType.ex
@@ -63,11 +63,23 @@ defmodule TopLevel do
           unionization: boolean() | float()
         }
 
+  def decode_barre(value) when is_binary(value), do: value
+  def decode_barre(_), do: {:error, "Unexpected type when decoding TopLevel.barre"}
+
+  def encode_barre(value) when is_binary(value), do: value
+  def encode_barre(_), do: {:error, "Unexpected type when encoding TopLevel.barre"}
+
+  def decode_foo(value) when is_binary(value), do: value
+  def decode_foo(_), do: {:error, "Unexpected type when decoding TopLevel.foo"}
+
+  def encode_foo(value) when is_binary(value), do: value
+  def encode_foo(_), do: {:error, "Unexpected type when encoding TopLevel.foo"}
+
   def from_map(m) do
     %TopLevel{
-      barre: m["bar"],
+      barre: decode_barre(m["bar"]),
       enumerification: EnumEnum.decode(m["enum"]),
-      foo: m["foo"],
+      foo: decode_foo(m["foo"]),
       unionization: m["union"],
     }
   end
diff --git a/base/schema-elixir/test/inputs/schema/all-of-additional-properties-false.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/all-of-additional-properties-false.schema/default/QuickType.ex
index ff5ebd1..9125750 100644
--- a/base/schema-elixir/test/inputs/schema/all-of-additional-properties-false.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/all-of-additional-properties-false.schema/default/QuickType.ex
@@ -109,9 +109,17 @@ defmodule TopLevel do
           type: Type.t()
         }
 
+  def decode_amount(value) when is_float(value), do: value
+  def decode_amount(value) when is_integer(value), do: value
+  def decode_amount(_), do: {:error, "Unexpected type when decoding TopLevel.amount"}
+
+  def encode_amount(value) when is_float(value), do: value
+  def encode_amount(value) when is_integer(value), do: value
+  def encode_amount(_), do: {:error, "Unexpected type when encoding TopLevel.amount"}
+
   def from_map(m) do
     %TopLevel{
-      amount: m["amount"],
+      amount: decode_amount(m["amount"]),
       frequency: Frequency.decode(m["frequency"]),
       description: m["description"],
       type: Type.decode(m["type"]),
diff --git a/base/schema-elixir/test/inputs/schema/bool-string.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/bool-string.schema/default/QuickType.ex
index 8bd9c99..019829a 100644
--- a/base/schema-elixir/test/inputs/schema/bool-string.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/bool-string.schema/default/QuickType.ex
@@ -27,12 +27,18 @@ defmodule TopLevel do
   def encode_arr_nullable_element(value) when is_binary(value), do: value
   def encode_arr_nullable_element(_), do: {:error, "Unexpected type when encoding TopLevel.arr_nullable"}
 
+  def decode_one(value) when is_binary(value), do: value
+  def decode_one(_), do: {:error, "Unexpected type when decoding TopLevel.one"}
+
+  def encode_one(value) when is_binary(value), do: value
+  def encode_one(_), do: {:error, "Unexpected type when encoding TopLevel.one"}
+
   def from_map(m) do
     %TopLevel{
       arr_nullable: m["arrNullable"] && Enum.map(m["arrNullable"], &decode_arr_nullable_element/1),
       arr_one: m["arrOne"],
       nullable: m["nullable"],
-      one: m["one"],
+      one: decode_one(m["one"]),
       optional: m["optional"],
       union_with_bool: m["unionWithBool"],
       union_with_bool_and_enum: m["unionWithBoolAndEnum"],
diff --git a/head/schema-elixir/test/inputs/schema/boolean-subschema.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/boolean-subschema.schema/default/QuickType.ex
new file mode 100644
index 0000000..5b53c89
--- /dev/null
+++ b/head/schema-elixir/test/inputs/schema/boolean-subschema.schema/default/QuickType.ex
@@ -0,0 +1,60 @@
+# This file was autogenerated using quicktype https://github.com/quicktype/quicktype
+#
+# Add Jason to your mix.exs
+#
+# Decode a JSON string: TopLevel.from_json(data)
+# Encode into a JSON string: TopLevel.to_json(struct)
+
+defmodule TopLevel do
+  @enforce_keys [:empty, :foo]
+  defstruct [:disallowed, :empty, :foo, :impossible]
+
+  @type t :: %__MODULE__{
+          disallowed: any() | nil,
+          empty: [any()],
+          foo: String.t(),
+          impossible: any() | nil
+        }
+
+  def decode_empty(value) when is_list(value), do: value
+  def decode_empty(_), do: {:error, "Unexpected type when decoding TopLevel.empty"}
+
+  def encode_empty(value) when is_list(value), do: value
+  def encode_empty(_), do: {:error, "Unexpected type when encoding TopLevel.empty"}
+
+  def decode_foo(value) when is_binary(value), do: value
+  def decode_foo(_), do: {:error, "Unexpected type when decoding TopLevel.foo"}
+
+  def encode_foo(value) when is_binary(value), do: value
+  def encode_foo(_), do: {:error, "Unexpected type when encoding TopLevel.foo"}
+
+  def from_map(m) do
+    %TopLevel{
+      disallowed: m["disallowed"],
+      empty: decode_empty(m["empty"]),
+      foo: decode_foo(m["foo"]),
+      impossible: m["impossible"],
+    }
+  end
+
+  def from_json(json) do
+    json
+          |> Jason.decode!()
+          |> from_map()
+  end
+
+  def to_map(struct) do
+    %{
+      "disallowed" => struct.disallowed,
+      "empty" => struct.empty,
+      "foo" => struct.foo,
+      "impossible" => struct.impossible,
+    }
+  end
+
+  def to_json(struct) do
+    struct
+          |> to_map()
+          |> Jason.encode!()
+  end
+end
diff --git a/base/schema-elixir/test/inputs/schema/class-with-additional.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/class-with-additional.schema/default/QuickType.ex
index eb1cc12..471562f 100644
--- a/base/schema-elixir/test/inputs/schema/class-with-additional.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/class-with-additional.schema/default/QuickType.ex
@@ -24,7 +24,8 @@ defmodule TopLevel do
 
   def from_map(m) do
     %TopLevel{
-      map: m["map"],
+      map: m["map"]
+      |> Map.new(fn {key, value} -> {key, decode_map_value(value)} end),
     }
   end
 
@@ -36,7 +37,8 @@ defmodule TopLevel do
 
   def to_map(struct) do
     %{
-      "map" => struct.map,
+      "map" => struct.map
+      |> Map.new(fn {key, value} -> {key, encode_map_value(value)} end),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/comment-injection-nested-comment.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/comment-injection-nested-comment.schema/default/QuickType.ex
index 2c8a56a..16a848d 100644
--- a/base/schema-elixir/test/inputs/schema/comment-injection-nested-comment.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/comment-injection-nested-comment.schema/default/QuickType.ex
@@ -21,9 +21,15 @@ defmodule TopLevel do
           value: String.t()
         }
 
+  def decode_value(value) when is_binary(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding TopLevel.value"}
+
+  def encode_value(value) when is_binary(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding TopLevel.value"}
+
   def from_map(m) do
     %TopLevel{
-      value: m["value"],
+      value: decode_value(m["value"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/comment-injection.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/comment-injection.schema/default/QuickType.ex
index 56d28c3..568bd38 100644
--- a/base/schema-elixir/test/inputs/schema/comment-injection.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/comment-injection.schema/default/QuickType.ex
@@ -35,12 +35,18 @@ defmodule TopLevel do
           value: String.t()
         }
 
+  def decode_value(value) when is_binary(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding TopLevel.value"}
+
+  def encode_value(value) when is_binary(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding TopLevel.value"}
+
   def from_map(m) do
     %TopLevel{
       trailing_backslash: m["trailingBackslash"],
       trailing_quote: m["trailingQuote"],
       trailing_triple_quote: m["trailingTripleQuote"],
-      value: m["value"],
+      value: decode_value(m["value"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/const-non-string.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/const-non-string.schema/default/QuickType.ex
index 9dbf0f0..7cdafba 100644
--- a/base/schema-elixir/test/inputs/schema/const-non-string.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/const-non-string.schema/default/QuickType.ex
@@ -62,13 +62,41 @@ defmodule TopLevel do
           version: float()
         }
 
+  def decode_amount(value) when is_integer(value), do: value
+  def decode_amount(_), do: {:error, "Unexpected type when decoding TopLevel.amount"}
+
+  def encode_amount(value) when is_integer(value), do: value
+  def encode_amount(_), do: {:error, "Unexpected type when encoding TopLevel.amount"}
+
+  def decode_enabled(value) when is_boolean(value), do: value
+  def decode_enabled(_), do: {:error, "Unexpected type when decoding TopLevel.enabled"}
+
+  def encode_enabled(value) when is_boolean(value), do: value
+  def encode_enabled(_), do: {:error, "Unexpected type when encoding TopLevel.enabled"}
+
+  def decode_ratio(value) when is_float(value), do: value
+  def decode_ratio(value) when is_integer(value), do: value
+  def decode_ratio(_), do: {:error, "Unexpected type when decoding TopLevel.ratio"}
+
+  def encode_ratio(value) when is_float(value), do: value
+  def encode_ratio(value) when is_integer(value), do: value
+  def encode_ratio(_), do: {:error, "Unexpected type when encoding TopLevel.ratio"}
+
+  def decode_version(value) when is_float(value), do: value
+  def decode_version(value) when is_integer(value), do: value
+  def decode_version(_), do: {:error, "Unexpected type when decoding TopLevel.version"}
+
+  def encode_version(value) when is_float(value), do: value
+  def encode_version(value) when is_integer(value), do: value
+  def encode_version(_), do: {:error, "Unexpected type when encoding TopLevel.version"}
+
   def from_map(m) do
     %TopLevel{
-      amount: m["amount"],
-      enabled: m["enabled"],
+      amount: decode_amount(m["amount"]),
+      enabled: decode_enabled(m["enabled"]),
       kind: Kind.decode(m["kind"]),
-      ratio: m["ratio"],
-      version: m["version"],
+      ratio: decode_ratio(m["ratio"]),
+      version: decode_version(m["version"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/cut-enum.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/cut-enum.schema/default/QuickType.ex
index 6ad5247..c02f943 100644
--- a/base/schema-elixir/test/inputs/schema/cut-enum.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/cut-enum.schema/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule TopLevel do
           foo: integer()
         }
 
+  def decode_foo(value) when is_integer(value), do: value
+  def decode_foo(_), do: {:error, "Unexpected type when decoding TopLevel.foo"}
+
+  def encode_foo(value) when is_integer(value), do: value
+  def encode_foo(_), do: {:error, "Unexpected type when encoding TopLevel.foo"}
+
   def from_map(m) do
     %TopLevel{
-      foo: m["foo"],
+      foo: decode_foo(m["foo"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/date-time-or-string.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/date-time-or-string.schema/default/QuickType.ex
index 44ed170..c991af2 100644
--- a/base/schema-elixir/test/inputs/schema/date-time-or-string.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/date-time-or-string.schema/default/QuickType.ex
@@ -14,10 +14,22 @@ defmodule TopLevel do
           foo: String.t()
         }
 
+  def decode_bar(value) when is_binary(value), do: value
+  def decode_bar(_), do: {:error, "Unexpected type when decoding TopLevel.bar"}
+
+  def encode_bar(value) when is_binary(value), do: value
+  def encode_bar(_), do: {:error, "Unexpected type when encoding TopLevel.bar"}
+
+  def decode_foo(value) when is_binary(value), do: value
+  def decode_foo(_), do: {:error, "Unexpected type when decoding TopLevel.foo"}
+
+  def encode_foo(value) when is_binary(value), do: value
+  def encode_foo(_), do: {:error, "Unexpected type when encoding TopLevel.foo"}
+
   def from_map(m) do
     %TopLevel{
-      bar: m["bar"],
-      foo: m["foo"],
+      bar: decode_bar(m["bar"]),
+      foo: decode_foo(m["foo"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/date-time.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/date-time.schema/default/QuickType.ex
index 915dc4c..4d75e9a 100644
--- a/base/schema-elixir/test/inputs/schema/date-time.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/date-time.schema/default/QuickType.ex
@@ -17,6 +17,12 @@ defmodule TopLevel do
           union_array: [String.t()]
         }
 
+  def decode_complex_union_array(value) when is_list(value), do: value
+  def decode_complex_union_array(_), do: {:error, "Unexpected type when decoding TopLevel.complex_union_array"}
+
+  def encode_complex_union_array(value) when is_list(value), do: value
+  def encode_complex_union_array(_), do: {:error, "Unexpected type when encoding TopLevel.complex_union_array"}
+
   def decode_complex_union_array_element(value) when is_integer(value), do: value
   def decode_complex_union_array_element(value) when is_binary(value), do: value
   def decode_complex_union_array_element(_), do: {:error, "Unexpected type when decoding TopLevel.complex_union_array"}
@@ -25,13 +31,37 @@ defmodule TopLevel do
   def encode_complex_union_array_element(value) when is_binary(value), do: value
   def encode_complex_union_array_element(_), do: {:error, "Unexpected type when encoding TopLevel.complex_union_array"}
 
+  def decode_date(value) when is_binary(value), do: value
+  def decode_date(_), do: {:error, "Unexpected type when decoding TopLevel.date"}
+
+  def encode_date(value) when is_binary(value), do: value
+  def encode_date(_), do: {:error, "Unexpected type when encoding TopLevel.date"}
+
+  def decode_date_time(value) when is_binary(value), do: value
+  def decode_date_time(_), do: {:error, "Unexpected type when decoding TopLevel.date_time"}
+
+  def encode_date_time(value) when is_binary(value), do: value
+  def encode_date_time(_), do: {:error, "Unexpected type when encoding TopLevel.date_time"}
+
+  def decode_time(value) when is_binary(value), do: value
+  def decode_time(_), do: {:error, "Unexpected type when decoding TopLevel.time"}
+
+  def encode_time(value) when is_binary(value), do: value
+  def encode_time(_), do: {:error, "Unexpected type when encoding TopLevel.time"}
+
+  def decode_union_array(value) when is_list(value), do: value
+  def decode_union_array(_), do: {:error, "Unexpected type when decoding TopLevel.union_array"}
+
+  def encode_union_array(value) when is_list(value), do: value
+  def encode_union_array(_), do: {:error, "Unexpected type when encoding TopLevel.union_array"}
+
   def from_map(m) do
     %TopLevel{
       complex_union_array: Enum.map(m["complex-union-array"], &decode_complex_union_array_element/1),
-      date: m["date"],
-      date_time: m["date-time"],
-      time: m["time"],
-      union_array: m["union-array"],
+      date: decode_date(m["date"]),
+      date_time: decode_date_time(m["date-time"]),
+      time: decode_time(m["time"]),
+      union_array: decode_union_array(m["union-array"]),
     }
   end
 
diff --git a/head/schema-elixir/test/inputs/schema/default-value.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/default-value.schema/default/QuickType.ex
new file mode 100644
index 0000000..2ea737b
--- /dev/null
+++ b/head/schema-elixir/test/inputs/schema/default-value.schema/default/QuickType.ex
@@ -0,0 +1,49 @@
+# This file was autogenerated using quicktype https://github.com/quicktype/quicktype
+#
+# Add Jason to your mix.exs
+#
+# Decode a JSON string: TopLevel.from_json(data)
+# Encode into a JSON string: TopLevel.to_json(struct)
+
+defmodule TopLevel do
+  @moduledoc """
+  An object with a scalar default
+  """
+
+  @enforce_keys [:id]
+  defstruct [:id]
+
+  @type t :: %__MODULE__{
+          id: integer()
+        }
+
+  def decode_id(value) when is_integer(value), do: value
+  def decode_id(_), do: {:error, "Unexpected type when decoding TopLevel.id"}
+
+  def encode_id(value) when is_integer(value), do: value
+  def encode_id(_), do: {:error, "Unexpected type when encoding TopLevel.id"}
+
+  def from_map(m) do
+    %TopLevel{
+      id: decode_id(m["id"]),
+    }
+  end
+
+  def from_json(json) do
+    json
+          |> Jason.decode!()
+          |> from_map()
+  end
+
+  def to_map(struct) do
+    %{
+      "id" => struct.id,
+    }
+  end
+
+  def to_json(struct) do
+    struct
+          |> to_map()
+          |> Jason.encode!()
+  end
+end
diff --git a/base/schema-elixir/test/inputs/schema/description.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/description.schema/default/QuickType.ex
index 933eb3d..5ab0436 100644
--- a/base/schema-elixir/test/inputs/schema/description.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/description.schema/default/QuickType.ex
@@ -66,9 +66,17 @@ defmodule ObjectOrStringClass do
           prop: float()
         }
 
+  def decode_prop(value) when is_float(value), do: value
+  def decode_prop(value) when is_integer(value), do: value
+  def decode_prop(_), do: {:error, "Unexpected type when decoding ObjectOrStringClass.prop"}
+
+  def encode_prop(value) when is_float(value), do: value
+  def encode_prop(value) when is_integer(value), do: value
+  def encode_prop(_), do: {:error, "Unexpected type when encoding ObjectOrStringClass.prop"}
+
   def from_map(m) do
     %ObjectOrStringClass{
-      prop: m["prop"],
+      prop: decode_prop(m["prop"]),
     }
   end
 
diff --git a/head/schema-elixir/test/inputs/schema/go-schema-pattern-properties.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/go-schema-pattern-properties.schema/default/QuickType.ex
new file mode 100644
index 0000000..6be160b
--- /dev/null
+++ b/head/schema-elixir/test/inputs/schema/go-schema-pattern-properties.schema/default/QuickType.ex
@@ -0,0 +1,46 @@
+# This file was autogenerated using quicktype https://github.com/quicktype/quicktype
+#
+# Add Jason to your mix.exs
+#
+# Decode a JSON string: TopLevel.from_json(data)
+# Encode into a JSON string: TopLevel.to_json(struct)
+
+defmodule TopLevel do
+  @enforce_keys [:map]
+  defstruct [:map]
+
+  @type t :: %__MODULE__{
+          map: %{String.t() => integer()}
+        }
+
+  def decode_map_value(value) when is_integer(value), do: value
+  def decode_map_value(_), do: {:error, "Unexpected type when decoding TopLevel.map"}
+
+  def encode_map_value(value) when is_integer(value), do: value
+  def encode_map_value(_), do: {:error, "Unexpected type when encoding TopLevel.map"}
+
+  def from_map(m) do
+    %TopLevel{
+      map: m["map"]
+      |> Map.new(fn {key, value} -> {key, decode_map_value(value)} end),
+    }
+  end
+
+  def from_json(json) do
+    json
+          |> Jason.decode!()
+          |> from_map()
+  end
+
+  def to_map(struct) do
+    %{
+      "map" => struct.map,
+    }
+  end
+
+  def to_json(struct) do
+    struct
+          |> to_map()
+          |> Jason.encode!()
+  end
+end
diff --git a/base/schema-elixir/test/inputs/schema/id-no-address.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/id-no-address.schema/default/QuickType.ex
index c17d420..11a6b4d 100644
--- a/base/schema-elixir/test/inputs/schema/id-no-address.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/id-no-address.schema/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule TopLevel do
           item: integer()
         }
 
+  def decode_item(value) when is_integer(value), do: value
+  def decode_item(_), do: {:error, "Unexpected type when decoding TopLevel.item"}
+
+  def encode_item(value) when is_integer(value), do: value
+  def encode_item(_), do: {:error, "Unexpected type when encoding TopLevel.item"}
+
   def from_map(m) do
     %TopLevel{
-      item: m["item"],
+      item: decode_item(m["item"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/id-root.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/id-root.schema/default/QuickType.ex
index f300af1..6e81b17 100644
--- a/base/schema-elixir/test/inputs/schema/id-root.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/id-root.schema/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule TopLevel do
           bar: integer()
         }
 
+  def decode_bar(value) when is_integer(value), do: value
+  def decode_bar(_), do: {:error, "Unexpected type when decoding TopLevel.bar"}
+
+  def encode_bar(value) when is_integer(value), do: value
+  def encode_bar(_), do: {:error, "Unexpected type when encoding TopLevel.bar"}
+
   def from_map(m) do
     %TopLevel{
-      bar: m["bar"],
+      bar: decode_bar(m["bar"]),
     }
   end
 
diff --git a/head/schema-elixir/test/inputs/schema/ie-suffix-singularization.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/ie-suffix-singularization.schema/default/QuickType.ex
new file mode 100644
index 0000000..da2e610
--- /dev/null
+++ b/head/schema-elixir/test/inputs/schema/ie-suffix-singularization.schema/default/QuickType.ex
@@ -0,0 +1,93 @@
+# This file was autogenerated using quicktype https://github.com/quicktype/quicktype
+#
+# Add Jason to your mix.exs
+#
+# Decode a JSON string: TopLevel.from_json(data)
+# Encode into a JSON string: TopLevel.to_json(struct)
+
+defmodule Cookie do
+  @enforce_keys [:name, :value]
+  defstruct [:name, :value]
+
+  @type t :: %__MODULE__{
+          name: String.t(),
+          value: String.t()
+        }
+
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding Cookie.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding Cookie.name"}
+
+  def decode_value(value) when is_binary(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding Cookie.value"}
+
+  def encode_value(value) when is_binary(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding Cookie.value"}
+
+  def from_map(m) do
+    %Cookie{
+      name: decode_name(m["name"]),
+      value: decode_value(m["value"]),
+    }
+  end
+
+  def from_json(json) do
+    json
+          |> Jason.decode!()
+          |> from_map()
+  end
+
+  def to_map(struct) do
+    %{
+      "name" => struct.name,
+      "value" => struct.value,
+    }
+  end
+
+  def to_json(struct) do
+    struct
+          |> to_map()
+          |> Jason.encode!()
+  end
+end
+
+defmodule TopLevel do
+  @enforce_keys [:cookies]
+  defstruct [:cookies]
+
+  @type t :: %__MODULE__{
+          cookies: [Cookie.t()]
+        }
+
+  def decode_cookies(value) when is_list(value), do: value
+  def decode_cookies(_), do: {:error, "Unexpected type when decoding TopLevel.cookies"}
+
+  def encode_cookies(value) when is_list(value), do: value
+  def encode_cookies(_), do: {:error, "Unexpected type when encoding TopLevel.cookies"}
+
+  def from_map(m) do
+    %TopLevel{
+      cookies: Enum.map(m["cookies"], &Cookie.from_map/1),
+    }
+  end
+
+  def from_json(json) do
+    json
+          |> Jason.decode!()
+          |> from_map()
+  end
+
+  def to_map(struct) do
+    %{
+      "cookies" => struct.cookies && Enum.map(struct.cookies, &Cookie.to_map/1),
+    }
+  end
+
+  def to_json(struct) do
+    struct
+          |> to_map()
+          |> Jason.encode!()
+  end
+end
diff --git a/base/schema-elixir/test/inputs/schema/implicit-all-of.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/implicit-all-of.schema/default/QuickType.ex
index f4019fb..919c9df 100644
--- a/base/schema-elixir/test/inputs/schema/implicit-all-of.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/implicit-all-of.schema/default/QuickType.ex
@@ -15,11 +15,29 @@ defmodule TopLevel do
           quux: String.t()
         }
 
+  def decode_foo(value) when is_integer(value), do: value
+  def decode_foo(_), do: {:error, "Unexpected type when decoding TopLevel.foo"}
+
+  def encode_foo(value) when is_integer(value), do: value
+  def encode_foo(_), do: {:error, "Unexpected type when encoding TopLevel.foo"}
+
+  def decode_bar(value) when is_boolean(value), do: value
+  def decode_bar(_), do: {:error, "Unexpected type when decoding TopLevel.bar"}
+
+  def encode_bar(value) when is_boolean(value), do: value
+  def encode_bar(_), do: {:error, "Unexpected type when encoding TopLevel.bar"}
+
+  def decode_quux(value) when is_binary(value), do: value
+  def decode_quux(_), do: {:error, "Unexpected type when decoding TopLevel.quux"}
+
+  def encode_quux(value) when is_binary(value), do: value
+  def encode_quux(_), do: {:error, "Unexpected type when encoding TopLevel.quux"}
+
   def from_map(m) do
     %TopLevel{
-      foo: m["foo"],
-      bar: m["bar"],
-      quux: m["quux"],
+      foo: decode_foo(m["foo"]),
+      bar: decode_bar(m["bar"]),
+      quux: decode_quux(m["quux"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/implicit-class-array-union.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/implicit-class-array-union.schema/default/QuickType.ex
index 1dc999b..c6dedb0 100644
--- a/base/schema-elixir/test/inputs/schema/implicit-class-array-union.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/implicit-class-array-union.schema/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule FooClass do
           bar: integer()
         }
 
+  def decode_bar(value) when is_integer(value), do: value
+  def decode_bar(_), do: {:error, "Unexpected type when decoding FooClass.bar"}
+
+  def encode_bar(value) when is_integer(value), do: value
+  def encode_bar(_), do: {:error, "Unexpected type when encoding FooClass.bar"}
+
   def from_map(m) do
     %FooClass{
-      bar: m["bar"],
+      bar: decode_bar(m["bar"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/implicit-one-of.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/implicit-one-of.schema/default/QuickType.ex
index 1370b5c..799ebf6 100644
--- a/base/schema-elixir/test/inputs/schema/implicit-one-of.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/implicit-one-of.schema/default/QuickType.ex
@@ -15,9 +15,15 @@ defmodule TopLevel do
           quux: String.t() | nil
         }
 
+  def decode_foo(value) when is_integer(value), do: value
+  def decode_foo(_), do: {:error, "Unexpected type when decoding TopLevel.foo"}
+
+  def encode_foo(value) when is_integer(value), do: value
+  def encode_foo(_), do: {:error, "Unexpected type when encoding TopLevel.foo"}
+
   def from_map(m) do
     %TopLevel{
-      foo: m["foo"],
+      foo: decode_foo(m["foo"]),
       bar: m["bar"],
       quux: m["quux"],
     }
diff --git a/base/schema-elixir/test/inputs/schema/integer-float-union.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/integer-float-union.schema/default/QuickType.ex
index 53b2142..41e219c 100644
--- a/base/schema-elixir/test/inputs/schema/integer-float-union.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/integer-float-union.schema/default/QuickType.ex
@@ -13,9 +13,17 @@ defmodule TopLevel do
           number: float()
         }
 
+  def decode_number(value) when is_float(value), do: value
+  def decode_number(value) when is_integer(value), do: value
+  def decode_number(_), do: {:error, "Unexpected type when decoding TopLevel.number"}
+
+  def encode_number(value) when is_float(value), do: value
+  def encode_number(value) when is_integer(value), do: value
+  def encode_number(_), do: {:error, "Unexpected type when encoding TopLevel.number"}
+
   def from_map(m) do
     %TopLevel{
-      number: m["number"],
+      number: decode_number(m["number"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/integer-string.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/integer-string.schema/default/QuickType.ex
index 55627bf..a669bda 100644
--- a/base/schema-elixir/test/inputs/schema/integer-string.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/integer-string.schema/default/QuickType.ex
@@ -27,12 +27,18 @@ defmodule TopLevel do
   def encode_arr_nullable_element(value) when is_binary(value), do: value
   def encode_arr_nullable_element(_), do: {:error, "Unexpected type when encoding TopLevel.arr_nullable"}
 
+  def decode_one(value) when is_binary(value), do: value
+  def decode_one(_), do: {:error, "Unexpected type when decoding TopLevel.one"}
+
+  def encode_one(value) when is_binary(value), do: value
+  def encode_one(_), do: {:error, "Unexpected type when encoding TopLevel.one"}
+
   def from_map(m) do
     %TopLevel{
       arr_nullable: m["arrNullable"] && Enum.map(m["arrNullable"], &decode_arr_nullable_element/1),
       arr_one: m["arrOne"],
       nullable: m["nullable"],
-      one: m["one"],
+      one: decode_one(m["one"]),
       optional: m["optional"],
       union_with_int: m["unionWithInt"],
       union_with_int_and_enum: m["unionWithIntAndEnum"],
diff --git a/base/schema-elixir/test/inputs/schema/integer-type.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/integer-type.schema/default/QuickType.ex
index 41efa9c..257b3a8 100644
--- a/base/schema-elixir/test/inputs/schema/integer-type.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/integer-type.schema/default/QuickType.ex
@@ -21,17 +21,71 @@ defmodule TopLevel do
           unbounded: integer()
         }
 
+  def decode_above_i32_max(value) when is_integer(value), do: value
+  def decode_above_i32_max(_), do: {:error, "Unexpected type when decoding TopLevel.above_i32_max"}
+
+  def encode_above_i32_max(value) when is_integer(value), do: value
+  def encode_above_i32_max(_), do: {:error, "Unexpected type when encoding TopLevel.above_i32_max"}
+
+  def decode_below_i32_min(value) when is_integer(value), do: value
+  def decode_below_i32_min(_), do: {:error, "Unexpected type when decoding TopLevel.below_i32_min"}
+
+  def encode_below_i32_min(value) when is_integer(value), do: value
+  def encode_below_i32_min(_), do: {:error, "Unexpected type when encoding TopLevel.below_i32_min"}
+
+  def decode_i32_range(value) when is_integer(value), do: value
+  def decode_i32_range(_), do: {:error, "Unexpected type when decoding TopLevel.i32_range"}
+
+  def encode_i32_range(value) when is_integer(value), do: value
+  def encode_i32_range(_), do: {:error, "Unexpected type when encoding TopLevel.i32_range"}
+
+  def decode_large_bounds(value) when is_integer(value), do: value
+  def decode_large_bounds(_), do: {:error, "Unexpected type when decoding TopLevel.large_bounds"}
+
+  def encode_large_bounds(value) when is_integer(value), do: value
+  def encode_large_bounds(_), do: {:error, "Unexpected type when encoding TopLevel.large_bounds"}
+
+  def decode_only_maximum(value) when is_integer(value), do: value
+  def decode_only_maximum(_), do: {:error, "Unexpected type when decoding TopLevel.only_maximum"}
+
+  def encode_only_maximum(value) when is_integer(value), do: value
+  def encode_only_maximum(_), do: {:error, "Unexpected type when encoding TopLevel.only_maximum"}
+
+  def decode_only_minimum(value) when is_integer(value), do: value
+  def decode_only_minimum(_), do: {:error, "Unexpected type when decoding TopLevel.only_minimum"}
+
+  def encode_only_minimum(value) when is_integer(value), do: value
+  def encode_only_minimum(_), do: {:error, "Unexpected type when encoding TopLevel.only_minimum"}
+
+  def decode_small_negative(value) when is_integer(value), do: value
+  def decode_small_negative(_), do: {:error, "Unexpected type when decoding TopLevel.small_negative"}
+
+  def encode_small_negative(value) when is_integer(value), do: value
+  def encode_small_negative(_), do: {:error, "Unexpected type when encoding TopLevel.small_negative"}
+
+  def decode_small_positive(value) when is_integer(value), do: value
+  def decode_small_positive(_), do: {:error, "Unexpected type when decoding TopLevel.small_positive"}
+
+  def encode_small_positive(value) when is_integer(value), do: value
+  def encode_small_positive(_), do: {:error, "Unexpected type when encoding TopLevel.small_positive"}
+
+  def decode_unbounded(value) when is_integer(value), do: value
+  def decode_unbounded(_), do: {:error, "Unexpected type when decoding TopLevel.unbounded"}
+
+  def encode_unbounded(value) when is_integer(value), do: value
+  def encode_unbounded(_), do: {:error, "Unexpected type when encoding TopLevel.unbounded"}
+
   def from_map(m) do
     %TopLevel{
-      above_i32_max: m["above_i32_max"],
-      below_i32_min: m["below_i32_min"],
-      i32_range: m["i32_range"],
-      large_bounds: m["large_bounds"],
-      only_maximum: m["only_maximum"],
-      only_minimum: m["only_minimum"],
-      small_negative: m["small_negative"],
-      small_positive: m["small_positive"],
-      unbounded: m["unbounded"],
+      above_i32_max: decode_above_i32_max(m["above_i32_max"]),
+      below_i32_min: decode_below_i32_min(m["below_i32_min"]),
+      i32_range: decode_i32_range(m["i32_range"]),
+      large_bounds: decode_large_bounds(m["large_bounds"]),
+      only_maximum: decode_only_maximum(m["only_maximum"]),
+      only_minimum: decode_only_minimum(m["only_minimum"]),
+      small_negative: decode_small_negative(m["small_negative"]),
+      small_positive: decode_small_positive(m["small_positive"]),
+      unbounded: decode_unbounded(m["unbounded"]),
     }
   end
 
diff --git a/head/schema-elixir/test/inputs/schema/intersection.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/intersection.schema/default/QuickType.ex
new file mode 100644
index 0000000..8e35c58
--- /dev/null
+++ b/head/schema-elixir/test/inputs/schema/intersection.schema/default/QuickType.ex
@@ -0,0 +1,82 @@
+# This file was autogenerated using quicktype https://github.com/quicktype/quicktype
+#
+# Add Jason to your mix.exs
+#
+# Decode a JSON string: TopLevel.from_json(data)
+# Encode into a JSON string: TopLevel.to_json(struct)
+
+defmodule Intersection do
+  @enforce_keys [:foo]
+  defstruct [:foo, :bar]
+
+  @type t :: %__MODULE__{
+          foo: float(),
+          bar: String.t() | nil
+        }
+
+  def decode_foo(value) when is_float(value), do: value
+  def decode_foo(value) when is_integer(value), do: value
+  def decode_foo(_), do: {:error, "Unexpected type when decoding Intersection.foo"}
+
+  def encode_foo(value) when is_float(value), do: value
+  def encode_foo(value) when is_integer(value), do: value
+  def encode_foo(_), do: {:error, "Unexpected type when encoding Intersection.foo"}
+
+  def from_map(m) do
+    %Intersection{
+      foo: decode_foo(m["foo"]),
+      bar: m["bar"],
+    }
+  end
+
+  def from_json(json) do
+    json
+          |> Jason.decode!()
+          |> from_map()
+  end
+
+  def to_map(struct) do
+    %{
+      "foo" => struct.foo,
+      "bar" => struct.bar,
+    }
+  end
+
+  def to_json(struct) do
+    struct
+          |> to_map()
+          |> Jason.encode!()
+  end
+end
+
+defmodule TopLevel do
+  defstruct [:intersection]
+
+  @type t :: %__MODULE__{
+          intersection: Intersection.t() | nil
+        }
+
+  def from_map(m) do
+    %TopLevel{
+      intersection: m["intersection"] && Intersection.from_map(m["intersection"]),
+    }
+  end
+
+  def from_json(json) do
+    json
+          |> Jason.decode!()
+          |> from_map()
+  end
+
+  def to_map(struct) do
+    %{
+      "intersection" => struct.intersection && Intersection.to_map(struct.intersection),
+    }
+  end
+
+  def to_json(struct) do
+    struct
+          |> to_map()
+          |> Jason.encode!()
+  end
+end
diff --git a/base/schema-elixir/test/inputs/schema/light.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/light.schema/default/QuickType.ex
index dbafcde..1bce0ae 100644
--- a/base/schema-elixir/test/inputs/schema/light.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/light.schema/default/QuickType.ex
@@ -15,11 +15,29 @@ defmodule LightParams do
           rgba: String.t()
         }
 
+  def decode_app_id(value) when is_binary(value), do: value
+  def decode_app_id(_), do: {:error, "Unexpected type when decoding LightParams.app_id"}
+
+  def encode_app_id(value) when is_binary(value), do: value
+  def encode_app_id(_), do: {:error, "Unexpected type when encoding LightParams.app_id"}
+
+  def decode_outlet_id(value) when is_binary(value), do: value
+  def decode_outlet_id(_), do: {:error, "Unexpected type when decoding LightParams.outlet_id"}
+
+  def encode_outlet_id(value) when is_binary(value), do: value
+  def encode_outlet_id(_), do: {:error, "Unexpected type when encoding LightParams.outlet_id"}
+
+  def decode_rgba(value) when is_binary(value), do: value
+  def decode_rgba(_), do: {:error, "Unexpected type when decoding LightParams.rgba"}
+
+  def encode_rgba(value) when is_binary(value), do: value
+  def encode_rgba(_), do: {:error, "Unexpected type when encoding LightParams.rgba"}
+
   def from_map(m) do
     %LightParams{
-      app_id: m["app_id"],
-      outlet_id: m["outlet_id"],
-      rgba: m["rgba"],
+      app_id: decode_app_id(m["app_id"]),
+      outlet_id: decode_outlet_id(m["outlet_id"]),
+      rgba: decode_rgba(m["rgba"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/min-max-items.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/min-max-items.schema/default/QuickType.ex
index afebffa..ab96f6c 100644
--- a/base/schema-elixir/test/inputs/schema/min-max-items.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/min-max-items.schema/default/QuickType.ex
@@ -17,6 +17,36 @@ defmodule TopLevel do
           union_items: [integer() | String.t()]
         }
 
+  def decode_max_only(value) when is_list(value), do: value
+  def decode_max_only(_), do: {:error, "Unexpected type when decoding TopLevel.max_only"}
+
+  def encode_max_only(value) when is_list(value), do: value
+  def encode_max_only(_), do: {:error, "Unexpected type when encoding TopLevel.max_only"}
+
+  def decode_min_and_max(value) when is_list(value), do: value
+  def decode_min_and_max(_), do: {:error, "Unexpected type when decoding TopLevel.min_and_max"}
+
+  def encode_min_and_max(value) when is_list(value), do: value
+  def encode_min_and_max(_), do: {:error, "Unexpected type when encoding TopLevel.min_and_max"}
+
+  def decode_min_only(value) when is_list(value), do: value
+  def decode_min_only(_), do: {:error, "Unexpected type when decoding TopLevel.min_only"}
+
+  def encode_min_only(value) when is_list(value), do: value
+  def encode_min_only(_), do: {:error, "Unexpected type when encoding TopLevel.min_only"}
+
+  def decode_plain(value) when is_list(value), do: value
+  def decode_plain(_), do: {:error, "Unexpected type when decoding TopLevel.plain"}
+
+  def encode_plain(value) when is_list(value), do: value
+  def encode_plain(_), do: {:error, "Unexpected type when encoding TopLevel.plain"}
+
+  def decode_union_items(value) when is_list(value), do: value
+  def decode_union_items(_), do: {:error, "Unexpected type when decoding TopLevel.union_items"}
+
+  def encode_union_items(value) when is_list(value), do: value
+  def encode_union_items(_), do: {:error, "Unexpected type when encoding TopLevel.union_items"}
+
   def decode_union_items_element(value) when is_integer(value), do: value
   def decode_union_items_element(value) when is_binary(value), do: value
   def decode_union_items_element(_), do: {:error, "Unexpected type when decoding TopLevel.union_items"}
@@ -27,10 +57,10 @@ defmodule TopLevel do
 
   def from_map(m) do
     %TopLevel{
-      max_only: m["maxOnly"],
-      min_and_max: m["minAndMax"],
-      min_only: m["minOnly"],
-      plain: m["plain"],
+      max_only: decode_max_only(m["maxOnly"]),
+      min_and_max: decode_min_and_max(m["minAndMax"]),
+      min_only: decode_min_only(m["minOnly"]),
+      plain: decode_plain(m["plain"]),
       union_items: Enum.map(m["unionItems"], &decode_union_items_element/1),
     }
   end
diff --git a/base/schema-elixir/test/inputs/schema/minmax-integer.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/minmax-integer.schema/default/QuickType.ex
index 7e95e06..9129fbd 100644
--- a/base/schema-elixir/test/inputs/schema/minmax-integer.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/minmax-integer.schema/default/QuickType.ex
@@ -20,16 +20,64 @@ defmodule TopLevel do
           union: integer()
         }
 
+  def decode_free(value) when is_integer(value), do: value
+  def decode_free(_), do: {:error, "Unexpected type when decoding TopLevel.free"}
+
+  def encode_free(value) when is_integer(value), do: value
+  def encode_free(_), do: {:error, "Unexpected type when encoding TopLevel.free"}
+
+  def decode_intersection(value) when is_integer(value), do: value
+  def decode_intersection(_), do: {:error, "Unexpected type when decoding TopLevel.intersection"}
+
+  def encode_intersection(value) when is_integer(value), do: value
+  def encode_intersection(_), do: {:error, "Unexpected type when encoding TopLevel.intersection"}
+
+  def decode_max(value) when is_integer(value), do: value
+  def decode_max(_), do: {:error, "Unexpected type when decoding TopLevel.max"}
+
+  def encode_max(value) when is_integer(value), do: value
+  def encode_max(_), do: {:error, "Unexpected type when encoding TopLevel.max"}
+
+  def decode_min(value) when is_integer(value), do: value
+  def decode_min(_), do: {:error, "Unexpected type when decoding TopLevel.min"}
+
+  def encode_min(value) when is_integer(value), do: value
+  def encode_min(_), do: {:error, "Unexpected type when encoding TopLevel.min"}
+
+  def decode_minmax(value) when is_integer(value), do: value
+  def decode_minmax(_), do: {:error, "Unexpected type when decoding TopLevel.minmax"}
+
+  def encode_minmax(value) when is_integer(value), do: value
+  def encode_minmax(_), do: {:error, "Unexpected type when encoding TopLevel.minmax"}
+
+  def decode_min_max_intersection(value) when is_integer(value), do: value
+  def decode_min_max_intersection(_), do: {:error, "Unexpected type when decoding TopLevel.min_max_intersection"}
+
+  def encode_min_max_intersection(value) when is_integer(value), do: value
+  def encode_min_max_intersection(_), do: {:error, "Unexpected type when encoding TopLevel.min_max_intersection"}
+
+  def decode_min_max_union(value) when is_integer(value), do: value
+  def decode_min_max_union(_), do: {:error, "Unexpected type when decoding TopLevel.min_max_union"}
+
+  def encode_min_max_union(value) when is_integer(value), do: value
+  def encode_min_max_union(_), do: {:error, "Unexpected type when encoding TopLevel.min_max_union"}
+
+  def decode_union(value) when is_integer(value), do: value
+  def decode_union(_), do: {:error, "Unexpected type when decoding TopLevel.union"}
+
+  def encode_union(value) when is_integer(value), do: value
+  def encode_union(_), do: {:error, "Unexpected type when encoding TopLevel.union"}
+
   def from_map(m) do
     %TopLevel{
-      free: m["free"],
-      intersection: m["intersection"],
-      max: m["max"],
-      min: m["min"],
-      minmax: m["minmax"],
-      min_max_intersection: m["minMaxIntersection"],
-      min_max_union: m["minMaxUnion"],
-      union: m["union"],
+      free: decode_free(m["free"]),
+      intersection: decode_intersection(m["intersection"]),
+      max: decode_max(m["max"]),
+      min: decode_min(m["min"]),
+      minmax: decode_minmax(m["minmax"]),
+      min_max_intersection: decode_min_max_intersection(m["minMaxIntersection"]),
+      min_max_union: decode_min_max_union(m["minMaxUnion"]),
+      union: decode_union(m["union"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/minmax.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/minmax.schema/default/QuickType.ex
index 3e7b3cf..3ffe159 100644
--- a/base/schema-elixir/test/inputs/schema/minmax.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/minmax.schema/default/QuickType.ex
@@ -20,16 +20,80 @@ defmodule TopLevel do
           union: float()
         }
 
+  def decode_free(value) when is_float(value), do: value
+  def decode_free(value) when is_integer(value), do: value
+  def decode_free(_), do: {:error, "Unexpected type when decoding TopLevel.free"}
+
+  def encode_free(value) when is_float(value), do: value
+  def encode_free(value) when is_integer(value), do: value
+  def encode_free(_), do: {:error, "Unexpected type when encoding TopLevel.free"}
+
+  def decode_intersection(value) when is_float(value), do: value
+  def decode_intersection(value) when is_integer(value), do: value
+  def decode_intersection(_), do: {:error, "Unexpected type when decoding TopLevel.intersection"}
+
+  def encode_intersection(value) when is_float(value), do: value
+  def encode_intersection(value) when is_integer(value), do: value
+  def encode_intersection(_), do: {:error, "Unexpected type when encoding TopLevel.intersection"}
+
+  def decode_max(value) when is_float(value), do: value
+  def decode_max(value) when is_integer(value), do: value
+  def decode_max(_), do: {:error, "Unexpected type when decoding TopLevel.max"}
+
+  def encode_max(value) when is_float(value), do: value
+  def encode_max(value) when is_integer(value), do: value
+  def encode_max(_), do: {:error, "Unexpected type when encoding TopLevel.max"}
+
+  def decode_min(value) when is_float(value), do: value
+  def decode_min(value) when is_integer(value), do: value
+  def decode_min(_), do: {:error, "Unexpected type when decoding TopLevel.min"}
+
+  def encode_min(value) when is_float(value), do: value
+  def encode_min(value) when is_integer(value), do: value
+  def encode_min(_), do: {:error, "Unexpected type when encoding TopLevel.min"}
+
+  def decode_minmax(value) when is_float(value), do: value
+  def decode_minmax(value) when is_integer(value), do: value
+  def decode_minmax(_), do: {:error, "Unexpected type when decoding TopLevel.minmax"}
+
+  def encode_minmax(value) when is_float(value), do: value
+  def encode_minmax(value) when is_integer(value), do: value
+  def encode_minmax(_), do: {:error, "Unexpected type when encoding TopLevel.minmax"}
+
+  def decode_min_max_intersection(value) when is_float(value), do: value
+  def decode_min_max_intersection(value) when is_integer(value), do: value
+  def decode_min_max_intersection(_), do: {:error, "Unexpected type when decoding TopLevel.min_max_intersection"}
+
+  def encode_min_max_intersection(value) when is_float(value), do: value
+  def encode_min_max_intersection(value) when is_integer(value), do: value
+  def encode_min_max_intersection(_), do: {:error, "Unexpected type when encoding TopLevel.min_max_intersection"}
+
+  def decode_min_max_union(value) when is_float(value), do: value
+  def decode_min_max_union(value) when is_integer(value), do: value
+  def decode_min_max_union(_), do: {:error, "Unexpected type when decoding TopLevel.min_max_union"}
+
+  def encode_min_max_union(value) when is_float(value), do: value
+  def encode_min_max_union(value) when is_integer(value), do: value
+  def encode_min_max_union(_), do: {:error, "Unexpected type when encoding TopLevel.min_max_union"}
+
+  def decode_union(value) when is_float(value), do: value
+  def decode_union(value) when is_integer(value), do: value
+  def decode_union(_), do: {:error, "Unexpected type when decoding TopLevel.union"}
+
+  def encode_union(value) when is_float(value), do: value
+  def encode_union(value) when is_integer(value), do: value
+  def encode_union(_), do: {:error, "Unexpected type when encoding TopLevel.union"}
+
   def from_map(m) do
     %TopLevel{
-      free: m["free"],
-      intersection: m["intersection"],
-      max: m["max"],
-      min: m["min"],
-      minmax: m["minmax"],
-      min_max_intersection: m["minMaxIntersection"],
-      min_max_union: m["minMaxUnion"],
-      union: m["union"],
+      free: decode_free(m["free"]),
+      intersection: decode_intersection(m["intersection"]),
+      max: decode_max(m["max"]),
+      min: decode_min(m["min"]),
+      minmax: decode_minmax(m["minmax"]),
+      min_max_intersection: decode_min_max_intersection(m["minMaxIntersection"]),
+      min_max_union: decode_min_max_union(m["minMaxUnion"]),
+      union: decode_union(m["union"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/minmaxlength.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/minmaxlength.schema/default/QuickType.ex
index 31656f4..a94cef5 100644
--- a/base/schema-elixir/test/inputs/schema/minmaxlength.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/minmaxlength.schema/default/QuickType.ex
@@ -20,16 +20,58 @@ defmodule TopLevel do
           union: String.t()
         }
 
+  def decode_intersection(value) when is_binary(value), do: value
+  def decode_intersection(_), do: {:error, "Unexpected type when decoding TopLevel.intersection"}
+
+  def encode_intersection(value) when is_binary(value), do: value
+  def encode_intersection(_), do: {:error, "Unexpected type when encoding TopLevel.intersection"}
+
+  def decode_maxlength(value) when is_binary(value), do: value
+  def decode_maxlength(_), do: {:error, "Unexpected type when decoding TopLevel.maxlength"}
+
+  def encode_maxlength(value) when is_binary(value), do: value
+  def encode_maxlength(_), do: {:error, "Unexpected type when encoding TopLevel.maxlength"}
+
+  def decode_minlength(value) when is_binary(value), do: value
+  def decode_minlength(_), do: {:error, "Unexpected type when decoding TopLevel.minlength"}
+
+  def encode_minlength(value) when is_binary(value), do: value
+  def encode_minlength(_), do: {:error, "Unexpected type when encoding TopLevel.minlength"}
+
+  def decode_min_max_intersection(value) when is_binary(value), do: value
+  def decode_min_max_intersection(_), do: {:error, "Unexpected type when decoding TopLevel.min_max_intersection"}
+
+  def encode_min_max_intersection(value) when is_binary(value), do: value
+  def encode_min_max_intersection(_), do: {:error, "Unexpected type when encoding TopLevel.min_max_intersection"}
+
+  def decode_minmaxlength(value) when is_binary(value), do: value
+  def decode_minmaxlength(_), do: {:error, "Unexpected type when decoding TopLevel.minmaxlength"}
+
+  def encode_minmaxlength(value) when is_binary(value), do: value
+  def encode_minmaxlength(_), do: {:error, "Unexpected type when encoding TopLevel.minmaxlength"}
+
+  def decode_min_max_union(value) when is_binary(value), do: value
+  def decode_min_max_union(_), do: {:error, "Unexpected type when decoding TopLevel.min_max_union"}
+
+  def encode_min_max_union(value) when is_binary(value), do: value
+  def encode_min_max_union(_), do: {:error, "Unexpected type when encoding TopLevel.min_max_union"}
+
+  def decode_union(value) when is_binary(value), do: value
+  def decode_union(_), do: {:error, "Unexpected type when decoding TopLevel.union"}
+
+  def encode_union(value) when is_binary(value), do: value
+  def encode_union(_), do: {:error, "Unexpected type when encoding TopLevel.union"}
+
   def from_map(m) do
     %TopLevel{
-      intersection: m["intersection"],
+      intersection: decode_intersection(m["intersection"]),
       in_union: m["inUnion"],
-      maxlength: m["maxlength"],
-      minlength: m["minlength"],
-      min_max_intersection: m["minMaxIntersection"],
-      minmaxlength: m["minmaxlength"],
-      min_max_union: m["minMaxUnion"],
-      union: m["union"],
+      maxlength: decode_maxlength(m["maxlength"]),
+      minlength: decode_minlength(m["minlength"]),
+      min_max_intersection: decode_min_max_intersection(m["minMaxIntersection"]),
+      minmaxlength: decode_minmaxlength(m["minmaxlength"]),
+      min_max_union: decode_min_max_union(m["minMaxUnion"]),
+      union: decode_union(m["union"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/nested-intersection-union.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/nested-intersection-union.schema/default/QuickType.ex
index 4603172..92e1629 100644
--- a/base/schema-elixir/test/inputs/schema/nested-intersection-union.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/nested-intersection-union.schema/default/QuickType.ex
@@ -54,6 +54,12 @@ defmodule TopLevel do
           input: [Item.t()]
         }
 
+  def decode_input(value) when is_list(value), do: value
+  def decode_input(_), do: {:error, "Unexpected type when decoding TopLevel.input"}
+
+  def encode_input(value) when is_list(value), do: value
+  def encode_input(_), do: {:error, "Unexpected type when encoding TopLevel.input"}
+
   def from_map(m) do
     %TopLevel{
       input: Enum.map(m["input"], &Item.from_map/1),
diff --git a/base/schema-elixir/test/inputs/schema/non-standard-ref.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/non-standard-ref.schema/default/QuickType.ex
index e3d5cc2..bd09840 100644
--- a/base/schema-elixir/test/inputs/schema/non-standard-ref.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/non-standard-ref.schema/default/QuickType.ex
@@ -15,11 +15,29 @@ defmodule TopLevel do
           quux: boolean()
         }
 
+  def decode_bar(value) when is_integer(value), do: value
+  def decode_bar(_), do: {:error, "Unexpected type when decoding TopLevel.bar"}
+
+  def encode_bar(value) when is_integer(value), do: value
+  def encode_bar(_), do: {:error, "Unexpected type when encoding TopLevel.bar"}
+
+  def decode_foo(value) when is_integer(value), do: value
+  def decode_foo(_), do: {:error, "Unexpected type when decoding TopLevel.foo"}
+
+  def encode_foo(value) when is_integer(value), do: value
+  def encode_foo(_), do: {:error, "Unexpected type when encoding TopLevel.foo"}
+
+  def decode_quux(value) when is_boolean(value), do: value
+  def decode_quux(_), do: {:error, "Unexpected type when decoding TopLevel.quux"}
+
+  def encode_quux(value) when is_boolean(value), do: value
+  def encode_quux(_), do: {:error, "Unexpected type when encoding TopLevel.quux"}
+
   def from_map(m) do
     %TopLevel{
-      bar: m["bar"],
-      foo: m["foo"],
-      quux: m["quux"],
+      bar: decode_bar(m["bar"]),
+      foo: decode_foo(m["foo"]),
+      quux: decode_quux(m["quux"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/object-type-required.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/object-type-required.schema/default/QuickType.ex
index 2577353..2627628 100644
--- a/base/schema-elixir/test/inputs/schema/object-type-required.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/object-type-required.schema/default/QuickType.ex
@@ -14,9 +14,15 @@ defmodule TopLevel do
           bar: String.t() | nil
         }
 
+  def decode_foo(value) when is_binary(value), do: value
+  def decode_foo(_), do: {:error, "Unexpected type when decoding TopLevel.foo"}
+
+  def encode_foo(value) when is_binary(value), do: value
+  def encode_foo(_), do: {:error, "Unexpected type when encoding TopLevel.foo"}
+
   def from_map(m) do
     %TopLevel{
-      foo: m["foo"],
+      foo: decode_foo(m["foo"]),
       bar: m["bar"],
     }
   end
diff --git a/head/schema-elixir/test/inputs/schema/optional-any.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/optional-any.schema/default/QuickType.ex
new file mode 100644
index 0000000..0d32001
--- /dev/null
+++ b/head/schema-elixir/test/inputs/schema/optional-any.schema/default/QuickType.ex
@@ -0,0 +1,48 @@
+# This file was autogenerated using quicktype https://github.com/quicktype/quicktype
+#
+# Add Jason to your mix.exs
+#
+# Decode a JSON string: TopLevel.from_json(data)
+# Encode into a JSON string: TopLevel.to_json(struct)
+
+defmodule TopLevel do
+  @enforce_keys [:bar]
+  defstruct [:bar, :foo]
+
+  @type t :: %__MODULE__{
+          bar: boolean(),
+          foo: any() | nil
+        }
+
+  def decode_bar(value) when is_boolean(value), do: value
+  def decode_bar(_), do: {:error, "Unexpected type when decoding TopLevel.bar"}
+
+  def encode_bar(value) when is_boolean(value), do: value
+  def encode_bar(_), do: {:error, "Unexpected type when encoding TopLevel.bar"}
+
+  def from_map(m) do
+    %TopLevel{
+      bar: decode_bar(m["bar"]),
+      foo: m["foo"],
+    }
+  end
+
+  def from_json(json) do
+    json
+          |> Jason.decode!()
+          |> from_map()
+  end
+
+  def to_map(struct) do
+    %{
+      "bar" => struct.bar,
+      "foo" => struct.foo,
+    }
+  end
+
+  def to_json(struct) do
+    struct
+          |> to_map()
+          |> Jason.encode!()
+  end
+end
diff --git a/base/schema-elixir/test/inputs/schema/optional-const-ref.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/optional-const-ref.schema/default/QuickType.ex
index d7c96a5..0542ed9 100644
--- a/base/schema-elixir/test/inputs/schema/optional-const-ref.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/optional-const-ref.schema/default/QuickType.ex
@@ -14,10 +14,26 @@ defmodule Coordinate do
           longitude: float()
         }
 
+  def decode_latitude(value) when is_float(value), do: value
+  def decode_latitude(value) when is_integer(value), do: value
+  def decode_latitude(_), do: {:error, "Unexpected type when decoding Coordinate.latitude"}
+
+  def encode_latitude(value) when is_float(value), do: value
+  def encode_latitude(value) when is_integer(value), do: value
+  def encode_latitude(_), do: {:error, "Unexpected type when encoding Coordinate.latitude"}
+
+  def decode_longitude(value) when is_float(value), do: value
+  def decode_longitude(value) when is_integer(value), do: value
+  def decode_longitude(_), do: {:error, "Unexpected type when decoding Coordinate.longitude"}
+
+  def encode_longitude(value) when is_float(value), do: value
+  def encode_longitude(value) when is_integer(value), do: value
+  def encode_longitude(_), do: {:error, "Unexpected type when encoding Coordinate.longitude"}
+
   def from_map(m) do
     %Coordinate{
-      latitude: m["latitude"],
-      longitude: m["longitude"],
+      latitude: decode_latitude(m["latitude"]),
+      longitude: decode_longitude(m["longitude"]),
     }
   end
 
@@ -55,14 +71,32 @@ defmodule TopLevel do
           weight: float() | nil
         }
 
+  def decode_required_coordinates(value) when is_list(value), do: value
+  def decode_required_coordinates(_), do: {:error, "Unexpected type when decoding TopLevel.required_coordinates"}
+
+  def encode_required_coordinates(value) when is_list(value), do: value
+  def encode_required_coordinates(_), do: {:error, "Unexpected type when encoding TopLevel.required_coordinates"}
+
+  def decode_required_count(value) when is_integer(value), do: value
+  def decode_required_count(_), do: {:error, "Unexpected type when decoding TopLevel.required_count"}
+
+  def encode_required_count(value) when is_integer(value), do: value
+  def encode_required_count(_), do: {:error, "Unexpected type when encoding TopLevel.required_count"}
+
+  def decode_required_label(value) when is_binary(value), do: value
+  def decode_required_label(_), do: {:error, "Unexpected type when decoding TopLevel.required_label"}
+
+  def encode_required_label(value) when is_binary(value), do: value
+  def encode_required_label(_), do: {:error, "Unexpected type when encoding TopLevel.required_label"}
+
   def from_map(m) do
     %TopLevel{
       coordinates: m["coordinates"] && Enum.map(m["coordinates"], &Coordinate.from_map/1),
       count: m["count"],
       label: m["label"],
       required_coordinates: Enum.map(m["requiredCoordinates"], &Coordinate.from_map/1),
-      required_count: m["requiredCount"],
-      required_label: m["requiredLabel"],
+      required_count: decode_required_count(m["requiredCount"]),
+      required_label: decode_required_label(m["requiredLabel"]),
       weight: m["weight"],
     }
   end
diff --git a/base/schema-elixir/test/inputs/schema/optional-constraints.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/optional-constraints.schema/default/QuickType.ex
index 47dfc9a..151b91e 100644
--- a/base/schema-elixir/test/inputs/schema/optional-constraints.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/optional-constraints.schema/default/QuickType.ex
@@ -17,13 +17,19 @@ defmodule TopLevel do
           req_zero_min: integer()
         }
 
+  def decode_req_zero_min(value) when is_integer(value), do: value
+  def decode_req_zero_min(_), do: {:error, "Unexpected type when decoding TopLevel.req_zero_min"}
+
+  def encode_req_zero_min(value) when is_integer(value), do: value
+  def encode_req_zero_min(_), do: {:error, "Unexpected type when encoding TopLevel.req_zero_min"}
+
   def from_map(m) do
     %TopLevel{
       opt_double: m["optDouble"],
       opt_int: m["optInt"],
       opt_pattern: m["optPattern"],
       opt_string: m["optString"],
-      req_zero_min: m["reqZeroMin"],
+      req_zero_min: decode_req_zero_min(m["reqZeroMin"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/optional-date-time.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/optional-date-time.schema/default/QuickType.ex
index 81b07fd..e4180fb 100644
--- a/base/schema-elixir/test/inputs/schema/optional-date-time.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/optional-date-time.schema/default/QuickType.ex
@@ -18,14 +18,32 @@ defmodule TopLevel do
           required_time: String.t()
         }
 
+  def decode_required_date(value) when is_binary(value), do: value
+  def decode_required_date(_), do: {:error, "Unexpected type when decoding TopLevel.required_date"}
+
+  def encode_required_date(value) when is_binary(value), do: value
+  def encode_required_date(_), do: {:error, "Unexpected type when encoding TopLevel.required_date"}
+
+  def decode_required_date_time(value) when is_binary(value), do: value
+  def decode_required_date_time(_), do: {:error, "Unexpected type when decoding TopLevel.required_date_time"}
+
+  def encode_required_date_time(value) when is_binary(value), do: value
+  def encode_required_date_time(_), do: {:error, "Unexpected type when encoding TopLevel.required_date_time"}
+
+  def decode_required_time(value) when is_binary(value), do: value
+  def decode_required_time(_), do: {:error, "Unexpected type when decoding TopLevel.required_time"}
+
+  def encode_required_time(value) when is_binary(value), do: value
+  def encode_required_time(_), do: {:error, "Unexpected type when encoding TopLevel.required_time"}
+
   def from_map(m) do
     %TopLevel{
       optional_date: m["optional-date"],
       optional_date_time: m["optional-date-time"],
       optional_time: m["optional-time"],
-      required_date: m["required-date"],
-      required_date_time: m["required-date-time"],
-      required_time: m["required-time"],
+      required_date: decode_required_date(m["required-date"]),
+      required_date_time: decode_required_date_time(m["required-date-time"]),
+      required_time: decode_required_time(m["required-time"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/optional-enum.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/optional-enum.schema/default/QuickType.ex
index 63a8b51..54ab549 100644
--- a/base/schema-elixir/test/inputs/schema/optional-enum.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/optional-enum.schema/default/QuickType.ex
@@ -60,9 +60,15 @@ defmodule TopLevel do
           shortcut: Shortcut.t() | nil
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding TopLevel.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding TopLevel.name"}
+
   def from_map(m) do
     %TopLevel{
-      name: m["name"],
+      name: decode_name(m["name"]),
       shortcut: m["shortcut"] && Shortcut.decode(m["shortcut"]),
     }
   end
diff --git a/base/schema-elixir/test/inputs/schema/pattern.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/pattern.schema/default/QuickType.ex
index a077de8..33c751d 100644
--- a/base/schema-elixir/test/inputs/schema/pattern.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/pattern.schema/default/QuickType.ex
@@ -15,11 +15,29 @@ defmodule TopLevel do
           union: String.t()
         }
 
+  def decode_pattern1(value) when is_binary(value), do: value
+  def decode_pattern1(_), do: {:error, "Unexpected type when decoding TopLevel.pattern1"}
+
+  def encode_pattern1(value) when is_binary(value), do: value
+  def encode_pattern1(_), do: {:error, "Unexpected type when encoding TopLevel.pattern1"}
+
+  def decode_pattern2(value) when is_binary(value), do: value
+  def decode_pattern2(_), do: {:error, "Unexpected type when decoding TopLevel.pattern2"}
+
+  def encode_pattern2(value) when is_binary(value), do: value
+  def encode_pattern2(_), do: {:error, "Unexpected type when encoding TopLevel.pattern2"}
+
+  def decode_union(value) when is_binary(value), do: value
+  def decode_union(_), do: {:error, "Unexpected type when decoding TopLevel.union"}
+
+  def encode_union(value) when is_binary(value), do: value
+  def encode_union(_), do: {:error, "Unexpected type when encoding TopLevel.union"}
+
   def from_map(m) do
     %TopLevel{
-      pattern1: m["pattern1"],
-      pattern2: m["pattern2"],
-      union: m["union"],
+      pattern1: decode_pattern1(m["pattern1"]),
+      pattern2: decode_pattern2(m["pattern2"]),
+      union: decode_union(m["union"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/prefix-items.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/prefix-items.schema/default/QuickType.ex
index 022b5a3..c54690a 100644
--- a/base/schema-elixir/test/inputs/schema/prefix-items.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/prefix-items.schema/default/QuickType.ex
@@ -14,6 +14,12 @@ defmodule TopLevel do
           tuple: [boolean() | integer()]
         }
 
+  def decode_open(value) when is_list(value), do: value
+  def decode_open(_), do: {:error, "Unexpected type when decoding TopLevel.open"}
+
+  def encode_open(value) when is_list(value), do: value
+  def encode_open(_), do: {:error, "Unexpected type when encoding TopLevel.open"}
+
   def decode_open_element(value) when is_boolean(value), do: value
   def decode_open_element(value) when is_integer(value), do: value
   def decode_open_element(_), do: {:error, "Unexpected type when decoding TopLevel.open"}
@@ -22,6 +28,12 @@ defmodule TopLevel do
   def encode_open_element(value) when is_integer(value), do: value
   def encode_open_element(_), do: {:error, "Unexpected type when encoding TopLevel.open"}
 
+  def decode_tuple(value) when is_list(value), do: value
+  def decode_tuple(_), do: {:error, "Unexpected type when decoding TopLevel.tuple"}
+
+  def encode_tuple(value) when is_list(value), do: value
+  def encode_tuple(_), do: {:error, "Unexpected type when encoding TopLevel.tuple"}
+
   def decode_tuple_element(value) when is_boolean(value), do: value
   def decode_tuple_element(value) when is_integer(value), do: value
   def decode_tuple_element(_), do: {:error, "Unexpected type when decoding TopLevel.tuple"}
diff --git a/base/schema-elixir/test/inputs/schema/ref-id-files.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/ref-id-files.schema/default/QuickType.ex
index 6ad5247..c02f943 100644
--- a/base/schema-elixir/test/inputs/schema/ref-id-files.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/ref-id-files.schema/default/QuickType.ex
@@ -13,9 +13,15 @@ defmodule TopLevel do
           foo: integer()
         }
 
+  def decode_foo(value) when is_integer(value), do: value
+  def decode_foo(_), do: {:error, "Unexpected type when decoding TopLevel.foo"}
+
+  def encode_foo(value) when is_integer(value), do: value
+  def encode_foo(_), do: {:error, "Unexpected type when encoding TopLevel.foo"}
+
   def from_map(m) do
     %TopLevel{
-      foo: m["foo"],
+      foo: decode_foo(m["foo"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/required-draft3.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/required-draft3.schema/default/QuickType.ex
index 520d75f..fef4f98 100644
--- a/base/schema-elixir/test/inputs/schema/required-draft3.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/required-draft3.schema/default/QuickType.ex
@@ -13,9 +13,17 @@ defmodule TopLevel do
           longitude: float()
         }
 
+  def decode_longitude(value) when is_float(value), do: value
+  def decode_longitude(value) when is_integer(value), do: value
+  def decode_longitude(_), do: {:error, "Unexpected type when decoding TopLevel.longitude"}
+
+  def encode_longitude(value) when is_float(value), do: value
+  def encode_longitude(value) when is_integer(value), do: value
+  def encode_longitude(_), do: {:error, "Unexpected type when encoding TopLevel.longitude"}
+
   def from_map(m) do
     %TopLevel{
-      longitude: m["longitude"],
+      longitude: decode_longitude(m["longitude"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/required-non-properties.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/required-non-properties.schema/default/QuickType.ex
index b2df28e..b15e91b 100644
--- a/base/schema-elixir/test/inputs/schema/required-non-properties.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/required-non-properties.schema/default/QuickType.ex
@@ -14,9 +14,15 @@ defmodule TopLevel do
           bar: any()
         }
 
+  def decode_foo(value) when is_integer(value), do: value
+  def decode_foo(_), do: {:error, "Unexpected type when decoding TopLevel.foo"}
+
+  def encode_foo(value) when is_integer(value), do: value
+  def encode_foo(_), do: {:error, "Unexpected type when encoding TopLevel.foo"}
+
   def from_map(m) do
     %TopLevel{
-      foo: m["foo"],
+      foo: decode_foo(m["foo"]),
       bar: m["bar"],
     }
   end
diff --git a/head/schema-elixir/test/inputs/schema/required.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/required.schema/default/QuickType.ex
new file mode 100644
index 0000000..fef4f98
--- /dev/null
+++ b/head/schema-elixir/test/inputs/schema/required.schema/default/QuickType.ex
@@ -0,0 +1,47 @@
+# This file was autogenerated using quicktype https://github.com/quicktype/quicktype
+#
+# Add Jason to your mix.exs
+#
+# Decode a JSON string: TopLevel.from_json(data)
+# Encode into a JSON string: TopLevel.to_json(struct)
+
+defmodule TopLevel do
+  @enforce_keys [:longitude]
+  defstruct [:longitude]
+
+  @type t :: %__MODULE__{
+          longitude: float()
+        }
+
+  def decode_longitude(value) when is_float(value), do: value
+  def decode_longitude(value) when is_integer(value), do: value
+  def decode_longitude(_), do: {:error, "Unexpected type when decoding TopLevel.longitude"}
+
+  def encode_longitude(value) when is_float(value), do: value
+  def encode_longitude(value) when is_integer(value), do: value
+  def encode_longitude(_), do: {:error, "Unexpected type when encoding TopLevel.longitude"}
+
+  def from_map(m) do
+    %TopLevel{
+      longitude: decode_longitude(m["longitude"]),
+    }
+  end
+
+  def from_json(json) do
+    json
+          |> Jason.decode!()
+          |> from_map()
+  end
+
+  def to_map(struct) do
+    %{
+      "longitude" => struct.longitude,
+    }
+  end
+
+  def to_json(struct) do
+    struct
+          |> to_map()
+          |> Jason.encode!()
+  end
+end
diff --git a/base/schema-elixir/test/inputs/schema/rust-cycle-breaker-union.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/rust-cycle-breaker-union.schema/default/QuickType.ex
index 43f4cff..7270ea0 100644
--- a/base/schema-elixir/test/inputs/schema/rust-cycle-breaker-union.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/rust-cycle-breaker-union.schema/default/QuickType.ex
@@ -24,10 +24,16 @@ defmodule NodeClass do
   def encode_next(value) when is_binary(value), do: value
   def encode_next(_), do: {:error, "Unexpected type when encoding NodeClass.next"}
 
+  def decode_value(value) when is_binary(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding NodeClass.value"}
+
+  def encode_value(value) when is_binary(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding NodeClass.value"}
+
   def from_map(m) do
     %NodeClass{
       next: decode_next(m["next"]),
-      value: m["value"],
+      value: decode_value(m["value"]),
     }
   end
 
@@ -70,10 +76,16 @@ defmodule TopLevel do
   def encode_next(value) when is_binary(value), do: value
   def encode_next(_), do: {:error, "Unexpected type when encoding TopLevel.next"}
 
+  def decode_value(value) when is_binary(value), do: value
+  def decode_value(_), do: {:error, "Unexpected type when decoding TopLevel.value"}
+
+  def encode_value(value) when is_binary(value), do: value
+  def encode_value(_), do: {:error, "Unexpected type when encoding TopLevel.value"}
+
   def from_map(m) do
     %TopLevel{
       next: decode_next(m["next"]),
-      value: m["value"],
+      value: decode_value(m["value"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/schema-constraints.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/schema-constraints.schema/default/QuickType.ex
index 46834a6..6d909f1 100644
--- a/base/schema-elixir/test/inputs/schema/schema-constraints.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/schema-constraints.schema/default/QuickType.ex
@@ -14,10 +14,24 @@ defmodule TopLevel do
           percent: float()
         }
 
+  def decode_min_max_length(value) when is_binary(value), do: value
+  def decode_min_max_length(_), do: {:error, "Unexpected type when decoding TopLevel.min_max_length"}
+
+  def encode_min_max_length(value) when is_binary(value), do: value
+  def encode_min_max_length(_), do: {:error, "Unexpected type when encoding TopLevel.min_max_length"}
+
+  def decode_percent(value) when is_float(value), do: value
+  def decode_percent(value) when is_integer(value), do: value
+  def decode_percent(_), do: {:error, "Unexpected type when decoding TopLevel.percent"}
+
+  def encode_percent(value) when is_float(value), do: value
+  def encode_percent(value) when is_integer(value), do: value
+  def encode_percent(_), do: {:error, "Unexpected type when encoding TopLevel.percent"}
+
   def from_map(m) do
     %TopLevel{
-      min_max_length: m["minMaxLength"],
-      percent: m["percent"],
+      min_max_length: decode_min_max_length(m["minMaxLength"]),
+      percent: decode_percent(m["percent"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/top-level-array.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/top-level-array.schema/default/QuickType.ex
index 2db4571..521777f 100644
--- a/base/schema-elixir/test/inputs/schema/top-level-array.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/top-level-array.schema/default/QuickType.ex
@@ -14,10 +14,24 @@ defmodule TextClassificationOutputElement do
           score: float()
         }
 
+  def decode_label(value) when is_binary(value), do: value
+  def decode_label(_), do: {:error, "Unexpected type when decoding TextClassificationOutputElement.label"}
+
+  def encode_label(value) when is_binary(value), do: value
+  def encode_label(_), do: {:error, "Unexpected type when encoding TextClassificationOutputElement.label"}
+
+  def decode_score(value) when is_float(value), do: value
+  def decode_score(value) when is_integer(value), do: value
+  def decode_score(_), do: {:error, "Unexpected type when decoding TextClassificationOutputElement.score"}
+
+  def encode_score(value) when is_float(value), do: value
+  def encode_score(value) when is_integer(value), do: value
+  def encode_score(_), do: {:error, "Unexpected type when encoding TextClassificationOutputElement.score"}
+
   def from_map(m) do
     %TextClassificationOutputElement{
-      label: m["label"],
-      score: m["score"],
+      label: decode_label(m["label"]),
+      score: decode_score(m["score"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/tuple.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/tuple.schema/default/QuickType.ex
index b747e6b..c3980b3 100644
--- a/base/schema-elixir/test/inputs/schema/tuple.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/tuple.schema/default/QuickType.ex
@@ -13,6 +13,12 @@ defmodule TopLevel do
           tuple: [boolean() | integer()]
         }
 
+  def decode_tuple(value) when is_list(value), do: value
+  def decode_tuple(_), do: {:error, "Unexpected type when decoding TopLevel.tuple"}
+
+  def encode_tuple(value) when is_list(value), do: value
+  def encode_tuple(_), do: {:error, "Unexpected type when encoding TopLevel.tuple"}
+
   def decode_tuple_element(value) when is_boolean(value), do: value
   def decode_tuple_element(value) when is_integer(value), do: value
   def decode_tuple_element(_), do: {:error, "Unexpected type when decoding TopLevel.tuple"}
diff --git a/base/schema-elixir/test/inputs/schema/union.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/union.schema/default/QuickType.ex
index 1354fc3..3ab5043 100644
--- a/base/schema-elixir/test/inputs/schema/union.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/union.schema/default/QuickType.ex
@@ -15,10 +15,16 @@ defmodule TopLevelElement do
           three: float() | nil
         }
 
+  def decode_two(value) when is_boolean(value), do: value
+  def decode_two(_), do: {:error, "Unexpected type when decoding TopLevelElement.two"}
+
+  def encode_two(value) when is_boolean(value), do: value
+  def encode_two(_), do: {:error, "Unexpected type when encoding TopLevelElement.two"}
+
   def from_map(m) do
     %TopLevelElement{
       one: m["one"],
-      two: m["two"],
+      two: decode_two(m["two"]),
       three: m["three"],
     }
   end
diff --git a/base/schema-elixir/test/inputs/schema/uuid.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/uuid.schema/default/QuickType.ex
index 602006f..a366090 100644
--- a/base/schema-elixir/test/inputs/schema/uuid.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/uuid.schema/default/QuickType.ex
@@ -26,14 +26,26 @@ defmodule TopLevel do
   def encode_arr_nullable_element(value) when is_binary(value), do: value
   def encode_arr_nullable_element(_), do: {:error, "Unexpected type when encoding TopLevel.arr_nullable"}
 
+  def decode_one(value) when is_binary(value), do: value
+  def decode_one(_), do: {:error, "Unexpected type when decoding TopLevel.one"}
+
+  def encode_one(value) when is_binary(value), do: value
+  def encode_one(_), do: {:error, "Unexpected type when encoding TopLevel.one"}
+
+  def decode_union_with_enum(value) when is_binary(value), do: value
+  def decode_union_with_enum(_), do: {:error, "Unexpected type when decoding TopLevel.union_with_enum"}
+
+  def encode_union_with_enum(value) when is_binary(value), do: value
+  def encode_union_with_enum(_), do: {:error, "Unexpected type when encoding TopLevel.union_with_enum"}
+
   def from_map(m) do
     %TopLevel{
       arr_nullable: m["arrNullable"] && Enum.map(m["arrNullable"], &decode_arr_nullable_element/1),
       arr_one: m["arrOne"],
       nullable: m["nullable"],
-      one: m["one"],
+      one: decode_one(m["one"]),
       optional: m["optional"],
-      union_with_enum: m["unionWithEnum"],
+      union_with_enum: decode_union_with_enum(m["unionWithEnum"]),
     }
   end
 
diff --git a/base/schema-elixir/test/inputs/schema/vega-lite.schema/default/QuickType.ex b/head/schema-elixir/test/inputs/schema/vega-lite.schema/default/QuickType.ex
index 0e82e11..8a6a928 100644
--- a/base/schema-elixir/test/inputs/schema/vega-lite.schema/default/QuickType.ex
+++ b/head/schema-elixir/test/inputs/schema/vega-lite.schema/default/QuickType.ex
@@ -1894,7 +1894,8 @@ defmodule ProjectionConfig do
       fraction: m["fraction"],
       lobes: m["lobes"],
       parallel: m["parallel"],
-      precision: m["precision"],
+      precision: m["precision"]
+      |> Map.new(fn {key, value} -> {key, decode_precision_value(value)} end),
       radius: m["radius"],
       ratio: m["ratio"],
       rotate: m["rotate"],
@@ -1920,7 +1921,8 @@ defmodule ProjectionConfig do
       "fraction" => struct.fraction,
       "lobes" => struct.lobes,
       "parallel" => struct.parallel,
-      "precision" => struct.precision,
+      "precision" => struct.precision
+      |> Map.new(fn {key, value} -> {key, encode_precision_value(value)} end),
       "radius" => struct.radius,
       "ratio" => struct.ratio,
       "rotate" => struct.rotate,
@@ -2514,10 +2516,16 @@ defmodule VGBinding do
           step: float() | nil
         }
 
+  def decode_input(value) when is_binary(value), do: value
+  def decode_input(_), do: {:error, "Unexpected type when decoding VGBinding.input"}
+
+  def encode_input(value) when is_binary(value), do: value
+  def encode_input(_), do: {:error, "Unexpected type when encoding VGBinding.input"}
+
   def from_map(m) do
     %VGBinding{
       element: m["element"],
-      input: m["input"],
+      input: decode_input(m["input"]),
       options: m["options"],
       max: m["max"],
       min: m["min"],
@@ -4767,10 +4775,16 @@ defmodule DomainClass do
           encoding: String.t() | nil
         }
 
+  def decode_selection(value) when is_binary(value), do: value
+  def decode_selection(_), do: {:error, "Unexpected type when decoding DomainClass.selection"}
+
+  def encode_selection(value) when is_binary(value), do: value
+  def encode_selection(_), do: {:error, "Unexpected type when encoding DomainClass.selection"}
+
   def from_map(m) do
     %DomainClass{
       field: m["field"],
-      selection: m["selection"],
+      selection: decode_selection(m["selection"]),
       encoding: m["encoding"],
     }
   end
@@ -4933,10 +4947,24 @@ defmodule NiceClass do
           step: float()
         }
 
+  def decode_interval(value) when is_binary(value), do: value
+  def decode_interval(_), do: {:error, "Unexpected type when decoding NiceClass.interval"}
+
+  def encode_interval(value) when is_binary(value), do: value
+  def encode_interval(_), do: {:error, "Unexpected type when encoding NiceClass.interval"}
+
+  def decode_step(value) when is_float(value), do: value
+  def decode_step(value) when is_integer(value), do: value
+  def decode_step(_), do: {:error, "Unexpected type when decoding NiceClass.step"}
+
+  def encode_step(value) when is_float(value), do: value
+  def encode_step(value) when is_integer(value), do: value
+  def encode_step(_), do: {:error, "Unexpected type when encoding NiceClass.step"}
+
   def from_map(m) do
     %NiceClass{
-      interval: m["interval"],
-      step: m["step"],
+      interval: decode_interval(m["interval"]),
+      step: decode_step(m["step"]),
     }
   end
 
@@ -5025,10 +5053,16 @@ defmodule SchemeParams do
           name: String.t()
         }
 
+  def decode_name(value) when is_binary(value), do: value
+  def decode_name(_), do: {:error, "Unexpected type when decoding SchemeParams.name"}
+
+  def encode_name(value) when is_binary(value), do: value
+  def encode_name(_), do: {:error, "Unexpected type when encoding SchemeParams.name"}
+
   def from_map(m) do
     %SchemeParams{
       extent: m["extent"],
-      name: m["name"],
+      name: decode_name(m["name"]),
     }
   end
 
@@ -7319,7 +7353,8 @@ defmodule Projection do
       fraction: m["fraction"],
       lobes: m["lobes"],
       parallel: m["parallel"],
-      precision: m["precision"],
+      precision: m["precision"]
+      |> Map.new(fn {key, value} -> {key, decode_precision_value(value)} end),
       radius: m["radius"],
       ratio: m["ratio"],
       rotate: m["rotate"],
@@ -7345,7 +7380,8 @@ defmodule Projection do
       "fraction" => struct.fraction,
       "lobes" => struct.lobes,
       "parallel" => struct.parallel,
-      "precision" => struct.precision,
+      "precision" => struct.precision
+      |> Map.new(fn {key, value} -> {key, encode_precision_value(value)} end),
       "radius" => struct.radius,
       "ratio" => struct.ratio,
       "rotate" => struct.rotate,
@@ -7751,13 +7787,19 @@ defmodule TitleParams do
   def encode_style(value) when is_nil(value), do: value
   def encode_style(_), do: {:error, "Unexpected type when encoding TitleParams.style"}
 
+  def decode_text(value) when is_binary(value), do: value
+  def decode_text(_), do: {:error, "Unexpected type when decoding TitleParams.text"}
+
+  def encode_text(value) when is_binary(value), do: value
+  def encode_text(_), do: {:error, "Unexpected type when encoding TitleParams.text"}
+
   def from_map(m) do
     %TitleParams{
       anchor: m["anchor"] && Anchor.decode(m["anchor"]),
       offset: m["offset"],
       orient: m["orient"] && TitleOrient.decode(m["orient"]),
       style: decode_style(m["style"]),
-      text: m["text"],
+      text: decode_text(m["text"]),
     }
   end
 
@@ -7800,10 +7842,22 @@ defmodule AggregatedFieldDef do
           op: AggregateOp.t()
         }
 
+  def decode_as(value) when is_binary(value), do: value
+  def decode_as(_), do: {:error, "Unexpected type when decoding AggregatedFieldDef.as"}
+
+  def encode_as(value) when is_binary(value), do: value
+  def encode_as(_), do: {:error, "Unexpected type when encoding AggregatedFieldDef.as"}
+
+  def decode_field(value) when is_binary(value), do: value
+  def decode_field(_), do: {:error, "Unexpected type when decoding AggregatedFieldDef.field"}
+
+  def encode_field(value) when is_binary(value), do: value
+  def encode_field(_), do: {:error, "Unexpected type when encoding AggregatedFieldDef.field"}
+
   def from_map(m) do
     %AggregatedFieldDef{
-      as: m["as"],
-      field: m["field"],
+      as: decode_as(m["as"]),
+      field: decode_field(m["field"]),
       op: AggregateOp.decode(m["op"]),
     }
   end
@@ -7846,11 +7900,17 @@ defmodule LookupData do
           key: String.t()
         }
 
+  def decode_key(value) when is_binary(value), do: value
+  def decode_key(_), do: {:error, "Unexpected type when decoding LookupData.key"}
+
+  def encode_key(value) when is_binary(value), do: value
+  def encode_key(_), do: {:error, "Unexpected type when encoding LookupData.key"}
+
   def from_map(m) do
     %LookupData{
       data: Data.from_map(m["data"]),
       fields: m["fields"],
-      key: m["key"],
+      key: decode_key(m["key"]),
     }
   end
 
