You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iceberg.apache.org by gi...@apache.org on 2026/08/31 03:18:42 UTC

(iceberg-rust) branch gh-pages updated: deploy: d6d06f3c4a60e5f3a6d3d789a43513a919d9eacb

This is an automated email from the ASF dual-hosted git repository.

github-actions[bot] pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/iceberg-rust.git


The following commit(s) were added to refs/heads/gh-pages by this push:
     new f0643a888 deploy: d6d06f3c4a60e5f3a6d3d789a43513a919d9eacb
f0643a888 is described below

commit f0643a8885fd5e93a0da4326a3e1f75991fa4165
Author: blackmwk <bl...@users.noreply.github.com>
AuthorDate: Mon Aug 31 03:18:38 2026 +0000

    deploy: d6d06f3c4a60e5f3a6d3d789a43513a919d9eacb
---
 api/iceberg/spec/constant.LIST_FIELD_NAME.html     |    2 +-
 api/iceberg/spec/constant.MAP_KEY_FIELD_NAME.html  |    2 +-
 .../spec/constant.MAP_VALUE_FIELD_NAME.html        |    2 +-
 api/iceberg/spec/enum.Literal.html                 |    8 +-
 api/iceberg/spec/enum.PrimitiveType.html           |   18 +-
 api/iceberg/spec/enum.Type.html                    |   30 +-
 api/iceberg/spec/struct.ListType.html              |    8 +-
 api/iceberg/spec/struct.MapType.html               |   12 +-
 api/iceberg/spec/struct.NestedField.html           |   28 +-
 api/iceberg/spec/struct.StructType.html            |   18 +-
 api/iceberg/spec/struct.VariantType.html           |   12 +-
 api/iceberg/spec/type.NestedFieldRef.html          |    2 +-
 api/search.index/path/9bda7dc8bb.js                |    1 +
 api/search.index/path/d74fbb7dc9.js                |    1 -
 api/search.index/root.js                           |    2 +-
 api/src/iceberg/spec/datatypes.rs.html             | 2771 ++++++++++----------
 api/src/iceberg/spec/values/literal.rs.html        |  475 ++--
 17 files changed, 1716 insertions(+), 1676 deletions(-)

diff --git a/api/iceberg/spec/constant.LIST_FIELD_NAME.html b/api/iceberg/spec/constant.LIST_FIELD_NAME.html
index f95305c6e..1459f379e 100644
--- a/api/iceberg/spec/constant.LIST_FIELD_NAME.html
+++ b/api/iceberg/spec/constant.LIST_FIELD_NAME.html
@@ -1,2 +1,2 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Field name for list type."><title>LIST_FIELD_NAME in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-Med [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Field name for list type."><title>LIST_FIELD_NAME in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-Med [...]
 </div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/api/iceberg/spec/constant.MAP_KEY_FIELD_NAME.html b/api/iceberg/spec/constant.MAP_KEY_FIELD_NAME.html
index 21612dd8e..8b0b1fbd0 100644
--- a/api/iceberg/spec/constant.MAP_KEY_FIELD_NAME.html
+++ b/api/iceberg/spec/constant.MAP_KEY_FIELD_NAME.html
@@ -1,2 +1,2 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Field name for map type’s key."><title>MAP_KEY_FIELD_NAME in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,Fira [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Field name for map type’s key."><title>MAP_KEY_FIELD_NAME in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,Fira [...]
 </div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/api/iceberg/spec/constant.MAP_VALUE_FIELD_NAME.html b/api/iceberg/spec/constant.MAP_VALUE_FIELD_NAME.html
index d19261bef..0e2d599a0 100644
--- a/api/iceberg/spec/constant.MAP_VALUE_FIELD_NAME.html
+++ b/api/iceberg/spec/constant.MAP_VALUE_FIELD_NAME.html
@@ -1,2 +1,2 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Field name for map type’s value."><title>MAP_VALUE_FIELD_NAME in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2, [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Field name for map type’s value."><title>MAP_VALUE_FIELD_NAME in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2, [...]
 </div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/api/iceberg/spec/enum.Literal.html b/api/iceberg/spec/enum.Literal.html
index 60c011463..919e9c6a8 100644
--- a/api/iceberg/spec/enum.Literal.html
+++ b/api/iceberg/spec/enum.Literal.html
@@ -14,7 +14,7 @@ Elements can be either optional or required. Element types may be any type.</p>
 </div><section id="variant.Map" class="variant"><a href="#variant.Map" class="anchor">§</a><h3 class="code-header">Map(<a class="struct" href="struct.Map.html" title="struct iceberg::spec::Map">Map</a>)</h3></section><div class="docblock"><p>A map is a collection of key-value pairs with a key type and a value type.
 Both the key field and value field each have an integer id that is unique in the table schema.
 Map keys are required and map values can be either optional or required. Both map keys and map values may be any type, including nested types.</p>
-</div></div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Literal" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values/literal.rs.html#58-783">Source</a><a href="#impl-Literal" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.Literal.html" title="enum iceberg::spec:: [...]
+</div></div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Literal" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values/literal.rs.html#58-794">Source</a><a href="#impl-Literal" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.Literal.html" title="enum iceberg::spec:: [...]
 <p>Example:</p>
 
 <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::{Literal, PrimitiveLiteral};
@@ -156,11 +156,11 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
 <span class="kw">let </span>t2 = Literal::decimal_from_str(<span class="string">"123.45"</span>).unwrap();
 
 <span class="macro">assert_eq!</span>(t1, t2);</code></pre></div></div></details><details class="toggle method-toggle" open><summary><section id="method.as_primitive_literal" class="method"><a class="src rightside" href="../../src/iceberg/spec/values/literal.rs.html#418-423">Source</a><h4 class="code-header">pub fn <a href="#method.as_primitive_literal" class="fn">as_primitive_literal</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.htm [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.try_from_json" class="method"><a class="src rightside" href="../../src/iceberg/spec/values/literal.rs.html#428-636">Source</a><h4 class="code-header">pub fn <a href="#method.try_from_json" class="fn">try_from_json</a>(value: <a class="enum" href="https://docs.rs/serde_json/1.0.150/serde_json/value/enum.Value.html" title="enum serde_json::value::Value">JsonValue</a>, data_type: &amp;<a class="enum" hre [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.try_from_json" class="method"><a class="src rightside" href="../../src/iceberg/spec/values/literal.rs.html#428-647">Source</a><h4 class="code-header">pub fn <a href="#method.try_from_json" class="fn">try_from_json</a>(value: <a class="enum" href="https://docs.rs/serde_json/1.0.150/serde_json/value/enum.Value.html" title="enum serde_json::value::Value">JsonValue</a>, data_type: &amp;<a class="enum" hre [...]
 <p>See <a href="https://iceberg.apache.org/spec/#json-single-value-serialization">this spec</a> for reference.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.try_into_json" class="method"><a class="src rightside" href="../../src/iceberg/spec/values/literal.rs.html#641-763">Source</a><h4 class="code-header">pub fn <a href="#method.try_into_json" class="fn">try_into_json</a>(self, type: &amp;<a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type</a>) -&gt; <a class="type" href="../type.Result.html" title="type iceberg::Result">Result</a> [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.try_into_json" class="method"><a class="src rightside" href="../../src/iceberg/spec/values/literal.rs.html#652-774">Source</a><h4 class="code-header">pub fn <a href="#method.try_into_json" class="fn">try_into_json</a>(self, type: &amp;<a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type</a>) -&gt; <a class="type" href="../type.Result.html" title="type iceberg::Result">Result</a> [...]
 <p>See <a href="https://iceberg.apache.org/spec/#json-single-value-serialization">this spec</a> for reference.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.into_any" class="method"><a class="src rightside" href="../../src/iceberg/spec/values/literal.rs.html#766-782">Source</a><h4 class="code-header">pub fn <a href="#method.into_any" class="fn">into_any</a>(self) -&gt; <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/night [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.into_any" class="method"><a class="src rightside" href="../../src/iceberg/spec/values/literal.rs.html#777-793">Source</a><h4 class="code-header">pub fn <a href="#method.into_any" class="fn">into_any</a>(self) -&gt; <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a>&lt;dyn <a class="trait" href="https://doc.rust-lang.org/night [...]
 </div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Literal" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values/literal.rs.html#40">Source</a><a href="#impl-Clone-for-Literal" class="anchor">§</a><h3 class="code-header">impl <a [...]
     H: <a class="trait" href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher">Hasher</a>,
     Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Feeds a slice of this type into the given <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher"><code>Hasher</code></a>. <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice">Read more</a></div></details></div></d [...]
diff --git a/api/iceberg/spec/enum.PrimitiveType.html b/api/iceberg/spec/enum.PrimitiveType.html
index 0a93d3943..0992d0637 100644
--- a/api/iceberg/spec/enum.PrimitiveType.html
+++ b/api/iceberg/spec/enum.PrimitiveType.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Primitive data types"><title>PrimitiveType in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItal [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Primitive data types"><title>PrimitiveType in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItal [...]
 <details class="toggle type-contents-toggle"><summary class="hideme"><span>Show 16 variants</span></summary>    Boolean,
     Int,
     Long,
@@ -37,20 +37,20 @@
 </div><section id="variant.Uuid" class="variant"><a href="#variant.Uuid" class="anchor">§</a><h3 class="code-header">Uuid</h3></section><div class="docblock"><p>Universally Unique Identifiers, should use 16-byte fixed</p>
 </div><section id="variant.Fixed" class="variant"><a href="#variant.Fixed" class="anchor">§</a><h3 class="code-header">Fixed(<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u64.html">u64</a>)</h3></section><div class="docblock"><p>Fixed length byte array</p>
 </div><section id="variant.Binary" class="variant"><a href="#variant.Binary" class="anchor">§</a><h3 class="code-header">Binary</h3></section><div class="docblock"><p>Arbitrary-length byte array.</p>
-</div></div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-PrimitiveType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#235">Source</a><a href="#impl-PrimitiveType" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.PrimitiveType.html" title="enum icebe [...]
+</div></div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-PrimitiveType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#234">Source</a><a href="#impl-PrimitiveType" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.PrimitiveType.html" title="enum icebe [...]
     __self: &amp;<a class="enum" href="enum.PrimitiveType.html" title="enum iceberg::spec::PrimitiveType">PrimitiveType</a>,
     __serializer: __S,
 ) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;__S::<a class="associatedtype" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html#associatedtype.Ok" title="type serde_core::ser::Serializer::Ok">Ok</a>, __S::<a class="associatedtype" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html#associatedtype.Error" title="type serde_core::ser::Serialize [...]
-    __S: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html" title="trait serde_core::ser::Serializer">Serializer</a>,</div></h4></section></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-PrimitiveType-1" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#235">Source</a><a href="#impl-PrimitiveType-1" class="anchor">§</a><h3 class="code-header">impl&lt;'de&gt; <a class [...]
+    __S: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html" title="trait serde_core::ser::Serializer">Serializer</a>,</div></h4></section></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-PrimitiveType-1" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#234">Source</a><a href="#impl-PrimitiveType-1" class="anchor">§</a><h3 class="code-header">impl&lt;'de&gt; <a class [...]
     __deserializer: __D,
 ) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;<a class="enum" href="enum.PrimitiveType.html" title="enum iceberg::spec::PrimitiveType">PrimitiveType</a>, __D::<a class="associatedtype" href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserializer.html#associatedtype.Error" title="type serde_core::de::Deserializer::Error">Error</a>&gt;<div class="where">where
-    __D: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserializer.html" title="trait serde_core::de::Deserializer">Deserializer</a>&lt;'de&gt;,</div></h4></section></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-PrimitiveType-2" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#279-302">Source</a><a href="#impl-PrimitiveType-2" class="anchor">§</a><h3 class="code-header">impl  [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-PrimitiveType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#235">Source</a><a href="#impl-Clone-for-PrimitiveType" class="anchor">§</a><h3 class="code-header" [...]
-    D: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserializer.html" title="trait serde_core::de::Deserializer">Deserializer</a>&lt;'de&gt;,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary> [...]
+    __D: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserializer.html" title="trait serde_core::de::Deserializer">Deserializer</a>&lt;'de&gt;,</div></h4></section></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-PrimitiveType-2" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#278-301">Source</a><a href="#impl-PrimitiveType-2" class="anchor">§</a><h3 class="code-header">impl  [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-PrimitiveType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#234">Source</a><a href="#impl-Clone-for-PrimitiveType" class="anchor">§</a><h3 class="code-header" [...]
+    D: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserializer.html" title="trait serde_core::de::Deserializer">Deserializer</a>&lt;'de&gt;,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary> [...]
     H: <a class="trait" href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher">Hasher</a>,
-    Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Feeds a slice of this type into the given <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher"><code>Hasher</code></a>. <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice">Read more</a></div></details></div></d [...]
-and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Serialize-for-PrimitiveType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#334-345">Source</a><a href="#impl-Serialize-for-PrimitiveType" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html" title="tr [...]
-    S: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html" title="trait serde_core::ser::Serializer">Serializer</a>,</div></h4></section></summary><div class='docblock'>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html#tymethod.serialize">Read more</a></div></details></div></details><section id="impl-Eq-for-PrimitiveType" class="impl"><a class="src rightside" hr [...]
+    Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Feeds a slice of this type into the given <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher"><code>Hasher</code></a>. <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice">Read more</a></div></details></div></d [...]
+and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Serialize-for-PrimitiveType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#333-344">Source</a><a href="#impl-Serialize-for-PrimitiveType" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html" title="tr [...]
+    S: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html" title="trait serde_core::ser::Serializer">Serializer</a>,</div></h4></section></summary><div class='docblock'>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html#tymethod.serialize">Read more</a></div></details></div></details><section id="impl-Eq-for-PrimitiveType" class="impl"><a class="src rightside" hr [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#142">Source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: CastFrom&lt;U&gt;,</div></h4></section></summary><div class='docblock'>Casts <code>self</code> to type <code>T</code>. The <a href="https://doc.rust-lang.org/reference/expressions/operator-expr.html#semantics">semantics of numeric casting</a> with the <code>as</code> operator are followed, so <code>&lt;T as As&gt;::as_::&lt;U&gt;</code> can be used in the same way as <code>T as U</code> for numeric conversions. <a>Read more</a></div></details></div></details><details class="toggle [...]
     T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a>,</div></h3></section></summary><div class="impl-items"><section id="method.as_any" class="method trait-impl"><a href="#method.as_any" class="anchor">§</a><h4 class="code-header">fn <a class="fn">as_any</a>(&amp;self) -&gt; &amp;(dyn <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a> + 'static)</h4 [...]
diff --git a/api/iceberg/spec/enum.Type.html b/api/iceberg/spec/enum.Type.html
index 4f55df4ee..c102e67ad 100644
--- a/api/iceberg/spec/enum.Type.html
+++ b/api/iceberg/spec/enum.Type.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="All data types are either primitives or nested types, which are maps, lists, or structs."><title>Type in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35d [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="All data types are either primitives or nested types, which are maps, lists, or structs."><title>Type in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35d [...]
     Primitive(<a class="enum" href="enum.PrimitiveType.html" title="enum iceberg::spec::PrimitiveType">PrimitiveType</a>),
     Struct(<a class="struct" href="struct.StructType.html" title="struct iceberg::spec::StructType">StructType</a>),
     List(<a class="struct" href="struct.ListType.html" title="struct iceberg::spec::ListType">ListType</a>),
@@ -10,20 +10,20 @@
 </div><section id="variant.List" class="variant"><a href="#variant.List" class="anchor">§</a><h3 class="code-header">List(<a class="struct" href="struct.ListType.html" title="struct iceberg::spec::ListType">ListType</a>)</h3></section><div class="docblock"><p>List type.</p>
 </div><section id="variant.Map" class="variant"><a href="#variant.Map" class="anchor">§</a><h3 class="code-header">Map(<a class="struct" href="struct.MapType.html" title="struct iceberg::spec::MapType">MapType</a>)</h3></section><div class="docblock"><p>Map type</p>
 </div><section id="variant.Variant" class="variant"><a href="#variant.Variant" class="anchor">§</a><h3 class="code-header">Variant(<a class="struct" href="struct.VariantType.html" title="struct iceberg::spec::VariantType">VariantType</a>)</h3></section><div class="docblock"><p>Variant Type</p>
-</div></div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Type" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#109-208">Source</a><a href="#impl-Type" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type</a [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.is_struct" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#118-120">Source</a><h4 class="code-header">pub fn <a href="#method.is_struct" class="fn">is_struct</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Whether the type is struct type.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.is_nested" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#124-126">Source</a><h4 class="code-header">pub fn <a href="#method.is_nested" class="fn">is_nested</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Whether the type is nested type.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.is_variant" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#130-132">Source</a><h4 class="code-header">pub fn <a href="#method.is_variant" class="fn">is_variant</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Whether the type is variant type.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.as_primitive_type" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#153-159">Source</a><h4 class="code-header">pub fn <a href="#method.as_primitive_type" class="fn">as_primitive_type</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;&amp;<a class="enum" href="e [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.to_struct_type" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#162-168">Source</a><h4 class="code-header">pub fn <a href="#method.to_struct_type" class="fn">to_struct_type</a>(self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="struct.StructType. [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.decimal_max_precision" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#172-178">Source</a><h4 class="code-header">pub fn <a href="#method.decimal_max_precision" class="fn">decimal_max_precision</a>(num_bytes: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u32</a>) -&gt; <a class="type" href="../type.Result.html" title="type i [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.decimal_required_bytes" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#182-188">Source</a><h4 class="code-header">pub fn <a href="#method.decimal_required_bytes" class="fn">decimal_required_bytes</a>(precision: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u32</a>) -&gt; <a class="type" href="../type.Result.html" title="typ [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.decimal" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#192-198">Source</a><h4 class="code-header">pub fn <a href="#method.decimal" class="fn">decimal</a>(precision: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u32</a>, scale: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u32</a>) -&g [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.is_floating_type" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#202-207">Source</a><h4 class="code-header">pub fn <a href="#method.is_floating_type" class="fn">is_floating_type</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Check if it’s float o [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Type" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#82">Source</a><a href="#impl-Clone-for-Type" class="anchor">§</a><h3 class="code-header">impl <a class="tra [...]
-    D: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserializer.html" title="trait serde_core::de::Deserializer">Deserializer</a>&lt;'de&gt;,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary> [...]
-and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Serialize-for-Type" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#304-310">Source</a><a href="#impl-Serialize-for-Type" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html" title="trait serde_core::se [...]
-    S: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html" title="trait serde_core::ser::Serializer">Serializer</a>,</div></h4></section></summary><div class='docblock'>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html#tymethod.serialize">Read more</a></div></details></div></details><section id="impl-Eq-for-Type" class="impl"><a class="src rightside" href="../.. [...]
+</div></div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Type" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#108-207">Source</a><a href="#impl-Type" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type</a [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.is_struct" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#117-119">Source</a><h4 class="code-header">pub fn <a href="#method.is_struct" class="fn">is_struct</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Whether the type is struct type.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.is_nested" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#123-125">Source</a><h4 class="code-header">pub fn <a href="#method.is_nested" class="fn">is_nested</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Whether the type is nested type.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.is_variant" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#129-131">Source</a><h4 class="code-header">pub fn <a href="#method.is_variant" class="fn">is_variant</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Whether the type is variant type.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.as_primitive_type" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#152-158">Source</a><h4 class="code-header">pub fn <a href="#method.as_primitive_type" class="fn">as_primitive_type</a>(&amp;self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;&amp;<a class="enum" href="e [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.to_struct_type" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#161-167">Source</a><h4 class="code-header">pub fn <a href="#method.to_struct_type" class="fn">to_struct_type</a>(self) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="struct.StructType. [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.decimal_max_precision" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#171-177">Source</a><h4 class="code-header">pub fn <a href="#method.decimal_max_precision" class="fn">decimal_max_precision</a>(num_bytes: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u32</a>) -&gt; <a class="type" href="../type.Result.html" title="type i [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.decimal_required_bytes" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#181-187">Source</a><h4 class="code-header">pub fn <a href="#method.decimal_required_bytes" class="fn">decimal_required_bytes</a>(precision: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u32</a>) -&gt; <a class="type" href="../type.Result.html" title="typ [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.decimal" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#191-197">Source</a><h4 class="code-header">pub fn <a href="#method.decimal" class="fn">decimal</a>(precision: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u32</a>, scale: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u32</a>) -&g [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.is_floating_type" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#201-206">Source</a><h4 class="code-header">pub fn <a href="#method.is_floating_type" class="fn">is_floating_type</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Check if it’s float o [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-Type" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#81">Source</a><a href="#impl-Clone-for-Type" class="anchor">§</a><h3 class="code-header">impl <a class="tra [...]
+    D: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserializer.html" title="trait serde_core::de::Deserializer">Deserializer</a>&lt;'de&gt;,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary> [...]
+and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Serialize-for-Type" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#303-309">Source</a><a href="#impl-Serialize-for-Type" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html" title="trait serde_core::se [...]
+    S: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html" title="trait serde_core::ser::Serializer">Serializer</a>,</div></h4></section></summary><div class='docblock'>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html#tymethod.serialize">Read more</a></div></details></div></details><section id="impl-Eq-for-Type" class="impl"><a class="src rightside" href="../.. [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#142">Source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: CastFrom&lt;U&gt;,</div></h4></section></summary><div class='docblock'>Casts <code>self</code> to type <code>T</code>. The <a href="https://doc.rust-lang.org/reference/expressions/operator-expr.html#semantics">semantics of numeric casting</a> with the <code>as</code> operator are followed, so <code>&lt;T as As&gt;::as_::&lt;U&gt;</code> can be used in the same way as <code>T as U</code> for numeric conversions. <a>Read more</a></div></details></div></details><details class="toggle [...]
     T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a>,</div></h3></section></summary><div class="impl-items"><section id="method.as_any" class="method trait-impl"><a href="#method.as_any" class="anchor">§</a><h4 class="code-header">fn <a class="fn">as_any</a>(&amp;self) -&gt; &amp;(dyn <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a> + 'static)</h4 [...]
diff --git a/api/iceberg/spec/struct.ListType.html b/api/iceberg/spec/struct.ListType.html
index 1547d688b..001e44403 100644
--- a/api/iceberg/spec/struct.ListType.html
+++ b/api/iceberg/spec/struct.ListType.html
@@ -1,11 +1,11 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A list is a collection of values with some element type. The element field has an integer id that is unique in the table schema. Elements can be either optional or required. Element types may be any type."><title>ListType in iceberg::spec - Rust</title><script>if(window.location.protocol [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A list is a collection of values with some element type. The element field has an integer id that is unique in the table schema. Elements can be either optional or required. Element types may be any type."><title>ListType in iceberg::spec - Rust</title><script>if(window.location.protocol [...]
     pub element_field: <a class="type" href="type.NestedFieldRef.html" title="type iceberg::spec::NestedFieldRef">NestedFieldRef</a>,
 }</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>A list is a collection of values with some element type. The element field has an integer id that is unique in the table schema.
 Elements can be either optional or required. Element types may be any type.</p>
 </div></details><h2 id="fields" class="fields section-header">Fields<a href="#fields" class="anchor">§</a></h2><span id="structfield.element_field" class="structfield section-header"><a href="#structfield.element_field" class="anchor field">§</a><code>element_field: <a class="type" href="type.NestedFieldRef.html" title="type iceberg::spec::NestedFieldRef">NestedFieldRef</a></code></span><div class="docblock"><p>Element field of list type.</p>
-</div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ListType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#724-729">Source</a><a href="#impl-ListType" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ListType.html" title="struct iceberg::spec::L [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-ListType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#716">Source</a><a href="#impl-Clone-for-ListType" class="anchor">§</a><h3 class="code-header">impl <a c [...]
-and should not be overridden without very good reason.</div></details></div></details><section id="impl-Eq-for-ListType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#716">Source</a><a href="#impl-Eq-for-ListType" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html" title="trait core::cmp::Eq">Eq</a> for <a class="struct" href="struct.ListType.html" title="struct iceberg::s [...]
+</div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-ListType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#728-733">Source</a><a href="#impl-ListType" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.ListType.html" title="struct iceberg::spec::L [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-ListType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#720">Source</a><a href="#impl-Clone-for-ListType" class="anchor">§</a><h3 class="code-header">impl <a c [...]
+and should not be overridden without very good reason.</div></details></div></details><section id="impl-Eq-for-ListType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#720">Source</a><a href="#impl-Eq-for-ListType" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html" title="trait core::cmp::Eq">Eq</a> for <a class="struct" href="struct.ListType.html" title="struct iceberg::s [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#142">Source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: CastFrom&lt;U&gt;,</div></h4></section></summary><div class='docblock'>Casts <code>self</code> to type <code>T</code>. The <a href="https://doc.rust-lang.org/reference/expressions/operator-expr.html#semantics">semantics of numeric casting</a> with the <code>as</code> operator are followed, so <code>&lt;T as As&gt;::as_::&lt;U&gt;</code> can be used in the same way as <code>T as U</code> for numeric conversions. <a>Read more</a></div></details></div></details><details class="toggle [...]
     T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a>,</div></h3></section></summary><div class="impl-items"><section id="method.as_any" class="method trait-impl"><a href="#method.as_any" class="anchor">§</a><h4 class="code-header">fn <a class="fn">as_any</a>(&amp;self) -&gt; &amp;(dyn <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a> + 'static)</h4 [...]
diff --git a/api/iceberg/spec/struct.MapType.html b/api/iceberg/spec/struct.MapType.html
index a0785b210..696384ea5 100644
--- a/api/iceberg/spec/struct.MapType.html
+++ b/api/iceberg/spec/struct.MapType.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A map is a collection of key-value pairs with a key type and a value type. Both the key field and value field each have an integer id that is unique in the table schema. Map keys are required and map values can be either optional or required. Both map keys and map values may be any type, [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A map is a collection of key-value pairs with a key type and a value type. Both the key field and value field each have an integer id that is unique in the table schema. Map keys are required and map values can be either optional or required. Both map keys and map values may be any type, [...]
     pub key_field: <a class="type" href="type.NestedFieldRef.html" title="type iceberg::spec::NestedFieldRef">NestedFieldRef</a>,
     pub value_field: <a class="type" href="type.NestedFieldRef.html" title="type iceberg::spec::NestedFieldRef">NestedFieldRef</a>,
 }</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>A map is a collection of key-value pairs with a key type and a value type.
@@ -7,21 +7,21 @@ Map keys are required and map values can be either optional or required.
 Both map keys and map values may be any type, including nested types.</p>
 </div></details><h2 id="fields" class="fields section-header">Fields<a href="#fields" class="anchor">§</a></h2><span id="structfield.key_field" class="structfield section-header"><a href="#structfield.key_field" class="anchor field">§</a><code>key_field: <a class="type" href="type.NestedFieldRef.html" title="type iceberg::spec::NestedFieldRef">NestedFieldRef</a></code></span><div class="docblock"><p>Field for key.</p>
 </div><span id="structfield.value_field" class="structfield section-header"><a href="#structfield.value_field" class="anchor field">§</a><code>value_field: <a class="type" href="type.NestedFieldRef.html" title="type iceberg::spec::NestedFieldRef">NestedFieldRef</a></code></span><div class="docblock"><p>Field for value.</p>
-</div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-MapType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#852-876">Source</a><a href="#impl-MapType" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.MapType.html" title="struct iceberg::spec::MapT [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.optional" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#862-867">Source</a><h4 class="code-header">pub fn <a href="#method.optional" class="fn">optional</a>(
+</div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-MapType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#856-880">Source</a><a href="#impl-MapType" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.MapType.html" title="struct iceberg::spec::MapT [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.optional" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#866-871">Source</a><h4 class="code-header">pub fn <a href="#method.optional" class="fn">optional</a>(
     key_id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>,
     key_type: <a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type</a>,
     value_id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>,
     value_type: <a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type</a>,
 ) -&gt; Self</h4></section></summary><div class="docblock"><p>Construct an optional map type with the given key and value fields.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.required" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#870-875">Source</a><h4 class="code-header">pub fn <a href="#method.required" class="fn">required</a>(
+</div></details><details class="toggle method-toggle" open><summary><section id="method.required" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#874-879">Source</a><h4 class="code-header">pub fn <a href="#method.required" class="fn">required</a>(
     key_id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>,
     key_type: <a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type</a>,
     value_id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>,
     value_type: <a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type</a>,
 ) -&gt; Self</h4></section></summary><div class="docblock"><p>Construct a required map type with the given key and value fields.</p>
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-MapType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#840">Source</a><a href="#impl-Clone-for-MapType" class="anchor">§</a><h3 class="code-header">impl <a cla [...]
-and should not be overridden without very good reason.</div></details></div></details><section id="impl-Eq-for-MapType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#840">Source</a><a href="#impl-Eq-for-MapType" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html" title="trait core::cmp::Eq">Eq</a> for <a class="struct" href="struct.MapType.html" title="struct iceberg::spec [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-MapType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#844">Source</a><a href="#impl-Clone-for-MapType" class="anchor">§</a><h3 class="code-header">impl <a cla [...]
+and should not be overridden without very good reason.</div></details></div></details><section id="impl-Eq-for-MapType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#844">Source</a><a href="#impl-Eq-for-MapType" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html" title="trait core::cmp::Eq">Eq</a> for <a class="struct" href="struct.MapType.html" title="struct iceberg::spec [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#142">Source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: CastFrom&lt;U&gt;,</div></h4></section></summary><div class='docblock'>Casts <code>self</code> to type <code>T</code>. The <a href="https://doc.rust-lang.org/reference/expressions/operator-expr.html#semantics">semantics of numeric casting</a> with the <code>as</code> operator are followed, so <code>&lt;T as As&gt;::as_::&lt;U&gt;</code> can be used in the same way as <code>T as U</code> for numeric conversions. <a>Read more</a></div></details></div></details><details class="toggle [...]
     T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a>,</div></h3></section></summary><div class="impl-items"><section id="method.as_any" class="method trait-impl"><a href="#method.as_any" class="anchor">§</a><h4 class="code-header">fn <a class="fn">as_any</a>(&amp;self) -&gt; &amp;(dyn <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a> + 'static)</h4 [...]
diff --git a/api/iceberg/spec/struct.NestedField.html b/api/iceberg/spec/struct.NestedField.html
index 4de69fa2c..f4458e51c 100644
--- a/api/iceberg/spec/struct.NestedField.html
+++ b/api/iceberg/spec/struct.NestedField.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A struct is a tuple of typed values. Each field in the tuple is named and has an integer id that is unique in the table schema. Each field can be either optional or required, meaning that values can (or cannot) be null. Fields may be any type. Fields may have an optional comment or doc s [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A struct is a tuple of typed values. Each field in the tuple is named and has an integer id that is unique in the table schema. Each field can be either optional or required, meaning that values can (or cannot) be null. Fields may be any type. Fields may have an optional comment or doc s [...]
     pub id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>,
     pub name: <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>,
     pub required: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a>,
@@ -16,24 +16,24 @@ Fields may have an optional comment or doc string. Fields can have default value
 </div><span id="structfield.doc" class="structfield section-header"><a href="#structfield.doc" class="anchor field">§</a><code>doc: <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="struct" href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>&gt;</code></span><div class="docblock"><p>Fields may have an optional comment or doc st [...]
 </div><span id="structfield.initial_default" class="structfield section-header"><a href="#structfield.initial_default" class="anchor field">§</a><code>initial_default: <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="enum" href="enum.Literal.html" title="enum iceberg::spec::Literal">Literal</a>&gt;</code></span><div class="docblock"><p>Used to populate the field’s value for all records that wer [...]
 </div><span id="structfield.write_default" class="structfield section-header"><a href="#structfield.write_default" class="anchor field">§</a><code>write_default: <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a>&lt;<a class="enum" href="enum.Literal.html" title="enum iceberg::spec::Literal">Literal</a>&gt;</code></span><div class="docblock"><p>Used to populate the field’s value for any records written after  [...]
-</div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-NestedField" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#635-697">Source</a><a href="#impl-NestedField" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.NestedField.html" title="struct iceberg [...]
+</div><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-NestedField" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#639-701">Source</a><a href="#impl-NestedField" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.NestedField.html" title="struct iceberg [...]
     id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>,
     name: impl <a class="trait" href="https://doc.rust-lang.org/nightly/alloc/string/trait.ToString.html" title="trait alloc::string::ToString">ToString</a>,
     field_type: <a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type</a>,
     required: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a>,
 ) -&gt; Self</h4></section></summary><div class="docblock"><p>Construct a new field.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.required" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#650-652">Source</a><h4 class="code-header">pub fn <a href="#method.required" class="fn">required</a>(id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>, name: impl <a class="trait" href="https://doc.rust-lang.org/nightly/alloc/string/trait.ToString.html" title= [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.optional" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#655-657">Source</a><h4 class="code-header">pub fn <a href="#method.optional" class="fn">optional</a>(id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>, name: impl <a class="trait" href="https://doc.rust-lang.org/nightly/alloc/string/trait.ToString.html" title= [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.list_element" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#660-662">Source</a><h4 class="code-header">pub fn <a href="#method.list_element" class="fn">list_element</a>(id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>, field_type: <a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type</a>, req [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.map_key_element" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#665-667">Source</a><h4 class="code-header">pub fn <a href="#method.map_key_element" class="fn">map_key_element</a>(id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>, field_type: <a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.map_value_element" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#670-672">Source</a><h4 class="code-header">pub fn <a href="#method.map_value_element" class="fn">map_value_element</a>(id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>, field_type: <a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.with_doc" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#675-678">Source</a><h4 class="code-header">pub fn <a href="#method.with_doc" class="fn">with_doc</a>(self, doc: impl <a class="trait" href="https://doc.rust-lang.org/nightly/alloc/string/trait.ToString.html" title="trait alloc::string::ToString">ToString</a>) -&gt; Self</h4></section></summary><div class=" [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.with_initial_default" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#681-684">Source</a><h4 class="code-header">pub fn <a href="#method.with_initial_default" class="fn">with_initial_default</a>(self, value: <a class="enum" href="enum.Literal.html" title="enum iceberg::spec::Literal">Literal</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Set the [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.with_write_default" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#687-690">Source</a><h4 class="code-header">pub fn <a href="#method.with_write_default" class="fn">with_write_default</a>(self, value: <a class="enum" href="enum.Literal.html" title="enum iceberg::spec::Literal">Literal</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Set the field [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-NestedField" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#556">Source</a><a href="#impl-Clone-for-NestedField" class="anchor">§</a><h3 class="code-header">imp [...]
-    __D: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserializer.html" title="trait serde_core::de::Deserializer">Deserializer</a>&lt;'de&gt;,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summar [...]
-and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Serialize-for-NestedField" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#556">Source</a><a href="#impl-Serialize-for-NestedField" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html" title="trait serd [...]
-    __S: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html" title="trait serde_core::ser::Serializer">Serializer</a>,</div></h4></section></summary><div class='docblock'>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html#tymethod.serialize">Read more</a></div></details></div></details><section id="impl-Eq-for-NestedField" class="impl"><a class="src rightside" hr [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.required" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#654-656">Source</a><h4 class="code-header">pub fn <a href="#method.required" class="fn">required</a>(id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>, name: impl <a class="trait" href="https://doc.rust-lang.org/nightly/alloc/string/trait.ToString.html" title= [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.optional" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#659-661">Source</a><h4 class="code-header">pub fn <a href="#method.optional" class="fn">optional</a>(id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>, name: impl <a class="trait" href="https://doc.rust-lang.org/nightly/alloc/string/trait.ToString.html" title= [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.list_element" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#664-666">Source</a><h4 class="code-header">pub fn <a href="#method.list_element" class="fn">list_element</a>(id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>, field_type: <a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type</a>, req [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.map_key_element" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#669-671">Source</a><h4 class="code-header">pub fn <a href="#method.map_key_element" class="fn">map_key_element</a>(id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>, field_type: <a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.map_value_element" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#674-676">Source</a><h4 class="code-header">pub fn <a href="#method.map_value_element" class="fn">map_value_element</a>(id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>, field_type: <a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.with_doc" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#679-682">Source</a><h4 class="code-header">pub fn <a href="#method.with_doc" class="fn">with_doc</a>(self, doc: impl <a class="trait" href="https://doc.rust-lang.org/nightly/alloc/string/trait.ToString.html" title="trait alloc::string::ToString">ToString</a>) -&gt; Self</h4></section></summary><div class=" [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.with_initial_default" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#685-688">Source</a><h4 class="code-header">pub fn <a href="#method.with_initial_default" class="fn">with_initial_default</a>(self, value: <a class="enum" href="enum.Literal.html" title="enum iceberg::spec::Literal">Literal</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Set the [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.with_write_default" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#691-694">Source</a><h4 class="code-header">pub fn <a href="#method.with_write_default" class="fn">with_write_default</a>(self, value: <a class="enum" href="enum.Literal.html" title="enum iceberg::spec::Literal">Literal</a>) -&gt; Self</h4></section></summary><div class="docblock"><p>Set the field [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-NestedField" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#555">Source</a><a href="#impl-Clone-for-NestedField" class="anchor">§</a><h3 class="code-header">imp [...]
+    __D: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserializer.html" title="trait serde_core::de::Deserializer">Deserializer</a>&lt;'de&gt;,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summar [...]
+and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Serialize-for-NestedField" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#555">Source</a><a href="#impl-Serialize-for-NestedField" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html" title="trait serd [...]
+    __S: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html" title="trait serde_core::ser::Serializer">Serializer</a>,</div></h4></section></summary><div class='docblock'>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html#tymethod.serialize">Read more</a></div></details></div></details><section id="impl-Eq-for-NestedField" class="impl"><a class="src rightside" hr [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#142">Source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: CastFrom&lt;U&gt;,</div></h4></section></summary><div class='docblock'>Casts <code>self</code> to type <code>T</code>. The <a href="https://doc.rust-lang.org/reference/expressions/operator-expr.html#semantics">semantics of numeric casting</a> with the <code>as</code> operator are followed, so <code>&lt;T as As&gt;::as_::&lt;U&gt;</code> can be used in the same way as <code>T as U</code> for numeric conversions. <a>Read more</a></div></details></div></details><details class="toggle [...]
     T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a>,</div></h3></section></summary><div class="impl-items"><section id="method.as_any" class="method trait-impl"><a href="#method.as_any" class="anchor">§</a><h4 class="code-header">fn <a class="fn">as_any</a>(&amp;self) -&gt; &amp;(dyn <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a> + 'static)</h4 [...]
diff --git a/api/iceberg/spec/struct.StructType.html b/api/iceberg/spec/struct.StructType.html
index 1c6734571..ab2470860 100644
--- a/api/iceberg/spec/struct.StructType.html
+++ b/api/iceberg/spec/struct.StructType.html
@@ -1,12 +1,12 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="DataType for a specific struct"><title>StructType in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-Med [...]
-</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-StructType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#481-528">Source</a><a href="#impl-StructType" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.StructType.html" title="struct  [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.field_by_id" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#492-494">Source</a><h4 class="code-header">pub fn <a href="#method.field_by_id" class="fn">field_by_id</a>(&amp;self, id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.ht [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.field_by_name" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#506-508">Source</a><h4 class="code-header">pub fn <a href="#method.field_by_name" class="fn">field_by_name</a>(&amp;self, name: &amp;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/e [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.fields" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#525-527">Source</a><h4 class="code-header">pub fn <a href="#method.fields" class="fn">fields</a>(&amp;self) -&gt; &amp;[<a class="type" href="type.NestedFieldRef.html" title="type iceberg::spec::NestedFieldRef">NestedFieldRef</a>] <a href="#" class="tooltip" data-notable-ty="&amp;[NestedFieldRef]">ⓘ</a></h4> [...]
-</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-StructType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#417">Source</a><a href="#impl-Clone-for-StructType" class="anchor">§</a><h3 class="code-header">impl  [...]
-    D: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserializer.html" title="trait serde_core::de::Deserializer">Deserializer</a>&lt;'de&gt;,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary> [...]
-and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Serialize-for-StructType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#417">Source</a><a href="#impl-Serialize-for-StructType" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html" title="trait serde_ [...]
-    __S: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html" title="trait serde_core::ser::Serializer">Serializer</a>,</div></h4></section></summary><div class='docblock'>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html#tymethod.serialize">Read more</a></div></details></div></details><section id="impl-Eq-for-StructType" class="impl"><a class="src rightside" hre [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="DataType for a specific struct"><title>StructType in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-Med [...]
+</div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-StructType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#480-527">Source</a><a href="#impl-StructType" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.StructType.html" title="struct  [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.field_by_id" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#491-493">Source</a><h4 class="code-header">pub fn <a href="#method.field_by_id" class="fn">field_by_id</a>(&amp;self, id: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.ht [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.field_by_name" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#505-507">Source</a><h4 class="code-header">pub fn <a href="#method.field_by_name" class="fn">field_by_name</a>(&amp;self, name: &amp;<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.str.html">str</a>) -&gt; <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/e [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.fields" class="method"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#524-526">Source</a><h4 class="code-header">pub fn <a href="#method.fields" class="fn">fields</a>(&amp;self) -&gt; &amp;[<a class="type" href="type.NestedFieldRef.html" title="type iceberg::spec::NestedFieldRef">NestedFieldRef</a>] <a href="#" class="tooltip" data-notable-ty="&amp;[NestedFieldRef]">ⓘ</a></h4> [...]
+</div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-StructType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#416">Source</a><a href="#impl-Clone-for-StructType" class="anchor">§</a><h3 class="code-header">impl  [...]
+    D: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserializer.html" title="trait serde_core::de::Deserializer">Deserializer</a>&lt;'de&gt;,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary> [...]
+and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Serialize-for-StructType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#416">Source</a><a href="#impl-Serialize-for-StructType" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html" title="trait serde_ [...]
+    __S: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html" title="trait serde_core::ser::Serializer">Serializer</a>,</div></h4></section></summary><div class='docblock'>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html#tymethod.serialize">Read more</a></div></details></div></details><section id="impl-Eq-for-StructType" class="impl"><a class="src rightside" hre [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#142">Source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: CastFrom&lt;U&gt;,</div></h4></section></summary><div class='docblock'>Casts <code>self</code> to type <code>T</code>. The <a href="https://doc.rust-lang.org/reference/expressions/operator-expr.html#semantics">semantics of numeric casting</a> with the <code>as</code> operator are followed, so <code>&lt;T as As&gt;::as_::&lt;U&gt;</code> can be used in the same way as <code>T as U</code> for numeric conversions. <a>Read more</a></div></details></div></details><details class="toggle [...]
     T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a>,</div></h3></section></summary><div class="impl-items"><section id="method.as_any" class="method trait-impl"><a href="#method.as_any" class="anchor">§</a><h4 class="code-header">fn <a class="fn">as_any</a>(&amp;self) -&gt; &amp;(dyn <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a> + 'static)</h4 [...]
diff --git a/api/iceberg/spec/struct.VariantType.html b/api/iceberg/spec/struct.VariantType.html
index 45ef436cc..74f072eeb 100644
--- a/api/iceberg/spec/struct.VariantType.html
+++ b/api/iceberg/spec/struct.VariantType.html
@@ -1,11 +1,11 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Variant type - can hold semi-structured data of any type. This is an Iceberg V3 feature."><title>VariantType in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic- [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Variant type - can hold semi-structured data of any type. This is an Iceberg V3 feature."><title>VariantType in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic- [...]
 This is an Iceberg V3 feature.</p>
-</div></details><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-VariantType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#880">Source</a><a href="#impl-Clone-for-VariantType" class="anchor">§</a><h3 class="code-header">impl <a class="trait" hre [...]
-    D: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserializer.html" title="trait serde_core::de::Deserializer">Deserializer</a>&lt;'de&gt;,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary> [...]
+</div></details><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Clone-for-VariantType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#884">Source</a><a href="#impl-Clone-for-VariantType" class="anchor">§</a><h3 class="code-header">impl <a class="trait" hre [...]
+    D: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserializer.html" title="trait serde_core::de::Deserializer">Deserializer</a>&lt;'de&gt;,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary> [...]
     H: <a class="trait" href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher">Hasher</a>,
-    Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Feeds a slice of this type into the given <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher"><code>Hasher</code></a>. <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice">Read more</a></div></details></div></d [...]
-and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Serialize-for-VariantType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#895-900">Source</a><a href="#impl-Serialize-for-VariantType" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html" title="trait  [...]
-    S: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html" title="trait serde_core::ser::Serializer">Serializer</a>,</div></h4></section></summary><div class='docblock'>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html#tymethod.serialize">Read more</a></div></details></div></details><section id="impl-Copy-for-VariantType" class="impl"><a class="src rightside" hr [...]
+    Self: <a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h4></section></summary><div class='docblock'>Feeds a slice of this type into the given <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hasher.html" title="trait core::hash::Hasher"><code>Hasher</code></a>. <a href="https://doc.rust-lang.org/nightly/core/hash/trait.Hash.html#method.hash_slice">Read more</a></div></details></div></d [...]
+and should not be overridden without very good reason.</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Serialize-for-VariantType" class="impl"><a class="src rightside" href="../../src/iceberg/spec/datatypes.rs.html#899-904">Source</a><a href="#impl-Serialize-for-VariantType" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html" title="trait  [...]
+    S: <a class="trait" href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serializer.html" title="trait serde_core::ser::Serializer">Serializer</a>,</div></h4></section></summary><div class='docblock'>Serialize this value into the given Serde serializer. <a href="https://docs.rs/serde_core/1.0.228/serde_core/ser/trait.Serialize.html#tymethod.serialize">Read more</a></div></details></div></details><section id="impl-Copy-for-VariantType" class="impl"><a class="src rightside" hr [...]
     T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#142">Source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
     T: CastFrom&lt;U&gt;,</div></h4></section></summary><div class='docblock'>Casts <code>self</code> to type <code>T</code>. The <a href="https://doc.rust-lang.org/reference/expressions/operator-expr.html#semantics">semantics of numeric casting</a> with the <code>as</code> operator are followed, so <code>&lt;T as As&gt;::as_::&lt;U&gt;</code> can be used in the same way as <code>T as U</code> for numeric conversions. <a>Read more</a></div></details></div></details><details class="toggle [...]
     T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a>,</div></h3></section></summary><div class="impl-items"><section id="method.as_any" class="method trait-impl"><a href="#method.as_any" class="anchor">§</a><h4 class="code-header">fn <a class="fn">as_any</a>(&amp;self) -&gt; &amp;(dyn <a class="trait" href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html" title="trait core::any::Any">Any</a> + 'static)</h4 [...]
diff --git a/api/iceberg/spec/type.NestedFieldRef.html b/api/iceberg/spec/type.NestedFieldRef.html
index 067d91d07..9468feb01 100644
--- a/api/iceberg/spec/type.NestedFieldRef.html
+++ b/api/iceberg/spec/type.NestedFieldRef.html
@@ -1,2 +1,2 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Reference to nested field."><title>NestedFieldRef in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-Med [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Reference to nested field."><title>NestedFieldRef in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-Med [...]
 </div></details><h2 id="aliased-type" class="section-header">Aliased Type<a href="#aliased-type" class="anchor">§</a></h2><pre class="rust item-decl"><code>pub struct NestedFieldRef { <span class="comment">/* private fields */</span> }</code></pre><script src="../../type.impl/alloc/sync/struct.Arc.js" data-self-path="iceberg::spec::datatypes::NestedFieldRef" async></script></section></div></main></body></html>
\ No newline at end of file
diff --git a/api/search.index/path/9bda7dc8bb.js b/api/search.index/path/9bda7dc8bb.js
new file mode 100644
index 000000000..dcad809f3
--- /dev/null
+++ b/api/search.index/path/9bda7dc8bb.js
@@ -0,0 +1 @@
+rd_("g[17,\"\"]000f[1,\"\"]0Aa[10,\"bnum::cast\"]Bn[15,\"iceberg_storage_opendal::OpenDalStorage\"]Eg[5,\"tower_http::follow_redirect::policy::or\",\"tower_http::follow_redirect::policy::or\"]1Ce[15,\"iceberg_storage_opendal::OpenDalStorageFactory\"]4Bb[2,\"iceberg::io::storage::config\"]m[2,\"iceberg\"]Ai[2,\"iceberg::encryption\"]2Am[2,\"iceberg_storage_opendal\"]8Ei[5,\"tower_http::follow_redirect::policy::and\",\"tower_http::follow_redirect::policy::and\"]A`[10,\"core::any\"]Ao[5,\"a [...]
\ No newline at end of file
diff --git a/api/search.index/path/d74fbb7dc9.js b/api/search.index/path/d74fbb7dc9.js
deleted file mode 100644
index 84fd534fb..000000000
--- a/api/search.index/path/d74fbb7dc9.js
+++ /dev/null
@@ -1 +0,0 @@
-rd_("g[17,\"\"]000f[1,\"\"]0Aa[10,\"bnum::cast\"]Bn[15,\"iceberg_storage_opendal::OpenDalStorage\"]Eg[5,\"tower_http::follow_redirect::policy::or\",\"tower_http::follow_redirect::policy::or\"]1Ce[15,\"iceberg_storage_opendal::OpenDalStorageFactory\"]4Bb[2,\"iceberg::io::storage::config\"]m[2,\"iceberg\"]Ai[2,\"iceberg::encryption\"]2Am[2,\"iceberg_storage_opendal\"]8Ei[5,\"tower_http::follow_redirect::policy::and\",\"tower_http::follow_redirect::policy::and\"]A`[10,\"core::any\"]Ao[5,\"a [...]
\ No newline at end of file
diff --git a/api/search.index/root.js b/api/search.index/root.js
index 5bc8e4d04..c420c0077 100644
--- a/api/search.index/root.js
+++ b/api/search.index/root.js
@@ -1 +1 @@
-rr_('{"normalizedName":{"I":"VYLAAAAUeRSTAVoH1QxyD5kPJQHAAAAwrAObBAEFNP8EdA8lAcAAABB0DzZ0F8AiRQHAAAAS1wxypQGsA5sEAQV1/MBEAgAAQVoH1QxyD5kPEP8EEXMPHwAgACEAlAFUESEgXyIVAcAAACFLEe0cbqYBBQLAAAATDiAQ7BxhcwEBAcUAABxQZDswAAABAAD0AAMACwUAACIFAACWCfIABQLDAACnKCKiXiFkc0UBwgAAFRwbY40KjgqPCsgKFQHAAAAS1wxypQEUAcJ0ZAAAFmVmYXVsdL0cZCUFdhsAAf4IThwACSlyDeDEAAAge3MA0j8bAAC9FQHRAAAWyiJkoCIVAdYAABbYImTJIjHAAAAvEe0e7h7zgQJmcGUBwwAAFtIiZM4hXCKPIpAitSK5IkUBwwAAFswiZNcaoh4/IqgiIwACxAAAITBhbvQpHAAApAFSBDgA+4YJAtA [...]
\ No newline at end of file
+rr_('{"normalizedName":{"I":"VYLAAAAUeRSTAVoH1QxyD5kPJQHAAAAwrAObBAEFNP8EdA8lAcAAABB0DzZ0F8AiRQHAAAAS1wxypQGsA5sEAQV1/MBEAgAAQVoH1QxyD5kPEP8EEXMPHwAgACEAlAFUESEgXyIVAcAAACFLEe0cbqYBBQLAAAATDiAQ7BxhcwEBAcUAABxQZDswAAABAAD0AAMACwUAACIFAACWCfIABQLDAACnKCKiXiFkc0UBwgAAFRwbY40KjgqPCsgKFQHAAAAS1wxypQEUAcJ0ZAAAFmVmYXVsdL0cZCUFdhsAAf4IThwACSlyDeDEAAAge3MA0j8bAAC9FQHRAAAWyiJkoCIVAdYAABbYImTJIjHAAAAvEe0e7h7zgQJmcGUBwwAAFtIiZM4hXCKPIpAitSK5IkUBwwAAFswiZNcaoh4/IqgiIwACxAAAITBhbvQpHAAApAFSBDgA+4YJAtA [...]
\ No newline at end of file
diff --git a/api/src/iceberg/spec/datatypes.rs.html b/api/src/iceberg/spec/datatypes.rs.html
index d3eb95a54..9270ebbdf 100644
--- a/api/src/iceberg/spec/datatypes.rs.html
+++ b/api/src/iceberg/spec/datatypes.rs.html
@@ -19,1384 +19,1413 @@
 <a href=#19 id=19 data-nosnippet>19</a> * Data Types
 <a href=#20 id=20 data-nosnippet>20</a> */
 <a href=#21 id=21 data-nosnippet>21</a></span><span class="kw">use </span>std::collections::HashMap;
-<a href=#22 id=22 data-nosnippet>22</a><span class="kw">use </span>std::convert::identity;
-<a href=#23 id=23 data-nosnippet>23</a><span class="kw">use </span>std::fmt;
-<a href=#24 id=24 data-nosnippet>24</a><span class="kw">use </span>std::ops::Index;
-<a href=#25 id=25 data-nosnippet>25</a><span class="kw">use </span>std::sync::{Arc, OnceLock};
-<a href=#26 id=26 data-nosnippet>26</a>
-<a href=#27 id=27 data-nosnippet>27</a><span class="kw">use </span>::serde::de::{MapAccess, Visitor};
-<a href=#28 id=28 data-nosnippet>28</a><span class="kw">use </span>serde::de::{Error, IntoDeserializer};
-<a href=#29 id=29 data-nosnippet>29</a><span class="kw">use </span>serde::{Deserialize, Deserializer, Serialize, Serializer};
-<a href=#30 id=30 data-nosnippet>30</a><span class="kw">use </span>serde_json::Value <span class="kw">as </span>JsonValue;
-<a href=#31 id=31 data-nosnippet>31</a>
-<a href=#32 id=32 data-nosnippet>32</a><span class="kw">use </span><span class="kw">super</span>::values::Literal;
-<a href=#33 id=33 data-nosnippet>33</a><span class="kw">use </span><span class="kw">crate</span>::ensure_data_valid;
-<a href=#34 id=34 data-nosnippet>34</a><span class="kw">use </span><span class="kw">crate</span>::error::Result;
-<a href=#35 id=35 data-nosnippet>35</a><span class="kw">use </span><span class="kw">crate</span>::spec::datatypes::_decimal::{MAX_PRECISION, REQUIRED_LENGTH};
-<a href=#36 id=36 data-nosnippet>36</a><span class="kw">use </span><span class="kw">crate</span>::spec::{FormatVersion, PrimitiveLiteral};
-<a href=#37 id=37 data-nosnippet>37</a>
-<a href=#38 id=38 data-nosnippet>38</a><span class="doccomment">/// Field name for list type.
-<a href=#39 id=39 data-nosnippet>39</a></span><span class="kw">pub const </span>LIST_FIELD_NAME: <span class="kw-2">&amp;</span>str = <span class="string">"element"</span>;
-<a href=#40 id=40 data-nosnippet>40</a><span class="doccomment">/// Field name for map type's key.
-<a href=#41 id=41 data-nosnippet>41</a></span><span class="kw">pub const </span>MAP_KEY_FIELD_NAME: <span class="kw-2">&amp;</span>str = <span class="string">"key"</span>;
-<a href=#42 id=42 data-nosnippet>42</a><span class="doccomment">/// Field name for map type's value.
-<a href=#43 id=43 data-nosnippet>43</a></span><span class="kw">pub const </span>MAP_VALUE_FIELD_NAME: <span class="kw-2">&amp;</span>str = <span class="string">"value"</span>;
-<a href=#44 id=44 data-nosnippet>44</a>
-<a href=#45 id=45 data-nosnippet>45</a><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">const </span>MAX_DECIMAL_BYTES: u32 = <span class="number">24</span>;
-<a href=#46 id=46 data-nosnippet>46</a><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">const </span>MAX_DECIMAL_PRECISION: u32 = <span class="number">38</span>;
-<a href=#47 id=47 data-nosnippet>47</a>
-<a href=#48 id=48 data-nosnippet>48</a><span class="kw">mod </span>_decimal {
-<a href=#49 id=49 data-nosnippet>49</a>    <span class="kw">use </span>once_cell::sync::Lazy;
-<a href=#50 id=50 data-nosnippet>50</a>
-<a href=#51 id=51 data-nosnippet>51</a>    <span class="kw">use </span><span class="kw">crate</span>::spec::{MAX_DECIMAL_BYTES, MAX_DECIMAL_PRECISION};
-<a href=#52 id=52 data-nosnippet>52</a>
-<a href=#53 id=53 data-nosnippet>53</a>    <span class="comment">// Max precision of bytes, starts from 1
-<a href=#54 id=54 data-nosnippet>54</a>    </span><span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">static </span>MAX_PRECISION: Lazy&lt;[u32; MAX_DECIMAL_BYTES <span class="kw">as </span>usize]&gt; = Lazy::new(|| {
-<a href=#55 id=55 data-nosnippet>55</a>        <span class="kw">let </span><span class="kw-2">mut </span>ret: [u32; <span class="number">24</span>] = [<span class="number">0</span>; <span class="number">24</span>];
-<a href=#56 id=56 data-nosnippet>56</a>        <span class="kw">for </span>(i, prec) <span class="kw">in </span>ret.iter_mut().enumerate() {
-<a href=#57 id=57 data-nosnippet>57</a>            <span class="kw-2">*</span>prec = <span class="number">2f64</span>.powi((<span class="number">8 </span>* (i + <span class="number">1</span>) - <span class="number">1</span>) <span class="kw">as </span>i32).log10().floor() <span class="kw">as </span>u32;
-<a href=#58 id=58 data-nosnippet>58</a>        }
-<a href=#59 id=59 data-nosnippet>59</a>
-<a href=#60 id=60 data-nosnippet>60</a>        ret
-<a href=#61 id=61 data-nosnippet>61</a>    });
-<a href=#62 id=62 data-nosnippet>62</a>
-<a href=#63 id=63 data-nosnippet>63</a>    <span class="comment">//  Required bytes of precision, starts from 1
-<a href=#64 id=64 data-nosnippet>64</a>    </span><span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">static </span>REQUIRED_LENGTH: Lazy&lt;[u32; MAX_DECIMAL_PRECISION <span class="kw">as </span>usize]&gt; =
-<a href=#65 id=65 data-nosnippet>65</a>        Lazy::new(|| {
-<a href=#66 id=66 data-nosnippet>66</a>            <span class="kw">let </span><span class="kw-2">mut </span>ret: [u32; MAX_DECIMAL_PRECISION <span class="kw">as </span>usize] =
-<a href=#67 id=67 data-nosnippet>67</a>                [<span class="number">0</span>; MAX_DECIMAL_PRECISION <span class="kw">as </span>usize];
-<a href=#68 id=68 data-nosnippet>68</a>
-<a href=#69 id=69 data-nosnippet>69</a>            <span class="kw">for </span>(i, required_len) <span class="kw">in </span>ret.iter_mut().enumerate() {
-<a href=#70 id=70 data-nosnippet>70</a>                <span class="kw">for </span>j <span class="kw">in </span><span class="number">0</span>..MAX_PRECISION.len() {
-<a href=#71 id=71 data-nosnippet>71</a>                    <span class="kw">if </span>MAX_PRECISION[j] &gt;= ((i + <span class="number">1</span>) <span class="kw">as </span>u32) {
-<a href=#72 id=72 data-nosnippet>72</a>                        <span class="kw-2">*</span>required_len = (j + <span class="number">1</span>) <span class="kw">as </span>u32;
-<a href=#73 id=73 data-nosnippet>73</a>                        <span class="kw">break</span>;
-<a href=#74 id=74 data-nosnippet>74</a>                    }
-<a href=#75 id=75 data-nosnippet>75</a>                }
-<a href=#76 id=76 data-nosnippet>76</a>            }
-<a href=#77 id=77 data-nosnippet>77</a>
-<a href=#78 id=78 data-nosnippet>78</a>            ret
-<a href=#79 id=79 data-nosnippet>79</a>        });
-<a href=#80 id=80 data-nosnippet>80</a>}
-<a href=#81 id=81 data-nosnippet>81</a>
-<a href=#82 id=82 data-nosnippet>82</a><span class="attr">#[derive(Debug, PartialEq, Eq, Clone)]
-<a href=#83 id=83 data-nosnippet>83</a></span><span class="doccomment">/// All data types are either primitives or nested types, which are maps, lists, or structs.
-<a href=#84 id=84 data-nosnippet>84</a></span><span class="kw">pub enum </span>Type {
-<a href=#85 id=85 data-nosnippet>85</a>    <span class="doccomment">/// Primitive types
-<a href=#86 id=86 data-nosnippet>86</a>    </span>Primitive(PrimitiveType),
-<a href=#87 id=87 data-nosnippet>87</a>    <span class="doccomment">/// Struct type
-<a href=#88 id=88 data-nosnippet>88</a>    </span>Struct(StructType),
-<a href=#89 id=89 data-nosnippet>89</a>    <span class="doccomment">/// List type.
-<a href=#90 id=90 data-nosnippet>90</a>    </span>List(ListType),
-<a href=#91 id=91 data-nosnippet>91</a>    <span class="doccomment">/// Map type
-<a href=#92 id=92 data-nosnippet>92</a>    </span>Map(MapType),
-<a href=#93 id=93 data-nosnippet>93</a>    <span class="doccomment">/// Variant Type
-<a href=#94 id=94 data-nosnippet>94</a>    </span>Variant(VariantType),
-<a href=#95 id=95 data-nosnippet>95</a>}
-<a href=#96 id=96 data-nosnippet>96</a>
-<a href=#97 id=97 data-nosnippet>97</a><span class="kw">impl </span>fmt::Display <span class="kw">for </span>Type {
-<a href=#98 id=98 data-nosnippet>98</a>    <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter) -&gt; fmt::Result {
-<a href=#99 id=99 data-nosnippet>99</a>        <span class="kw">match </span><span class="self">self </span>{
-<a href=#100 id=100 data-nosnippet>100</a>            Type::Primitive(primitive) =&gt; <span class="macro">write!</span>(f, <span class="string">"{primitive}"</span>),
-<a href=#101 id=101 data-nosnippet>101</a>            Type::Struct(s) =&gt; <span class="macro">write!</span>(f, <span class="string">"{s}"</span>),
-<a href=#102 id=102 data-nosnippet>102</a>            Type::List(<span class="kw">_</span>) =&gt; <span class="macro">write!</span>(f, <span class="string">"list"</span>),
-<a href=#103 id=103 data-nosnippet>103</a>            Type::Map(<span class="kw">_</span>) =&gt; <span class="macro">write!</span>(f, <span class="string">"map"</span>),
-<a href=#104 id=104 data-nosnippet>104</a>            Type::Variant(<span class="kw">_</span>) =&gt; <span class="macro">write!</span>(f, <span class="string">"variant"</span>),
-<a href=#105 id=105 data-nosnippet>105</a>        }
-<a href=#106 id=106 data-nosnippet>106</a>    }
-<a href=#107 id=107 data-nosnippet>107</a>}
-<a href=#108 id=108 data-nosnippet>108</a>
-<a href=#109 id=109 data-nosnippet>109</a><span class="kw">impl </span>Type {
-<a href=#110 id=110 data-nosnippet>110</a>    <span class="doccomment">/// Whether the type is primitive type.
-<a href=#111 id=111 data-nosnippet>111</a>    </span><span class="attr">#[inline(always)]
-<a href=#112 id=112 data-nosnippet>112</a>    </span><span class="kw">pub fn </span>is_primitive(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
-<a href=#113 id=113 data-nosnippet>113</a>        <span class="macro">matches!</span>(<span class="self">self</span>, Type::Primitive(<span class="kw">_</span>))
-<a href=#114 id=114 data-nosnippet>114</a>    }
-<a href=#115 id=115 data-nosnippet>115</a>
-<a href=#116 id=116 data-nosnippet>116</a>    <span class="doccomment">/// Whether the type is struct type.
-<a href=#117 id=117 data-nosnippet>117</a>    </span><span class="attr">#[inline(always)]
-<a href=#118 id=118 data-nosnippet>118</a>    </span><span class="kw">pub fn </span>is_struct(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
-<a href=#119 id=119 data-nosnippet>119</a>        <span class="macro">matches!</span>(<span class="self">self</span>, Type::Struct(<span class="kw">_</span>))
-<a href=#120 id=120 data-nosnippet>120</a>    }
-<a href=#121 id=121 data-nosnippet>121</a>
-<a href=#122 id=122 data-nosnippet>122</a>    <span class="doccomment">/// Whether the type is nested type.
-<a href=#123 id=123 data-nosnippet>123</a>    </span><span class="attr">#[inline(always)]
-<a href=#124 id=124 data-nosnippet>124</a>    </span><span class="kw">pub fn </span>is_nested(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
-<a href=#125 id=125 data-nosnippet>125</a>        <span class="macro">matches!</span>(<span class="self">self</span>, Type::Struct(<span class="kw">_</span>) | Type::List(<span class="kw">_</span>) | Type::Map(<span class="kw">_</span>))
-<a href=#126 id=126 data-nosnippet>126</a>    }
-<a href=#127 id=127 data-nosnippet>127</a>
-<a href=#128 id=128 data-nosnippet>128</a>    <span class="doccomment">/// Whether the type is variant type.
-<a href=#129 id=129 data-nosnippet>129</a>    </span><span class="attr">#[inline(always)]
-<a href=#130 id=130 data-nosnippet>130</a>    </span><span class="kw">pub fn </span>is_variant(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
-<a href=#131 id=131 data-nosnippet>131</a>        <span class="macro">matches!</span>(<span class="self">self</span>, Type::Variant(<span class="kw">_</span>))
-<a href=#132 id=132 data-nosnippet>132</a>    }
-<a href=#133 id=133 data-nosnippet>133</a>
-<a href=#134 id=134 data-nosnippet>134</a>    <span class="doccomment">/// Minimum [`FormatVersion`] required to support this type, **without** taking
-<a href=#135 id=135 data-nosnippet>135</a>    /// nested field types into account.
-<a href=#136 id=136 data-nosnippet>136</a>    ///
-<a href=#137 id=137 data-nosnippet>137</a>    /// `TimestampNs` / `TimestamptzNs` / `Variant` require [`FormatVersion::V3`]; every
-<a href=#138 id=138 data-nosnippet>138</a>    /// other type is valid from [`FormatVersion::V1`]. Mirrors Java's
-<a href=#139 id=139 data-nosnippet>139</a>    /// `Schema.MIN_FORMAT_VERSIONS` (a shallow lookup keyed by type id), so it
-<a href=#140 id=140 data-nosnippet>140</a>    /// intentionally does not recurse: callers needing the floor for a whole schema
-<a href=#141 id=141 data-nosnippet>141</a>    /// iterate its flattened fields (see [`Schema::calc_min_compatible_format`]).
-<a href=#142 id=142 data-nosnippet>142</a>    ///
-<a href=#143 id=143 data-nosnippet>143</a>    /// [`Schema::calc_min_compatible_format`]: crate::spec::Schema::calc_min_compatible_format
-<a href=#144 id=144 data-nosnippet>144</a>    </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>min_format_version(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; FormatVersion {
-<a href=#145 id=145 data-nosnippet>145</a>        <span class="kw">match </span><span class="self">self </span>{
-<a href=#146 id=146 data-nosnippet>146</a>            Type::Primitive(PrimitiveType::TimestampNs | PrimitiveType::TimestamptzNs)
-<a href=#147 id=147 data-nosnippet>147</a>            | Type::Variant(<span class="kw">_</span>) =&gt; FormatVersion::V3,
-<a href=#148 id=148 data-nosnippet>148</a>            <span class="kw">_ </span>=&gt; FormatVersion::V1,
-<a href=#149 id=149 data-nosnippet>149</a>        }
-<a href=#150 id=150 data-nosnippet>150</a>    }
-<a href=#151 id=151 data-nosnippet>151</a>
-<a href=#152 id=152 data-nosnippet>152</a>    <span class="doccomment">/// Convert Type to reference of PrimitiveType
-<a href=#153 id=153 data-nosnippet>153</a>    </span><span class="kw">pub fn </span>as_primitive_type(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span>PrimitiveType&gt; {
-<a href=#154 id=154 data-nosnippet>154</a>        <span class="kw">if let </span>Type::Primitive(primitive_type) = <span class="self">self </span>{
-<a href=#155 id=155 data-nosnippet>155</a>            <span class="prelude-val">Some</span>(primitive_type)
-<a href=#156 id=156 data-nosnippet>156</a>        } <span class="kw">else </span>{
-<a href=#157 id=157 data-nosnippet>157</a>            <span class="prelude-val">None
-<a href=#158 id=158 data-nosnippet>158</a>        </span>}
-<a href=#159 id=159 data-nosnippet>159</a>    }
-<a href=#160 id=160 data-nosnippet>160</a>
-<a href=#161 id=161 data-nosnippet>161</a>    <span class="doccomment">/// Convert Type to StructType
-<a href=#162 id=162 data-nosnippet>162</a>    </span><span class="kw">pub fn </span>to_struct_type(<span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;StructType&gt; {
-<a href=#163 id=163 data-nosnippet>163</a>        <span class="kw">if let </span>Type::Struct(struct_type) = <span class="self">self </span>{
-<a href=#164 id=164 data-nosnippet>164</a>            <span class="prelude-val">Some</span>(struct_type)
-<a href=#165 id=165 data-nosnippet>165</a>        } <span class="kw">else </span>{
-<a href=#166 id=166 data-nosnippet>166</a>            <span class="prelude-val">None
-<a href=#167 id=167 data-nosnippet>167</a>        </span>}
-<a href=#168 id=168 data-nosnippet>168</a>    }
-<a href=#169 id=169 data-nosnippet>169</a>
-<a href=#170 id=170 data-nosnippet>170</a>    <span class="doccomment">/// Return max precision for decimal given `num_bytes` bytes.
-<a href=#171 id=171 data-nosnippet>171</a>    </span><span class="attr">#[inline(always)]
-<a href=#172 id=172 data-nosnippet>172</a>    </span><span class="kw">pub fn </span>decimal_max_precision(num_bytes: u32) -&gt; <span class="prelude-ty">Result</span>&lt;u32&gt; {
-<a href=#173 id=173 data-nosnippet>173</a>        <span class="macro">ensure_data_valid!</span>(
-<a href=#174 id=174 data-nosnippet>174</a>            num_bytes &gt; <span class="number">0 </span>&amp;&amp; num_bytes &lt;= MAX_DECIMAL_BYTES,
-<a href=#175 id=175 data-nosnippet>175</a>            <span class="string">"Decimal length larger than {MAX_DECIMAL_BYTES} is not supported: {num_bytes}"</span>,
-<a href=#176 id=176 data-nosnippet>176</a>        );
-<a href=#177 id=177 data-nosnippet>177</a>        <span class="prelude-val">Ok</span>(MAX_PRECISION[num_bytes <span class="kw">as </span>usize - <span class="number">1</span>])
-<a href=#178 id=178 data-nosnippet>178</a>    }
-<a href=#179 id=179 data-nosnippet>179</a>
-<a href=#180 id=180 data-nosnippet>180</a>    <span class="doccomment">/// Returns minimum bytes required for decimal with `precision`.
-<a href=#181 id=181 data-nosnippet>181</a>    </span><span class="attr">#[inline(always)]
-<a href=#182 id=182 data-nosnippet>182</a>    </span><span class="kw">pub fn </span>decimal_required_bytes(precision: u32) -&gt; <span class="prelude-ty">Result</span>&lt;u32&gt; {
-<a href=#183 id=183 data-nosnippet>183</a>        <span class="macro">ensure_data_valid!</span>(
-<a href=#184 id=184 data-nosnippet>184</a>            precision &gt; <span class="number">0 </span>&amp;&amp; precision &lt;= MAX_DECIMAL_PRECISION,
-<a href=#185 id=185 data-nosnippet>185</a>            <span class="string">"Decimals with precision larger than {MAX_DECIMAL_PRECISION} are not supported: {precision}"</span>,
-<a href=#186 id=186 data-nosnippet>186</a>        );
-<a href=#187 id=187 data-nosnippet>187</a>        <span class="prelude-val">Ok</span>(REQUIRED_LENGTH[precision <span class="kw">as </span>usize - <span class="number">1</span>])
-<a href=#188 id=188 data-nosnippet>188</a>    }
-<a href=#189 id=189 data-nosnippet>189</a>
-<a href=#190 id=190 data-nosnippet>190</a>    <span class="doccomment">/// Creates  decimal type.
-<a href=#191 id=191 data-nosnippet>191</a>    </span><span class="attr">#[inline(always)]
-<a href=#192 id=192 data-nosnippet>192</a>    </span><span class="kw">pub fn </span>decimal(precision: u32, scale: u32) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="self">Self</span>&gt; {
-<a href=#193 id=193 data-nosnippet>193</a>        <span class="macro">ensure_data_valid!</span>(
-<a href=#194 id=194 data-nosnippet>194</a>            precision &gt; <span class="number">0 </span>&amp;&amp; precision &lt;= MAX_DECIMAL_PRECISION,
-<a href=#195 id=195 data-nosnippet>195</a>            <span class="string">"Decimals with precision larger than {MAX_DECIMAL_PRECISION} are not supported: {precision}"</span>,
-<a href=#196 id=196 data-nosnippet>196</a>        );
-<a href=#197 id=197 data-nosnippet>197</a>        <span class="prelude-val">Ok</span>(Type::Primitive(PrimitiveType::Decimal { precision, scale }))
-<a href=#198 id=198 data-nosnippet>198</a>    }
-<a href=#199 id=199 data-nosnippet>199</a>
-<a href=#200 id=200 data-nosnippet>200</a>    <span class="doccomment">/// Check if it's float or double type.
-<a href=#201 id=201 data-nosnippet>201</a>    </span><span class="attr">#[inline(always)]
-<a href=#202 id=202 data-nosnippet>202</a>    </span><span class="kw">pub fn </span>is_floating_type(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
-<a href=#203 id=203 data-nosnippet>203</a>        <span class="macro">matches!</span>(
-<a href=#204 id=204 data-nosnippet>204</a>            <span class="self">self</span>,
-<a href=#205 id=205 data-nosnippet>205</a>            Type::Primitive(PrimitiveType::Float) | Type::Primitive(PrimitiveType::Double)
-<a href=#206 id=206 data-nosnippet>206</a>        )
-<a href=#207 id=207 data-nosnippet>207</a>    }
-<a href=#208 id=208 data-nosnippet>208</a>}
-<a href=#209 id=209 data-nosnippet>209</a>
-<a href=#210 id=210 data-nosnippet>210</a><span class="kw">impl </span>From&lt;PrimitiveType&gt; <span class="kw">for </span>Type {
-<a href=#211 id=211 data-nosnippet>211</a>    <span class="kw">fn </span>from(value: PrimitiveType) -&gt; <span class="self">Self </span>{
-<a href=#212 id=212 data-nosnippet>212</a>        <span class="self">Self</span>::Primitive(value)
-<a href=#213 id=213 data-nosnippet>213</a>    }
-<a href=#214 id=214 data-nosnippet>214</a>}
-<a href=#215 id=215 data-nosnippet>215</a>
-<a href=#216 id=216 data-nosnippet>216</a><span class="kw">impl </span>From&lt;StructType&gt; <span class="kw">for </span>Type {
-<a href=#217 id=217 data-nosnippet>217</a>    <span class="kw">fn </span>from(value: StructType) -&gt; <span class="self">Self </span>{
-<a href=#218 id=218 data-nosnippet>218</a>        Type::Struct(value)
-<a href=#219 id=219 data-nosnippet>219</a>    }
-<a href=#220 id=220 data-nosnippet>220</a>}
-<a href=#221 id=221 data-nosnippet>221</a>
-<a href=#222 id=222 data-nosnippet>222</a><span class="kw">impl </span>From&lt;ListType&gt; <span class="kw">for </span>Type {
-<a href=#223 id=223 data-nosnippet>223</a>    <span class="kw">fn </span>from(value: ListType) -&gt; <span class="self">Self </span>{
-<a href=#224 id=224 data-nosnippet>224</a>        Type::List(value)
-<a href=#225 id=225 data-nosnippet>225</a>    }
-<a href=#226 id=226 data-nosnippet>226</a>}
-<a href=#227 id=227 data-nosnippet>227</a>
-<a href=#228 id=228 data-nosnippet>228</a><span class="kw">impl </span>From&lt;MapType&gt; <span class="kw">for </span>Type {
-<a href=#229 id=229 data-nosnippet>229</a>    <span class="kw">fn </span>from(value: MapType) -&gt; <span class="self">Self </span>{
-<a href=#230 id=230 data-nosnippet>230</a>        Type::Map(value)
-<a href=#231 id=231 data-nosnippet>231</a>    }
-<a href=#232 id=232 data-nosnippet>232</a>}
-<a href=#233 id=233 data-nosnippet>233</a>
-<a href=#234 id=234 data-nosnippet>234</a><span class="doccomment">/// Primitive data types
-<a href=#235 id=235 data-nosnippet>235</a></span><span class="attr">#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Hash)]
-<a href=#236 id=236 data-nosnippet>236</a>#[serde(rename_all = <span class="string">"lowercase"</span>, remote = <span class="string">"Self"</span>)]
-<a href=#237 id=237 data-nosnippet>237</a></span><span class="kw">pub enum </span>PrimitiveType {
-<a href=#238 id=238 data-nosnippet>238</a>    <span class="doccomment">/// True or False
-<a href=#239 id=239 data-nosnippet>239</a>    </span>Boolean,
-<a href=#240 id=240 data-nosnippet>240</a>    <span class="doccomment">/// 32-bit signed integer
-<a href=#241 id=241 data-nosnippet>241</a>    </span>Int,
-<a href=#242 id=242 data-nosnippet>242</a>    <span class="doccomment">/// 64-bit signed integer
-<a href=#243 id=243 data-nosnippet>243</a>    </span>Long,
-<a href=#244 id=244 data-nosnippet>244</a>    <span class="doccomment">/// 32-bit IEEE 754 floating point.
-<a href=#245 id=245 data-nosnippet>245</a>    </span>Float,
-<a href=#246 id=246 data-nosnippet>246</a>    <span class="doccomment">/// 64-bit IEEE 754 floating point.
-<a href=#247 id=247 data-nosnippet>247</a>    </span>Double,
-<a href=#248 id=248 data-nosnippet>248</a>    <span class="doccomment">/// Fixed point decimal
-<a href=#249 id=249 data-nosnippet>249</a>    </span>Decimal {
-<a href=#250 id=250 data-nosnippet>250</a>        <span class="doccomment">/// Precision, must be 38 or less
-<a href=#251 id=251 data-nosnippet>251</a>        </span>precision: u32,
-<a href=#252 id=252 data-nosnippet>252</a>        <span class="doccomment">/// Scale
-<a href=#253 id=253 data-nosnippet>253</a>        </span>scale: u32,
-<a href=#254 id=254 data-nosnippet>254</a>    },
-<a href=#255 id=255 data-nosnippet>255</a>    <span class="doccomment">/// Calendar date without timezone or time.
-<a href=#256 id=256 data-nosnippet>256</a>    </span>Date,
-<a href=#257 id=257 data-nosnippet>257</a>    <span class="doccomment">/// Time of day in microsecond precision, without date or timezone.
-<a href=#258 id=258 data-nosnippet>258</a>    </span>Time,
-<a href=#259 id=259 data-nosnippet>259</a>    <span class="doccomment">/// Timestamp in microsecond precision, without timezone
-<a href=#260 id=260 data-nosnippet>260</a>    </span>Timestamp,
-<a href=#261 id=261 data-nosnippet>261</a>    <span class="doccomment">/// Timestamp in microsecond precision, with timezone
-<a href=#262 id=262 data-nosnippet>262</a>    </span>Timestamptz,
-<a href=#263 id=263 data-nosnippet>263</a>    <span class="doccomment">/// Timestamp in nanosecond precision, without timezone
-<a href=#264 id=264 data-nosnippet>264</a>    </span><span class="attr">#[serde(rename = <span class="string">"timestamp_ns"</span>)]
-<a href=#265 id=265 data-nosnippet>265</a>    </span>TimestampNs,
-<a href=#266 id=266 data-nosnippet>266</a>    <span class="doccomment">/// Timestamp in nanosecond precision with timezone
-<a href=#267 id=267 data-nosnippet>267</a>    </span><span class="attr">#[serde(rename = <span class="string">"timestamptz_ns"</span>)]
-<a href=#268 id=268 data-nosnippet>268</a>    </span>TimestamptzNs,
-<a href=#269 id=269 data-nosnippet>269</a>    <span class="doccomment">/// Arbitrary-length character sequences encoded in utf-8
-<a href=#270 id=270 data-nosnippet>270</a>    </span>String,
-<a href=#271 id=271 data-nosnippet>271</a>    <span class="doccomment">/// Universally Unique Identifiers, should use 16-byte fixed
-<a href=#272 id=272 data-nosnippet>272</a>    </span>Uuid,
-<a href=#273 id=273 data-nosnippet>273</a>    <span class="doccomment">/// Fixed length byte array
-<a href=#274 id=274 data-nosnippet>274</a>    </span>Fixed(u64),
-<a href=#275 id=275 data-nosnippet>275</a>    <span class="doccomment">/// Arbitrary-length byte array.
-<a href=#276 id=276 data-nosnippet>276</a>    </span>Binary,
-<a href=#277 id=277 data-nosnippet>277</a>}
-<a href=#278 id=278 data-nosnippet>278</a>
-<a href=#279 id=279 data-nosnippet>279</a><span class="kw">impl </span>PrimitiveType {
-<a href=#280 id=280 data-nosnippet>280</a>    <span class="doccomment">/// Check whether literal is compatible with the type.
-<a href=#281 id=281 data-nosnippet>281</a>    </span><span class="kw">pub fn </span>compatible(<span class="kw-2">&amp;</span><span class="self">self</span>, literal: <span class="kw-2">&amp;</span>PrimitiveLiteral) -&gt; bool {
-<a href=#282 id=282 data-nosnippet>282</a>        <span class="macro">matches!</span>(
-<a href=#283 id=283 data-nosnippet>283</a>            (<span class="self">self</span>, literal),
-<a href=#284 id=284 data-nosnippet>284</a>            (PrimitiveType::Boolean, PrimitiveLiteral::Boolean(<span class="kw">_</span>))
-<a href=#285 id=285 data-nosnippet>285</a>                | (PrimitiveType::Int, PrimitiveLiteral::Int(<span class="kw">_</span>))
-<a href=#286 id=286 data-nosnippet>286</a>                | (PrimitiveType::Long, PrimitiveLiteral::Long(<span class="kw">_</span>))
-<a href=#287 id=287 data-nosnippet>287</a>                | (PrimitiveType::Float, PrimitiveLiteral::Float(<span class="kw">_</span>))
-<a href=#288 id=288 data-nosnippet>288</a>                | (PrimitiveType::Double, PrimitiveLiteral::Double(<span class="kw">_</span>))
-<a href=#289 id=289 data-nosnippet>289</a>                | (PrimitiveType::Decimal { .. }, PrimitiveLiteral::Int128(<span class="kw">_</span>))
-<a href=#290 id=290 data-nosnippet>290</a>                | (PrimitiveType::Date, PrimitiveLiteral::Int(<span class="kw">_</span>))
-<a href=#291 id=291 data-nosnippet>291</a>                | (PrimitiveType::Time, PrimitiveLiteral::Long(<span class="kw">_</span>))
-<a href=#292 id=292 data-nosnippet>292</a>                | (PrimitiveType::Timestamp, PrimitiveLiteral::Long(<span class="kw">_</span>))
-<a href=#293 id=293 data-nosnippet>293</a>                | (PrimitiveType::Timestamptz, PrimitiveLiteral::Long(<span class="kw">_</span>))
-<a href=#294 id=294 data-nosnippet>294</a>                | (PrimitiveType::TimestampNs, PrimitiveLiteral::Long(<span class="kw">_</span>))
-<a href=#295 id=295 data-nosnippet>295</a>                | (PrimitiveType::TimestamptzNs, PrimitiveLiteral::Long(<span class="kw">_</span>))
-<a href=#296 id=296 data-nosnippet>296</a>                | (PrimitiveType::String, PrimitiveLiteral::String(<span class="kw">_</span>))
-<a href=#297 id=297 data-nosnippet>297</a>                | (PrimitiveType::Uuid, PrimitiveLiteral::UInt128(<span class="kw">_</span>))
-<a href=#298 id=298 data-nosnippet>298</a>                | (PrimitiveType::Fixed(<span class="kw">_</span>), PrimitiveLiteral::Binary(<span class="kw">_</span>))
-<a href=#299 id=299 data-nosnippet>299</a>                | (PrimitiveType::Binary, PrimitiveLiteral::Binary(<span class="kw">_</span>))
-<a href=#300 id=300 data-nosnippet>300</a>        )
-<a href=#301 id=301 data-nosnippet>301</a>    }
-<a href=#302 id=302 data-nosnippet>302</a>}
-<a href=#303 id=303 data-nosnippet>303</a>
-<a href=#304 id=304 data-nosnippet>304</a><span class="kw">impl </span>Serialize <span class="kw">for </span>Type {
-<a href=#305 id=305 data-nosnippet>305</a>    <span class="kw">fn </span>serialize&lt;S&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, serializer: S) -&gt; std::result::Result&lt;S::Ok, S::Error&gt;
-<a href=#306 id=306 data-nosnippet>306</a>    <span class="kw">where </span>S: Serializer {
-<a href=#307 id=307 data-nosnippet>307</a>        <span class="kw">let </span>type_serde = _serde::SerdeType::from(<span class="self">self</span>);
-<a href=#308 id=308 data-nosnippet>308</a>        type_serde.serialize(serializer)
-<a href=#309 id=309 data-nosnippet>309</a>    }
-<a href=#310 id=310 data-nosnippet>310</a>}
-<a href=#311 id=311 data-nosnippet>311</a>
-<a href=#312 id=312 data-nosnippet>312</a><span class="kw">impl</span>&lt;<span class="lifetime">'de</span>&gt; Deserialize&lt;<span class="lifetime">'de</span>&gt; <span class="kw">for </span>Type {
-<a href=#313 id=313 data-nosnippet>313</a>    <span class="kw">fn </span>deserialize&lt;D&gt;(deserializer: D) -&gt; std::result::Result&lt;<span class="self">Self</span>, D::Error&gt;
-<a href=#314 id=314 data-nosnippet>314</a>    <span class="kw">where </span>D: Deserializer&lt;<span class="lifetime">'de</span>&gt; {
-<a href=#315 id=315 data-nosnippet>315</a>        <span class="kw">let </span>type_serde = _serde::SerdeType::deserialize(deserializer)<span class="question-mark">?</span>;
-<a href=#316 id=316 data-nosnippet>316</a>        <span class="prelude-val">Ok</span>(Type::from(type_serde))
-<a href=#317 id=317 data-nosnippet>317</a>    }
-<a href=#318 id=318 data-nosnippet>318</a>}
-<a href=#319 id=319 data-nosnippet>319</a>
-<a href=#320 id=320 data-nosnippet>320</a><span class="kw">impl</span>&lt;<span class="lifetime">'de</span>&gt; Deserialize&lt;<span class="lifetime">'de</span>&gt; <span class="kw">for </span>PrimitiveType {
-<a href=#321 id=321 data-nosnippet>321</a>    <span class="kw">fn </span>deserialize&lt;D&gt;(deserializer: D) -&gt; std::result::Result&lt;<span class="self">Self</span>, D::Error&gt;
-<a href=#322 id=322 data-nosnippet>322</a>    <span class="kw">where </span>D: Deserializer&lt;<span class="lifetime">'de</span>&gt; {
-<a href=#323 id=323 data-nosnippet>323</a>        <span class="kw">let </span>s = String::deserialize(deserializer)<span class="question-mark">?</span>;
-<a href=#324 id=324 data-nosnippet>324</a>        <span class="kw">if </span>s.starts_with(<span class="string">"decimal"</span>) {
-<a href=#325 id=325 data-nosnippet>325</a>            deserialize_decimal(s.into_deserializer())
-<a href=#326 id=326 data-nosnippet>326</a>        } <span class="kw">else if </span>s.starts_with(<span class="string">"fixed"</span>) {
-<a href=#327 id=327 data-nosnippet>327</a>            deserialize_fixed(s.into_deserializer())
-<a href=#328 id=328 data-nosnippet>328</a>        } <span class="kw">else </span>{
-<a href=#329 id=329 data-nosnippet>329</a>            PrimitiveType::deserialize(s.into_deserializer())
-<a href=#330 id=330 data-nosnippet>330</a>        }
-<a href=#331 id=331 data-nosnippet>331</a>    }
-<a href=#332 id=332 data-nosnippet>332</a>}
-<a href=#333 id=333 data-nosnippet>333</a>
-<a href=#334 id=334 data-nosnippet>334</a><span class="kw">impl </span>Serialize <span class="kw">for </span>PrimitiveType {
-<a href=#335 id=335 data-nosnippet>335</a>    <span class="kw">fn </span>serialize&lt;S&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, serializer: S) -&gt; std::result::Result&lt;S::Ok, S::Error&gt;
-<a href=#336 id=336 data-nosnippet>336</a>    <span class="kw">where </span>S: Serializer {
-<a href=#337 id=337 data-nosnippet>337</a>        <span class="kw">match </span><span class="self">self </span>{
-<a href=#338 id=338 data-nosnippet>338</a>            PrimitiveType::Decimal { precision, scale } =&gt; {
-<a href=#339 id=339 data-nosnippet>339</a>                serialize_decimal(precision, scale, serializer)
-<a href=#340 id=340 data-nosnippet>340</a>            }
-<a href=#341 id=341 data-nosnippet>341</a>            PrimitiveType::Fixed(l) =&gt; serialize_fixed(l, serializer),
-<a href=#342 id=342 data-nosnippet>342</a>            <span class="kw">_ </span>=&gt; PrimitiveType::serialize(<span class="self">self</span>, serializer),
-<a href=#343 id=343 data-nosnippet>343</a>        }
-<a href=#344 id=344 data-nosnippet>344</a>    }
-<a href=#345 id=345 data-nosnippet>345</a>}
-<a href=#346 id=346 data-nosnippet>346</a>
-<a href=#347 id=347 data-nosnippet>347</a><span class="kw">fn </span>deserialize_decimal&lt;<span class="lifetime">'de</span>, D&gt;(deserializer: D) -&gt; std::result::Result&lt;PrimitiveType, D::Error&gt;
-<a href=#348 id=348 data-nosnippet>348</a><span class="kw">where </span>D: Deserializer&lt;<span class="lifetime">'de</span>&gt; {
-<a href=#349 id=349 data-nosnippet>349</a>    <span class="kw">let </span>s = String::deserialize(deserializer)<span class="question-mark">?</span>;
-<a href=#350 id=350 data-nosnippet>350</a>    <span class="kw">let </span>(precision, scale) = s
-<a href=#351 id=351 data-nosnippet>351</a>        .trim_start_matches(<span class="string">r"decimal("</span>)
-<a href=#352 id=352 data-nosnippet>352</a>        .trim_end_matches(<span class="string">')'</span>)
-<a href=#353 id=353 data-nosnippet>353</a>        .split_once(<span class="string">','</span>)
-<a href=#354 id=354 data-nosnippet>354</a>        .ok_or_else(|| D::Error::custom(<span class="string">"Decimal requires precision and scale: {s}"</span>))<span class="question-mark">?</span>;
-<a href=#355 id=355 data-nosnippet>355</a>
-<a href=#356 id=356 data-nosnippet>356</a>    <span class="prelude-val">Ok</span>(PrimitiveType::Decimal {
-<a href=#357 id=357 data-nosnippet>357</a>        precision: precision.trim().parse().map_err(D::Error::custom)<span class="question-mark">?</span>,
-<a href=#358 id=358 data-nosnippet>358</a>        scale: scale.trim().parse().map_err(D::Error::custom)<span class="question-mark">?</span>,
-<a href=#359 id=359 data-nosnippet>359</a>    })
-<a href=#360 id=360 data-nosnippet>360</a>}
-<a href=#361 id=361 data-nosnippet>361</a>
-<a href=#362 id=362 data-nosnippet>362</a><span class="kw">fn </span>serialize_decimal&lt;S&gt;(
-<a href=#363 id=363 data-nosnippet>363</a>    precision: <span class="kw-2">&amp;</span>u32,
-<a href=#364 id=364 data-nosnippet>364</a>    scale: <span class="kw-2">&amp;</span>u32,
-<a href=#365 id=365 data-nosnippet>365</a>    serializer: S,
-<a href=#366 id=366 data-nosnippet>366</a>) -&gt; std::result::Result&lt;S::Ok, S::Error&gt;
-<a href=#367 id=367 data-nosnippet>367</a><span class="kw">where
-<a href=#368 id=368 data-nosnippet>368</a>    </span>S: Serializer,
-<a href=#369 id=369 data-nosnippet>369</a>{
-<a href=#370 id=370 data-nosnippet>370</a>    serializer.serialize_str(<span class="kw-2">&amp;</span><span class="macro">format!</span>(<span class="string">"decimal({precision}, {scale})"</span>))
-<a href=#371 id=371 data-nosnippet>371</a>}
-<a href=#372 id=372 data-nosnippet>372</a>
-<a href=#373 id=373 data-nosnippet>373</a><span class="kw">fn </span>deserialize_fixed&lt;<span class="lifetime">'de</span>, D&gt;(deserializer: D) -&gt; std::result::Result&lt;PrimitiveType, D::Error&gt;
-<a href=#374 id=374 data-nosnippet>374</a><span class="kw">where </span>D: Deserializer&lt;<span class="lifetime">'de</span>&gt; {
-<a href=#375 id=375 data-nosnippet>375</a>    <span class="kw">let </span>fixed = String::deserialize(deserializer)<span class="question-mark">?
-<a href=#376 id=376 data-nosnippet>376</a>        </span>.trim_start_matches(<span class="string">r"fixed["</span>)
-<a href=#377 id=377 data-nosnippet>377</a>        .trim_end_matches(<span class="string">']'</span>)
-<a href=#378 id=378 data-nosnippet>378</a>        .to_owned();
-<a href=#379 id=379 data-nosnippet>379</a>
-<a href=#380 id=380 data-nosnippet>380</a>    fixed
-<a href=#381 id=381 data-nosnippet>381</a>        .parse()
-<a href=#382 id=382 data-nosnippet>382</a>        .map(PrimitiveType::Fixed)
-<a href=#383 id=383 data-nosnippet>383</a>        .map_err(D::Error::custom)
-<a href=#384 id=384 data-nosnippet>384</a>}
-<a href=#385 id=385 data-nosnippet>385</a>
-<a href=#386 id=386 data-nosnippet>386</a><span class="kw">fn </span>serialize_fixed&lt;S&gt;(value: <span class="kw-2">&amp;</span>u64, serializer: S) -&gt; std::result::Result&lt;S::Ok, S::Error&gt;
-<a href=#387 id=387 data-nosnippet>387</a><span class="kw">where </span>S: Serializer {
-<a href=#388 id=388 data-nosnippet>388</a>    serializer.serialize_str(<span class="kw-2">&amp;</span><span class="macro">format!</span>(<span class="string">"fixed[{value}]"</span>))
-<a href=#389 id=389 data-nosnippet>389</a>}
-<a href=#390 id=390 data-nosnippet>390</a>
-<a href=#391 id=391 data-nosnippet>391</a><span class="kw">impl </span>fmt::Display <span class="kw">for </span>PrimitiveType {
-<a href=#392 id=392 data-nosnippet>392</a>    <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter) -&gt; fmt::Result {
-<a href=#393 id=393 data-nosnippet>393</a>        <span class="kw">match </span><span class="self">self </span>{
-<a href=#394 id=394 data-nosnippet>394</a>            PrimitiveType::Boolean =&gt; <span class="macro">write!</span>(f, <span class="string">"boolean"</span>),
-<a href=#395 id=395 data-nosnippet>395</a>            PrimitiveType::Int =&gt; <span class="macro">write!</span>(f, <span class="string">"int"</span>),
-<a href=#396 id=396 data-nosnippet>396</a>            PrimitiveType::Long =&gt; <span class="macro">write!</span>(f, <span class="string">"long"</span>),
-<a href=#397 id=397 data-nosnippet>397</a>            PrimitiveType::Float =&gt; <span class="macro">write!</span>(f, <span class="string">"float"</span>),
-<a href=#398 id=398 data-nosnippet>398</a>            PrimitiveType::Double =&gt; <span class="macro">write!</span>(f, <span class="string">"double"</span>),
-<a href=#399 id=399 data-nosnippet>399</a>            PrimitiveType::Decimal { precision, scale } =&gt; {
-<a href=#400 id=400 data-nosnippet>400</a>                <span class="macro">write!</span>(f, <span class="string">"decimal({precision}, {scale})"</span>)
-<a href=#401 id=401 data-nosnippet>401</a>            }
-<a href=#402 id=402 data-nosnippet>402</a>            PrimitiveType::Date =&gt; <span class="macro">write!</span>(f, <span class="string">"date"</span>),
-<a href=#403 id=403 data-nosnippet>403</a>            PrimitiveType::Time =&gt; <span class="macro">write!</span>(f, <span class="string">"time"</span>),
-<a href=#404 id=404 data-nosnippet>404</a>            PrimitiveType::Timestamp =&gt; <span class="macro">write!</span>(f, <span class="string">"timestamp"</span>),
-<a href=#405 id=405 data-nosnippet>405</a>            PrimitiveType::Timestamptz =&gt; <span class="macro">write!</span>(f, <span class="string">"timestamptz"</span>),
-<a href=#406 id=406 data-nosnippet>406</a>            PrimitiveType::TimestampNs =&gt; <span class="macro">write!</span>(f, <span class="string">"timestamp_ns"</span>),
-<a href=#407 id=407 data-nosnippet>407</a>            PrimitiveType::TimestamptzNs =&gt; <span class="macro">write!</span>(f, <span class="string">"timestamptz_ns"</span>),
-<a href=#408 id=408 data-nosnippet>408</a>            PrimitiveType::String =&gt; <span class="macro">write!</span>(f, <span class="string">"string"</span>),
-<a href=#409 id=409 data-nosnippet>409</a>            PrimitiveType::Uuid =&gt; <span class="macro">write!</span>(f, <span class="string">"uuid"</span>),
-<a href=#410 id=410 data-nosnippet>410</a>            PrimitiveType::Fixed(size) =&gt; <span class="macro">write!</span>(f, <span class="string">"fixed({size})"</span>),
-<a href=#411 id=411 data-nosnippet>411</a>            PrimitiveType::Binary =&gt; <span class="macro">write!</span>(f, <span class="string">"binary"</span>),
-<a href=#412 id=412 data-nosnippet>412</a>        }
-<a href=#413 id=413 data-nosnippet>413</a>    }
-<a href=#414 id=414 data-nosnippet>414</a>}
-<a href=#415 id=415 data-nosnippet>415</a>
-<a href=#416 id=416 data-nosnippet>416</a><span class="doccomment">/// DataType for a specific struct
-<a href=#417 id=417 data-nosnippet>417</a></span><span class="attr">#[derive(Debug, Serialize, Clone, Default)]
-<a href=#418 id=418 data-nosnippet>418</a>#[serde(rename = <span class="string">"struct"</span>, tag = <span class="string">"type"</span>)]
-<a href=#419 id=419 data-nosnippet>419</a></span><span class="kw">pub struct </span>StructType {
-<a href=#420 id=420 data-nosnippet>420</a>    <span class="doccomment">/// Struct fields
-<a href=#421 id=421 data-nosnippet>421</a>    </span>fields: Vec&lt;NestedFieldRef&gt;,
-<a href=#422 id=422 data-nosnippet>422</a>    <span class="doccomment">/// Lookup for index by field id
-<a href=#423 id=423 data-nosnippet>423</a>    </span><span class="attr">#[serde(skip_serializing)]
-<a href=#424 id=424 data-nosnippet>424</a>    </span>id_lookup: OnceLock&lt;HashMap&lt;i32, usize&gt;&gt;,
-<a href=#425 id=425 data-nosnippet>425</a>    <span class="attr">#[serde(skip_serializing)]
-<a href=#426 id=426 data-nosnippet>426</a>    </span>name_lookup: OnceLock&lt;HashMap&lt;String, usize&gt;&gt;,
-<a href=#427 id=427 data-nosnippet>427</a>}
-<a href=#428 id=428 data-nosnippet>428</a>
-<a href=#429 id=429 data-nosnippet>429</a><span class="kw">impl</span>&lt;<span class="lifetime">'de</span>&gt; Deserialize&lt;<span class="lifetime">'de</span>&gt; <span class="kw">for </span>StructType {
-<a href=#430 id=430 data-nosnippet>430</a>    <span class="kw">fn </span>deserialize&lt;D&gt;(deserializer: D) -&gt; std::result::Result&lt;<span class="self">Self</span>, D::Error&gt;
-<a href=#431 id=431 data-nosnippet>431</a>    <span class="kw">where </span>D: Deserializer&lt;<span class="lifetime">'de</span>&gt; {
-<a href=#432 id=432 data-nosnippet>432</a>        <span class="attr">#[derive(Deserialize)]
-<a href=#433 id=433 data-nosnippet>433</a>        #[serde(field_identifier, rename_all = <span class="string">"lowercase"</span>)]
-<a href=#434 id=434 data-nosnippet>434</a>        </span><span class="kw">enum </span>Field {
-<a href=#435 id=435 data-nosnippet>435</a>            Type,
-<a href=#436 id=436 data-nosnippet>436</a>            Fields,
-<a href=#437 id=437 data-nosnippet>437</a>        }
-<a href=#438 id=438 data-nosnippet>438</a>
-<a href=#439 id=439 data-nosnippet>439</a>        <span class="kw">struct </span>StructTypeVisitor;
-<a href=#440 id=440 data-nosnippet>440</a>
-<a href=#441 id=441 data-nosnippet>441</a>        <span class="kw">impl</span>&lt;<span class="lifetime">'de</span>&gt; Visitor&lt;<span class="lifetime">'de</span>&gt; <span class="kw">for </span>StructTypeVisitor {
-<a href=#442 id=442 data-nosnippet>442</a>            <span class="kw">type </span>Value = StructType;
-<a href=#443 id=443 data-nosnippet>443</a>
-<a href=#444 id=444 data-nosnippet>444</a>            <span class="kw">fn </span>expecting(<span class="kw-2">&amp;</span><span class="self">self</span>, formatter: <span class="kw-2">&amp;mut </span>fmt::Formatter) -&gt; fmt::Result {
-<a href=#445 id=445 data-nosnippet>445</a>                formatter.write_str(<span class="string">"struct"</span>)
-<a href=#446 id=446 data-nosnippet>446</a>            }
-<a href=#447 id=447 data-nosnippet>447</a>
-<a href=#448 id=448 data-nosnippet>448</a>            <span class="kw">fn </span>visit_map&lt;V&gt;(<span class="self">self</span>, <span class="kw-2">mut </span>map: V) -&gt; std::result::Result&lt;StructType, V::Error&gt;
-<a href=#449 id=449 data-nosnippet>449</a>            <span class="kw">where </span>V: MapAccess&lt;<span class="lifetime">'de</span>&gt; {
-<a href=#450 id=450 data-nosnippet>450</a>                <span class="kw">let </span><span class="kw-2">mut </span>fields = <span class="prelude-val">None</span>;
-<a href=#451 id=451 data-nosnippet>451</a>                <span class="kw">while let </span><span class="prelude-val">Some</span>(key) = map.next_key()<span class="question-mark">? </span>{
-<a href=#452 id=452 data-nosnippet>452</a>                    <span class="kw">match </span>key {
-<a href=#453 id=453 data-nosnippet>453</a>                        Field::Type =&gt; {
-<a href=#454 id=454 data-nosnippet>454</a>                            <span class="kw">let </span>type_val: String = map.next_value()<span class="question-mark">?</span>;
-<a href=#455 id=455 data-nosnippet>455</a>                            <span class="kw">if </span>type_val != <span class="string">"struct" </span>{
-<a href=#456 id=456 data-nosnippet>456</a>                                <span class="kw">return </span><span class="prelude-val">Err</span>(Error::custom(<span class="macro">format!</span>(
-<a href=#457 id=457 data-nosnippet>457</a>                                    <span class="string">"expected type 'struct', got '{type_val}'"
-<a href=#458 id=458 data-nosnippet>458</a>                                </span>)));
-<a href=#459 id=459 data-nosnippet>459</a>                            }
-<a href=#460 id=460 data-nosnippet>460</a>                        }
-<a href=#461 id=461 data-nosnippet>461</a>                        Field::Fields =&gt; {
-<a href=#462 id=462 data-nosnippet>462</a>                            <span class="kw">if </span>fields.is_some() {
-<a href=#463 id=463 data-nosnippet>463</a>                                <span class="kw">return </span><span class="prelude-val">Err</span>(Error::duplicate_field(<span class="string">"fields"</span>));
-<a href=#464 id=464 data-nosnippet>464</a>                            }
-<a href=#465 id=465 data-nosnippet>465</a>                            fields = <span class="prelude-val">Some</span>(map.next_value()<span class="question-mark">?</span>);
-<a href=#466 id=466 data-nosnippet>466</a>                        }
-<a href=#467 id=467 data-nosnippet>467</a>                    }
-<a href=#468 id=468 data-nosnippet>468</a>                }
-<a href=#469 id=469 data-nosnippet>469</a>                <span class="kw">let </span>fields: Vec&lt;NestedFieldRef&gt; =
-<a href=#470 id=470 data-nosnippet>470</a>                    fields.ok_or_else(|| Error::missing_field(<span class="string">"fields"</span>))<span class="question-mark">?</span>;
-<a href=#471 id=471 data-nosnippet>471</a>
-<a href=#472 id=472 data-nosnippet>472</a>                <span class="prelude-val">Ok</span>(StructType::new(fields))
-<a href=#473 id=473 data-nosnippet>473</a>            }
-<a href=#474 id=474 data-nosnippet>474</a>        }
-<a href=#475 id=475 data-nosnippet>475</a>
-<a href=#476 id=476 data-nosnippet>476</a>        <span class="kw">const </span>FIELDS: <span class="kw-2">&amp;</span>[<span class="kw-2">&amp;</span>str] = <span class="kw-2">&amp;</span>[<span class="string">"type"</span>, <span class="string">"fields"</span>];
-<a href=#477 id=477 data-nosnippet>477</a>        deserializer.deserialize_struct(<span class="string">"struct"</span>, FIELDS, StructTypeVisitor)
-<a href=#478 id=478 data-nosnippet>478</a>    }
-<a href=#479 id=479 data-nosnippet>479</a>}
-<a href=#480 id=480 data-nosnippet>480</a>
-<a href=#481 id=481 data-nosnippet>481</a><span class="kw">impl </span>StructType {
-<a href=#482 id=482 data-nosnippet>482</a>    <span class="doccomment">/// Creates a struct type with the given fields.
-<a href=#483 id=483 data-nosnippet>483</a>    </span><span class="kw">pub fn </span>new(fields: Vec&lt;NestedFieldRef&gt;) -&gt; <span class="self">Self </span>{
-<a href=#484 id=484 data-nosnippet>484</a>        <span class="self">Self </span>{
-<a href=#485 id=485 data-nosnippet>485</a>            fields,
-<a href=#486 id=486 data-nosnippet>486</a>            id_lookup: OnceLock::new(),
-<a href=#487 id=487 data-nosnippet>487</a>            name_lookup: OnceLock::new(),
-<a href=#488 id=488 data-nosnippet>488</a>        }
-<a href=#489 id=489 data-nosnippet>489</a>    }
-<a href=#490 id=490 data-nosnippet>490</a>
-<a href=#491 id=491 data-nosnippet>491</a>    <span class="doccomment">/// Get struct field with certain id
-<a href=#492 id=492 data-nosnippet>492</a>    </span><span class="kw">pub fn </span>field_by_id(<span class="kw-2">&amp;</span><span class="self">self</span>, id: i32) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span>NestedFieldRef&gt; {
-<a href=#493 id=493 data-nosnippet>493</a>        <span class="self">self</span>.field_id_to_index(id).map(|idx| <span class="kw-2">&amp;</span><span class="self">self</span>.fields[idx])
-<a href=#494 id=494 data-nosnippet>494</a>    }
-<a href=#495 id=495 data-nosnippet>495</a>
-<a href=#496 id=496 data-nosnippet>496</a>    <span class="kw">fn </span>field_id_to_index(<span class="kw-2">&amp;</span><span class="self">self</span>, field_id: i32) -&gt; <span class="prelude-ty">Option</span>&lt;usize&gt; {
-<a href=#497 id=497 data-nosnippet>497</a>        <span class="self">self</span>.id_lookup
-<a href=#498 id=498 data-nosnippet>498</a>            .get_or_init(|| {
-<a href=#499 id=499 data-nosnippet>499</a>                HashMap::from_iter(<span class="self">self</span>.fields.iter().enumerate().map(|(i, x)| (x.id, i)))
-<a href=#500 id=500 data-nosnippet>500</a>            })
-<a href=#501 id=501 data-nosnippet>501</a>            .get(<span class="kw-2">&amp;</span>field_id)
-<a href=#502 id=502 data-nosnippet>502</a>            .copied()
-<a href=#503 id=503 data-nosnippet>503</a>    }
-<a href=#504 id=504 data-nosnippet>504</a>
-<a href=#505 id=505 data-nosnippet>505</a>    <span class="doccomment">/// Get struct field with certain field name
-<a href=#506 id=506 data-nosnippet>506</a>    </span><span class="kw">pub fn </span>field_by_name(<span class="kw-2">&amp;</span><span class="self">self</span>, name: <span class="kw-2">&amp;</span>str) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span>NestedFieldRef&gt; {
-<a href=#507 id=507 data-nosnippet>507</a>        <span class="self">self</span>.field_name_to_index(name).map(|idx| <span class="kw-2">&amp;</span><span class="self">self</span>.fields[idx])
-<a href=#508 id=508 data-nosnippet>508</a>    }
-<a href=#509 id=509 data-nosnippet>509</a>
-<a href=#510 id=510 data-nosnippet>510</a>    <span class="kw">fn </span>field_name_to_index(<span class="kw-2">&amp;</span><span class="self">self</span>, name: <span class="kw-2">&amp;</span>str) -&gt; <span class="prelude-ty">Option</span>&lt;usize&gt; {
-<a href=#511 id=511 data-nosnippet>511</a>        <span class="self">self</span>.name_lookup
-<a href=#512 id=512 data-nosnippet>512</a>            .get_or_init(|| {
-<a href=#513 id=513 data-nosnippet>513</a>                HashMap::from_iter(
-<a href=#514 id=514 data-nosnippet>514</a>                    <span class="self">self</span>.fields
-<a href=#515 id=515 data-nosnippet>515</a>                        .iter()
-<a href=#516 id=516 data-nosnippet>516</a>                        .enumerate()
-<a href=#517 id=517 data-nosnippet>517</a>                        .map(|(i, x)| (x.name.clone(), i)),
-<a href=#518 id=518 data-nosnippet>518</a>                )
-<a href=#519 id=519 data-nosnippet>519</a>            })
-<a href=#520 id=520 data-nosnippet>520</a>            .get(name)
-<a href=#521 id=521 data-nosnippet>521</a>            .copied()
-<a href=#522 id=522 data-nosnippet>522</a>    }
-<a href=#523 id=523 data-nosnippet>523</a>
-<a href=#524 id=524 data-nosnippet>524</a>    <span class="doccomment">/// Get fields.
-<a href=#525 id=525 data-nosnippet>525</a>    </span><span class="kw">pub fn </span>fields(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[NestedFieldRef] {
-<a href=#526 id=526 data-nosnippet>526</a>        <span class="kw-2">&amp;</span><span class="self">self</span>.fields
-<a href=#527 id=527 data-nosnippet>527</a>    }
-<a href=#528 id=528 data-nosnippet>528</a>}
-<a href=#529 id=529 data-nosnippet>529</a>
-<a href=#530 id=530 data-nosnippet>530</a><span class="kw">impl </span>PartialEq <span class="kw">for </span>StructType {
-<a href=#531 id=531 data-nosnippet>531</a>    <span class="kw">fn </span>eq(<span class="kw-2">&amp;</span><span class="self">self</span>, other: <span class="kw-2">&amp;</span><span class="self">Self</span>) -&gt; bool {
-<a href=#532 id=532 data-nosnippet>532</a>        <span class="self">self</span>.fields == other.fields
-<a href=#533 id=533 data-nosnippet>533</a>    }
-<a href=#534 id=534 data-nosnippet>534</a>}
-<a href=#535 id=535 data-nosnippet>535</a>
-<a href=#536 id=536 data-nosnippet>536</a><span class="kw">impl </span>Eq <span class="kw">for </span>StructType {}
-<a href=#537 id=537 data-nosnippet>537</a>
-<a href=#538 id=538 data-nosnippet>538</a><span class="kw">impl </span>Index&lt;usize&gt; <span class="kw">for </span>StructType {
-<a href=#539 id=539 data-nosnippet>539</a>    <span class="kw">type </span>Output = NestedField;
-<a href=#540 id=540 data-nosnippet>540</a>
-<a href=#541 id=541 data-nosnippet>541</a>    <span class="kw">fn </span>index(<span class="kw-2">&amp;</span><span class="self">self</span>, index: usize) -&gt; <span class="kw-2">&amp;</span><span class="self">Self</span>::Output {
-<a href=#542 id=542 data-nosnippet>542</a>        <span class="kw-2">&amp;</span><span class="self">self</span>.fields[index]
-<a href=#543 id=543 data-nosnippet>543</a>    }
-<a href=#544 id=544 data-nosnippet>544</a>}
-<a href=#545 id=545 data-nosnippet>545</a>
-<a href=#546 id=546 data-nosnippet>546</a><span class="kw">impl </span>fmt::Display <span class="kw">for </span>StructType {
-<a href=#547 id=547 data-nosnippet>547</a>    <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter) -&gt; fmt::Result {
-<a href=#548 id=548 data-nosnippet>548</a>        <span class="macro">write!</span>(f, <span class="string">"struct&lt;"</span>)<span class="question-mark">?</span>;
-<a href=#549 id=549 data-nosnippet>549</a>        <span class="kw">for </span>field <span class="kw">in </span><span class="kw-2">&amp;</span><span class="self">self</span>.fields {
-<a href=#550 id=550 data-nosnippet>550</a>            <span class="macro">write!</span>(f, <span class="string">"{}"</span>, field.field_type)<span class="question-mark">?</span>;
-<a href=#551 id=551 data-nosnippet>551</a>        }
-<a href=#552 id=552 data-nosnippet>552</a>        <span class="macro">write!</span>(f, <span class="string">"&gt;"</span>)
-<a href=#553 id=553 data-nosnippet>553</a>    }
-<a href=#554 id=554 data-nosnippet>554</a>}
-<a href=#555 id=555 data-nosnippet>555</a>
-<a href=#556 id=556 data-nosnippet>556</a><span class="attr">#[derive(Debug, PartialEq, Serialize, Deserialize, Eq, Clone)]
-<a href=#557 id=557 data-nosnippet>557</a>#[serde(from = <span class="string">"SerdeNestedField"</span>, into = <span class="string">"SerdeNestedField"</span>)]
-<a href=#558 id=558 data-nosnippet>558</a></span><span class="doccomment">/// A struct is a tuple of typed values. Each field in the tuple is named and has an integer id that is unique in the table schema.
-<a href=#559 id=559 data-nosnippet>559</a>/// Each field can be either optional or required, meaning that values can (or cannot) be null. Fields may be any type.
-<a href=#560 id=560 data-nosnippet>560</a>/// Fields may have an optional comment or doc string. Fields can have default values.
-<a href=#561 id=561 data-nosnippet>561</a></span><span class="kw">pub struct </span>NestedField {
-<a href=#562 id=562 data-nosnippet>562</a>    <span class="doccomment">/// Id unique in table schema
-<a href=#563 id=563 data-nosnippet>563</a>    </span><span class="kw">pub </span>id: i32,
-<a href=#564 id=564 data-nosnippet>564</a>    <span class="doccomment">/// Field Name
-<a href=#565 id=565 data-nosnippet>565</a>    </span><span class="kw">pub </span>name: String,
-<a href=#566 id=566 data-nosnippet>566</a>    <span class="doccomment">/// Optional or required
-<a href=#567 id=567 data-nosnippet>567</a>    </span><span class="kw">pub </span>required: bool,
-<a href=#568 id=568 data-nosnippet>568</a>    <span class="doccomment">/// Datatype
-<a href=#569 id=569 data-nosnippet>569</a>    </span><span class="kw">pub </span>field_type: Box&lt;Type&gt;,
-<a href=#570 id=570 data-nosnippet>570</a>    <span class="doccomment">/// Fields may have an optional comment or doc string.
-<a href=#571 id=571 data-nosnippet>571</a>    </span><span class="kw">pub </span>doc: <span class="prelude-ty">Option</span>&lt;String&gt;,
-<a href=#572 id=572 data-nosnippet>572</a>    <span class="doccomment">/// Used to populate the field’s value for all records that were written before the field was added to the schema
-<a href=#573 id=573 data-nosnippet>573</a>    </span><span class="kw">pub </span>initial_default: <span class="prelude-ty">Option</span>&lt;Literal&gt;,
-<a href=#574 id=574 data-nosnippet>574</a>    <span class="doccomment">/// Used to populate the field’s value for any records written after the field was added to the schema, if the writer does not supply the field’s value
-<a href=#575 id=575 data-nosnippet>575</a>    </span><span class="kw">pub </span>write_default: <span class="prelude-ty">Option</span>&lt;Literal&gt;,
-<a href=#576 id=576 data-nosnippet>576</a>}
-<a href=#577 id=577 data-nosnippet>577</a>
-<a href=#578 id=578 data-nosnippet>578</a><span class="attr">#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
-<a href=#579 id=579 data-nosnippet>579</a>#[serde(rename_all = <span class="string">"kebab-case"</span>)]
-<a href=#580 id=580 data-nosnippet>580</a></span><span class="kw">struct </span>SerdeNestedField {
-<a href=#581 id=581 data-nosnippet>581</a>    <span class="kw">pub </span>id: i32,
-<a href=#582 id=582 data-nosnippet>582</a>    <span class="kw">pub </span>name: String,
-<a href=#583 id=583 data-nosnippet>583</a>    <span class="kw">pub </span>required: bool,
-<a href=#584 id=584 data-nosnippet>584</a>    <span class="attr">#[serde(rename = <span class="string">"type"</span>)]
-<a href=#585 id=585 data-nosnippet>585</a>    </span><span class="kw">pub </span>field_type: Box&lt;Type&gt;,
-<a href=#586 id=586 data-nosnippet>586</a>    <span class="attr">#[serde(skip_serializing_if = <span class="string">"Option::is_none"</span>)]
-<a href=#587 id=587 data-nosnippet>587</a>    </span><span class="kw">pub </span>doc: <span class="prelude-ty">Option</span>&lt;String&gt;,
-<a href=#588 id=588 data-nosnippet>588</a>    <span class="attr">#[serde(skip_serializing_if = <span class="string">"Option::is_none"</span>)]
-<a href=#589 id=589 data-nosnippet>589</a>    </span><span class="kw">pub </span>initial_default: <span class="prelude-ty">Option</span>&lt;JsonValue&gt;,
-<a href=#590 id=590 data-nosnippet>590</a>    <span class="attr">#[serde(skip_serializing_if = <span class="string">"Option::is_none"</span>)]
-<a href=#591 id=591 data-nosnippet>591</a>    </span><span class="kw">pub </span>write_default: <span class="prelude-ty">Option</span>&lt;JsonValue&gt;,
-<a href=#592 id=592 data-nosnippet>592</a>}
-<a href=#593 id=593 data-nosnippet>593</a>
-<a href=#594 id=594 data-nosnippet>594</a><span class="kw">impl </span>From&lt;SerdeNestedField&gt; <span class="kw">for </span>NestedField {
-<a href=#595 id=595 data-nosnippet>595</a>    <span class="kw">fn </span>from(value: SerdeNestedField) -&gt; <span class="self">Self </span>{
-<a href=#596 id=596 data-nosnippet>596</a>        NestedField {
-<a href=#597 id=597 data-nosnippet>597</a>            id: value.id,
-<a href=#598 id=598 data-nosnippet>598</a>            name: value.name,
-<a href=#599 id=599 data-nosnippet>599</a>            required: value.required,
-<a href=#600 id=600 data-nosnippet>600</a>            initial_default: value.initial_default.and_then(|x| {
-<a href=#601 id=601 data-nosnippet>601</a>                Literal::try_from_json(x, <span class="kw-2">&amp;</span>value.field_type)
-<a href=#602 id=602 data-nosnippet>602</a>                    .ok()
-<a href=#603 id=603 data-nosnippet>603</a>                    .and_then(identity)
-<a href=#604 id=604 data-nosnippet>604</a>            }),
-<a href=#605 id=605 data-nosnippet>605</a>            write_default: value.write_default.and_then(|x| {
-<a href=#606 id=606 data-nosnippet>606</a>                Literal::try_from_json(x, <span class="kw-2">&amp;</span>value.field_type)
-<a href=#607 id=607 data-nosnippet>607</a>                    .ok()
-<a href=#608 id=608 data-nosnippet>608</a>                    .and_then(identity)
-<a href=#609 id=609 data-nosnippet>609</a>            }),
-<a href=#610 id=610 data-nosnippet>610</a>            field_type: value.field_type,
-<a href=#611 id=611 data-nosnippet>611</a>            doc: value.doc,
-<a href=#612 id=612 data-nosnippet>612</a>        }
-<a href=#613 id=613 data-nosnippet>613</a>    }
-<a href=#614 id=614 data-nosnippet>614</a>}
-<a href=#615 id=615 data-nosnippet>615</a>
-<a href=#616 id=616 data-nosnippet>616</a><span class="kw">impl </span>From&lt;NestedField&gt; <span class="kw">for </span>SerdeNestedField {
-<a href=#617 id=617 data-nosnippet>617</a>    <span class="kw">fn </span>from(value: NestedField) -&gt; <span class="self">Self </span>{
-<a href=#618 id=618 data-nosnippet>618</a>        <span class="kw">let </span>initial_default = value.initial_default.map(|x| x.try_into_json(<span class="kw-2">&amp;</span>value.field_type).expect(<span class="string">"We should have checked this in NestedField::with_initial_default, it can't be converted to json value"</span>));
-<a href=#619 id=619 data-nosnippet>619</a>        <span class="kw">let </span>write_default = value.write_default.map(|x| x.try_into_json(<span class="kw-2">&amp;</span>value.field_type).expect(<span class="string">"We should have checked this in NestedField::with_write_default, it can't be converted to json value"</span>));
-<a href=#620 id=620 data-nosnippet>620</a>        SerdeNestedField {
-<a href=#621 id=621 data-nosnippet>621</a>            id: value.id,
-<a href=#622 id=622 data-nosnippet>622</a>            name: value.name,
-<a href=#623 id=623 data-nosnippet>623</a>            required: value.required,
-<a href=#624 id=624 data-nosnippet>624</a>            field_type: value.field_type,
-<a href=#625 id=625 data-nosnippet>625</a>            doc: value.doc,
-<a href=#626 id=626 data-nosnippet>626</a>            initial_default,
-<a href=#627 id=627 data-nosnippet>627</a>            write_default,
-<a href=#628 id=628 data-nosnippet>628</a>        }
-<a href=#629 id=629 data-nosnippet>629</a>    }
-<a href=#630 id=630 data-nosnippet>630</a>}
-<a href=#631 id=631 data-nosnippet>631</a>
-<a href=#632 id=632 data-nosnippet>632</a><span class="doccomment">/// Reference to nested field.
-<a href=#633 id=633 data-nosnippet>633</a></span><span class="kw">pub type </span>NestedFieldRef = Arc&lt;NestedField&gt;;
-<a href=#634 id=634 data-nosnippet>634</a>
-<a href=#635 id=635 data-nosnippet>635</a><span class="kw">impl </span>NestedField {
-<a href=#636 id=636 data-nosnippet>636</a>    <span class="doccomment">/// Construct a new field.
-<a href=#637 id=637 data-nosnippet>637</a>    </span><span class="kw">pub fn </span>new(id: i32, name: <span class="kw">impl </span>ToString, field_type: Type, required: bool) -&gt; <span class="self">Self </span>{
-<a href=#638 id=638 data-nosnippet>638</a>        <span class="self">Self </span>{
-<a href=#639 id=639 data-nosnippet>639</a>            id,
-<a href=#640 id=640 data-nosnippet>640</a>            name: name.to_string(),
-<a href=#641 id=641 data-nosnippet>641</a>            required,
-<a href=#642 id=642 data-nosnippet>642</a>            field_type: Box::new(field_type),
-<a href=#643 id=643 data-nosnippet>643</a>            doc: <span class="prelude-val">None</span>,
-<a href=#644 id=644 data-nosnippet>644</a>            initial_default: <span class="prelude-val">None</span>,
-<a href=#645 id=645 data-nosnippet>645</a>            write_default: <span class="prelude-val">None</span>,
-<a href=#646 id=646 data-nosnippet>646</a>        }
-<a href=#647 id=647 data-nosnippet>647</a>    }
-<a href=#648 id=648 data-nosnippet>648</a>
-<a href=#649 id=649 data-nosnippet>649</a>    <span class="doccomment">/// Construct a required field.
-<a href=#650 id=650 data-nosnippet>650</a>    </span><span class="kw">pub fn </span>required(id: i32, name: <span class="kw">impl </span>ToString, field_type: Type) -&gt; <span class="self">Self </span>{
-<a href=#651 id=651 data-nosnippet>651</a>        <span class="self">Self</span>::new(id, name, field_type, <span class="bool-val">true</span>)
-<a href=#652 id=652 data-nosnippet>652</a>    }
-<a href=#653 id=653 data-nosnippet>653</a>
-<a href=#654 id=654 data-nosnippet>654</a>    <span class="doccomment">/// Construct an optional field.
-<a href=#655 id=655 data-nosnippet>655</a>    </span><span class="kw">pub fn </span>optional(id: i32, name: <span class="kw">impl </span>ToString, field_type: Type) -&gt; <span class="self">Self </span>{
-<a href=#656 id=656 data-nosnippet>656</a>        <span class="self">Self</span>::new(id, name, field_type, <span class="bool-val">false</span>)
-<a href=#657 id=657 data-nosnippet>657</a>    }
-<a href=#658 id=658 data-nosnippet>658</a>
-<a href=#659 id=659 data-nosnippet>659</a>    <span class="doccomment">/// Construct list type's element field.
-<a href=#660 id=660 data-nosnippet>660</a>    </span><span class="kw">pub fn </span>list_element(id: i32, field_type: Type, required: bool) -&gt; <span class="self">Self </span>{
-<a href=#661 id=661 data-nosnippet>661</a>        <span class="self">Self</span>::new(id, LIST_FIELD_NAME, field_type, required)
-<a href=#662 id=662 data-nosnippet>662</a>    }
-<a href=#663 id=663 data-nosnippet>663</a>
-<a href=#664 id=664 data-nosnippet>664</a>    <span class="doccomment">/// Construct map type's key field.
-<a href=#665 id=665 data-nosnippet>665</a>    </span><span class="kw">pub fn </span>map_key_element(id: i32, field_type: Type) -&gt; <span class="self">Self </span>{
-<a href=#666 id=666 data-nosnippet>666</a>        <span class="self">Self</span>::required(id, MAP_KEY_FIELD_NAME, field_type)
-<a href=#667 id=667 data-nosnippet>667</a>    }
-<a href=#668 id=668 data-nosnippet>668</a>
-<a href=#669 id=669 data-nosnippet>669</a>    <span class="doccomment">/// Construct map type's value field.
-<a href=#670 id=670 data-nosnippet>670</a>    </span><span class="kw">pub fn </span>map_value_element(id: i32, field_type: Type, required: bool) -&gt; <span class="self">Self </span>{
-<a href=#671 id=671 data-nosnippet>671</a>        <span class="self">Self</span>::new(id, MAP_VALUE_FIELD_NAME, field_type, required)
-<a href=#672 id=672 data-nosnippet>672</a>    }
-<a href=#673 id=673 data-nosnippet>673</a>
-<a href=#674 id=674 data-nosnippet>674</a>    <span class="doccomment">/// Set the field's doc.
-<a href=#675 id=675 data-nosnippet>675</a>    </span><span class="kw">pub fn </span>with_doc(<span class="kw-2">mut </span><span class="self">self</span>, doc: <span class="kw">impl </span>ToString) -&gt; <span class="self">Self </span>{
-<a href=#676 id=676 data-nosnippet>676</a>        <span class="self">self</span>.doc = <span class="prelude-val">Some</span>(doc.to_string());
-<a href=#677 id=677 data-nosnippet>677</a>        <span class="self">self
-<a href=#678 id=678 data-nosnippet>678</a>    </span>}
-<a href=#679 id=679 data-nosnippet>679</a>
-<a href=#680 id=680 data-nosnippet>680</a>    <span class="doccomment">/// Set the field's initial default value.
-<a href=#681 id=681 data-nosnippet>681</a>    </span><span class="kw">pub fn </span>with_initial_default(<span class="kw-2">mut </span><span class="self">self</span>, value: Literal) -&gt; <span class="self">Self </span>{
-<a href=#682 id=682 data-nosnippet>682</a>        <span class="self">self</span>.initial_default = <span class="prelude-val">Some</span>(value);
-<a href=#683 id=683 data-nosnippet>683</a>        <span class="self">self
-<a href=#684 id=684 data-nosnippet>684</a>    </span>}
-<a href=#685 id=685 data-nosnippet>685</a>
-<a href=#686 id=686 data-nosnippet>686</a>    <span class="doccomment">/// Set the field's initial default value.
-<a href=#687 id=687 data-nosnippet>687</a>    </span><span class="kw">pub fn </span>with_write_default(<span class="kw-2">mut </span><span class="self">self</span>, value: Literal) -&gt; <span class="self">Self </span>{
-<a href=#688 id=688 data-nosnippet>688</a>        <span class="self">self</span>.write_default = <span class="prelude-val">Some</span>(value);
-<a href=#689 id=689 data-nosnippet>689</a>        <span class="self">self
-<a href=#690 id=690 data-nosnippet>690</a>    </span>}
-<a href=#691 id=691 data-nosnippet>691</a>
-<a href=#692 id=692 data-nosnippet>692</a>    <span class="doccomment">/// Set the id of the field.
-<a href=#693 id=693 data-nosnippet>693</a>    </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>with_id(<span class="kw-2">mut </span><span class="self">self</span>, id: i32) -&gt; <span class="self">Self </span>{
-<a href=#694 id=694 data-nosnippet>694</a>        <span class="self">self</span>.id = id;
-<a href=#695 id=695 data-nosnippet>695</a>        <span class="self">self
-<a href=#696 id=696 data-nosnippet>696</a>    </span>}
-<a href=#697 id=697 data-nosnippet>697</a>}
-<a href=#698 id=698 data-nosnippet>698</a>
-<a href=#699 id=699 data-nosnippet>699</a><span class="kw">impl </span>fmt::Display <span class="kw">for </span>NestedField {
-<a href=#700 id=700 data-nosnippet>700</a>    <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter) -&gt; fmt::Result {
-<a href=#701 id=701 data-nosnippet>701</a>        <span class="macro">write!</span>(f, <span class="string">"{}: "</span>, <span class="self">self</span>.id)<span class="question-mark">?</span>;
-<a href=#702 id=702 data-nosnippet>702</a>        <span class="macro">write!</span>(f, <span class="string">"{}: "</span>, <span class="self">self</span>.name)<span class="question-mark">?</span>;
-<a href=#703 id=703 data-nosnippet>703</a>        <span class="kw">if </span><span class="self">self</span>.required {
-<a href=#704 id=704 data-nosnippet>704</a>            <span class="macro">write!</span>(f, <span class="string">"required "</span>)<span class="question-mark">?</span>;
-<a href=#705 id=705 data-nosnippet>705</a>        } <span class="kw">else </span>{
-<a href=#706 id=706 data-nosnippet>706</a>            <span class="macro">write!</span>(f, <span class="string">"optional "</span>)<span class="question-mark">?</span>;
-<a href=#707 id=707 data-nosnippet>707</a>        }
-<a href=#708 id=708 data-nosnippet>708</a>        <span class="macro">write!</span>(f, <span class="string">"{} "</span>, <span class="self">self</span>.field_type)<span class="question-mark">?</span>;
-<a href=#709 id=709 data-nosnippet>709</a>        <span class="kw">if let </span><span class="prelude-val">Some</span>(doc) = <span class="kw-2">&amp;</span><span class="self">self</span>.doc {
-<a href=#710 id=710 data-nosnippet>710</a>            <span class="macro">write!</span>(f, <span class="string">"{doc}"</span>)<span class="question-mark">?</span>;
+<a href=#22 id=22 data-nosnippet>22</a><span class="kw">use </span>std::fmt;
+<a href=#23 id=23 data-nosnippet>23</a><span class="kw">use </span>std::ops::Index;
+<a href=#24 id=24 data-nosnippet>24</a><span class="kw">use </span>std::sync::{Arc, OnceLock};
+<a href=#25 id=25 data-nosnippet>25</a>
+<a href=#26 id=26 data-nosnippet>26</a><span class="kw">use </span>::serde::de::{MapAccess, Visitor};
+<a href=#27 id=27 data-nosnippet>27</a><span class="kw">use </span>serde::de::{Error, IntoDeserializer};
+<a href=#28 id=28 data-nosnippet>28</a><span class="kw">use </span>serde::{Deserialize, Deserializer, Serialize, Serializer};
+<a href=#29 id=29 data-nosnippet>29</a><span class="kw">use </span>serde_json::Value <span class="kw">as </span>JsonValue;
+<a href=#30 id=30 data-nosnippet>30</a>
+<a href=#31 id=31 data-nosnippet>31</a><span class="kw">use </span><span class="kw">super</span>::values::Literal;
+<a href=#32 id=32 data-nosnippet>32</a><span class="kw">use </span><span class="kw">crate</span>::ensure_data_valid;
+<a href=#33 id=33 data-nosnippet>33</a><span class="kw">use </span><span class="kw">crate</span>::error::Result;
+<a href=#34 id=34 data-nosnippet>34</a><span class="kw">use </span><span class="kw">crate</span>::spec::datatypes::_decimal::{MAX_PRECISION, REQUIRED_LENGTH};
+<a href=#35 id=35 data-nosnippet>35</a><span class="kw">use </span><span class="kw">crate</span>::spec::{FormatVersion, PrimitiveLiteral};
+<a href=#36 id=36 data-nosnippet>36</a>
+<a href=#37 id=37 data-nosnippet>37</a><span class="doccomment">/// Field name for list type.
+<a href=#38 id=38 data-nosnippet>38</a></span><span class="kw">pub const </span>LIST_FIELD_NAME: <span class="kw-2">&amp;</span>str = <span class="string">"element"</span>;
+<a href=#39 id=39 data-nosnippet>39</a><span class="doccomment">/// Field name for map type's key.
+<a href=#40 id=40 data-nosnippet>40</a></span><span class="kw">pub const </span>MAP_KEY_FIELD_NAME: <span class="kw-2">&amp;</span>str = <span class="string">"key"</span>;
+<a href=#41 id=41 data-nosnippet>41</a><span class="doccomment">/// Field name for map type's value.
+<a href=#42 id=42 data-nosnippet>42</a></span><span class="kw">pub const </span>MAP_VALUE_FIELD_NAME: <span class="kw-2">&amp;</span>str = <span class="string">"value"</span>;
+<a href=#43 id=43 data-nosnippet>43</a>
+<a href=#44 id=44 data-nosnippet>44</a><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">const </span>MAX_DECIMAL_BYTES: u32 = <span class="number">24</span>;
+<a href=#45 id=45 data-nosnippet>45</a><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">const </span>MAX_DECIMAL_PRECISION: u32 = <span class="number">38</span>;
+<a href=#46 id=46 data-nosnippet>46</a>
+<a href=#47 id=47 data-nosnippet>47</a><span class="kw">mod </span>_decimal {
+<a href=#48 id=48 data-nosnippet>48</a>    <span class="kw">use </span>once_cell::sync::Lazy;
+<a href=#49 id=49 data-nosnippet>49</a>
+<a href=#50 id=50 data-nosnippet>50</a>    <span class="kw">use </span><span class="kw">crate</span>::spec::{MAX_DECIMAL_BYTES, MAX_DECIMAL_PRECISION};
+<a href=#51 id=51 data-nosnippet>51</a>
+<a href=#52 id=52 data-nosnippet>52</a>    <span class="comment">// Max precision of bytes, starts from 1
+<a href=#53 id=53 data-nosnippet>53</a>    </span><span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">static </span>MAX_PRECISION: Lazy&lt;[u32; MAX_DECIMAL_BYTES <span class="kw">as </span>usize]&gt; = Lazy::new(|| {
+<a href=#54 id=54 data-nosnippet>54</a>        <span class="kw">let </span><span class="kw-2">mut </span>ret: [u32; <span class="number">24</span>] = [<span class="number">0</span>; <span class="number">24</span>];
+<a href=#55 id=55 data-nosnippet>55</a>        <span class="kw">for </span>(i, prec) <span class="kw">in </span>ret.iter_mut().enumerate() {
+<a href=#56 id=56 data-nosnippet>56</a>            <span class="kw-2">*</span>prec = <span class="number">2f64</span>.powi((<span class="number">8 </span>* (i + <span class="number">1</span>) - <span class="number">1</span>) <span class="kw">as </span>i32).log10().floor() <span class="kw">as </span>u32;
+<a href=#57 id=57 data-nosnippet>57</a>        }
+<a href=#58 id=58 data-nosnippet>58</a>
+<a href=#59 id=59 data-nosnippet>59</a>        ret
+<a href=#60 id=60 data-nosnippet>60</a>    });
+<a href=#61 id=61 data-nosnippet>61</a>
+<a href=#62 id=62 data-nosnippet>62</a>    <span class="comment">//  Required bytes of precision, starts from 1
+<a href=#63 id=63 data-nosnippet>63</a>    </span><span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">static </span>REQUIRED_LENGTH: Lazy&lt;[u32; MAX_DECIMAL_PRECISION <span class="kw">as </span>usize]&gt; =
+<a href=#64 id=64 data-nosnippet>64</a>        Lazy::new(|| {
+<a href=#65 id=65 data-nosnippet>65</a>            <span class="kw">let </span><span class="kw-2">mut </span>ret: [u32; MAX_DECIMAL_PRECISION <span class="kw">as </span>usize] =
+<a href=#66 id=66 data-nosnippet>66</a>                [<span class="number">0</span>; MAX_DECIMAL_PRECISION <span class="kw">as </span>usize];
+<a href=#67 id=67 data-nosnippet>67</a>
+<a href=#68 id=68 data-nosnippet>68</a>            <span class="kw">for </span>(i, required_len) <span class="kw">in </span>ret.iter_mut().enumerate() {
+<a href=#69 id=69 data-nosnippet>69</a>                <span class="kw">for </span>j <span class="kw">in </span><span class="number">0</span>..MAX_PRECISION.len() {
+<a href=#70 id=70 data-nosnippet>70</a>                    <span class="kw">if </span>MAX_PRECISION[j] &gt;= ((i + <span class="number">1</span>) <span class="kw">as </span>u32) {
+<a href=#71 id=71 data-nosnippet>71</a>                        <span class="kw-2">*</span>required_len = (j + <span class="number">1</span>) <span class="kw">as </span>u32;
+<a href=#72 id=72 data-nosnippet>72</a>                        <span class="kw">break</span>;
+<a href=#73 id=73 data-nosnippet>73</a>                    }
+<a href=#74 id=74 data-nosnippet>74</a>                }
+<a href=#75 id=75 data-nosnippet>75</a>            }
+<a href=#76 id=76 data-nosnippet>76</a>
+<a href=#77 id=77 data-nosnippet>77</a>            ret
+<a href=#78 id=78 data-nosnippet>78</a>        });
+<a href=#79 id=79 data-nosnippet>79</a>}
+<a href=#80 id=80 data-nosnippet>80</a>
+<a href=#81 id=81 data-nosnippet>81</a><span class="attr">#[derive(Debug, PartialEq, Eq, Clone)]
+<a href=#82 id=82 data-nosnippet>82</a></span><span class="doccomment">/// All data types are either primitives or nested types, which are maps, lists, or structs.
+<a href=#83 id=83 data-nosnippet>83</a></span><span class="kw">pub enum </span>Type {
+<a href=#84 id=84 data-nosnippet>84</a>    <span class="doccomment">/// Primitive types
+<a href=#85 id=85 data-nosnippet>85</a>    </span>Primitive(PrimitiveType),
+<a href=#86 id=86 data-nosnippet>86</a>    <span class="doccomment">/// Struct type
+<a href=#87 id=87 data-nosnippet>87</a>    </span>Struct(StructType),
+<a href=#88 id=88 data-nosnippet>88</a>    <span class="doccomment">/// List type.
+<a href=#89 id=89 data-nosnippet>89</a>    </span>List(ListType),
+<a href=#90 id=90 data-nosnippet>90</a>    <span class="doccomment">/// Map type
+<a href=#91 id=91 data-nosnippet>91</a>    </span>Map(MapType),
+<a href=#92 id=92 data-nosnippet>92</a>    <span class="doccomment">/// Variant Type
+<a href=#93 id=93 data-nosnippet>93</a>    </span>Variant(VariantType),
+<a href=#94 id=94 data-nosnippet>94</a>}
+<a href=#95 id=95 data-nosnippet>95</a>
+<a href=#96 id=96 data-nosnippet>96</a><span class="kw">impl </span>fmt::Display <span class="kw">for </span>Type {
+<a href=#97 id=97 data-nosnippet>97</a>    <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter) -&gt; fmt::Result {
+<a href=#98 id=98 data-nosnippet>98</a>        <span class="kw">match </span><span class="self">self </span>{
+<a href=#99 id=99 data-nosnippet>99</a>            Type::Primitive(primitive) =&gt; <span class="macro">write!</span>(f, <span class="string">"{primitive}"</span>),
+<a href=#100 id=100 data-nosnippet>100</a>            Type::Struct(s) =&gt; <span class="macro">write!</span>(f, <span class="string">"{s}"</span>),
+<a href=#101 id=101 data-nosnippet>101</a>            Type::List(<span class="kw">_</span>) =&gt; <span class="macro">write!</span>(f, <span class="string">"list"</span>),
+<a href=#102 id=102 data-nosnippet>102</a>            Type::Map(<span class="kw">_</span>) =&gt; <span class="macro">write!</span>(f, <span class="string">"map"</span>),
+<a href=#103 id=103 data-nosnippet>103</a>            Type::Variant(<span class="kw">_</span>) =&gt; <span class="macro">write!</span>(f, <span class="string">"variant"</span>),
+<a href=#104 id=104 data-nosnippet>104</a>        }
+<a href=#105 id=105 data-nosnippet>105</a>    }
+<a href=#106 id=106 data-nosnippet>106</a>}
+<a href=#107 id=107 data-nosnippet>107</a>
+<a href=#108 id=108 data-nosnippet>108</a><span class="kw">impl </span>Type {
+<a href=#109 id=109 data-nosnippet>109</a>    <span class="doccomment">/// Whether the type is primitive type.
+<a href=#110 id=110 data-nosnippet>110</a>    </span><span class="attr">#[inline(always)]
+<a href=#111 id=111 data-nosnippet>111</a>    </span><span class="kw">pub fn </span>is_primitive(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
+<a href=#112 id=112 data-nosnippet>112</a>        <span class="macro">matches!</span>(<span class="self">self</span>, Type::Primitive(<span class="kw">_</span>))
+<a href=#113 id=113 data-nosnippet>113</a>    }
+<a href=#114 id=114 data-nosnippet>114</a>
+<a href=#115 id=115 data-nosnippet>115</a>    <span class="doccomment">/// Whether the type is struct type.
+<a href=#116 id=116 data-nosnippet>116</a>    </span><span class="attr">#[inline(always)]
+<a href=#117 id=117 data-nosnippet>117</a>    </span><span class="kw">pub fn </span>is_struct(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
+<a href=#118 id=118 data-nosnippet>118</a>        <span class="macro">matches!</span>(<span class="self">self</span>, Type::Struct(<span class="kw">_</span>))
+<a href=#119 id=119 data-nosnippet>119</a>    }
+<a href=#120 id=120 data-nosnippet>120</a>
+<a href=#121 id=121 data-nosnippet>121</a>    <span class="doccomment">/// Whether the type is nested type.
+<a href=#122 id=122 data-nosnippet>122</a>    </span><span class="attr">#[inline(always)]
+<a href=#123 id=123 data-nosnippet>123</a>    </span><span class="kw">pub fn </span>is_nested(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
+<a href=#124 id=124 data-nosnippet>124</a>        <span class="macro">matches!</span>(<span class="self">self</span>, Type::Struct(<span class="kw">_</span>) | Type::List(<span class="kw">_</span>) | Type::Map(<span class="kw">_</span>))
+<a href=#125 id=125 data-nosnippet>125</a>    }
+<a href=#126 id=126 data-nosnippet>126</a>
+<a href=#127 id=127 data-nosnippet>127</a>    <span class="doccomment">/// Whether the type is variant type.
+<a href=#128 id=128 data-nosnippet>128</a>    </span><span class="attr">#[inline(always)]
+<a href=#129 id=129 data-nosnippet>129</a>    </span><span class="kw">pub fn </span>is_variant(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
+<a href=#130 id=130 data-nosnippet>130</a>        <span class="macro">matches!</span>(<span class="self">self</span>, Type::Variant(<span class="kw">_</span>))
+<a href=#131 id=131 data-nosnippet>131</a>    }
+<a href=#132 id=132 data-nosnippet>132</a>
+<a href=#133 id=133 data-nosnippet>133</a>    <span class="doccomment">/// Minimum [`FormatVersion`] required to support this type, **without** taking
+<a href=#134 id=134 data-nosnippet>134</a>    /// nested field types into account.
+<a href=#135 id=135 data-nosnippet>135</a>    ///
+<a href=#136 id=136 data-nosnippet>136</a>    /// `TimestampNs` / `TimestamptzNs` / `Variant` require [`FormatVersion::V3`]; every
+<a href=#137 id=137 data-nosnippet>137</a>    /// other type is valid from [`FormatVersion::V1`]. Mirrors Java's
+<a href=#138 id=138 data-nosnippet>138</a>    /// `Schema.MIN_FORMAT_VERSIONS` (a shallow lookup keyed by type id), so it
+<a href=#139 id=139 data-nosnippet>139</a>    /// intentionally does not recurse: callers needing the floor for a whole schema
+<a href=#140 id=140 data-nosnippet>140</a>    /// iterate its flattened fields (see [`Schema::calc_min_compatible_format`]).
+<a href=#141 id=141 data-nosnippet>141</a>    ///
+<a href=#142 id=142 data-nosnippet>142</a>    /// [`Schema::calc_min_compatible_format`]: crate::spec::Schema::calc_min_compatible_format
+<a href=#143 id=143 data-nosnippet>143</a>    </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>min_format_version(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; FormatVersion {
+<a href=#144 id=144 data-nosnippet>144</a>        <span class="kw">match </span><span class="self">self </span>{
+<a href=#145 id=145 data-nosnippet>145</a>            Type::Primitive(PrimitiveType::TimestampNs | PrimitiveType::TimestamptzNs)
+<a href=#146 id=146 data-nosnippet>146</a>            | Type::Variant(<span class="kw">_</span>) =&gt; FormatVersion::V3,
+<a href=#147 id=147 data-nosnippet>147</a>            <span class="kw">_ </span>=&gt; FormatVersion::V1,
+<a href=#148 id=148 data-nosnippet>148</a>        }
+<a href=#149 id=149 data-nosnippet>149</a>    }
+<a href=#150 id=150 data-nosnippet>150</a>
+<a href=#151 id=151 data-nosnippet>151</a>    <span class="doccomment">/// Convert Type to reference of PrimitiveType
+<a href=#152 id=152 data-nosnippet>152</a>    </span><span class="kw">pub fn </span>as_primitive_type(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span>PrimitiveType&gt; {
+<a href=#153 id=153 data-nosnippet>153</a>        <span class="kw">if let </span>Type::Primitive(primitive_type) = <span class="self">self </span>{
+<a href=#154 id=154 data-nosnippet>154</a>            <span class="prelude-val">Some</span>(primitive_type)
+<a href=#155 id=155 data-nosnippet>155</a>        } <span class="kw">else </span>{
+<a href=#156 id=156 data-nosnippet>156</a>            <span class="prelude-val">None
+<a href=#157 id=157 data-nosnippet>157</a>        </span>}
+<a href=#158 id=158 data-nosnippet>158</a>    }
+<a href=#159 id=159 data-nosnippet>159</a>
+<a href=#160 id=160 data-nosnippet>160</a>    <span class="doccomment">/// Convert Type to StructType
+<a href=#161 id=161 data-nosnippet>161</a>    </span><span class="kw">pub fn </span>to_struct_type(<span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;StructType&gt; {
+<a href=#162 id=162 data-nosnippet>162</a>        <span class="kw">if let </span>Type::Struct(struct_type) = <span class="self">self </span>{
+<a href=#163 id=163 data-nosnippet>163</a>            <span class="prelude-val">Some</span>(struct_type)
+<a href=#164 id=164 data-nosnippet>164</a>        } <span class="kw">else </span>{
+<a href=#165 id=165 data-nosnippet>165</a>            <span class="prelude-val">None
+<a href=#166 id=166 data-nosnippet>166</a>        </span>}
+<a href=#167 id=167 data-nosnippet>167</a>    }
+<a href=#168 id=168 data-nosnippet>168</a>
+<a href=#169 id=169 data-nosnippet>169</a>    <span class="doccomment">/// Return max precision for decimal given `num_bytes` bytes.
+<a href=#170 id=170 data-nosnippet>170</a>    </span><span class="attr">#[inline(always)]
+<a href=#171 id=171 data-nosnippet>171</a>    </span><span class="kw">pub fn </span>decimal_max_precision(num_bytes: u32) -&gt; <span class="prelude-ty">Result</span>&lt;u32&gt; {
+<a href=#172 id=172 data-nosnippet>172</a>        <span class="macro">ensure_data_valid!</span>(
+<a href=#173 id=173 data-nosnippet>173</a>            num_bytes &gt; <span class="number">0 </span>&amp;&amp; num_bytes &lt;= MAX_DECIMAL_BYTES,
+<a href=#174 id=174 data-nosnippet>174</a>            <span class="string">"Decimal length larger than {MAX_DECIMAL_BYTES} is not supported: {num_bytes}"</span>,
+<a href=#175 id=175 data-nosnippet>175</a>        );
+<a href=#176 id=176 data-nosnippet>176</a>        <span class="prelude-val">Ok</span>(MAX_PRECISION[num_bytes <span class="kw">as </span>usize - <span class="number">1</span>])
+<a href=#177 id=177 data-nosnippet>177</a>    }
+<a href=#178 id=178 data-nosnippet>178</a>
+<a href=#179 id=179 data-nosnippet>179</a>    <span class="doccomment">/// Returns minimum bytes required for decimal with `precision`.
+<a href=#180 id=180 data-nosnippet>180</a>    </span><span class="attr">#[inline(always)]
+<a href=#181 id=181 data-nosnippet>181</a>    </span><span class="kw">pub fn </span>decimal_required_bytes(precision: u32) -&gt; <span class="prelude-ty">Result</span>&lt;u32&gt; {
+<a href=#182 id=182 data-nosnippet>182</a>        <span class="macro">ensure_data_valid!</span>(
+<a href=#183 id=183 data-nosnippet>183</a>            precision &gt; <span class="number">0 </span>&amp;&amp; precision &lt;= MAX_DECIMAL_PRECISION,
+<a href=#184 id=184 data-nosnippet>184</a>            <span class="string">"Decimals with precision larger than {MAX_DECIMAL_PRECISION} are not supported: {precision}"</span>,
+<a href=#185 id=185 data-nosnippet>185</a>        );
+<a href=#186 id=186 data-nosnippet>186</a>        <span class="prelude-val">Ok</span>(REQUIRED_LENGTH[precision <span class="kw">as </span>usize - <span class="number">1</span>])
+<a href=#187 id=187 data-nosnippet>187</a>    }
+<a href=#188 id=188 data-nosnippet>188</a>
+<a href=#189 id=189 data-nosnippet>189</a>    <span class="doccomment">/// Creates  decimal type.
+<a href=#190 id=190 data-nosnippet>190</a>    </span><span class="attr">#[inline(always)]
+<a href=#191 id=191 data-nosnippet>191</a>    </span><span class="kw">pub fn </span>decimal(precision: u32, scale: u32) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="self">Self</span>&gt; {
+<a href=#192 id=192 data-nosnippet>192</a>        <span class="macro">ensure_data_valid!</span>(
+<a href=#193 id=193 data-nosnippet>193</a>            precision &gt; <span class="number">0 </span>&amp;&amp; precision &lt;= MAX_DECIMAL_PRECISION,
+<a href=#194 id=194 data-nosnippet>194</a>            <span class="string">"Decimals with precision larger than {MAX_DECIMAL_PRECISION} are not supported: {precision}"</span>,
+<a href=#195 id=195 data-nosnippet>195</a>        );
+<a href=#196 id=196 data-nosnippet>196</a>        <span class="prelude-val">Ok</span>(Type::Primitive(PrimitiveType::Decimal { precision, scale }))
+<a href=#197 id=197 data-nosnippet>197</a>    }
+<a href=#198 id=198 data-nosnippet>198</a>
+<a href=#199 id=199 data-nosnippet>199</a>    <span class="doccomment">/// Check if it's float or double type.
+<a href=#200 id=200 data-nosnippet>200</a>    </span><span class="attr">#[inline(always)]
+<a href=#201 id=201 data-nosnippet>201</a>    </span><span class="kw">pub fn </span>is_floating_type(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; bool {
+<a href=#202 id=202 data-nosnippet>202</a>        <span class="macro">matches!</span>(
+<a href=#203 id=203 data-nosnippet>203</a>            <span class="self">self</span>,
+<a href=#204 id=204 data-nosnippet>204</a>            Type::Primitive(PrimitiveType::Float) | Type::Primitive(PrimitiveType::Double)
+<a href=#205 id=205 data-nosnippet>205</a>        )
+<a href=#206 id=206 data-nosnippet>206</a>    }
+<a href=#207 id=207 data-nosnippet>207</a>}
+<a href=#208 id=208 data-nosnippet>208</a>
+<a href=#209 id=209 data-nosnippet>209</a><span class="kw">impl </span>From&lt;PrimitiveType&gt; <span class="kw">for </span>Type {
+<a href=#210 id=210 data-nosnippet>210</a>    <span class="kw">fn </span>from(value: PrimitiveType) -&gt; <span class="self">Self </span>{
+<a href=#211 id=211 data-nosnippet>211</a>        <span class="self">Self</span>::Primitive(value)
+<a href=#212 id=212 data-nosnippet>212</a>    }
+<a href=#213 id=213 data-nosnippet>213</a>}
+<a href=#214 id=214 data-nosnippet>214</a>
+<a href=#215 id=215 data-nosnippet>215</a><span class="kw">impl </span>From&lt;StructType&gt; <span class="kw">for </span>Type {
+<a href=#216 id=216 data-nosnippet>216</a>    <span class="kw">fn </span>from(value: StructType) -&gt; <span class="self">Self </span>{
+<a href=#217 id=217 data-nosnippet>217</a>        Type::Struct(value)
+<a href=#218 id=218 data-nosnippet>218</a>    }
+<a href=#219 id=219 data-nosnippet>219</a>}
+<a href=#220 id=220 data-nosnippet>220</a>
+<a href=#221 id=221 data-nosnippet>221</a><span class="kw">impl </span>From&lt;ListType&gt; <span class="kw">for </span>Type {
+<a href=#222 id=222 data-nosnippet>222</a>    <span class="kw">fn </span>from(value: ListType) -&gt; <span class="self">Self </span>{
+<a href=#223 id=223 data-nosnippet>223</a>        Type::List(value)
+<a href=#224 id=224 data-nosnippet>224</a>    }
+<a href=#225 id=225 data-nosnippet>225</a>}
+<a href=#226 id=226 data-nosnippet>226</a>
+<a href=#227 id=227 data-nosnippet>227</a><span class="kw">impl </span>From&lt;MapType&gt; <span class="kw">for </span>Type {
+<a href=#228 id=228 data-nosnippet>228</a>    <span class="kw">fn </span>from(value: MapType) -&gt; <span class="self">Self </span>{
+<a href=#229 id=229 data-nosnippet>229</a>        Type::Map(value)
+<a href=#230 id=230 data-nosnippet>230</a>    }
+<a href=#231 id=231 data-nosnippet>231</a>}
+<a href=#232 id=232 data-nosnippet>232</a>
+<a href=#233 id=233 data-nosnippet>233</a><span class="doccomment">/// Primitive data types
+<a href=#234 id=234 data-nosnippet>234</a></span><span class="attr">#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Hash)]
+<a href=#235 id=235 data-nosnippet>235</a>#[serde(rename_all = <span class="string">"lowercase"</span>, remote = <span class="string">"Self"</span>)]
+<a href=#236 id=236 data-nosnippet>236</a></span><span class="kw">pub enum </span>PrimitiveType {
+<a href=#237 id=237 data-nosnippet>237</a>    <span class="doccomment">/// True or False
+<a href=#238 id=238 data-nosnippet>238</a>    </span>Boolean,
+<a href=#239 id=239 data-nosnippet>239</a>    <span class="doccomment">/// 32-bit signed integer
+<a href=#240 id=240 data-nosnippet>240</a>    </span>Int,
+<a href=#241 id=241 data-nosnippet>241</a>    <span class="doccomment">/// 64-bit signed integer
+<a href=#242 id=242 data-nosnippet>242</a>    </span>Long,
+<a href=#243 id=243 data-nosnippet>243</a>    <span class="doccomment">/// 32-bit IEEE 754 floating point.
+<a href=#244 id=244 data-nosnippet>244</a>    </span>Float,
+<a href=#245 id=245 data-nosnippet>245</a>    <span class="doccomment">/// 64-bit IEEE 754 floating point.
+<a href=#246 id=246 data-nosnippet>246</a>    </span>Double,
+<a href=#247 id=247 data-nosnippet>247</a>    <span class="doccomment">/// Fixed point decimal
+<a href=#248 id=248 data-nosnippet>248</a>    </span>Decimal {
+<a href=#249 id=249 data-nosnippet>249</a>        <span class="doccomment">/// Precision, must be 38 or less
+<a href=#250 id=250 data-nosnippet>250</a>        </span>precision: u32,
+<a href=#251 id=251 data-nosnippet>251</a>        <span class="doccomment">/// Scale
+<a href=#252 id=252 data-nosnippet>252</a>        </span>scale: u32,
+<a href=#253 id=253 data-nosnippet>253</a>    },
+<a href=#254 id=254 data-nosnippet>254</a>    <span class="doccomment">/// Calendar date without timezone or time.
+<a href=#255 id=255 data-nosnippet>255</a>    </span>Date,
+<a href=#256 id=256 data-nosnippet>256</a>    <span class="doccomment">/// Time of day in microsecond precision, without date or timezone.
+<a href=#257 id=257 data-nosnippet>257</a>    </span>Time,
+<a href=#258 id=258 data-nosnippet>258</a>    <span class="doccomment">/// Timestamp in microsecond precision, without timezone
+<a href=#259 id=259 data-nosnippet>259</a>    </span>Timestamp,
+<a href=#260 id=260 data-nosnippet>260</a>    <span class="doccomment">/// Timestamp in microsecond precision, with timezone
+<a href=#261 id=261 data-nosnippet>261</a>    </span>Timestamptz,
+<a href=#262 id=262 data-nosnippet>262</a>    <span class="doccomment">/// Timestamp in nanosecond precision, without timezone
+<a href=#263 id=263 data-nosnippet>263</a>    </span><span class="attr">#[serde(rename = <span class="string">"timestamp_ns"</span>)]
+<a href=#264 id=264 data-nosnippet>264</a>    </span>TimestampNs,
+<a href=#265 id=265 data-nosnippet>265</a>    <span class="doccomment">/// Timestamp in nanosecond precision with timezone
+<a href=#266 id=266 data-nosnippet>266</a>    </span><span class="attr">#[serde(rename = <span class="string">"timestamptz_ns"</span>)]
+<a href=#267 id=267 data-nosnippet>267</a>    </span>TimestamptzNs,
+<a href=#268 id=268 data-nosnippet>268</a>    <span class="doccomment">/// Arbitrary-length character sequences encoded in utf-8
+<a href=#269 id=269 data-nosnippet>269</a>    </span>String,
+<a href=#270 id=270 data-nosnippet>270</a>    <span class="doccomment">/// Universally Unique Identifiers, should use 16-byte fixed
+<a href=#271 id=271 data-nosnippet>271</a>    </span>Uuid,
+<a href=#272 id=272 data-nosnippet>272</a>    <span class="doccomment">/// Fixed length byte array
+<a href=#273 id=273 data-nosnippet>273</a>    </span>Fixed(u64),
+<a href=#274 id=274 data-nosnippet>274</a>    <span class="doccomment">/// Arbitrary-length byte array.
+<a href=#275 id=275 data-nosnippet>275</a>    </span>Binary,
+<a href=#276 id=276 data-nosnippet>276</a>}
+<a href=#277 id=277 data-nosnippet>277</a>
+<a href=#278 id=278 data-nosnippet>278</a><span class="kw">impl </span>PrimitiveType {
+<a href=#279 id=279 data-nosnippet>279</a>    <span class="doccomment">/// Check whether literal is compatible with the type.
+<a href=#280 id=280 data-nosnippet>280</a>    </span><span class="kw">pub fn </span>compatible(<span class="kw-2">&amp;</span><span class="self">self</span>, literal: <span class="kw-2">&amp;</span>PrimitiveLiteral) -&gt; bool {
+<a href=#281 id=281 data-nosnippet>281</a>        <span class="macro">matches!</span>(
+<a href=#282 id=282 data-nosnippet>282</a>            (<span class="self">self</span>, literal),
+<a href=#283 id=283 data-nosnippet>283</a>            (PrimitiveType::Boolean, PrimitiveLiteral::Boolean(<span class="kw">_</span>))
+<a href=#284 id=284 data-nosnippet>284</a>                | (PrimitiveType::Int, PrimitiveLiteral::Int(<span class="kw">_</span>))
+<a href=#285 id=285 data-nosnippet>285</a>                | (PrimitiveType::Long, PrimitiveLiteral::Long(<span class="kw">_</span>))
+<a href=#286 id=286 data-nosnippet>286</a>                | (PrimitiveType::Float, PrimitiveLiteral::Float(<span class="kw">_</span>))
+<a href=#287 id=287 data-nosnippet>287</a>                | (PrimitiveType::Double, PrimitiveLiteral::Double(<span class="kw">_</span>))
+<a href=#288 id=288 data-nosnippet>288</a>                | (PrimitiveType::Decimal { .. }, PrimitiveLiteral::Int128(<span class="kw">_</span>))
+<a href=#289 id=289 data-nosnippet>289</a>                | (PrimitiveType::Date, PrimitiveLiteral::Int(<span class="kw">_</span>))
+<a href=#290 id=290 data-nosnippet>290</a>                | (PrimitiveType::Time, PrimitiveLiteral::Long(<span class="kw">_</span>))
+<a href=#291 id=291 data-nosnippet>291</a>                | (PrimitiveType::Timestamp, PrimitiveLiteral::Long(<span class="kw">_</span>))
+<a href=#292 id=292 data-nosnippet>292</a>                | (PrimitiveType::Timestamptz, PrimitiveLiteral::Long(<span class="kw">_</span>))
+<a href=#293 id=293 data-nosnippet>293</a>                | (PrimitiveType::TimestampNs, PrimitiveLiteral::Long(<span class="kw">_</span>))
+<a href=#294 id=294 data-nosnippet>294</a>                | (PrimitiveType::TimestamptzNs, PrimitiveLiteral::Long(<span class="kw">_</span>))
+<a href=#295 id=295 data-nosnippet>295</a>                | (PrimitiveType::String, PrimitiveLiteral::String(<span class="kw">_</span>))
+<a href=#296 id=296 data-nosnippet>296</a>                | (PrimitiveType::Uuid, PrimitiveLiteral::UInt128(<span class="kw">_</span>))
+<a href=#297 id=297 data-nosnippet>297</a>                | (PrimitiveType::Fixed(<span class="kw">_</span>), PrimitiveLiteral::Binary(<span class="kw">_</span>))
+<a href=#298 id=298 data-nosnippet>298</a>                | (PrimitiveType::Binary, PrimitiveLiteral::Binary(<span class="kw">_</span>))
+<a href=#299 id=299 data-nosnippet>299</a>        )
+<a href=#300 id=300 data-nosnippet>300</a>    }
+<a href=#301 id=301 data-nosnippet>301</a>}
+<a href=#302 id=302 data-nosnippet>302</a>
+<a href=#303 id=303 data-nosnippet>303</a><span class="kw">impl </span>Serialize <span class="kw">for </span>Type {
+<a href=#304 id=304 data-nosnippet>304</a>    <span class="kw">fn </span>serialize&lt;S&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, serializer: S) -&gt; std::result::Result&lt;S::Ok, S::Error&gt;
+<a href=#305 id=305 data-nosnippet>305</a>    <span class="kw">where </span>S: Serializer {
+<a href=#306 id=306 data-nosnippet>306</a>        <span class="kw">let </span>type_serde = _serde::SerdeType::from(<span class="self">self</span>);
+<a href=#307 id=307 data-nosnippet>307</a>        type_serde.serialize(serializer)
+<a href=#308 id=308 data-nosnippet>308</a>    }
+<a href=#309 id=309 data-nosnippet>309</a>}
+<a href=#310 id=310 data-nosnippet>310</a>
+<a href=#311 id=311 data-nosnippet>311</a><span class="kw">impl</span>&lt;<span class="lifetime">'de</span>&gt; Deserialize&lt;<span class="lifetime">'de</span>&gt; <span class="kw">for </span>Type {
+<a href=#312 id=312 data-nosnippet>312</a>    <span class="kw">fn </span>deserialize&lt;D&gt;(deserializer: D) -&gt; std::result::Result&lt;<span class="self">Self</span>, D::Error&gt;
+<a href=#313 id=313 data-nosnippet>313</a>    <span class="kw">where </span>D: Deserializer&lt;<span class="lifetime">'de</span>&gt; {
+<a href=#314 id=314 data-nosnippet>314</a>        <span class="kw">let </span>type_serde = _serde::SerdeType::deserialize(deserializer)<span class="question-mark">?</span>;
+<a href=#315 id=315 data-nosnippet>315</a>        <span class="prelude-val">Ok</span>(Type::from(type_serde))
+<a href=#316 id=316 data-nosnippet>316</a>    }
+<a href=#317 id=317 data-nosnippet>317</a>}
+<a href=#318 id=318 data-nosnippet>318</a>
+<a href=#319 id=319 data-nosnippet>319</a><span class="kw">impl</span>&lt;<span class="lifetime">'de</span>&gt; Deserialize&lt;<span class="lifetime">'de</span>&gt; <span class="kw">for </span>PrimitiveType {
+<a href=#320 id=320 data-nosnippet>320</a>    <span class="kw">fn </span>deserialize&lt;D&gt;(deserializer: D) -&gt; std::result::Result&lt;<span class="self">Self</span>, D::Error&gt;
+<a href=#321 id=321 data-nosnippet>321</a>    <span class="kw">where </span>D: Deserializer&lt;<span class="lifetime">'de</span>&gt; {
+<a href=#322 id=322 data-nosnippet>322</a>        <span class="kw">let </span>s = String::deserialize(deserializer)<span class="question-mark">?</span>;
+<a href=#323 id=323 data-nosnippet>323</a>        <span class="kw">if </span>s.starts_with(<span class="string">"decimal"</span>) {
+<a href=#324 id=324 data-nosnippet>324</a>            deserialize_decimal(s.into_deserializer())
+<a href=#325 id=325 data-nosnippet>325</a>        } <span class="kw">else if </span>s.starts_with(<span class="string">"fixed"</span>) {
+<a href=#326 id=326 data-nosnippet>326</a>            deserialize_fixed(s.into_deserializer())
+<a href=#327 id=327 data-nosnippet>327</a>        } <span class="kw">else </span>{
+<a href=#328 id=328 data-nosnippet>328</a>            PrimitiveType::deserialize(s.into_deserializer())
+<a href=#329 id=329 data-nosnippet>329</a>        }
+<a href=#330 id=330 data-nosnippet>330</a>    }
+<a href=#331 id=331 data-nosnippet>331</a>}
+<a href=#332 id=332 data-nosnippet>332</a>
+<a href=#333 id=333 data-nosnippet>333</a><span class="kw">impl </span>Serialize <span class="kw">for </span>PrimitiveType {
+<a href=#334 id=334 data-nosnippet>334</a>    <span class="kw">fn </span>serialize&lt;S&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, serializer: S) -&gt; std::result::Result&lt;S::Ok, S::Error&gt;
+<a href=#335 id=335 data-nosnippet>335</a>    <span class="kw">where </span>S: Serializer {
+<a href=#336 id=336 data-nosnippet>336</a>        <span class="kw">match </span><span class="self">self </span>{
+<a href=#337 id=337 data-nosnippet>337</a>            PrimitiveType::Decimal { precision, scale } =&gt; {
+<a href=#338 id=338 data-nosnippet>338</a>                serialize_decimal(precision, scale, serializer)
+<a href=#339 id=339 data-nosnippet>339</a>            }
+<a href=#340 id=340 data-nosnippet>340</a>            PrimitiveType::Fixed(l) =&gt; serialize_fixed(l, serializer),
+<a href=#341 id=341 data-nosnippet>341</a>            <span class="kw">_ </span>=&gt; PrimitiveType::serialize(<span class="self">self</span>, serializer),
+<a href=#342 id=342 data-nosnippet>342</a>        }
+<a href=#343 id=343 data-nosnippet>343</a>    }
+<a href=#344 id=344 data-nosnippet>344</a>}
+<a href=#345 id=345 data-nosnippet>345</a>
+<a href=#346 id=346 data-nosnippet>346</a><span class="kw">fn </span>deserialize_decimal&lt;<span class="lifetime">'de</span>, D&gt;(deserializer: D) -&gt; std::result::Result&lt;PrimitiveType, D::Error&gt;
+<a href=#347 id=347 data-nosnippet>347</a><span class="kw">where </span>D: Deserializer&lt;<span class="lifetime">'de</span>&gt; {
+<a href=#348 id=348 data-nosnippet>348</a>    <span class="kw">let </span>s = String::deserialize(deserializer)<span class="question-mark">?</span>;
+<a href=#349 id=349 data-nosnippet>349</a>    <span class="kw">let </span>(precision, scale) = s
+<a href=#350 id=350 data-nosnippet>350</a>        .trim_start_matches(<span class="string">r"decimal("</span>)
+<a href=#351 id=351 data-nosnippet>351</a>        .trim_end_matches(<span class="string">')'</span>)
+<a href=#352 id=352 data-nosnippet>352</a>        .split_once(<span class="string">','</span>)
+<a href=#353 id=353 data-nosnippet>353</a>        .ok_or_else(|| D::Error::custom(<span class="string">"Decimal requires precision and scale: {s}"</span>))<span class="question-mark">?</span>;
+<a href=#354 id=354 data-nosnippet>354</a>
+<a href=#355 id=355 data-nosnippet>355</a>    <span class="prelude-val">Ok</span>(PrimitiveType::Decimal {
+<a href=#356 id=356 data-nosnippet>356</a>        precision: precision.trim().parse().map_err(D::Error::custom)<span class="question-mark">?</span>,
+<a href=#357 id=357 data-nosnippet>357</a>        scale: scale.trim().parse().map_err(D::Error::custom)<span class="question-mark">?</span>,
+<a href=#358 id=358 data-nosnippet>358</a>    })
+<a href=#359 id=359 data-nosnippet>359</a>}
+<a href=#360 id=360 data-nosnippet>360</a>
+<a href=#361 id=361 data-nosnippet>361</a><span class="kw">fn </span>serialize_decimal&lt;S&gt;(
+<a href=#362 id=362 data-nosnippet>362</a>    precision: <span class="kw-2">&amp;</span>u32,
+<a href=#363 id=363 data-nosnippet>363</a>    scale: <span class="kw-2">&amp;</span>u32,
+<a href=#364 id=364 data-nosnippet>364</a>    serializer: S,
+<a href=#365 id=365 data-nosnippet>365</a>) -&gt; std::result::Result&lt;S::Ok, S::Error&gt;
+<a href=#366 id=366 data-nosnippet>366</a><span class="kw">where
+<a href=#367 id=367 data-nosnippet>367</a>    </span>S: Serializer,
+<a href=#368 id=368 data-nosnippet>368</a>{
+<a href=#369 id=369 data-nosnippet>369</a>    serializer.serialize_str(<span class="kw-2">&amp;</span><span class="macro">format!</span>(<span class="string">"decimal({precision}, {scale})"</span>))
+<a href=#370 id=370 data-nosnippet>370</a>}
+<a href=#371 id=371 data-nosnippet>371</a>
+<a href=#372 id=372 data-nosnippet>372</a><span class="kw">fn </span>deserialize_fixed&lt;<span class="lifetime">'de</span>, D&gt;(deserializer: D) -&gt; std::result::Result&lt;PrimitiveType, D::Error&gt;
+<a href=#373 id=373 data-nosnippet>373</a><span class="kw">where </span>D: Deserializer&lt;<span class="lifetime">'de</span>&gt; {
+<a href=#374 id=374 data-nosnippet>374</a>    <span class="kw">let </span>fixed = String::deserialize(deserializer)<span class="question-mark">?
+<a href=#375 id=375 data-nosnippet>375</a>        </span>.trim_start_matches(<span class="string">r"fixed["</span>)
+<a href=#376 id=376 data-nosnippet>376</a>        .trim_end_matches(<span class="string">']'</span>)
+<a href=#377 id=377 data-nosnippet>377</a>        .to_owned();
+<a href=#378 id=378 data-nosnippet>378</a>
+<a href=#379 id=379 data-nosnippet>379</a>    fixed
+<a href=#380 id=380 data-nosnippet>380</a>        .parse()
+<a href=#381 id=381 data-nosnippet>381</a>        .map(PrimitiveType::Fixed)
+<a href=#382 id=382 data-nosnippet>382</a>        .map_err(D::Error::custom)
+<a href=#383 id=383 data-nosnippet>383</a>}
+<a href=#384 id=384 data-nosnippet>384</a>
+<a href=#385 id=385 data-nosnippet>385</a><span class="kw">fn </span>serialize_fixed&lt;S&gt;(value: <span class="kw-2">&amp;</span>u64, serializer: S) -&gt; std::result::Result&lt;S::Ok, S::Error&gt;
+<a href=#386 id=386 data-nosnippet>386</a><span class="kw">where </span>S: Serializer {
+<a href=#387 id=387 data-nosnippet>387</a>    serializer.serialize_str(<span class="kw-2">&amp;</span><span class="macro">format!</span>(<span class="string">"fixed[{value}]"</span>))
+<a href=#388 id=388 data-nosnippet>388</a>}
+<a href=#389 id=389 data-nosnippet>389</a>
+<a href=#390 id=390 data-nosnippet>390</a><span class="kw">impl </span>fmt::Display <span class="kw">for </span>PrimitiveType {
+<a href=#391 id=391 data-nosnippet>391</a>    <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter) -&gt; fmt::Result {
+<a href=#392 id=392 data-nosnippet>392</a>        <span class="kw">match </span><span class="self">self </span>{
+<a href=#393 id=393 data-nosnippet>393</a>            PrimitiveType::Boolean =&gt; <span class="macro">write!</span>(f, <span class="string">"boolean"</span>),
+<a href=#394 id=394 data-nosnippet>394</a>            PrimitiveType::Int =&gt; <span class="macro">write!</span>(f, <span class="string">"int"</span>),
+<a href=#395 id=395 data-nosnippet>395</a>            PrimitiveType::Long =&gt; <span class="macro">write!</span>(f, <span class="string">"long"</span>),
+<a href=#396 id=396 data-nosnippet>396</a>            PrimitiveType::Float =&gt; <span class="macro">write!</span>(f, <span class="string">"float"</span>),
+<a href=#397 id=397 data-nosnippet>397</a>            PrimitiveType::Double =&gt; <span class="macro">write!</span>(f, <span class="string">"double"</span>),
+<a href=#398 id=398 data-nosnippet>398</a>            PrimitiveType::Decimal { precision, scale } =&gt; {
+<a href=#399 id=399 data-nosnippet>399</a>                <span class="macro">write!</span>(f, <span class="string">"decimal({precision}, {scale})"</span>)
+<a href=#400 id=400 data-nosnippet>400</a>            }
+<a href=#401 id=401 data-nosnippet>401</a>            PrimitiveType::Date =&gt; <span class="macro">write!</span>(f, <span class="string">"date"</span>),
+<a href=#402 id=402 data-nosnippet>402</a>            PrimitiveType::Time =&gt; <span class="macro">write!</span>(f, <span class="string">"time"</span>),
+<a href=#403 id=403 data-nosnippet>403</a>            PrimitiveType::Timestamp =&gt; <span class="macro">write!</span>(f, <span class="string">"timestamp"</span>),
+<a href=#404 id=404 data-nosnippet>404</a>            PrimitiveType::Timestamptz =&gt; <span class="macro">write!</span>(f, <span class="string">"timestamptz"</span>),
+<a href=#405 id=405 data-nosnippet>405</a>            PrimitiveType::TimestampNs =&gt; <span class="macro">write!</span>(f, <span class="string">"timestamp_ns"</span>),
+<a href=#406 id=406 data-nosnippet>406</a>            PrimitiveType::TimestamptzNs =&gt; <span class="macro">write!</span>(f, <span class="string">"timestamptz_ns"</span>),
+<a href=#407 id=407 data-nosnippet>407</a>            PrimitiveType::String =&gt; <span class="macro">write!</span>(f, <span class="string">"string"</span>),
+<a href=#408 id=408 data-nosnippet>408</a>            PrimitiveType::Uuid =&gt; <span class="macro">write!</span>(f, <span class="string">"uuid"</span>),
+<a href=#409 id=409 data-nosnippet>409</a>            PrimitiveType::Fixed(size) =&gt; <span class="macro">write!</span>(f, <span class="string">"fixed({size})"</span>),
+<a href=#410 id=410 data-nosnippet>410</a>            PrimitiveType::Binary =&gt; <span class="macro">write!</span>(f, <span class="string">"binary"</span>),
+<a href=#411 id=411 data-nosnippet>411</a>        }
+<a href=#412 id=412 data-nosnippet>412</a>    }
+<a href=#413 id=413 data-nosnippet>413</a>}
+<a href=#414 id=414 data-nosnippet>414</a>
+<a href=#415 id=415 data-nosnippet>415</a><span class="doccomment">/// DataType for a specific struct
+<a href=#416 id=416 data-nosnippet>416</a></span><span class="attr">#[derive(Debug, Serialize, Clone, Default)]
+<a href=#417 id=417 data-nosnippet>417</a>#[serde(rename = <span class="string">"struct"</span>, tag = <span class="string">"type"</span>)]
+<a href=#418 id=418 data-nosnippet>418</a></span><span class="kw">pub struct </span>StructType {
+<a href=#419 id=419 data-nosnippet>419</a>    <span class="doccomment">/// Struct fields
+<a href=#420 id=420 data-nosnippet>420</a>    </span>fields: Vec&lt;NestedFieldRef&gt;,
+<a href=#421 id=421 data-nosnippet>421</a>    <span class="doccomment">/// Lookup for index by field id
+<a href=#422 id=422 data-nosnippet>422</a>    </span><span class="attr">#[serde(skip_serializing)]
+<a href=#423 id=423 data-nosnippet>423</a>    </span>id_lookup: OnceLock&lt;HashMap&lt;i32, usize&gt;&gt;,
+<a href=#424 id=424 data-nosnippet>424</a>    <span class="attr">#[serde(skip_serializing)]
+<a href=#425 id=425 data-nosnippet>425</a>    </span>name_lookup: OnceLock&lt;HashMap&lt;String, usize&gt;&gt;,
+<a href=#426 id=426 data-nosnippet>426</a>}
+<a href=#427 id=427 data-nosnippet>427</a>
+<a href=#428 id=428 data-nosnippet>428</a><span class="kw">impl</span>&lt;<span class="lifetime">'de</span>&gt; Deserialize&lt;<span class="lifetime">'de</span>&gt; <span class="kw">for </span>StructType {
+<a href=#429 id=429 data-nosnippet>429</a>    <span class="kw">fn </span>deserialize&lt;D&gt;(deserializer: D) -&gt; std::result::Result&lt;<span class="self">Self</span>, D::Error&gt;
+<a href=#430 id=430 data-nosnippet>430</a>    <span class="kw">where </span>D: Deserializer&lt;<span class="lifetime">'de</span>&gt; {
+<a href=#431 id=431 data-nosnippet>431</a>        <span class="attr">#[derive(Deserialize)]
+<a href=#432 id=432 data-nosnippet>432</a>        #[serde(field_identifier, rename_all = <span class="string">"lowercase"</span>)]
+<a href=#433 id=433 data-nosnippet>433</a>        </span><span class="kw">enum </span>Field {
+<a href=#434 id=434 data-nosnippet>434</a>            Type,
+<a href=#435 id=435 data-nosnippet>435</a>            Fields,
+<a href=#436 id=436 data-nosnippet>436</a>        }
+<a href=#437 id=437 data-nosnippet>437</a>
+<a href=#438 id=438 data-nosnippet>438</a>        <span class="kw">struct </span>StructTypeVisitor;
+<a href=#439 id=439 data-nosnippet>439</a>
+<a href=#440 id=440 data-nosnippet>440</a>        <span class="kw">impl</span>&lt;<span class="lifetime">'de</span>&gt; Visitor&lt;<span class="lifetime">'de</span>&gt; <span class="kw">for </span>StructTypeVisitor {
+<a href=#441 id=441 data-nosnippet>441</a>            <span class="kw">type </span>Value = StructType;
+<a href=#442 id=442 data-nosnippet>442</a>
+<a href=#443 id=443 data-nosnippet>443</a>            <span class="kw">fn </span>expecting(<span class="kw-2">&amp;</span><span class="self">self</span>, formatter: <span class="kw-2">&amp;mut </span>fmt::Formatter) -&gt; fmt::Result {
+<a href=#444 id=444 data-nosnippet>444</a>                formatter.write_str(<span class="string">"struct"</span>)
+<a href=#445 id=445 data-nosnippet>445</a>            }
+<a href=#446 id=446 data-nosnippet>446</a>
+<a href=#447 id=447 data-nosnippet>447</a>            <span class="kw">fn </span>visit_map&lt;V&gt;(<span class="self">self</span>, <span class="kw-2">mut </span>map: V) -&gt; std::result::Result&lt;StructType, V::Error&gt;
+<a href=#448 id=448 data-nosnippet>448</a>            <span class="kw">where </span>V: MapAccess&lt;<span class="lifetime">'de</span>&gt; {
+<a href=#449 id=449 data-nosnippet>449</a>                <span class="kw">let </span><span class="kw-2">mut </span>fields = <span class="prelude-val">None</span>;
+<a href=#450 id=450 data-nosnippet>450</a>                <span class="kw">while let </span><span class="prelude-val">Some</span>(key) = map.next_key()<span class="question-mark">? </span>{
+<a href=#451 id=451 data-nosnippet>451</a>                    <span class="kw">match </span>key {
+<a href=#452 id=452 data-nosnippet>452</a>                        Field::Type =&gt; {
+<a href=#453 id=453 data-nosnippet>453</a>                            <span class="kw">let </span>type_val: String = map.next_value()<span class="question-mark">?</span>;
+<a href=#454 id=454 data-nosnippet>454</a>                            <span class="kw">if </span>type_val != <span class="string">"struct" </span>{
+<a href=#455 id=455 data-nosnippet>455</a>                                <span class="kw">return </span><span class="prelude-val">Err</span>(Error::custom(<span class="macro">format!</span>(
+<a href=#456 id=456 data-nosnippet>456</a>                                    <span class="string">"expected type 'struct', got '{type_val}'"
+<a href=#457 id=457 data-nosnippet>457</a>                                </span>)));
+<a href=#458 id=458 data-nosnippet>458</a>                            }
+<a href=#459 id=459 data-nosnippet>459</a>                        }
+<a href=#460 id=460 data-nosnippet>460</a>                        Field::Fields =&gt; {
+<a href=#461 id=461 data-nosnippet>461</a>                            <span class="kw">if </span>fields.is_some() {
+<a href=#462 id=462 data-nosnippet>462</a>                                <span class="kw">return </span><span class="prelude-val">Err</span>(Error::duplicate_field(<span class="string">"fields"</span>));
+<a href=#463 id=463 data-nosnippet>463</a>                            }
+<a href=#464 id=464 data-nosnippet>464</a>                            fields = <span class="prelude-val">Some</span>(map.next_value()<span class="question-mark">?</span>);
+<a href=#465 id=465 data-nosnippet>465</a>                        }
+<a href=#466 id=466 data-nosnippet>466</a>                    }
+<a href=#467 id=467 data-nosnippet>467</a>                }
+<a href=#468 id=468 data-nosnippet>468</a>                <span class="kw">let </span>fields: Vec&lt;NestedFieldRef&gt; =
+<a href=#469 id=469 data-nosnippet>469</a>                    fields.ok_or_else(|| Error::missing_field(<span class="string">"fields"</span>))<span class="question-mark">?</span>;
+<a href=#470 id=470 data-nosnippet>470</a>
+<a href=#471 id=471 data-nosnippet>471</a>                <span class="prelude-val">Ok</span>(StructType::new(fields))
+<a href=#472 id=472 data-nosnippet>472</a>            }
+<a href=#473 id=473 data-nosnippet>473</a>        }
+<a href=#474 id=474 data-nosnippet>474</a>
+<a href=#475 id=475 data-nosnippet>475</a>        <span class="kw">const </span>FIELDS: <span class="kw-2">&amp;</span>[<span class="kw-2">&amp;</span>str] = <span class="kw-2">&amp;</span>[<span class="string">"type"</span>, <span class="string">"fields"</span>];
+<a href=#476 id=476 data-nosnippet>476</a>        deserializer.deserialize_struct(<span class="string">"struct"</span>, FIELDS, StructTypeVisitor)
+<a href=#477 id=477 data-nosnippet>477</a>    }
+<a href=#478 id=478 data-nosnippet>478</a>}
+<a href=#479 id=479 data-nosnippet>479</a>
+<a href=#480 id=480 data-nosnippet>480</a><span class="kw">impl </span>StructType {
+<a href=#481 id=481 data-nosnippet>481</a>    <span class="doccomment">/// Creates a struct type with the given fields.
+<a href=#482 id=482 data-nosnippet>482</a>    </span><span class="kw">pub fn </span>new(fields: Vec&lt;NestedFieldRef&gt;) -&gt; <span class="self">Self </span>{
+<a href=#483 id=483 data-nosnippet>483</a>        <span class="self">Self </span>{
+<a href=#484 id=484 data-nosnippet>484</a>            fields,
+<a href=#485 id=485 data-nosnippet>485</a>            id_lookup: OnceLock::new(),
+<a href=#486 id=486 data-nosnippet>486</a>            name_lookup: OnceLock::new(),
+<a href=#487 id=487 data-nosnippet>487</a>        }
+<a href=#488 id=488 data-nosnippet>488</a>    }
+<a href=#489 id=489 data-nosnippet>489</a>
+<a href=#490 id=490 data-nosnippet>490</a>    <span class="doccomment">/// Get struct field with certain id
+<a href=#491 id=491 data-nosnippet>491</a>    </span><span class="kw">pub fn </span>field_by_id(<span class="kw-2">&amp;</span><span class="self">self</span>, id: i32) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span>NestedFieldRef&gt; {
+<a href=#492 id=492 data-nosnippet>492</a>        <span class="self">self</span>.field_id_to_index(id).map(|idx| <span class="kw-2">&amp;</span><span class="self">self</span>.fields[idx])
+<a href=#493 id=493 data-nosnippet>493</a>    }
+<a href=#494 id=494 data-nosnippet>494</a>
+<a href=#495 id=495 data-nosnippet>495</a>    <span class="kw">fn </span>field_id_to_index(<span class="kw-2">&amp;</span><span class="self">self</span>, field_id: i32) -&gt; <span class="prelude-ty">Option</span>&lt;usize&gt; {
+<a href=#496 id=496 data-nosnippet>496</a>        <span class="self">self</span>.id_lookup
+<a href=#497 id=497 data-nosnippet>497</a>            .get_or_init(|| {
+<a href=#498 id=498 data-nosnippet>498</a>                HashMap::from_iter(<span class="self">self</span>.fields.iter().enumerate().map(|(i, x)| (x.id, i)))
+<a href=#499 id=499 data-nosnippet>499</a>            })
+<a href=#500 id=500 data-nosnippet>500</a>            .get(<span class="kw-2">&amp;</span>field_id)
+<a href=#501 id=501 data-nosnippet>501</a>            .copied()
+<a href=#502 id=502 data-nosnippet>502</a>    }
+<a href=#503 id=503 data-nosnippet>503</a>
+<a href=#504 id=504 data-nosnippet>504</a>    <span class="doccomment">/// Get struct field with certain field name
+<a href=#505 id=505 data-nosnippet>505</a>    </span><span class="kw">pub fn </span>field_by_name(<span class="kw-2">&amp;</span><span class="self">self</span>, name: <span class="kw-2">&amp;</span>str) -&gt; <span class="prelude-ty">Option</span>&lt;<span class="kw-2">&amp;</span>NestedFieldRef&gt; {
+<a href=#506 id=506 data-nosnippet>506</a>        <span class="self">self</span>.field_name_to_index(name).map(|idx| <span class="kw-2">&amp;</span><span class="self">self</span>.fields[idx])
+<a href=#507 id=507 data-nosnippet>507</a>    }
+<a href=#508 id=508 data-nosnippet>508</a>
+<a href=#509 id=509 data-nosnippet>509</a>    <span class="kw">fn </span>field_name_to_index(<span class="kw-2">&amp;</span><span class="self">self</span>, name: <span class="kw-2">&amp;</span>str) -&gt; <span class="prelude-ty">Option</span>&lt;usize&gt; {
+<a href=#510 id=510 data-nosnippet>510</a>        <span class="self">self</span>.name_lookup
+<a href=#511 id=511 data-nosnippet>511</a>            .get_or_init(|| {
+<a href=#512 id=512 data-nosnippet>512</a>                HashMap::from_iter(
+<a href=#513 id=513 data-nosnippet>513</a>                    <span class="self">self</span>.fields
+<a href=#514 id=514 data-nosnippet>514</a>                        .iter()
+<a href=#515 id=515 data-nosnippet>515</a>                        .enumerate()
+<a href=#516 id=516 data-nosnippet>516</a>                        .map(|(i, x)| (x.name.clone(), i)),
+<a href=#517 id=517 data-nosnippet>517</a>                )
+<a href=#518 id=518 data-nosnippet>518</a>            })
+<a href=#519 id=519 data-nosnippet>519</a>            .get(name)
+<a href=#520 id=520 data-nosnippet>520</a>            .copied()
+<a href=#521 id=521 data-nosnippet>521</a>    }
+<a href=#522 id=522 data-nosnippet>522</a>
+<a href=#523 id=523 data-nosnippet>523</a>    <span class="doccomment">/// Get fields.
+<a href=#524 id=524 data-nosnippet>524</a>    </span><span class="kw">pub fn </span>fields(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="kw-2">&amp;</span>[NestedFieldRef] {
+<a href=#525 id=525 data-nosnippet>525</a>        <span class="kw-2">&amp;</span><span class="self">self</span>.fields
+<a href=#526 id=526 data-nosnippet>526</a>    }
+<a href=#527 id=527 data-nosnippet>527</a>}
+<a href=#528 id=528 data-nosnippet>528</a>
+<a href=#529 id=529 data-nosnippet>529</a><span class="kw">impl </span>PartialEq <span class="kw">for </span>StructType {
+<a href=#530 id=530 data-nosnippet>530</a>    <span class="kw">fn </span>eq(<span class="kw-2">&amp;</span><span class="self">self</span>, other: <span class="kw-2">&amp;</span><span class="self">Self</span>) -&gt; bool {
+<a href=#531 id=531 data-nosnippet>531</a>        <span class="self">self</span>.fields == other.fields
+<a href=#532 id=532 data-nosnippet>532</a>    }
+<a href=#533 id=533 data-nosnippet>533</a>}
+<a href=#534 id=534 data-nosnippet>534</a>
+<a href=#535 id=535 data-nosnippet>535</a><span class="kw">impl </span>Eq <span class="kw">for </span>StructType {}
+<a href=#536 id=536 data-nosnippet>536</a>
+<a href=#537 id=537 data-nosnippet>537</a><span class="kw">impl </span>Index&lt;usize&gt; <span class="kw">for </span>StructType {
+<a href=#538 id=538 data-nosnippet>538</a>    <span class="kw">type </span>Output = NestedField;
+<a href=#539 id=539 data-nosnippet>539</a>
+<a href=#540 id=540 data-nosnippet>540</a>    <span class="kw">fn </span>index(<span class="kw-2">&amp;</span><span class="self">self</span>, index: usize) -&gt; <span class="kw-2">&amp;</span><span class="self">Self</span>::Output {
+<a href=#541 id=541 data-nosnippet>541</a>        <span class="kw-2">&amp;</span><span class="self">self</span>.fields[index]
+<a href=#542 id=542 data-nosnippet>542</a>    }
+<a href=#543 id=543 data-nosnippet>543</a>}
+<a href=#544 id=544 data-nosnippet>544</a>
+<a href=#545 id=545 data-nosnippet>545</a><span class="kw">impl </span>fmt::Display <span class="kw">for </span>StructType {
+<a href=#546 id=546 data-nosnippet>546</a>    <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter) -&gt; fmt::Result {
+<a href=#547 id=547 data-nosnippet>547</a>        <span class="macro">write!</span>(f, <span class="string">"struct&lt;"</span>)<span class="question-mark">?</span>;
+<a href=#548 id=548 data-nosnippet>548</a>        <span class="kw">for </span>field <span class="kw">in </span><span class="kw-2">&amp;</span><span class="self">self</span>.fields {
+<a href=#549 id=549 data-nosnippet>549</a>            <span class="macro">write!</span>(f, <span class="string">"{}"</span>, field.field_type)<span class="question-mark">?</span>;
+<a href=#550 id=550 data-nosnippet>550</a>        }
+<a href=#551 id=551 data-nosnippet>551</a>        <span class="macro">write!</span>(f, <span class="string">"&gt;"</span>)
+<a href=#552 id=552 data-nosnippet>552</a>    }
+<a href=#553 id=553 data-nosnippet>553</a>}
+<a href=#554 id=554 data-nosnippet>554</a>
+<a href=#555 id=555 data-nosnippet>555</a><span class="attr">#[derive(Debug, PartialEq, Serialize, Deserialize, Eq, Clone)]
+<a href=#556 id=556 data-nosnippet>556</a>#[serde(try_from = <span class="string">"SerdeNestedField"</span>, into = <span class="string">"SerdeNestedField"</span>)]
+<a href=#557 id=557 data-nosnippet>557</a></span><span class="doccomment">/// A struct is a tuple of typed values. Each field in the tuple is named and has an integer id that is unique in the table schema.
+<a href=#558 id=558 data-nosnippet>558</a>/// Each field can be either optional or required, meaning that values can (or cannot) be null. Fields may be any type.
+<a href=#559 id=559 data-nosnippet>559</a>/// Fields may have an optional comment or doc string. Fields can have default values.
+<a href=#560 id=560 data-nosnippet>560</a></span><span class="kw">pub struct </span>NestedField {
+<a href=#561 id=561 data-nosnippet>561</a>    <span class="doccomment">/// Id unique in table schema
+<a href=#562 id=562 data-nosnippet>562</a>    </span><span class="kw">pub </span>id: i32,
+<a href=#563 id=563 data-nosnippet>563</a>    <span class="doccomment">/// Field Name
+<a href=#564 id=564 data-nosnippet>564</a>    </span><span class="kw">pub </span>name: String,
+<a href=#565 id=565 data-nosnippet>565</a>    <span class="doccomment">/// Optional or required
+<a href=#566 id=566 data-nosnippet>566</a>    </span><span class="kw">pub </span>required: bool,
+<a href=#567 id=567 data-nosnippet>567</a>    <span class="doccomment">/// Datatype
+<a href=#568 id=568 data-nosnippet>568</a>    </span><span class="kw">pub </span>field_type: Box&lt;Type&gt;,
+<a href=#569 id=569 data-nosnippet>569</a>    <span class="doccomment">/// Fields may have an optional comment or doc string.
+<a href=#570 id=570 data-nosnippet>570</a>    </span><span class="kw">pub </span>doc: <span class="prelude-ty">Option</span>&lt;String&gt;,
+<a href=#571 id=571 data-nosnippet>571</a>    <span class="doccomment">/// Used to populate the field’s value for all records that were written before the field was added to the schema
+<a href=#572 id=572 data-nosnippet>572</a>    </span><span class="kw">pub </span>initial_default: <span class="prelude-ty">Option</span>&lt;Literal&gt;,
+<a href=#573 id=573 data-nosnippet>573</a>    <span class="doccomment">/// Used to populate the field’s value for any records written after the field was added to the schema, if the writer does not supply the field’s value
+<a href=#574 id=574 data-nosnippet>574</a>    </span><span class="kw">pub </span>write_default: <span class="prelude-ty">Option</span>&lt;Literal&gt;,
+<a href=#575 id=575 data-nosnippet>575</a>}
+<a href=#576 id=576 data-nosnippet>576</a>
+<a href=#577 id=577 data-nosnippet>577</a><span class="attr">#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
+<a href=#578 id=578 data-nosnippet>578</a>#[serde(rename_all = <span class="string">"kebab-case"</span>)]
+<a href=#579 id=579 data-nosnippet>579</a></span><span class="kw">struct </span>SerdeNestedField {
+<a href=#580 id=580 data-nosnippet>580</a>    <span class="kw">pub </span>id: i32,
+<a href=#581 id=581 data-nosnippet>581</a>    <span class="kw">pub </span>name: String,
+<a href=#582 id=582 data-nosnippet>582</a>    <span class="kw">pub </span>required: bool,
+<a href=#583 id=583 data-nosnippet>583</a>    <span class="attr">#[serde(rename = <span class="string">"type"</span>)]
+<a href=#584 id=584 data-nosnippet>584</a>    </span><span class="kw">pub </span>field_type: Box&lt;Type&gt;,
+<a href=#585 id=585 data-nosnippet>585</a>    <span class="attr">#[serde(skip_serializing_if = <span class="string">"Option::is_none"</span>)]
+<a href=#586 id=586 data-nosnippet>586</a>    </span><span class="kw">pub </span>doc: <span class="prelude-ty">Option</span>&lt;String&gt;,
+<a href=#587 id=587 data-nosnippet>587</a>    <span class="attr">#[serde(skip_serializing_if = <span class="string">"Option::is_none"</span>)]
+<a href=#588 id=588 data-nosnippet>588</a>    </span><span class="kw">pub </span>initial_default: <span class="prelude-ty">Option</span>&lt;JsonValue&gt;,
+<a href=#589 id=589 data-nosnippet>589</a>    <span class="attr">#[serde(skip_serializing_if = <span class="string">"Option::is_none"</span>)]
+<a href=#590 id=590 data-nosnippet>590</a>    </span><span class="kw">pub </span>write_default: <span class="prelude-ty">Option</span>&lt;JsonValue&gt;,
+<a href=#591 id=591 data-nosnippet>591</a>}
+<a href=#592 id=592 data-nosnippet>592</a>
+<a href=#593 id=593 data-nosnippet>593</a><span class="kw">impl </span>TryFrom&lt;SerdeNestedField&gt; <span class="kw">for </span>NestedField {
+<a href=#594 id=594 data-nosnippet>594</a>    <span class="kw">type </span>Error = <span class="kw">crate</span>::Error;
+<a href=#595 id=595 data-nosnippet>595</a>
+<a href=#596 id=596 data-nosnippet>596</a>    <span class="kw">fn </span>try_from(value: SerdeNestedField) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="self">Self</span>&gt; {
+<a href=#597 id=597 data-nosnippet>597</a>        <span class="kw">let </span>initial_default = value
+<a href=#598 id=598 data-nosnippet>598</a>            .initial_default
+<a href=#599 id=599 data-nosnippet>599</a>            .map(|x| Literal::try_from_json(x, <span class="kw-2">&amp;</span>value.field_type))
+<a href=#600 id=600 data-nosnippet>600</a>            .transpose()<span class="question-mark">?
+<a href=#601 id=601 data-nosnippet>601</a>            </span>.flatten();
+<a href=#602 id=602 data-nosnippet>602</a>        <span class="kw">let </span>write_default = value
+<a href=#603 id=603 data-nosnippet>603</a>            .write_default
+<a href=#604 id=604 data-nosnippet>604</a>            .map(|x| Literal::try_from_json(x, <span class="kw-2">&amp;</span>value.field_type))
+<a href=#605 id=605 data-nosnippet>605</a>            .transpose()<span class="question-mark">?
+<a href=#606 id=606 data-nosnippet>606</a>            </span>.flatten();
+<a href=#607 id=607 data-nosnippet>607</a>
+<a href=#608 id=608 data-nosnippet>608</a>        <span class="prelude-val">Ok</span>(NestedField {
+<a href=#609 id=609 data-nosnippet>609</a>            id: value.id,
+<a href=#610 id=610 data-nosnippet>610</a>            name: value.name,
+<a href=#611 id=611 data-nosnippet>611</a>            required: value.required,
+<a href=#612 id=612 data-nosnippet>612</a>            initial_default,
+<a href=#613 id=613 data-nosnippet>613</a>            write_default,
+<a href=#614 id=614 data-nosnippet>614</a>            field_type: value.field_type,
+<a href=#615 id=615 data-nosnippet>615</a>            doc: value.doc,
+<a href=#616 id=616 data-nosnippet>616</a>        })
+<a href=#617 id=617 data-nosnippet>617</a>    }
+<a href=#618 id=618 data-nosnippet>618</a>}
+<a href=#619 id=619 data-nosnippet>619</a>
+<a href=#620 id=620 data-nosnippet>620</a><span class="kw">impl </span>From&lt;NestedField&gt; <span class="kw">for </span>SerdeNestedField {
+<a href=#621 id=621 data-nosnippet>621</a>    <span class="kw">fn </span>from(value: NestedField) -&gt; <span class="self">Self </span>{
+<a href=#622 id=622 data-nosnippet>622</a>        <span class="kw">let </span>initial_default = value.initial_default.map(|x| x.try_into_json(<span class="kw-2">&amp;</span>value.field_type).expect(<span class="string">"We should have checked this in NestedField::with_initial_default, it can't be converted to json value"</span>));
+<a href=#623 id=623 data-nosnippet>623</a>        <span class="kw">let </span>write_default = value.write_default.map(|x| x.try_into_json(<span class="kw-2">&amp;</span>value.field_type).expect(<span class="string">"We should have checked this in NestedField::with_write_default, it can't be converted to json value"</span>));
+<a href=#624 id=624 data-nosnippet>624</a>        SerdeNestedField {
+<a href=#625 id=625 data-nosnippet>625</a>            id: value.id,
+<a href=#626 id=626 data-nosnippet>626</a>            name: value.name,
+<a href=#627 id=627 data-nosnippet>627</a>            required: value.required,
+<a href=#628 id=628 data-nosnippet>628</a>            field_type: value.field_type,
+<a href=#629 id=629 data-nosnippet>629</a>            doc: value.doc,
+<a href=#630 id=630 data-nosnippet>630</a>            initial_default,
+<a href=#631 id=631 data-nosnippet>631</a>            write_default,
+<a href=#632 id=632 data-nosnippet>632</a>        }
+<a href=#633 id=633 data-nosnippet>633</a>    }
+<a href=#634 id=634 data-nosnippet>634</a>}
+<a href=#635 id=635 data-nosnippet>635</a>
+<a href=#636 id=636 data-nosnippet>636</a><span class="doccomment">/// Reference to nested field.
+<a href=#637 id=637 data-nosnippet>637</a></span><span class="kw">pub type </span>NestedFieldRef = Arc&lt;NestedField&gt;;
+<a href=#638 id=638 data-nosnippet>638</a>
+<a href=#639 id=639 data-nosnippet>639</a><span class="kw">impl </span>NestedField {
+<a href=#640 id=640 data-nosnippet>640</a>    <span class="doccomment">/// Construct a new field.
+<a href=#641 id=641 data-nosnippet>641</a>    </span><span class="kw">pub fn </span>new(id: i32, name: <span class="kw">impl </span>ToString, field_type: Type, required: bool) -&gt; <span class="self">Self </span>{
+<a href=#642 id=642 data-nosnippet>642</a>        <span class="self">Self </span>{
+<a href=#643 id=643 data-nosnippet>643</a>            id,
+<a href=#644 id=644 data-nosnippet>644</a>            name: name.to_string(),
+<a href=#645 id=645 data-nosnippet>645</a>            required,
+<a href=#646 id=646 data-nosnippet>646</a>            field_type: Box::new(field_type),
+<a href=#647 id=647 data-nosnippet>647</a>            doc: <span class="prelude-val">None</span>,
+<a href=#648 id=648 data-nosnippet>648</a>            initial_default: <span class="prelude-val">None</span>,
+<a href=#649 id=649 data-nosnippet>649</a>            write_default: <span class="prelude-val">None</span>,
+<a href=#650 id=650 data-nosnippet>650</a>        }
+<a href=#651 id=651 data-nosnippet>651</a>    }
+<a href=#652 id=652 data-nosnippet>652</a>
+<a href=#653 id=653 data-nosnippet>653</a>    <span class="doccomment">/// Construct a required field.
+<a href=#654 id=654 data-nosnippet>654</a>    </span><span class="kw">pub fn </span>required(id: i32, name: <span class="kw">impl </span>ToString, field_type: Type) -&gt; <span class="self">Self </span>{
+<a href=#655 id=655 data-nosnippet>655</a>        <span class="self">Self</span>::new(id, name, field_type, <span class="bool-val">true</span>)
+<a href=#656 id=656 data-nosnippet>656</a>    }
+<a href=#657 id=657 data-nosnippet>657</a>
+<a href=#658 id=658 data-nosnippet>658</a>    <span class="doccomment">/// Construct an optional field.
+<a href=#659 id=659 data-nosnippet>659</a>    </span><span class="kw">pub fn </span>optional(id: i32, name: <span class="kw">impl </span>ToString, field_type: Type) -&gt; <span class="self">Self </span>{
+<a href=#660 id=660 data-nosnippet>660</a>        <span class="self">Self</span>::new(id, name, field_type, <span class="bool-val">false</span>)
+<a href=#661 id=661 data-nosnippet>661</a>    }
+<a href=#662 id=662 data-nosnippet>662</a>
+<a href=#663 id=663 data-nosnippet>663</a>    <span class="doccomment">/// Construct list type's element field.
+<a href=#664 id=664 data-nosnippet>664</a>    </span><span class="kw">pub fn </span>list_element(id: i32, field_type: Type, required: bool) -&gt; <span class="self">Self </span>{
+<a href=#665 id=665 data-nosnippet>665</a>        <span class="self">Self</span>::new(id, LIST_FIELD_NAME, field_type, required)
+<a href=#666 id=666 data-nosnippet>666</a>    }
+<a href=#667 id=667 data-nosnippet>667</a>
+<a href=#668 id=668 data-nosnippet>668</a>    <span class="doccomment">/// Construct map type's key field.
+<a href=#669 id=669 data-nosnippet>669</a>    </span><span class="kw">pub fn </span>map_key_element(id: i32, field_type: Type) -&gt; <span class="self">Self </span>{
+<a href=#670 id=670 data-nosnippet>670</a>        <span class="self">Self</span>::required(id, MAP_KEY_FIELD_NAME, field_type)
+<a href=#671 id=671 data-nosnippet>671</a>    }
+<a href=#672 id=672 data-nosnippet>672</a>
+<a href=#673 id=673 data-nosnippet>673</a>    <span class="doccomment">/// Construct map type's value field.
+<a href=#674 id=674 data-nosnippet>674</a>    </span><span class="kw">pub fn </span>map_value_element(id: i32, field_type: Type, required: bool) -&gt; <span class="self">Self </span>{
+<a href=#675 id=675 data-nosnippet>675</a>        <span class="self">Self</span>::new(id, MAP_VALUE_FIELD_NAME, field_type, required)
+<a href=#676 id=676 data-nosnippet>676</a>    }
+<a href=#677 id=677 data-nosnippet>677</a>
+<a href=#678 id=678 data-nosnippet>678</a>    <span class="doccomment">/// Set the field's doc.
+<a href=#679 id=679 data-nosnippet>679</a>    </span><span class="kw">pub fn </span>with_doc(<span class="kw-2">mut </span><span class="self">self</span>, doc: <span class="kw">impl </span>ToString) -&gt; <span class="self">Self </span>{
+<a href=#680 id=680 data-nosnippet>680</a>        <span class="self">self</span>.doc = <span class="prelude-val">Some</span>(doc.to_string());
+<a href=#681 id=681 data-nosnippet>681</a>        <span class="self">self
+<a href=#682 id=682 data-nosnippet>682</a>    </span>}
+<a href=#683 id=683 data-nosnippet>683</a>
+<a href=#684 id=684 data-nosnippet>684</a>    <span class="doccomment">/// Set the field's initial default value.
+<a href=#685 id=685 data-nosnippet>685</a>    </span><span class="kw">pub fn </span>with_initial_default(<span class="kw-2">mut </span><span class="self">self</span>, value: Literal) -&gt; <span class="self">Self </span>{
+<a href=#686 id=686 data-nosnippet>686</a>        <span class="self">self</span>.initial_default = <span class="prelude-val">Some</span>(value);
+<a href=#687 id=687 data-nosnippet>687</a>        <span class="self">self
+<a href=#688 id=688 data-nosnippet>688</a>    </span>}
+<a href=#689 id=689 data-nosnippet>689</a>
+<a href=#690 id=690 data-nosnippet>690</a>    <span class="doccomment">/// Set the field's initial default value.
+<a href=#691 id=691 data-nosnippet>691</a>    </span><span class="kw">pub fn </span>with_write_default(<span class="kw-2">mut </span><span class="self">self</span>, value: Literal) -&gt; <span class="self">Self </span>{
+<a href=#692 id=692 data-nosnippet>692</a>        <span class="self">self</span>.write_default = <span class="prelude-val">Some</span>(value);
+<a href=#693 id=693 data-nosnippet>693</a>        <span class="self">self
+<a href=#694 id=694 data-nosnippet>694</a>    </span>}
+<a href=#695 id=695 data-nosnippet>695</a>
+<a href=#696 id=696 data-nosnippet>696</a>    <span class="doccomment">/// Set the id of the field.
+<a href=#697 id=697 data-nosnippet>697</a>    </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>with_id(<span class="kw-2">mut </span><span class="self">self</span>, id: i32) -&gt; <span class="self">Self </span>{
+<a href=#698 id=698 data-nosnippet>698</a>        <span class="self">self</span>.id = id;
+<a href=#699 id=699 data-nosnippet>699</a>        <span class="self">self
+<a href=#700 id=700 data-nosnippet>700</a>    </span>}
+<a href=#701 id=701 data-nosnippet>701</a>}
+<a href=#702 id=702 data-nosnippet>702</a>
+<a href=#703 id=703 data-nosnippet>703</a><span class="kw">impl </span>fmt::Display <span class="kw">for </span>NestedField {
+<a href=#704 id=704 data-nosnippet>704</a>    <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter) -&gt; fmt::Result {
+<a href=#705 id=705 data-nosnippet>705</a>        <span class="macro">write!</span>(f, <span class="string">"{}: "</span>, <span class="self">self</span>.id)<span class="question-mark">?</span>;
+<a href=#706 id=706 data-nosnippet>706</a>        <span class="macro">write!</span>(f, <span class="string">"{}: "</span>, <span class="self">self</span>.name)<span class="question-mark">?</span>;
+<a href=#707 id=707 data-nosnippet>707</a>        <span class="kw">if </span><span class="self">self</span>.required {
+<a href=#708 id=708 data-nosnippet>708</a>            <span class="macro">write!</span>(f, <span class="string">"required "</span>)<span class="question-mark">?</span>;
+<a href=#709 id=709 data-nosnippet>709</a>        } <span class="kw">else </span>{
+<a href=#710 id=710 data-nosnippet>710</a>            <span class="macro">write!</span>(f, <span class="string">"optional "</span>)<span class="question-mark">?</span>;
 <a href=#711 id=711 data-nosnippet>711</a>        }
-<a href=#712 id=712 data-nosnippet>712</a>        <span class="prelude-val">Ok</span>(())
-<a href=#713 id=713 data-nosnippet>713</a>    }
-<a href=#714 id=714 data-nosnippet>714</a>}
-<a href=#715 id=715 data-nosnippet>715</a>
-<a href=#716 id=716 data-nosnippet>716</a><span class="attr">#[derive(Debug, PartialEq, Eq, Clone)]
-<a href=#717 id=717 data-nosnippet>717</a></span><span class="doccomment">/// A list is a collection of values with some element type. The element field has an integer id that is unique in the table schema.
-<a href=#718 id=718 data-nosnippet>718</a>/// Elements can be either optional or required. Element types may be any type.
-<a href=#719 id=719 data-nosnippet>719</a></span><span class="kw">pub struct </span>ListType {
-<a href=#720 id=720 data-nosnippet>720</a>    <span class="doccomment">/// Element field of list type.
-<a href=#721 id=721 data-nosnippet>721</a>    </span><span class="kw">pub </span>element_field: NestedFieldRef,
-<a href=#722 id=722 data-nosnippet>722</a>}
-<a href=#723 id=723 data-nosnippet>723</a>
-<a href=#724 id=724 data-nosnippet>724</a><span class="kw">impl </span>ListType {
-<a href=#725 id=725 data-nosnippet>725</a>    <span class="doccomment">/// Construct a list type with the given element field.
-<a href=#726 id=726 data-nosnippet>726</a>    </span><span class="kw">pub fn </span>new(element_field: NestedFieldRef) -&gt; <span class="self">Self </span>{
-<a href=#727 id=727 data-nosnippet>727</a>        <span class="self">Self </span>{ element_field }
-<a href=#728 id=728 data-nosnippet>728</a>    }
-<a href=#729 id=729 data-nosnippet>729</a>}
-<a href=#730 id=730 data-nosnippet>730</a>
-<a href=#731 id=731 data-nosnippet>731</a><span class="doccomment">/// Module for type serialization/deserialization.
-<a href=#732 id=732 data-nosnippet>732</a></span><span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">mod </span>_serde {
-<a href=#733 id=733 data-nosnippet>733</a>    <span class="kw">use </span>std::borrow::Cow;
+<a href=#712 id=712 data-nosnippet>712</a>        <span class="macro">write!</span>(f, <span class="string">"{} "</span>, <span class="self">self</span>.field_type)<span class="question-mark">?</span>;
+<a href=#713 id=713 data-nosnippet>713</a>        <span class="kw">if let </span><span class="prelude-val">Some</span>(doc) = <span class="kw-2">&amp;</span><span class="self">self</span>.doc {
+<a href=#714 id=714 data-nosnippet>714</a>            <span class="macro">write!</span>(f, <span class="string">"{doc}"</span>)<span class="question-mark">?</span>;
+<a href=#715 id=715 data-nosnippet>715</a>        }
+<a href=#716 id=716 data-nosnippet>716</a>        <span class="prelude-val">Ok</span>(())
+<a href=#717 id=717 data-nosnippet>717</a>    }
+<a href=#718 id=718 data-nosnippet>718</a>}
+<a href=#719 id=719 data-nosnippet>719</a>
+<a href=#720 id=720 data-nosnippet>720</a><span class="attr">#[derive(Debug, PartialEq, Eq, Clone)]
+<a href=#721 id=721 data-nosnippet>721</a></span><span class="doccomment">/// A list is a collection of values with some element type. The element field has an integer id that is unique in the table schema.
+<a href=#722 id=722 data-nosnippet>722</a>/// Elements can be either optional or required. Element types may be any type.
+<a href=#723 id=723 data-nosnippet>723</a></span><span class="kw">pub struct </span>ListType {
+<a href=#724 id=724 data-nosnippet>724</a>    <span class="doccomment">/// Element field of list type.
+<a href=#725 id=725 data-nosnippet>725</a>    </span><span class="kw">pub </span>element_field: NestedFieldRef,
+<a href=#726 id=726 data-nosnippet>726</a>}
+<a href=#727 id=727 data-nosnippet>727</a>
+<a href=#728 id=728 data-nosnippet>728</a><span class="kw">impl </span>ListType {
+<a href=#729 id=729 data-nosnippet>729</a>    <span class="doccomment">/// Construct a list type with the given element field.
+<a href=#730 id=730 data-nosnippet>730</a>    </span><span class="kw">pub fn </span>new(element_field: NestedFieldRef) -&gt; <span class="self">Self </span>{
+<a href=#731 id=731 data-nosnippet>731</a>        <span class="self">Self </span>{ element_field }
+<a href=#732 id=732 data-nosnippet>732</a>    }
+<a href=#733 id=733 data-nosnippet>733</a>}
 <a href=#734 id=734 data-nosnippet>734</a>
-<a href=#735 id=735 data-nosnippet>735</a>    <span class="kw">use </span>serde_derive::{Deserialize, Serialize};
-<a href=#736 id=736 data-nosnippet>736</a>
-<a href=#737 id=737 data-nosnippet>737</a>    <span class="kw">use </span><span class="kw">crate</span>::spec::datatypes::Type::Map;
-<a href=#738 id=738 data-nosnippet>738</a>    <span class="kw">use </span><span class="kw">crate</span>::spec::datatypes::{
-<a href=#739 id=739 data-nosnippet>739</a>        ListType, MapType, NestedField, NestedFieldRef, PrimitiveType, StructType, Type,
-<a href=#740 id=740 data-nosnippet>740</a>        VariantType,
-<a href=#741 id=741 data-nosnippet>741</a>    };
-<a href=#742 id=742 data-nosnippet>742</a>
-<a href=#743 id=743 data-nosnippet>743</a>    <span class="doccomment">/// List type for serialization and deserialization
-<a href=#744 id=744 data-nosnippet>744</a>    </span><span class="attr">#[derive(Serialize, Deserialize)]
-<a href=#745 id=745 data-nosnippet>745</a>    #[serde(untagged)]
-<a href=#746 id=746 data-nosnippet>746</a>    </span><span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">enum </span>SerdeType&lt;<span class="lifetime">'a</span>&gt; {
-<a href=#747 id=747 data-nosnippet>747</a>        <span class="attr">#[serde(rename_all = <span class="string">"kebab-case"</span>)]
-<a href=#748 id=748 data-nosnippet>748</a>        </span>List {
-<a href=#749 id=749 data-nosnippet>749</a>            r#type: String,
-<a href=#750 id=750 data-nosnippet>750</a>            element_id: i32,
-<a href=#751 id=751 data-nosnippet>751</a>            element_required: bool,
-<a href=#752 id=752 data-nosnippet>752</a>            element: Cow&lt;<span class="lifetime">'a</span>, Type&gt;,
-<a href=#753 id=753 data-nosnippet>753</a>        },
-<a href=#754 id=754 data-nosnippet>754</a>        Struct {
-<a href=#755 id=755 data-nosnippet>755</a>            r#type: String,
-<a href=#756 id=756 data-nosnippet>756</a>            fields: Cow&lt;<span class="lifetime">'a</span>, [NestedFieldRef]&gt;,
+<a href=#735 id=735 data-nosnippet>735</a><span class="doccomment">/// Module for type serialization/deserialization.
+<a href=#736 id=736 data-nosnippet>736</a></span><span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">mod </span>_serde {
+<a href=#737 id=737 data-nosnippet>737</a>    <span class="kw">use </span>std::borrow::Cow;
+<a href=#738 id=738 data-nosnippet>738</a>
+<a href=#739 id=739 data-nosnippet>739</a>    <span class="kw">use </span>serde_derive::{Deserialize, Serialize};
+<a href=#740 id=740 data-nosnippet>740</a>
+<a href=#741 id=741 data-nosnippet>741</a>    <span class="kw">use </span><span class="kw">crate</span>::spec::datatypes::Type::Map;
+<a href=#742 id=742 data-nosnippet>742</a>    <span class="kw">use </span><span class="kw">crate</span>::spec::datatypes::{
+<a href=#743 id=743 data-nosnippet>743</a>        ListType, MapType, NestedField, NestedFieldRef, PrimitiveType, StructType, Type,
+<a href=#744 id=744 data-nosnippet>744</a>        VariantType,
+<a href=#745 id=745 data-nosnippet>745</a>    };
+<a href=#746 id=746 data-nosnippet>746</a>
+<a href=#747 id=747 data-nosnippet>747</a>    <span class="doccomment">/// List type for serialization and deserialization
+<a href=#748 id=748 data-nosnippet>748</a>    </span><span class="attr">#[derive(Serialize, Deserialize)]
+<a href=#749 id=749 data-nosnippet>749</a>    #[serde(untagged)]
+<a href=#750 id=750 data-nosnippet>750</a>    </span><span class="kw">pub</span>(<span class="kw">super</span>) <span class="kw">enum </span>SerdeType&lt;<span class="lifetime">'a</span>&gt; {
+<a href=#751 id=751 data-nosnippet>751</a>        <span class="attr">#[serde(rename_all = <span class="string">"kebab-case"</span>)]
+<a href=#752 id=752 data-nosnippet>752</a>        </span>List {
+<a href=#753 id=753 data-nosnippet>753</a>            r#type: String,
+<a href=#754 id=754 data-nosnippet>754</a>            element_id: i32,
+<a href=#755 id=755 data-nosnippet>755</a>            element_required: bool,
+<a href=#756 id=756 data-nosnippet>756</a>            element: Cow&lt;<span class="lifetime">'a</span>, Type&gt;,
 <a href=#757 id=757 data-nosnippet>757</a>        },
-<a href=#758 id=758 data-nosnippet>758</a>        <span class="attr">#[serde(rename_all = <span class="string">"kebab-case"</span>)]
-<a href=#759 id=759 data-nosnippet>759</a>        </span>Map {
-<a href=#760 id=760 data-nosnippet>760</a>            r#type: String,
-<a href=#761 id=761 data-nosnippet>761</a>            key_id: i32,
-<a href=#762 id=762 data-nosnippet>762</a>            key: Cow&lt;<span class="lifetime">'a</span>, Type&gt;,
-<a href=#763 id=763 data-nosnippet>763</a>            value_id: i32,
-<a href=#764 id=764 data-nosnippet>764</a>            value_required: bool,
-<a href=#765 id=765 data-nosnippet>765</a>            value: Cow&lt;<span class="lifetime">'a</span>, Type&gt;,
-<a href=#766 id=766 data-nosnippet>766</a>        },
-<a href=#767 id=767 data-nosnippet>767</a>        Primitive(PrimitiveType),
-<a href=#768 id=768 data-nosnippet>768</a>        Variant(VariantType),
-<a href=#769 id=769 data-nosnippet>769</a>    }
-<a href=#770 id=770 data-nosnippet>770</a>
-<a href=#771 id=771 data-nosnippet>771</a>    <span class="kw">impl </span>From&lt;SerdeType&lt;<span class="lifetime">'_</span>&gt;&gt; <span class="kw">for </span>Type {
-<a href=#772 id=772 data-nosnippet>772</a>        <span class="kw">fn </span>from(value: SerdeType) -&gt; <span class="self">Self </span>{
-<a href=#773 id=773 data-nosnippet>773</a>            <span class="kw">match </span>value {
-<a href=#774 id=774 data-nosnippet>774</a>                SerdeType::List {
-<a href=#775 id=775 data-nosnippet>775</a>                    r#type: <span class="kw">_</span>,
-<a href=#776 id=776 data-nosnippet>776</a>                    element_id,
-<a href=#777 id=777 data-nosnippet>777</a>                    element_required,
-<a href=#778 id=778 data-nosnippet>778</a>                    element,
-<a href=#779 id=779 data-nosnippet>779</a>                } =&gt; <span class="self">Self</span>::List(ListType {
-<a href=#780 id=780 data-nosnippet>780</a>                    element_field: NestedField::list_element(
-<a href=#781 id=781 data-nosnippet>781</a>                        element_id,
-<a href=#782 id=782 data-nosnippet>782</a>                        element.into_owned(),
-<a href=#783 id=783 data-nosnippet>783</a>                        element_required,
-<a href=#784 id=784 data-nosnippet>784</a>                    )
-<a href=#785 id=785 data-nosnippet>785</a>                    .into(),
-<a href=#786 id=786 data-nosnippet>786</a>                }),
-<a href=#787 id=787 data-nosnippet>787</a>                SerdeType::Map {
-<a href=#788 id=788 data-nosnippet>788</a>                    r#type: <span class="kw">_</span>,
-<a href=#789 id=789 data-nosnippet>789</a>                    key_id,
-<a href=#790 id=790 data-nosnippet>790</a>                    key,
-<a href=#791 id=791 data-nosnippet>791</a>                    value_id,
-<a href=#792 id=792 data-nosnippet>792</a>                    value_required,
-<a href=#793 id=793 data-nosnippet>793</a>                    value,
-<a href=#794 id=794 data-nosnippet>794</a>                } =&gt; Map(MapType {
-<a href=#795 id=795 data-nosnippet>795</a>                    key_field: NestedField::map_key_element(key_id, key.into_owned()).into(),
-<a href=#796 id=796 data-nosnippet>796</a>                    value_field: NestedField::map_value_element(
-<a href=#797 id=797 data-nosnippet>797</a>                        value_id,
-<a href=#798 id=798 data-nosnippet>798</a>                        value.into_owned(),
-<a href=#799 id=799 data-nosnippet>799</a>                        value_required,
-<a href=#800 id=800 data-nosnippet>800</a>                    )
-<a href=#801 id=801 data-nosnippet>801</a>                    .into(),
-<a href=#802 id=802 data-nosnippet>802</a>                }),
-<a href=#803 id=803 data-nosnippet>803</a>                SerdeType::Struct { r#type: <span class="kw">_</span>, fields } =&gt; {
-<a href=#804 id=804 data-nosnippet>804</a>                    <span class="self">Self</span>::Struct(StructType::new(fields.into_owned()))
-<a href=#805 id=805 data-nosnippet>805</a>                }
-<a href=#806 id=806 data-nosnippet>806</a>                SerdeType::Primitive(p) =&gt; <span class="self">Self</span>::Primitive(p),
-<a href=#807 id=807 data-nosnippet>807</a>                SerdeType::Variant(v) =&gt; <span class="self">Self</span>::Variant(v),
-<a href=#808 id=808 data-nosnippet>808</a>            }
-<a href=#809 id=809 data-nosnippet>809</a>        }
-<a href=#810 id=810 data-nosnippet>810</a>    }
-<a href=#811 id=811 data-nosnippet>811</a>
-<a href=#812 id=812 data-nosnippet>812</a>    <span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; From&lt;<span class="kw-2">&amp;</span><span class="lifetime">'a </span>Type&gt; <span class="kw">for </span>SerdeType&lt;<span class="lifetime">'a</span>&gt; {
-<a href=#813 id=813 data-nosnippet>813</a>        <span class="kw">fn </span>from(value: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>Type) -&gt; <span class="self">Self </span>{
-<a href=#814 id=814 data-nosnippet>814</a>            <span class="kw">match </span>value {
-<a href=#815 id=815 data-nosnippet>815</a>                Type::List(list) =&gt; SerdeType::List {
-<a href=#816 id=816 data-nosnippet>816</a>                    r#type: <span class="string">"list"</span>.to_string(),
-<a href=#817 id=817 data-nosnippet>817</a>                    element_id: list.element_field.id,
-<a href=#818 id=818 data-nosnippet>818</a>                    element_required: list.element_field.required,
-<a href=#819 id=819 data-nosnippet>819</a>                    element: Cow::Borrowed(<span class="kw-2">&amp;</span>list.element_field.field_type),
-<a href=#820 id=820 data-nosnippet>820</a>                },
-<a href=#821 id=821 data-nosnippet>821</a>                Map(map) =&gt; SerdeType::Map {
-<a href=#822 id=822 data-nosnippet>822</a>                    r#type: <span class="string">"map"</span>.to_string(),
-<a href=#823 id=823 data-nosnippet>823</a>                    key_id: map.key_field.id,
-<a href=#824 id=824 data-nosnippet>824</a>                    key: Cow::Borrowed(<span class="kw-2">&amp;</span>map.key_field.field_type),
-<a href=#825 id=825 data-nosnippet>825</a>                    value_id: map.value_field.id,
-<a href=#826 id=826 data-nosnippet>826</a>                    value_required: map.value_field.required,
-<a href=#827 id=827 data-nosnippet>827</a>                    value: Cow::Borrowed(<span class="kw-2">&amp;</span>map.value_field.field_type),
-<a href=#828 id=828 data-nosnippet>828</a>                },
-<a href=#829 id=829 data-nosnippet>829</a>                Type::Struct(s) =&gt; SerdeType::Struct {
-<a href=#830 id=830 data-nosnippet>830</a>                    r#type: <span class="string">"struct"</span>.to_string(),
-<a href=#831 id=831 data-nosnippet>831</a>                    fields: Cow::Borrowed(<span class="kw-2">&amp;</span>s.fields),
+<a href=#758 id=758 data-nosnippet>758</a>        Struct {
+<a href=#759 id=759 data-nosnippet>759</a>            r#type: String,
+<a href=#760 id=760 data-nosnippet>760</a>            fields: Cow&lt;<span class="lifetime">'a</span>, [NestedFieldRef]&gt;,
+<a href=#761 id=761 data-nosnippet>761</a>        },
+<a href=#762 id=762 data-nosnippet>762</a>        <span class="attr">#[serde(rename_all = <span class="string">"kebab-case"</span>)]
+<a href=#763 id=763 data-nosnippet>763</a>        </span>Map {
+<a href=#764 id=764 data-nosnippet>764</a>            r#type: String,
+<a href=#765 id=765 data-nosnippet>765</a>            key_id: i32,
+<a href=#766 id=766 data-nosnippet>766</a>            key: Cow&lt;<span class="lifetime">'a</span>, Type&gt;,
+<a href=#767 id=767 data-nosnippet>767</a>            value_id: i32,
+<a href=#768 id=768 data-nosnippet>768</a>            value_required: bool,
+<a href=#769 id=769 data-nosnippet>769</a>            value: Cow&lt;<span class="lifetime">'a</span>, Type&gt;,
+<a href=#770 id=770 data-nosnippet>770</a>        },
+<a href=#771 id=771 data-nosnippet>771</a>        Primitive(PrimitiveType),
+<a href=#772 id=772 data-nosnippet>772</a>        Variant(VariantType),
+<a href=#773 id=773 data-nosnippet>773</a>    }
+<a href=#774 id=774 data-nosnippet>774</a>
+<a href=#775 id=775 data-nosnippet>775</a>    <span class="kw">impl </span>From&lt;SerdeType&lt;<span class="lifetime">'_</span>&gt;&gt; <span class="kw">for </span>Type {
+<a href=#776 id=776 data-nosnippet>776</a>        <span class="kw">fn </span>from(value: SerdeType) -&gt; <span class="self">Self </span>{
+<a href=#777 id=777 data-nosnippet>777</a>            <span class="kw">match </span>value {
+<a href=#778 id=778 data-nosnippet>778</a>                SerdeType::List {
+<a href=#779 id=779 data-nosnippet>779</a>                    r#type: <span class="kw">_</span>,
+<a href=#780 id=780 data-nosnippet>780</a>                    element_id,
+<a href=#781 id=781 data-nosnippet>781</a>                    element_required,
+<a href=#782 id=782 data-nosnippet>782</a>                    element,
+<a href=#783 id=783 data-nosnippet>783</a>                } =&gt; <span class="self">Self</span>::List(ListType {
+<a href=#784 id=784 data-nosnippet>784</a>                    element_field: NestedField::list_element(
+<a href=#785 id=785 data-nosnippet>785</a>                        element_id,
+<a href=#786 id=786 data-nosnippet>786</a>                        element.into_owned(),
+<a href=#787 id=787 data-nosnippet>787</a>                        element_required,
+<a href=#788 id=788 data-nosnippet>788</a>                    )
+<a href=#789 id=789 data-nosnippet>789</a>                    .into(),
+<a href=#790 id=790 data-nosnippet>790</a>                }),
+<a href=#791 id=791 data-nosnippet>791</a>                SerdeType::Map {
+<a href=#792 id=792 data-nosnippet>792</a>                    r#type: <span class="kw">_</span>,
+<a href=#793 id=793 data-nosnippet>793</a>                    key_id,
+<a href=#794 id=794 data-nosnippet>794</a>                    key,
+<a href=#795 id=795 data-nosnippet>795</a>                    value_id,
+<a href=#796 id=796 data-nosnippet>796</a>                    value_required,
+<a href=#797 id=797 data-nosnippet>797</a>                    value,
+<a href=#798 id=798 data-nosnippet>798</a>                } =&gt; Map(MapType {
+<a href=#799 id=799 data-nosnippet>799</a>                    key_field: NestedField::map_key_element(key_id, key.into_owned()).into(),
+<a href=#800 id=800 data-nosnippet>800</a>                    value_field: NestedField::map_value_element(
+<a href=#801 id=801 data-nosnippet>801</a>                        value_id,
+<a href=#802 id=802 data-nosnippet>802</a>                        value.into_owned(),
+<a href=#803 id=803 data-nosnippet>803</a>                        value_required,
+<a href=#804 id=804 data-nosnippet>804</a>                    )
+<a href=#805 id=805 data-nosnippet>805</a>                    .into(),
+<a href=#806 id=806 data-nosnippet>806</a>                }),
+<a href=#807 id=807 data-nosnippet>807</a>                SerdeType::Struct { r#type: <span class="kw">_</span>, fields } =&gt; {
+<a href=#808 id=808 data-nosnippet>808</a>                    <span class="self">Self</span>::Struct(StructType::new(fields.into_owned()))
+<a href=#809 id=809 data-nosnippet>809</a>                }
+<a href=#810 id=810 data-nosnippet>810</a>                SerdeType::Primitive(p) =&gt; <span class="self">Self</span>::Primitive(p),
+<a href=#811 id=811 data-nosnippet>811</a>                SerdeType::Variant(v) =&gt; <span class="self">Self</span>::Variant(v),
+<a href=#812 id=812 data-nosnippet>812</a>            }
+<a href=#813 id=813 data-nosnippet>813</a>        }
+<a href=#814 id=814 data-nosnippet>814</a>    }
+<a href=#815 id=815 data-nosnippet>815</a>
+<a href=#816 id=816 data-nosnippet>816</a>    <span class="kw">impl</span>&lt;<span class="lifetime">'a</span>&gt; From&lt;<span class="kw-2">&amp;</span><span class="lifetime">'a </span>Type&gt; <span class="kw">for </span>SerdeType&lt;<span class="lifetime">'a</span>&gt; {
+<a href=#817 id=817 data-nosnippet>817</a>        <span class="kw">fn </span>from(value: <span class="kw-2">&amp;</span><span class="lifetime">'a </span>Type) -&gt; <span class="self">Self </span>{
+<a href=#818 id=818 data-nosnippet>818</a>            <span class="kw">match </span>value {
+<a href=#819 id=819 data-nosnippet>819</a>                Type::List(list) =&gt; SerdeType::List {
+<a href=#820 id=820 data-nosnippet>820</a>                    r#type: <span class="string">"list"</span>.to_string(),
+<a href=#821 id=821 data-nosnippet>821</a>                    element_id: list.element_field.id,
+<a href=#822 id=822 data-nosnippet>822</a>                    element_required: list.element_field.required,
+<a href=#823 id=823 data-nosnippet>823</a>                    element: Cow::Borrowed(<span class="kw-2">&amp;</span>list.element_field.field_type),
+<a href=#824 id=824 data-nosnippet>824</a>                },
+<a href=#825 id=825 data-nosnippet>825</a>                Map(map) =&gt; SerdeType::Map {
+<a href=#826 id=826 data-nosnippet>826</a>                    r#type: <span class="string">"map"</span>.to_string(),
+<a href=#827 id=827 data-nosnippet>827</a>                    key_id: map.key_field.id,
+<a href=#828 id=828 data-nosnippet>828</a>                    key: Cow::Borrowed(<span class="kw-2">&amp;</span>map.key_field.field_type),
+<a href=#829 id=829 data-nosnippet>829</a>                    value_id: map.value_field.id,
+<a href=#830 id=830 data-nosnippet>830</a>                    value_required: map.value_field.required,
+<a href=#831 id=831 data-nosnippet>831</a>                    value: Cow::Borrowed(<span class="kw-2">&amp;</span>map.value_field.field_type),
 <a href=#832 id=832 data-nosnippet>832</a>                },
-<a href=#833 id=833 data-nosnippet>833</a>                Type::Primitive(p) =&gt; SerdeType::Primitive(p.clone()),
-<a href=#834 id=834 data-nosnippet>834</a>                Type::Variant(v) =&gt; SerdeType::Variant(<span class="kw-2">*</span>v),
-<a href=#835 id=835 data-nosnippet>835</a>            }
-<a href=#836 id=836 data-nosnippet>836</a>        }
-<a href=#837 id=837 data-nosnippet>837</a>    }
-<a href=#838 id=838 data-nosnippet>838</a>}
-<a href=#839 id=839 data-nosnippet>839</a>
-<a href=#840 id=840 data-nosnippet>840</a><span class="attr">#[derive(Debug, PartialEq, Eq, Clone)]
-<a href=#841 id=841 data-nosnippet>841</a></span><span class="doccomment">/// A map is a collection of key-value pairs with a key type and a value type.
-<a href=#842 id=842 data-nosnippet>842</a>/// Both the key field and value field each have an integer id that is unique in the table schema.
-<a href=#843 id=843 data-nosnippet>843</a>/// Map keys are required and map values can be either optional or required.
-<a href=#844 id=844 data-nosnippet>844</a>/// Both map keys and map values may be any type, including nested types.
-<a href=#845 id=845 data-nosnippet>845</a></span><span class="kw">pub struct </span>MapType {
-<a href=#846 id=846 data-nosnippet>846</a>    <span class="doccomment">/// Field for key.
-<a href=#847 id=847 data-nosnippet>847</a>    </span><span class="kw">pub </span>key_field: NestedFieldRef,
-<a href=#848 id=848 data-nosnippet>848</a>    <span class="doccomment">/// Field for value.
-<a href=#849 id=849 data-nosnippet>849</a>    </span><span class="kw">pub </span>value_field: NestedFieldRef,
-<a href=#850 id=850 data-nosnippet>850</a>}
-<a href=#851 id=851 data-nosnippet>851</a>
-<a href=#852 id=852 data-nosnippet>852</a><span class="kw">impl </span>MapType {
-<a href=#853 id=853 data-nosnippet>853</a>    <span class="doccomment">/// Construct a map type with the given key and value fields.
-<a href=#854 id=854 data-nosnippet>854</a>    </span><span class="kw">pub fn </span>new(key_field: NestedFieldRef, value_field: NestedFieldRef) -&gt; <span class="self">Self </span>{
-<a href=#855 id=855 data-nosnippet>855</a>        <span class="self">Self </span>{
-<a href=#856 id=856 data-nosnippet>856</a>            key_field,
-<a href=#857 id=857 data-nosnippet>857</a>            value_field,
-<a href=#858 id=858 data-nosnippet>858</a>        }
-<a href=#859 id=859 data-nosnippet>859</a>    }
-<a href=#860 id=860 data-nosnippet>860</a>
-<a href=#861 id=861 data-nosnippet>861</a>    <span class="doccomment">/// Construct an optional map type with the given key and value fields.
-<a href=#862 id=862 data-nosnippet>862</a>    </span><span class="kw">pub fn </span>optional(key_id: i32, key_type: Type, value_id: i32, value_type: Type) -&gt; <span class="self">Self </span>{
-<a href=#863 id=863 data-nosnippet>863</a>        <span class="self">Self </span>{
-<a href=#864 id=864 data-nosnippet>864</a>            key_field: NestedField::map_key_element(key_id, key_type).into(),
-<a href=#865 id=865 data-nosnippet>865</a>            value_field: NestedField::map_value_element(value_id, value_type, <span class="bool-val">false</span>).into(),
-<a href=#866 id=866 data-nosnippet>866</a>        }
-<a href=#867 id=867 data-nosnippet>867</a>    }
-<a href=#868 id=868 data-nosnippet>868</a>
-<a href=#869 id=869 data-nosnippet>869</a>    <span class="doccomment">/// Construct a required map type with the given key and value fields.
-<a href=#870 id=870 data-nosnippet>870</a>    </span><span class="kw">pub fn </span>required(key_id: i32, key_type: Type, value_id: i32, value_type: Type) -&gt; <span class="self">Self </span>{
-<a href=#871 id=871 data-nosnippet>871</a>        <span class="self">Self </span>{
-<a href=#872 id=872 data-nosnippet>872</a>            key_field: NestedField::map_key_element(key_id, key_type).into(),
-<a href=#873 id=873 data-nosnippet>873</a>            value_field: NestedField::map_value_element(value_id, value_type, <span class="bool-val">true</span>).into(),
-<a href=#874 id=874 data-nosnippet>874</a>        }
-<a href=#875 id=875 data-nosnippet>875</a>    }
-<a href=#876 id=876 data-nosnippet>876</a>}
-<a href=#877 id=877 data-nosnippet>877</a>
-<a href=#878 id=878 data-nosnippet>878</a><span class="doccomment">/// Variant type - can hold semi-structured data of any type.
-<a href=#879 id=879 data-nosnippet>879</a>/// This is an Iceberg V3 feature.
-<a href=#880 id=880 data-nosnippet>880</a></span><span class="attr">#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
-<a href=#881 id=881 data-nosnippet>881</a></span><span class="kw">pub struct </span>VariantType;
-<a href=#882 id=882 data-nosnippet>882</a>
-<a href=#883 id=883 data-nosnippet>883</a><span class="kw">impl </span>fmt::Display <span class="kw">for </span>VariantType {
-<a href=#884 id=884 data-nosnippet>884</a>    <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter) -&gt; fmt::Result {
-<a href=#885 id=885 data-nosnippet>885</a>        <span class="macro">write!</span>(f, <span class="string">"variant"</span>)
-<a href=#886 id=886 data-nosnippet>886</a>    }
-<a href=#887 id=887 data-nosnippet>887</a>}
-<a href=#888 id=888 data-nosnippet>888</a>
-<a href=#889 id=889 data-nosnippet>889</a><span class="kw">impl </span>From&lt;VariantType&gt; <span class="kw">for </span>Type {
-<a href=#890 id=890 data-nosnippet>890</a>    <span class="kw">fn </span>from(<span class="kw">_</span>: VariantType) -&gt; <span class="self">Self </span>{
-<a href=#891 id=891 data-nosnippet>891</a>        Type::Variant(VariantType)
-<a href=#892 id=892 data-nosnippet>892</a>    }
-<a href=#893 id=893 data-nosnippet>893</a>}
-<a href=#894 id=894 data-nosnippet>894</a>
-<a href=#895 id=895 data-nosnippet>895</a><span class="kw">impl </span>Serialize <span class="kw">for </span>VariantType {
-<a href=#896 id=896 data-nosnippet>896</a>    <span class="kw">fn </span>serialize&lt;S&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, serializer: S) -&gt; std::result::Result&lt;S::Ok, S::Error&gt;
-<a href=#897 id=897 data-nosnippet>897</a>    <span class="kw">where </span>S: Serializer {
-<a href=#898 id=898 data-nosnippet>898</a>        serializer.serialize_str(<span class="string">"variant"</span>)
-<a href=#899 id=899 data-nosnippet>899</a>    }
-<a href=#900 id=900 data-nosnippet>900</a>}
-<a href=#901 id=901 data-nosnippet>901</a>
-<a href=#902 id=902 data-nosnippet>902</a><span class="kw">impl</span>&lt;<span class="lifetime">'de</span>&gt; Deserialize&lt;<span class="lifetime">'de</span>&gt; <span class="kw">for </span>VariantType {
-<a href=#903 id=903 data-nosnippet>903</a>    <span class="kw">fn </span>deserialize&lt;D&gt;(deserializer: D) -&gt; std::result::Result&lt;<span class="self">Self</span>, D::Error&gt;
-<a href=#904 id=904 data-nosnippet>904</a>    <span class="kw">where </span>D: Deserializer&lt;<span class="lifetime">'de</span>&gt; {
-<a href=#905 id=905 data-nosnippet>905</a>        <span class="kw">let </span>s = String::deserialize(deserializer)<span class="question-mark">?</span>;
-<a href=#906 id=906 data-nosnippet>906</a>        <span class="kw">if </span>s == <span class="string">"variant" </span>{
-<a href=#907 id=907 data-nosnippet>907</a>            <span class="prelude-val">Ok</span>(VariantType)
-<a href=#908 id=908 data-nosnippet>908</a>        } <span class="kw">else </span>{
-<a href=#909 id=909 data-nosnippet>909</a>            <span class="prelude-val">Err</span>(D::Error::custom(<span class="macro">format!</span>(<span class="string">"expected 'variant', got '{s}'"</span>)))
-<a href=#910 id=910 data-nosnippet>910</a>        }
-<a href=#911 id=911 data-nosnippet>911</a>    }
-<a href=#912 id=912 data-nosnippet>912</a>}
-<a href=#913 id=913 data-nosnippet>913</a>
-<a href=#914 id=914 data-nosnippet>914</a><span class="attr">#[cfg(test)]
-<a href=#915 id=915 data-nosnippet>915</a></span><span class="kw">mod </span>tests {
-<a href=#916 id=916 data-nosnippet>916</a>    <span class="kw">use </span>pretty_assertions::assert_eq;
-<a href=#917 id=917 data-nosnippet>917</a>    <span class="kw">use </span>uuid::Uuid;
-<a href=#918 id=918 data-nosnippet>918</a>
-<a href=#919 id=919 data-nosnippet>919</a>    <span class="kw">use </span>super::<span class="kw-2">*</span>;
-<a href=#920 id=920 data-nosnippet>920</a>    <span class="kw">use </span><span class="kw">crate</span>::spec::values::PrimitiveLiteral;
-<a href=#921 id=921 data-nosnippet>921</a>
-<a href=#922 id=922 data-nosnippet>922</a>    <span class="kw">fn </span>check_type_serde(json: <span class="kw-2">&amp;</span>str, expected_type: Type) {
-<a href=#923 id=923 data-nosnippet>923</a>        <span class="kw">let </span>desered_type: Type = serde_json::from_str(json).unwrap();
-<a href=#924 id=924 data-nosnippet>924</a>        <span class="macro">assert_eq!</span>(desered_type, expected_type);
+<a href=#833 id=833 data-nosnippet>833</a>                Type::Struct(s) =&gt; SerdeType::Struct {
+<a href=#834 id=834 data-nosnippet>834</a>                    r#type: <span class="string">"struct"</span>.to_string(),
+<a href=#835 id=835 data-nosnippet>835</a>                    fields: Cow::Borrowed(<span class="kw-2">&amp;</span>s.fields),
+<a href=#836 id=836 data-nosnippet>836</a>                },
+<a href=#837 id=837 data-nosnippet>837</a>                Type::Primitive(p) =&gt; SerdeType::Primitive(p.clone()),
+<a href=#838 id=838 data-nosnippet>838</a>                Type::Variant(v) =&gt; SerdeType::Variant(<span class="kw-2">*</span>v),
+<a href=#839 id=839 data-nosnippet>839</a>            }
+<a href=#840 id=840 data-nosnippet>840</a>        }
+<a href=#841 id=841 data-nosnippet>841</a>    }
+<a href=#842 id=842 data-nosnippet>842</a>}
+<a href=#843 id=843 data-nosnippet>843</a>
+<a href=#844 id=844 data-nosnippet>844</a><span class="attr">#[derive(Debug, PartialEq, Eq, Clone)]
+<a href=#845 id=845 data-nosnippet>845</a></span><span class="doccomment">/// A map is a collection of key-value pairs with a key type and a value type.
+<a href=#846 id=846 data-nosnippet>846</a>/// Both the key field and value field each have an integer id that is unique in the table schema.
+<a href=#847 id=847 data-nosnippet>847</a>/// Map keys are required and map values can be either optional or required.
+<a href=#848 id=848 data-nosnippet>848</a>/// Both map keys and map values may be any type, including nested types.
+<a href=#849 id=849 data-nosnippet>849</a></span><span class="kw">pub struct </span>MapType {
+<a href=#850 id=850 data-nosnippet>850</a>    <span class="doccomment">/// Field for key.
+<a href=#851 id=851 data-nosnippet>851</a>    </span><span class="kw">pub </span>key_field: NestedFieldRef,
+<a href=#852 id=852 data-nosnippet>852</a>    <span class="doccomment">/// Field for value.
+<a href=#853 id=853 data-nosnippet>853</a>    </span><span class="kw">pub </span>value_field: NestedFieldRef,
+<a href=#854 id=854 data-nosnippet>854</a>}
+<a href=#855 id=855 data-nosnippet>855</a>
+<a href=#856 id=856 data-nosnippet>856</a><span class="kw">impl </span>MapType {
+<a href=#857 id=857 data-nosnippet>857</a>    <span class="doccomment">/// Construct a map type with the given key and value fields.
+<a href=#858 id=858 data-nosnippet>858</a>    </span><span class="kw">pub fn </span>new(key_field: NestedFieldRef, value_field: NestedFieldRef) -&gt; <span class="self">Self </span>{
+<a href=#859 id=859 data-nosnippet>859</a>        <span class="self">Self </span>{
+<a href=#860 id=860 data-nosnippet>860</a>            key_field,
+<a href=#861 id=861 data-nosnippet>861</a>            value_field,
+<a href=#862 id=862 data-nosnippet>862</a>        }
+<a href=#863 id=863 data-nosnippet>863</a>    }
+<a href=#864 id=864 data-nosnippet>864</a>
+<a href=#865 id=865 data-nosnippet>865</a>    <span class="doccomment">/// Construct an optional map type with the given key and value fields.
+<a href=#866 id=866 data-nosnippet>866</a>    </span><span class="kw">pub fn </span>optional(key_id: i32, key_type: Type, value_id: i32, value_type: Type) -&gt; <span class="self">Self </span>{
+<a href=#867 id=867 data-nosnippet>867</a>        <span class="self">Self </span>{
+<a href=#868 id=868 data-nosnippet>868</a>            key_field: NestedField::map_key_element(key_id, key_type).into(),
+<a href=#869 id=869 data-nosnippet>869</a>            value_field: NestedField::map_value_element(value_id, value_type, <span class="bool-val">false</span>).into(),
+<a href=#870 id=870 data-nosnippet>870</a>        }
+<a href=#871 id=871 data-nosnippet>871</a>    }
+<a href=#872 id=872 data-nosnippet>872</a>
+<a href=#873 id=873 data-nosnippet>873</a>    <span class="doccomment">/// Construct a required map type with the given key and value fields.
+<a href=#874 id=874 data-nosnippet>874</a>    </span><span class="kw">pub fn </span>required(key_id: i32, key_type: Type, value_id: i32, value_type: Type) -&gt; <span class="self">Self </span>{
+<a href=#875 id=875 data-nosnippet>875</a>        <span class="self">Self </span>{
+<a href=#876 id=876 data-nosnippet>876</a>            key_field: NestedField::map_key_element(key_id, key_type).into(),
+<a href=#877 id=877 data-nosnippet>877</a>            value_field: NestedField::map_value_element(value_id, value_type, <span class="bool-val">true</span>).into(),
+<a href=#878 id=878 data-nosnippet>878</a>        }
+<a href=#879 id=879 data-nosnippet>879</a>    }
+<a href=#880 id=880 data-nosnippet>880</a>}
+<a href=#881 id=881 data-nosnippet>881</a>
+<a href=#882 id=882 data-nosnippet>882</a><span class="doccomment">/// Variant type - can hold semi-structured data of any type.
+<a href=#883 id=883 data-nosnippet>883</a>/// This is an Iceberg V3 feature.
+<a href=#884 id=884 data-nosnippet>884</a></span><span class="attr">#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
+<a href=#885 id=885 data-nosnippet>885</a></span><span class="kw">pub struct </span>VariantType;
+<a href=#886 id=886 data-nosnippet>886</a>
+<a href=#887 id=887 data-nosnippet>887</a><span class="kw">impl </span>fmt::Display <span class="kw">for </span>VariantType {
+<a href=#888 id=888 data-nosnippet>888</a>    <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter) -&gt; fmt::Result {
+<a href=#889 id=889 data-nosnippet>889</a>        <span class="macro">write!</span>(f, <span class="string">"variant"</span>)
+<a href=#890 id=890 data-nosnippet>890</a>    }
+<a href=#891 id=891 data-nosnippet>891</a>}
+<a href=#892 id=892 data-nosnippet>892</a>
+<a href=#893 id=893 data-nosnippet>893</a><span class="kw">impl </span>From&lt;VariantType&gt; <span class="kw">for </span>Type {
+<a href=#894 id=894 data-nosnippet>894</a>    <span class="kw">fn </span>from(<span class="kw">_</span>: VariantType) -&gt; <span class="self">Self </span>{
+<a href=#895 id=895 data-nosnippet>895</a>        Type::Variant(VariantType)
+<a href=#896 id=896 data-nosnippet>896</a>    }
+<a href=#897 id=897 data-nosnippet>897</a>}
+<a href=#898 id=898 data-nosnippet>898</a>
+<a href=#899 id=899 data-nosnippet>899</a><span class="kw">impl </span>Serialize <span class="kw">for </span>VariantType {
+<a href=#900 id=900 data-nosnippet>900</a>    <span class="kw">fn </span>serialize&lt;S&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, serializer: S) -&gt; std::result::Result&lt;S::Ok, S::Error&gt;
+<a href=#901 id=901 data-nosnippet>901</a>    <span class="kw">where </span>S: Serializer {
+<a href=#902 id=902 data-nosnippet>902</a>        serializer.serialize_str(<span class="string">"variant"</span>)
+<a href=#903 id=903 data-nosnippet>903</a>    }
+<a href=#904 id=904 data-nosnippet>904</a>}
+<a href=#905 id=905 data-nosnippet>905</a>
+<a href=#906 id=906 data-nosnippet>906</a><span class="kw">impl</span>&lt;<span class="lifetime">'de</span>&gt; Deserialize&lt;<span class="lifetime">'de</span>&gt; <span class="kw">for </span>VariantType {
+<a href=#907 id=907 data-nosnippet>907</a>    <span class="kw">fn </span>deserialize&lt;D&gt;(deserializer: D) -&gt; std::result::Result&lt;<span class="self">Self</span>, D::Error&gt;
+<a href=#908 id=908 data-nosnippet>908</a>    <span class="kw">where </span>D: Deserializer&lt;<span class="lifetime">'de</span>&gt; {
+<a href=#909 id=909 data-nosnippet>909</a>        <span class="kw">let </span>s = String::deserialize(deserializer)<span class="question-mark">?</span>;
+<a href=#910 id=910 data-nosnippet>910</a>        <span class="kw">if </span>s == <span class="string">"variant" </span>{
+<a href=#911 id=911 data-nosnippet>911</a>            <span class="prelude-val">Ok</span>(VariantType)
+<a href=#912 id=912 data-nosnippet>912</a>        } <span class="kw">else </span>{
+<a href=#913 id=913 data-nosnippet>913</a>            <span class="prelude-val">Err</span>(D::Error::custom(<span class="macro">format!</span>(<span class="string">"expected 'variant', got '{s}'"</span>)))
+<a href=#914 id=914 data-nosnippet>914</a>        }
+<a href=#915 id=915 data-nosnippet>915</a>    }
+<a href=#916 id=916 data-nosnippet>916</a>}
+<a href=#917 id=917 data-nosnippet>917</a>
+<a href=#918 id=918 data-nosnippet>918</a><span class="attr">#[cfg(test)]
+<a href=#919 id=919 data-nosnippet>919</a></span><span class="kw">mod </span>tests {
+<a href=#920 id=920 data-nosnippet>920</a>    <span class="kw">use </span>pretty_assertions::assert_eq;
+<a href=#921 id=921 data-nosnippet>921</a>    <span class="kw">use </span>uuid::Uuid;
+<a href=#922 id=922 data-nosnippet>922</a>
+<a href=#923 id=923 data-nosnippet>923</a>    <span class="kw">use </span>super::<span class="kw-2">*</span>;
+<a href=#924 id=924 data-nosnippet>924</a>    <span class="kw">use </span><span class="kw">crate</span>::spec::values::PrimitiveLiteral;
 <a href=#925 id=925 data-nosnippet>925</a>
-<a href=#926 id=926 data-nosnippet>926</a>        <span class="kw">let </span>sered_json = serde_json::to_string(<span class="kw-2">&amp;</span>expected_type).unwrap();
-<a href=#927 id=927 data-nosnippet>927</a>        <span class="kw">let </span>parsed_json_value = serde_json::from_str::&lt;serde_json::Value&gt;(<span class="kw-2">&amp;</span>sered_json).unwrap();
-<a href=#928 id=928 data-nosnippet>928</a>        <span class="kw">let </span>raw_json_value = serde_json::from_str::&lt;serde_json::Value&gt;(json).unwrap();
+<a href=#926 id=926 data-nosnippet>926</a>    <span class="kw">fn </span>check_type_serde(json: <span class="kw-2">&amp;</span>str, expected_type: Type) {
+<a href=#927 id=927 data-nosnippet>927</a>        <span class="kw">let </span>desered_type: Type = serde_json::from_str(json).unwrap();
+<a href=#928 id=928 data-nosnippet>928</a>        <span class="macro">assert_eq!</span>(desered_type, expected_type);
 <a href=#929 id=929 data-nosnippet>929</a>
-<a href=#930 id=930 data-nosnippet>930</a>        <span class="macro">assert_eq!</span>(parsed_json_value, raw_json_value);
-<a href=#931 id=931 data-nosnippet>931</a>    }
-<a href=#932 id=932 data-nosnippet>932</a>
-<a href=#933 id=933 data-nosnippet>933</a>    <span class="attr">#[test]
-<a href=#934 id=934 data-nosnippet>934</a>    </span><span class="kw">fn </span>primitive_type_serde() {
-<a href=#935 id=935 data-nosnippet>935</a>        <span class="kw">let </span>record = <span class="string">r#"
-<a href=#936 id=936 data-nosnippet>936</a>    {
-<a href=#937 id=937 data-nosnippet>937</a>        "type": "struct",
-<a href=#938 id=938 data-nosnippet>938</a>        "fields": [
-<a href=#939 id=939 data-nosnippet>939</a>            {"id": 1, "name": "bool_field", "required": true, "type": "boolean"},
-<a href=#940 id=940 data-nosnippet>940</a>            {"id": 2, "name": "int_field", "required": true, "type": "int"},
-<a href=#941 id=941 data-nosnippet>941</a>            {"id": 3, "name": "long_field", "required": true, "type": "long"},
-<a href=#942 id=942 data-nosnippet>942</a>            {"id": 4, "name": "float_field", "required": true, "type": "float"},
-<a href=#943 id=943 data-nosnippet>943</a>            {"id": 5, "name": "double_field", "required": true, "type": "double"},
-<a href=#944 id=944 data-nosnippet>944</a>            {"id": 6, "name": "decimal_field", "required": true, "type": "decimal(9, 2)"},
-<a href=#945 id=945 data-nosnippet>945</a>            {"id": 7, "name": "date_field", "required": true, "type": "date"},
-<a href=#946 id=946 data-nosnippet>946</a>            {"id": 8, "name": "time_field", "required": true, "type": "time"},
-<a href=#947 id=947 data-nosnippet>947</a>            {"id": 9, "name": "timestamp_field", "required": true, "type": "timestamp"},
-<a href=#948 id=948 data-nosnippet>948</a>            {"id": 10, "name": "timestamptz_field", "required": true, "type": "timestamptz"},
-<a href=#949 id=949 data-nosnippet>949</a>            {"id": 11, "name": "timestamp_ns_field", "required": true, "type": "timestamp_ns"},
-<a href=#950 id=950 data-nosnippet>950</a>            {"id": 12, "name": "timestamptz_ns_field", "required": true, "type": "timestamptz_ns"},
-<a href=#951 id=951 data-nosnippet>951</a>            {"id": 13, "name": "uuid_field", "required": true, "type": "uuid"},
-<a href=#952 id=952 data-nosnippet>952</a>            {"id": 14, "name": "fixed_field", "required": true, "type": "fixed[10]"},
-<a href=#953 id=953 data-nosnippet>953</a>            {"id": 15, "name": "binary_field", "required": true, "type": "binary"},
-<a href=#954 id=954 data-nosnippet>954</a>            {"id": 16, "name": "string_field", "required": true, "type": "string"}
-<a href=#955 id=955 data-nosnippet>955</a>        ]
-<a href=#956 id=956 data-nosnippet>956</a>    }
-<a href=#957 id=957 data-nosnippet>957</a>    "#</span>;
-<a href=#958 id=958 data-nosnippet>958</a>
-<a href=#959 id=959 data-nosnippet>959</a>        check_type_serde(
-<a href=#960 id=960 data-nosnippet>960</a>            record,
-<a href=#961 id=961 data-nosnippet>961</a>            Type::Struct(StructType {
-<a href=#962 id=962 data-nosnippet>962</a>                fields: <span class="macro">vec!</span>[
-<a href=#963 id=963 data-nosnippet>963</a>                    NestedField::required(<span class="number">1</span>, <span class="string">"bool_field"</span>, Type::Primitive(PrimitiveType::Boolean))
-<a href=#964 id=964 data-nosnippet>964</a>                        .into(),
-<a href=#965 id=965 data-nosnippet>965</a>                    NestedField::required(<span class="number">2</span>, <span class="string">"int_field"</span>, Type::Primitive(PrimitiveType::Int))
-<a href=#966 id=966 data-nosnippet>966</a>                        .into(),
-<a href=#967 id=967 data-nosnippet>967</a>                    NestedField::required(<span class="number">3</span>, <span class="string">"long_field"</span>, Type::Primitive(PrimitiveType::Long))
+<a href=#930 id=930 data-nosnippet>930</a>        <span class="kw">let </span>sered_json = serde_json::to_string(<span class="kw-2">&amp;</span>expected_type).unwrap();
+<a href=#931 id=931 data-nosnippet>931</a>        <span class="kw">let </span>parsed_json_value = serde_json::from_str::&lt;serde_json::Value&gt;(<span class="kw-2">&amp;</span>sered_json).unwrap();
+<a href=#932 id=932 data-nosnippet>932</a>        <span class="kw">let </span>raw_json_value = serde_json::from_str::&lt;serde_json::Value&gt;(json).unwrap();
+<a href=#933 id=933 data-nosnippet>933</a>
+<a href=#934 id=934 data-nosnippet>934</a>        <span class="macro">assert_eq!</span>(parsed_json_value, raw_json_value);
+<a href=#935 id=935 data-nosnippet>935</a>    }
+<a href=#936 id=936 data-nosnippet>936</a>
+<a href=#937 id=937 data-nosnippet>937</a>    <span class="attr">#[test]
+<a href=#938 id=938 data-nosnippet>938</a>    </span><span class="kw">fn </span>primitive_type_serde() {
+<a href=#939 id=939 data-nosnippet>939</a>        <span class="kw">let </span>record = <span class="string">r#"
+<a href=#940 id=940 data-nosnippet>940</a>    {
+<a href=#941 id=941 data-nosnippet>941</a>        "type": "struct",
+<a href=#942 id=942 data-nosnippet>942</a>        "fields": [
+<a href=#943 id=943 data-nosnippet>943</a>            {"id": 1, "name": "bool_field", "required": true, "type": "boolean"},
+<a href=#944 id=944 data-nosnippet>944</a>            {"id": 2, "name": "int_field", "required": true, "type": "int"},
+<a href=#945 id=945 data-nosnippet>945</a>            {"id": 3, "name": "long_field", "required": true, "type": "long"},
+<a href=#946 id=946 data-nosnippet>946</a>            {"id": 4, "name": "float_field", "required": true, "type": "float"},
+<a href=#947 id=947 data-nosnippet>947</a>            {"id": 5, "name": "double_field", "required": true, "type": "double"},
+<a href=#948 id=948 data-nosnippet>948</a>            {"id": 6, "name": "decimal_field", "required": true, "type": "decimal(9, 2)"},
+<a href=#949 id=949 data-nosnippet>949</a>            {"id": 7, "name": "date_field", "required": true, "type": "date"},
+<a href=#950 id=950 data-nosnippet>950</a>            {"id": 8, "name": "time_field", "required": true, "type": "time"},
+<a href=#951 id=951 data-nosnippet>951</a>            {"id": 9, "name": "timestamp_field", "required": true, "type": "timestamp"},
+<a href=#952 id=952 data-nosnippet>952</a>            {"id": 10, "name": "timestamptz_field", "required": true, "type": "timestamptz"},
+<a href=#953 id=953 data-nosnippet>953</a>            {"id": 11, "name": "timestamp_ns_field", "required": true, "type": "timestamp_ns"},
+<a href=#954 id=954 data-nosnippet>954</a>            {"id": 12, "name": "timestamptz_ns_field", "required": true, "type": "timestamptz_ns"},
+<a href=#955 id=955 data-nosnippet>955</a>            {"id": 13, "name": "uuid_field", "required": true, "type": "uuid"},
+<a href=#956 id=956 data-nosnippet>956</a>            {"id": 14, "name": "fixed_field", "required": true, "type": "fixed[10]"},
+<a href=#957 id=957 data-nosnippet>957</a>            {"id": 15, "name": "binary_field", "required": true, "type": "binary"},
+<a href=#958 id=958 data-nosnippet>958</a>            {"id": 16, "name": "string_field", "required": true, "type": "string"}
+<a href=#959 id=959 data-nosnippet>959</a>        ]
+<a href=#960 id=960 data-nosnippet>960</a>    }
+<a href=#961 id=961 data-nosnippet>961</a>    "#</span>;
+<a href=#962 id=962 data-nosnippet>962</a>
+<a href=#963 id=963 data-nosnippet>963</a>        check_type_serde(
+<a href=#964 id=964 data-nosnippet>964</a>            record,
+<a href=#965 id=965 data-nosnippet>965</a>            Type::Struct(StructType {
+<a href=#966 id=966 data-nosnippet>966</a>                fields: <span class="macro">vec!</span>[
+<a href=#967 id=967 data-nosnippet>967</a>                    NestedField::required(<span class="number">1</span>, <span class="string">"bool_field"</span>, Type::Primitive(PrimitiveType::Boolean))
 <a href=#968 id=968 data-nosnippet>968</a>                        .into(),
-<a href=#969 id=969 data-nosnippet>969</a>                    NestedField::required(<span class="number">4</span>, <span class="string">"float_field"</span>, Type::Primitive(PrimitiveType::Float))
+<a href=#969 id=969 data-nosnippet>969</a>                    NestedField::required(<span class="number">2</span>, <span class="string">"int_field"</span>, Type::Primitive(PrimitiveType::Int))
 <a href=#970 id=970 data-nosnippet>970</a>                        .into(),
-<a href=#971 id=971 data-nosnippet>971</a>                    NestedField::required(
-<a href=#972 id=972 data-nosnippet>972</a>                        <span class="number">5</span>,
-<a href=#973 id=973 data-nosnippet>973</a>                        <span class="string">"double_field"</span>,
-<a href=#974 id=974 data-nosnippet>974</a>                        Type::Primitive(PrimitiveType::Double),
-<a href=#975 id=975 data-nosnippet>975</a>                    )
-<a href=#976 id=976 data-nosnippet>976</a>                    .into(),
-<a href=#977 id=977 data-nosnippet>977</a>                    NestedField::required(
-<a href=#978 id=978 data-nosnippet>978</a>                        <span class="number">6</span>,
-<a href=#979 id=979 data-nosnippet>979</a>                        <span class="string">"decimal_field"</span>,
-<a href=#980 id=980 data-nosnippet>980</a>                        Type::Primitive(PrimitiveType::Decimal {
-<a href=#981 id=981 data-nosnippet>981</a>                            precision: <span class="number">9</span>,
-<a href=#982 id=982 data-nosnippet>982</a>                            scale: <span class="number">2</span>,
-<a href=#983 id=983 data-nosnippet>983</a>                        }),
-<a href=#984 id=984 data-nosnippet>984</a>                    )
-<a href=#985 id=985 data-nosnippet>985</a>                    .into(),
-<a href=#986 id=986 data-nosnippet>986</a>                    NestedField::required(<span class="number">7</span>, <span class="string">"date_field"</span>, Type::Primitive(PrimitiveType::Date))
-<a href=#987 id=987 data-nosnippet>987</a>                        .into(),
-<a href=#988 id=988 data-nosnippet>988</a>                    NestedField::required(<span class="number">8</span>, <span class="string">"time_field"</span>, Type::Primitive(PrimitiveType::Time))
-<a href=#989 id=989 data-nosnippet>989</a>                        .into(),
-<a href=#990 id=990 data-nosnippet>990</a>                    NestedField::required(
-<a href=#991 id=991 data-nosnippet>991</a>                        <span class="number">9</span>,
-<a href=#992 id=992 data-nosnippet>992</a>                        <span class="string">"timestamp_field"</span>,
-<a href=#993 id=993 data-nosnippet>993</a>                        Type::Primitive(PrimitiveType::Timestamp),
-<a href=#994 id=994 data-nosnippet>994</a>                    )
-<a href=#995 id=995 data-nosnippet>995</a>                    .into(),
-<a href=#996 id=996 data-nosnippet>996</a>                    NestedField::required(
-<a href=#997 id=997 data-nosnippet>997</a>                        <span class="number">10</span>,
-<a href=#998 id=998 data-nosnippet>998</a>                        <span class="string">"timestamptz_field"</span>,
-<a href=#999 id=999 data-nosnippet>999</a>                        Type::Primitive(PrimitiveType::Timestamptz),
-<a href=#1000 id=1000 data-nosnippet>1000</a>                    )
-<a href=#1001 id=1001 data-nosnippet>1001</a>                    .into(),
-<a href=#1002 id=1002 data-nosnippet>1002</a>                    NestedField::required(
-<a href=#1003 id=1003 data-nosnippet>1003</a>                        <span class="number">11</span>,
-<a href=#1004 id=1004 data-nosnippet>1004</a>                        <span class="string">"timestamp_ns_field"</span>,
-<a href=#1005 id=1005 data-nosnippet>1005</a>                        Type::Primitive(PrimitiveType::TimestampNs),
-<a href=#1006 id=1006 data-nosnippet>1006</a>                    )
-<a href=#1007 id=1007 data-nosnippet>1007</a>                    .into(),
-<a href=#1008 id=1008 data-nosnippet>1008</a>                    NestedField::required(
-<a href=#1009 id=1009 data-nosnippet>1009</a>                        <span class="number">12</span>,
-<a href=#1010 id=1010 data-nosnippet>1010</a>                        <span class="string">"timestamptz_ns_field"</span>,
-<a href=#1011 id=1011 data-nosnippet>1011</a>                        Type::Primitive(PrimitiveType::TimestamptzNs),
-<a href=#1012 id=1012 data-nosnippet>1012</a>                    )
-<a href=#1013 id=1013 data-nosnippet>1013</a>                    .into(),
-<a href=#1014 id=1014 data-nosnippet>1014</a>                    NestedField::required(<span class="number">13</span>, <span class="string">"uuid_field"</span>, Type::Primitive(PrimitiveType::Uuid))
-<a href=#1015 id=1015 data-nosnippet>1015</a>                        .into(),
-<a href=#1016 id=1016 data-nosnippet>1016</a>                    NestedField::required(
-<a href=#1017 id=1017 data-nosnippet>1017</a>                        <span class="number">14</span>,
-<a href=#1018 id=1018 data-nosnippet>1018</a>                        <span class="string">"fixed_field"</span>,
-<a href=#1019 id=1019 data-nosnippet>1019</a>                        Type::Primitive(PrimitiveType::Fixed(<span class="number">10</span>)),
-<a href=#1020 id=1020 data-nosnippet>1020</a>                    )
-<a href=#1021 id=1021 data-nosnippet>1021</a>                    .into(),
-<a href=#1022 id=1022 data-nosnippet>1022</a>                    NestedField::required(
-<a href=#1023 id=1023 data-nosnippet>1023</a>                        <span class="number">15</span>,
-<a href=#1024 id=1024 data-nosnippet>1024</a>                        <span class="string">"binary_field"</span>,
-<a href=#1025 id=1025 data-nosnippet>1025</a>                        Type::Primitive(PrimitiveType::Binary),
-<a href=#1026 id=1026 data-nosnippet>1026</a>                    )
-<a href=#1027 id=1027 data-nosnippet>1027</a>                    .into(),
-<a href=#1028 id=1028 data-nosnippet>1028</a>                    NestedField::required(
-<a href=#1029 id=1029 data-nosnippet>1029</a>                        <span class="number">16</span>,
-<a href=#1030 id=1030 data-nosnippet>1030</a>                        <span class="string">"string_field"</span>,
-<a href=#1031 id=1031 data-nosnippet>1031</a>                        Type::Primitive(PrimitiveType::String),
-<a href=#1032 id=1032 data-nosnippet>1032</a>                    )
-<a href=#1033 id=1033 data-nosnippet>1033</a>                    .into(),
-<a href=#1034 id=1034 data-nosnippet>1034</a>                ],
-<a href=#1035 id=1035 data-nosnippet>1035</a>                id_lookup: OnceLock::default(),
-<a href=#1036 id=1036 data-nosnippet>1036</a>                name_lookup: OnceLock::default(),
-<a href=#1037 id=1037 data-nosnippet>1037</a>            }),
-<a href=#1038 id=1038 data-nosnippet>1038</a>        )
-<a href=#1039 id=1039 data-nosnippet>1039</a>    }
-<a href=#1040 id=1040 data-nosnippet>1040</a>
-<a href=#1041 id=1041 data-nosnippet>1041</a>    <span class="attr">#[test]
-<a href=#1042 id=1042 data-nosnippet>1042</a>    </span><span class="kw">fn </span>struct_type() {
-<a href=#1043 id=1043 data-nosnippet>1043</a>        <span class="kw">let </span>record = <span class="string">r#"
-<a href=#1044 id=1044 data-nosnippet>1044</a>        {
-<a href=#1045 id=1045 data-nosnippet>1045</a>            "type": "struct",
-<a href=#1046 id=1046 data-nosnippet>1046</a>            "fields": [
-<a href=#1047 id=1047 data-nosnippet>1047</a>                {
-<a href=#1048 id=1048 data-nosnippet>1048</a>                    "id": 1,
-<a href=#1049 id=1049 data-nosnippet>1049</a>                    "name": "id",
-<a href=#1050 id=1050 data-nosnippet>1050</a>                    "required": true,
-<a href=#1051 id=1051 data-nosnippet>1051</a>                    "type": "uuid",
-<a href=#1052 id=1052 data-nosnippet>1052</a>                    "initial-default": "0db3e2a8-9d1d-42b9-aa7b-74ebe558dceb",
-<a href=#1053 id=1053 data-nosnippet>1053</a>                    "write-default": "ec5911be-b0a7-458c-8438-c9a3e53cffae"
-<a href=#1054 id=1054 data-nosnippet>1054</a>                }, {
-<a href=#1055 id=1055 data-nosnippet>1055</a>                    "id": 2,
-<a href=#1056 id=1056 data-nosnippet>1056</a>                    "name": "data",
-<a href=#1057 id=1057 data-nosnippet>1057</a>                    "required": false,
-<a href=#1058 id=1058 data-nosnippet>1058</a>                    "type": "int"
-<a href=#1059 id=1059 data-nosnippet>1059</a>                }
-<a href=#1060 id=1060 data-nosnippet>1060</a>            ]
-<a href=#1061 id=1061 data-nosnippet>1061</a>        }
-<a href=#1062 id=1062 data-nosnippet>1062</a>        "#</span>;
-<a href=#1063 id=1063 data-nosnippet>1063</a>
-<a href=#1064 id=1064 data-nosnippet>1064</a>        check_type_serde(
-<a href=#1065 id=1065 data-nosnippet>1065</a>            record,
-<a href=#1066 id=1066 data-nosnippet>1066</a>            Type::Struct(StructType {
-<a href=#1067 id=1067 data-nosnippet>1067</a>                fields: <span class="macro">vec!</span>[
-<a href=#1068 id=1068 data-nosnippet>1068</a>                    NestedField::required(<span class="number">1</span>, <span class="string">"id"</span>, Type::Primitive(PrimitiveType::Uuid))
-<a href=#1069 id=1069 data-nosnippet>1069</a>                        .with_initial_default(Literal::Primitive(PrimitiveLiteral::UInt128(
-<a href=#1070 id=1070 data-nosnippet>1070</a>                            Uuid::parse_str(<span class="string">"0db3e2a8-9d1d-42b9-aa7b-74ebe558dceb"</span>)
-<a href=#1071 id=1071 data-nosnippet>1071</a>                                .unwrap()
-<a href=#1072 id=1072 data-nosnippet>1072</a>                                .as_u128(),
-<a href=#1073 id=1073 data-nosnippet>1073</a>                        )))
-<a href=#1074 id=1074 data-nosnippet>1074</a>                        .with_write_default(Literal::Primitive(PrimitiveLiteral::UInt128(
-<a href=#1075 id=1075 data-nosnippet>1075</a>                            Uuid::parse_str(<span class="string">"ec5911be-b0a7-458c-8438-c9a3e53cffae"</span>)
-<a href=#1076 id=1076 data-nosnippet>1076</a>                                .unwrap()
-<a href=#1077 id=1077 data-nosnippet>1077</a>                                .as_u128(),
-<a href=#1078 id=1078 data-nosnippet>1078</a>                        )))
-<a href=#1079 id=1079 data-nosnippet>1079</a>                        .into(),
-<a href=#1080 id=1080 data-nosnippet>1080</a>                    NestedField::optional(<span class="number">2</span>, <span class="string">"data"</span>, Type::Primitive(PrimitiveType::Int)).into(),
-<a href=#1081 id=1081 data-nosnippet>1081</a>                ],
-<a href=#1082 id=1082 data-nosnippet>1082</a>                id_lookup: HashMap::from([(<span class="number">1</span>, <span class="number">0</span>), (<span class="number">2</span>, <span class="number">1</span>)]).into(),
-<a href=#1083 id=1083 data-nosnippet>1083</a>                name_lookup: HashMap::from([(<span class="string">"id"</span>.to_string(), <span class="number">0</span>), (<span class="string">"data"</span>.to_string(), <span class="number">1</span>)]).into(),
-<a href=#1084 id=1084 data-nosnippet>1084</a>            }),
-<a href=#1085 id=1085 data-nosnippet>1085</a>        )
-<a href=#1086 id=1086 data-nosnippet>1086</a>    }
-<a href=#1087 id=1087 data-nosnippet>1087</a>
-<a href=#1088 id=1088 data-nosnippet>1088</a>    <span class="attr">#[test]
-<a href=#1089 id=1089 data-nosnippet>1089</a>    </span><span class="kw">fn </span>test_deeply_nested_struct() {
-<a href=#1090 id=1090 data-nosnippet>1090</a>        <span class="kw">let </span>record = <span class="string">r#"
-<a href=#1091 id=1091 data-nosnippet>1091</a>{
-<a href=#1092 id=1092 data-nosnippet>1092</a>  "type": "struct",
-<a href=#1093 id=1093 data-nosnippet>1093</a>  "fields": [
-<a href=#1094 id=1094 data-nosnippet>1094</a>    {
-<a href=#1095 id=1095 data-nosnippet>1095</a>      "id": 1,
-<a href=#1096 id=1096 data-nosnippet>1096</a>      "name": "id",
-<a href=#1097 id=1097 data-nosnippet>1097</a>      "required": true,
-<a href=#1098 id=1098 data-nosnippet>1098</a>      "type": "uuid",
-<a href=#1099 id=1099 data-nosnippet>1099</a>      "initial-default": "0db3e2a8-9d1d-42b9-aa7b-74ebe558dceb",
-<a href=#1100 id=1100 data-nosnippet>1100</a>      "write-default": "ec5911be-b0a7-458c-8438-c9a3e53cffae"
-<a href=#1101 id=1101 data-nosnippet>1101</a>    },
-<a href=#1102 id=1102 data-nosnippet>1102</a>    {
-<a href=#1103 id=1103 data-nosnippet>1103</a>      "id": 2,
-<a href=#1104 id=1104 data-nosnippet>1104</a>      "name": "data",
-<a href=#1105 id=1105 data-nosnippet>1105</a>      "required": false,
-<a href=#1106 id=1106 data-nosnippet>1106</a>      "type": "int"
-<a href=#1107 id=1107 data-nosnippet>1107</a>    },
-<a href=#1108 id=1108 data-nosnippet>1108</a>    {
-<a href=#1109 id=1109 data-nosnippet>1109</a>      "id": 3,
-<a href=#1110 id=1110 data-nosnippet>1110</a>      "name": "address",
-<a href=#1111 id=1111 data-nosnippet>1111</a>      "required": true,
-<a href=#1112 id=1112 data-nosnippet>1112</a>      "type": {
-<a href=#1113 id=1113 data-nosnippet>1113</a>        "type": "struct",
-<a href=#1114 id=1114 data-nosnippet>1114</a>        "fields": [
-<a href=#1115 id=1115 data-nosnippet>1115</a>          {
-<a href=#1116 id=1116 data-nosnippet>1116</a>            "id": 4,
-<a href=#1117 id=1117 data-nosnippet>1117</a>            "name": "street",
-<a href=#1118 id=1118 data-nosnippet>1118</a>            "required": true,
-<a href=#1119 id=1119 data-nosnippet>1119</a>            "type": "string"
-<a href=#1120 id=1120 data-nosnippet>1120</a>          },
-<a href=#1121 id=1121 data-nosnippet>1121</a>          {
-<a href=#1122 id=1122 data-nosnippet>1122</a>            "id": 5,
-<a href=#1123 id=1123 data-nosnippet>1123</a>            "name": "province",
-<a href=#1124 id=1124 data-nosnippet>1124</a>            "required": false,
-<a href=#1125 id=1125 data-nosnippet>1125</a>            "type": "string"
-<a href=#1126 id=1126 data-nosnippet>1126</a>          },
-<a href=#1127 id=1127 data-nosnippet>1127</a>          {
-<a href=#1128 id=1128 data-nosnippet>1128</a>            "id": 6,
-<a href=#1129 id=1129 data-nosnippet>1129</a>            "name": "zip",
-<a href=#1130 id=1130 data-nosnippet>1130</a>            "required": true,
-<a href=#1131 id=1131 data-nosnippet>1131</a>            "type": "int"
-<a href=#1132 id=1132 data-nosnippet>1132</a>          }
-<a href=#1133 id=1133 data-nosnippet>1133</a>        ]
-<a href=#1134 id=1134 data-nosnippet>1134</a>      }
-<a href=#1135 id=1135 data-nosnippet>1135</a>    }
-<a href=#1136 id=1136 data-nosnippet>1136</a>  ]
-<a href=#1137 id=1137 data-nosnippet>1137</a>}
-<a href=#1138 id=1138 data-nosnippet>1138</a>"#</span>;
-<a href=#1139 id=1139 data-nosnippet>1139</a>
-<a href=#1140 id=1140 data-nosnippet>1140</a>        <span class="kw">let </span>struct_type = Type::Struct(StructType::new(<span class="macro">vec!</span>[
-<a href=#1141 id=1141 data-nosnippet>1141</a>            NestedField::required(<span class="number">1</span>, <span class="string">"id"</span>, Type::Primitive(PrimitiveType::Uuid))
-<a href=#1142 id=1142 data-nosnippet>1142</a>                .with_initial_default(Literal::Primitive(PrimitiveLiteral::UInt128(
-<a href=#1143 id=1143 data-nosnippet>1143</a>                    Uuid::parse_str(<span class="string">"0db3e2a8-9d1d-42b9-aa7b-74ebe558dceb"</span>)
-<a href=#1144 id=1144 data-nosnippet>1144</a>                        .unwrap()
-<a href=#1145 id=1145 data-nosnippet>1145</a>                        .as_u128(),
-<a href=#1146 id=1146 data-nosnippet>1146</a>                )))
-<a href=#1147 id=1147 data-nosnippet>1147</a>                .with_write_default(Literal::Primitive(PrimitiveLiteral::UInt128(
-<a href=#1148 id=1148 data-nosnippet>1148</a>                    Uuid::parse_str(<span class="string">"ec5911be-b0a7-458c-8438-c9a3e53cffae"</span>)
-<a href=#1149 id=1149 data-nosnippet>1149</a>                        .unwrap()
-<a href=#1150 id=1150 data-nosnippet>1150</a>                        .as_u128(),
-<a href=#1151 id=1151 data-nosnippet>1151</a>                )))
-<a href=#1152 id=1152 data-nosnippet>1152</a>                .into(),
-<a href=#1153 id=1153 data-nosnippet>1153</a>            NestedField::optional(<span class="number">2</span>, <span class="string">"data"</span>, Type::Primitive(PrimitiveType::Int)).into(),
-<a href=#1154 id=1154 data-nosnippet>1154</a>            NestedField::required(
-<a href=#1155 id=1155 data-nosnippet>1155</a>                <span class="number">3</span>,
-<a href=#1156 id=1156 data-nosnippet>1156</a>                <span class="string">"address"</span>,
-<a href=#1157 id=1157 data-nosnippet>1157</a>                Type::Struct(StructType::new(<span class="macro">vec!</span>[
-<a href=#1158 id=1158 data-nosnippet>1158</a>                    NestedField::required(<span class="number">4</span>, <span class="string">"street"</span>, Type::Primitive(PrimitiveType::String))
-<a href=#1159 id=1159 data-nosnippet>1159</a>                        .into(),
-<a href=#1160 id=1160 data-nosnippet>1160</a>                    NestedField::optional(<span class="number">5</span>, <span class="string">"province"</span>, Type::Primitive(PrimitiveType::String))
-<a href=#1161 id=1161 data-nosnippet>1161</a>                        .into(),
-<a href=#1162 id=1162 data-nosnippet>1162</a>                    NestedField::required(<span class="number">6</span>, <span class="string">"zip"</span>, Type::Primitive(PrimitiveType::Int)).into(),
-<a href=#1163 id=1163 data-nosnippet>1163</a>                ])),
-<a href=#1164 id=1164 data-nosnippet>1164</a>            )
-<a href=#1165 id=1165 data-nosnippet>1165</a>            .into(),
-<a href=#1166 id=1166 data-nosnippet>1166</a>        ]));
-<a href=#1167 id=1167 data-nosnippet>1167</a>
-<a href=#1168 id=1168 data-nosnippet>1168</a>        check_type_serde(record, struct_type)
-<a href=#1169 id=1169 data-nosnippet>1169</a>    }
-<a href=#1170 id=1170 data-nosnippet>1170</a>
-<a href=#1171 id=1171 data-nosnippet>1171</a>    <span class="attr">#[test]
-<a href=#1172 id=1172 data-nosnippet>1172</a>    </span><span class="kw">fn </span>list() {
-<a href=#1173 id=1173 data-nosnippet>1173</a>        <span class="kw">let </span>record = <span class="string">r#"
-<a href=#1174 id=1174 data-nosnippet>1174</a>        {
-<a href=#1175 id=1175 data-nosnippet>1175</a>            "type": "list",
-<a href=#1176 id=1176 data-nosnippet>1176</a>            "element-id": 3,
-<a href=#1177 id=1177 data-nosnippet>1177</a>            "element-required": true,
-<a href=#1178 id=1178 data-nosnippet>1178</a>            "element": "string"
-<a href=#1179 id=1179 data-nosnippet>1179</a>        }
-<a href=#1180 id=1180 data-nosnippet>1180</a>        "#</span>;
-<a href=#1181 id=1181 data-nosnippet>1181</a>
-<a href=#1182 id=1182 data-nosnippet>1182</a>        check_type_serde(
-<a href=#1183 id=1183 data-nosnippet>1183</a>            record,
-<a href=#1184 id=1184 data-nosnippet>1184</a>            Type::List(ListType {
-<a href=#1185 id=1185 data-nosnippet>1185</a>                element_field: NestedField::list_element(
-<a href=#1186 id=1186 data-nosnippet>1186</a>                    <span class="number">3</span>,
-<a href=#1187 id=1187 data-nosnippet>1187</a>                    Type::Primitive(PrimitiveType::String),
-<a href=#1188 id=1188 data-nosnippet>1188</a>                    <span class="bool-val">true</span>,
-<a href=#1189 id=1189 data-nosnippet>1189</a>                )
-<a href=#1190 id=1190 data-nosnippet>1190</a>                .into(),
-<a href=#1191 id=1191 data-nosnippet>1191</a>            }),
-<a href=#1192 id=1192 data-nosnippet>1192</a>        );
-<a href=#1193 id=1193 data-nosnippet>1193</a>    }
-<a href=#1194 id=1194 data-nosnippet>1194</a>
-<a href=#1195 id=1195 data-nosnippet>1195</a>    <span class="attr">#[test]
-<a href=#1196 id=1196 data-nosnippet>1196</a>    </span><span class="kw">fn </span>map() {
-<a href=#1197 id=1197 data-nosnippet>1197</a>        <span class="kw">let </span>record = <span class="string">r#"
-<a href=#1198 id=1198 data-nosnippet>1198</a>        {
-<a href=#1199 id=1199 data-nosnippet>1199</a>            "type": "map",
-<a href=#1200 id=1200 data-nosnippet>1200</a>            "key-id": 4,
-<a href=#1201 id=1201 data-nosnippet>1201</a>            "key": "string",
-<a href=#1202 id=1202 data-nosnippet>1202</a>            "value-id": 5,
-<a href=#1203 id=1203 data-nosnippet>1203</a>            "value-required": false,
-<a href=#1204 id=1204 data-nosnippet>1204</a>            "value": "double"
-<a href=#1205 id=1205 data-nosnippet>1205</a>        }
-<a href=#1206 id=1206 data-nosnippet>1206</a>        "#</span>;
-<a href=#1207 id=1207 data-nosnippet>1207</a>
-<a href=#1208 id=1208 data-nosnippet>1208</a>        check_type_serde(
-<a href=#1209 id=1209 data-nosnippet>1209</a>            record,
-<a href=#1210 id=1210 data-nosnippet>1210</a>            Type::Map(MapType {
-<a href=#1211 id=1211 data-nosnippet>1211</a>                key_field: NestedField::map_key_element(<span class="number">4</span>, Type::Primitive(PrimitiveType::String))
-<a href=#1212 id=1212 data-nosnippet>1212</a>                    .into(),
-<a href=#1213 id=1213 data-nosnippet>1213</a>                value_field: NestedField::map_value_element(
-<a href=#1214 id=1214 data-nosnippet>1214</a>                    <span class="number">5</span>,
-<a href=#1215 id=1215 data-nosnippet>1215</a>                    Type::Primitive(PrimitiveType::Double),
-<a href=#1216 id=1216 data-nosnippet>1216</a>                    <span class="bool-val">false</span>,
-<a href=#1217 id=1217 data-nosnippet>1217</a>                )
-<a href=#1218 id=1218 data-nosnippet>1218</a>                .into(),
-<a href=#1219 id=1219 data-nosnippet>1219</a>            }),
-<a href=#1220 id=1220 data-nosnippet>1220</a>        );
-<a href=#1221 id=1221 data-nosnippet>1221</a>
-<a href=#1222 id=1222 data-nosnippet>1222</a>        check_type_serde(
-<a href=#1223 id=1223 data-nosnippet>1223</a>            record,
-<a href=#1224 id=1224 data-nosnippet>1224</a>            Type::Map(MapType::optional(
-<a href=#1225 id=1225 data-nosnippet>1225</a>                <span class="number">4</span>,
-<a href=#1226 id=1226 data-nosnippet>1226</a>                Type::Primitive(PrimitiveType::String),
-<a href=#1227 id=1227 data-nosnippet>1227</a>                <span class="number">5</span>,
-<a href=#1228 id=1228 data-nosnippet>1228</a>                Type::Primitive(PrimitiveType::Double),
-<a href=#1229 id=1229 data-nosnippet>1229</a>            )),
-<a href=#1230 id=1230 data-nosnippet>1230</a>        );
-<a href=#1231 id=1231 data-nosnippet>1231</a>    }
-<a href=#1232 id=1232 data-nosnippet>1232</a>
-<a href=#1233 id=1233 data-nosnippet>1233</a>    <span class="attr">#[test]
-<a href=#1234 id=1234 data-nosnippet>1234</a>    </span><span class="kw">fn </span>map_int() {
-<a href=#1235 id=1235 data-nosnippet>1235</a>        <span class="kw">let </span>record = <span class="string">r#"
-<a href=#1236 id=1236 data-nosnippet>1236</a>        {
-<a href=#1237 id=1237 data-nosnippet>1237</a>            "type": "map",
-<a href=#1238 id=1238 data-nosnippet>1238</a>            "key-id": 4,
-<a href=#1239 id=1239 data-nosnippet>1239</a>            "key": "int",
-<a href=#1240 id=1240 data-nosnippet>1240</a>            "value-id": 5,
-<a href=#1241 id=1241 data-nosnippet>1241</a>            "value-required": false,
-<a href=#1242 id=1242 data-nosnippet>1242</a>            "value": "string"
-<a href=#1243 id=1243 data-nosnippet>1243</a>        }
-<a href=#1244 id=1244 data-nosnippet>1244</a>        "#</span>;
-<a href=#1245 id=1245 data-nosnippet>1245</a>
-<a href=#1246 id=1246 data-nosnippet>1246</a>        check_type_serde(
-<a href=#1247 id=1247 data-nosnippet>1247</a>            record,
-<a href=#1248 id=1248 data-nosnippet>1248</a>            Type::Map(MapType {
-<a href=#1249 id=1249 data-nosnippet>1249</a>                key_field: NestedField::map_key_element(<span class="number">4</span>, Type::Primitive(PrimitiveType::Int))
-<a href=#1250 id=1250 data-nosnippet>1250</a>                    .into(),
-<a href=#1251 id=1251 data-nosnippet>1251</a>                value_field: NestedField::map_value_element(
-<a href=#1252 id=1252 data-nosnippet>1252</a>                    <span class="number">5</span>,
-<a href=#1253 id=1253 data-nosnippet>1253</a>                    Type::Primitive(PrimitiveType::String),
-<a href=#1254 id=1254 data-nosnippet>1254</a>                    <span class="bool-val">false</span>,
-<a href=#1255 id=1255 data-nosnippet>1255</a>                )
-<a href=#1256 id=1256 data-nosnippet>1256</a>                .into(),
-<a href=#1257 id=1257 data-nosnippet>1257</a>            }),
-<a href=#1258 id=1258 data-nosnippet>1258</a>        );
-<a href=#1259 id=1259 data-nosnippet>1259</a>
-<a href=#1260 id=1260 data-nosnippet>1260</a>        check_type_serde(
-<a href=#1261 id=1261 data-nosnippet>1261</a>            record,
-<a href=#1262 id=1262 data-nosnippet>1262</a>            Type::Map(MapType::optional(
-<a href=#1263 id=1263 data-nosnippet>1263</a>                <span class="number">4</span>,
-<a href=#1264 id=1264 data-nosnippet>1264</a>                Type::Primitive(PrimitiveType::Int),
-<a href=#1265 id=1265 data-nosnippet>1265</a>                <span class="number">5</span>,
-<a href=#1266 id=1266 data-nosnippet>1266</a>                Type::Primitive(PrimitiveType::String),
-<a href=#1267 id=1267 data-nosnippet>1267</a>            )),
-<a href=#1268 id=1268 data-nosnippet>1268</a>        );
-<a href=#1269 id=1269 data-nosnippet>1269</a>    }
-<a href=#1270 id=1270 data-nosnippet>1270</a>
-<a href=#1271 id=1271 data-nosnippet>1271</a>    <span class="attr">#[test]
-<a href=#1272 id=1272 data-nosnippet>1272</a>    </span><span class="kw">fn </span>map_required_int() {
-<a href=#1273 id=1273 data-nosnippet>1273</a>        <span class="kw">let </span>record = <span class="string">r#"
-<a href=#1274 id=1274 data-nosnippet>1274</a>        {
-<a href=#1275 id=1275 data-nosnippet>1275</a>            "type": "map",
-<a href=#1276 id=1276 data-nosnippet>1276</a>            "key-id": 4,
-<a href=#1277 id=1277 data-nosnippet>1277</a>            "key": "int",
-<a href=#1278 id=1278 data-nosnippet>1278</a>            "value-id": 5,
-<a href=#1279 id=1279 data-nosnippet>1279</a>            "value-required": true,
-<a href=#1280 id=1280 data-nosnippet>1280</a>            "value": "string"
-<a href=#1281 id=1281 data-nosnippet>1281</a>        }
-<a href=#1282 id=1282 data-nosnippet>1282</a>        "#</span>;
-<a href=#1283 id=1283 data-nosnippet>1283</a>
-<a href=#1284 id=1284 data-nosnippet>1284</a>        check_type_serde(
-<a href=#1285 id=1285 data-nosnippet>1285</a>            record,
-<a href=#1286 id=1286 data-nosnippet>1286</a>            Type::Map(MapType::required(
-<a href=#1287 id=1287 data-nosnippet>1287</a>                <span class="number">4</span>,
-<a href=#1288 id=1288 data-nosnippet>1288</a>                Type::Primitive(PrimitiveType::Int),
-<a href=#1289 id=1289 data-nosnippet>1289</a>                <span class="number">5</span>,
-<a href=#1290 id=1290 data-nosnippet>1290</a>                Type::Primitive(PrimitiveType::String),
-<a href=#1291 id=1291 data-nosnippet>1291</a>            )),
-<a href=#1292 id=1292 data-nosnippet>1292</a>        );
-<a href=#1293 id=1293 data-nosnippet>1293</a>    }
-<a href=#1294 id=1294 data-nosnippet>1294</a>
-<a href=#1295 id=1295 data-nosnippet>1295</a>    <span class="attr">#[test]
-<a href=#1296 id=1296 data-nosnippet>1296</a>    </span><span class="kw">fn </span>test_decimal_precision() {
-<a href=#1297 id=1297 data-nosnippet>1297</a>        <span class="kw">let </span>expected_max_precision = [
-<a href=#1298 id=1298 data-nosnippet>1298</a>            <span class="number">2</span>, <span class="number">4</span>, <span class="number">6</span>, <span class="number">9</span>, <span class="number">11</span>, <span class="number">14</span>, <span class="number">16</span>, <span class="number">18</span>, <span class="number">21</span>, <span class="number">23</span>, <span class="number">26</span>, <span class="number">28</span>, <span class="number">31</span>, <span class="number">33 [...]
-<a href=#1299 id=1299 data-nosnippet>1299</a>            <span class="number">57</span>,
-<a href=#1300 id=1300 data-nosnippet>1300</a>        ];
-<a href=#1301 id=1301 data-nosnippet>1301</a>        <span class="kw">for </span>(i, max_precision) <span class="kw">in </span>expected_max_precision.iter().enumerate() {
-<a href=#1302 id=1302 data-nosnippet>1302</a>            <span class="macro">assert_eq!</span>(
-<a href=#1303 id=1303 data-nosnippet>1303</a>                <span class="kw-2">*</span>max_precision,
-<a href=#1304 id=1304 data-nosnippet>1304</a>                Type::decimal_max_precision(i <span class="kw">as </span>u32 + <span class="number">1</span>).unwrap(),
-<a href=#1305 id=1305 data-nosnippet>1305</a>                <span class="string">"Failed calculate max precision for {i}"
-<a href=#1306 id=1306 data-nosnippet>1306</a>            </span>);
-<a href=#1307 id=1307 data-nosnippet>1307</a>        }
-<a href=#1308 id=1308 data-nosnippet>1308</a>
-<a href=#1309 id=1309 data-nosnippet>1309</a>        <span class="macro">assert_eq!</span>(<span class="number">5</span>, Type::decimal_required_bytes(<span class="number">10</span>).unwrap());
-<a href=#1310 id=1310 data-nosnippet>1310</a>        <span class="macro">assert_eq!</span>(<span class="number">16</span>, Type::decimal_required_bytes(<span class="number">38</span>).unwrap());
-<a href=#1311 id=1311 data-nosnippet>1311</a>    }
+<a href=#971 id=971 data-nosnippet>971</a>                    NestedField::required(<span class="number">3</span>, <span class="string">"long_field"</span>, Type::Primitive(PrimitiveType::Long))
+<a href=#972 id=972 data-nosnippet>972</a>                        .into(),
+<a href=#973 id=973 data-nosnippet>973</a>                    NestedField::required(<span class="number">4</span>, <span class="string">"float_field"</span>, Type::Primitive(PrimitiveType::Float))
+<a href=#974 id=974 data-nosnippet>974</a>                        .into(),
+<a href=#975 id=975 data-nosnippet>975</a>                    NestedField::required(
+<a href=#976 id=976 data-nosnippet>976</a>                        <span class="number">5</span>,
+<a href=#977 id=977 data-nosnippet>977</a>                        <span class="string">"double_field"</span>,
+<a href=#978 id=978 data-nosnippet>978</a>                        Type::Primitive(PrimitiveType::Double),
+<a href=#979 id=979 data-nosnippet>979</a>                    )
+<a href=#980 id=980 data-nosnippet>980</a>                    .into(),
+<a href=#981 id=981 data-nosnippet>981</a>                    NestedField::required(
+<a href=#982 id=982 data-nosnippet>982</a>                        <span class="number">6</span>,
+<a href=#983 id=983 data-nosnippet>983</a>                        <span class="string">"decimal_field"</span>,
+<a href=#984 id=984 data-nosnippet>984</a>                        Type::Primitive(PrimitiveType::Decimal {
+<a href=#985 id=985 data-nosnippet>985</a>                            precision: <span class="number">9</span>,
+<a href=#986 id=986 data-nosnippet>986</a>                            scale: <span class="number">2</span>,
+<a href=#987 id=987 data-nosnippet>987</a>                        }),
+<a href=#988 id=988 data-nosnippet>988</a>                    )
+<a href=#989 id=989 data-nosnippet>989</a>                    .into(),
+<a href=#990 id=990 data-nosnippet>990</a>                    NestedField::required(<span class="number">7</span>, <span class="string">"date_field"</span>, Type::Primitive(PrimitiveType::Date))
+<a href=#991 id=991 data-nosnippet>991</a>                        .into(),
+<a href=#992 id=992 data-nosnippet>992</a>                    NestedField::required(<span class="number">8</span>, <span class="string">"time_field"</span>, Type::Primitive(PrimitiveType::Time))
+<a href=#993 id=993 data-nosnippet>993</a>                        .into(),
+<a href=#994 id=994 data-nosnippet>994</a>                    NestedField::required(
+<a href=#995 id=995 data-nosnippet>995</a>                        <span class="number">9</span>,
+<a href=#996 id=996 data-nosnippet>996</a>                        <span class="string">"timestamp_field"</span>,
+<a href=#997 id=997 data-nosnippet>997</a>                        Type::Primitive(PrimitiveType::Timestamp),
+<a href=#998 id=998 data-nosnippet>998</a>                    )
+<a href=#999 id=999 data-nosnippet>999</a>                    .into(),
+<a href=#1000 id=1000 data-nosnippet>1000</a>                    NestedField::required(
+<a href=#1001 id=1001 data-nosnippet>1001</a>                        <span class="number">10</span>,
+<a href=#1002 id=1002 data-nosnippet>1002</a>                        <span class="string">"timestamptz_field"</span>,
+<a href=#1003 id=1003 data-nosnippet>1003</a>                        Type::Primitive(PrimitiveType::Timestamptz),
+<a href=#1004 id=1004 data-nosnippet>1004</a>                    )
+<a href=#1005 id=1005 data-nosnippet>1005</a>                    .into(),
+<a href=#1006 id=1006 data-nosnippet>1006</a>                    NestedField::required(
+<a href=#1007 id=1007 data-nosnippet>1007</a>                        <span class="number">11</span>,
+<a href=#1008 id=1008 data-nosnippet>1008</a>                        <span class="string">"timestamp_ns_field"</span>,
+<a href=#1009 id=1009 data-nosnippet>1009</a>                        Type::Primitive(PrimitiveType::TimestampNs),
+<a href=#1010 id=1010 data-nosnippet>1010</a>                    )
+<a href=#1011 id=1011 data-nosnippet>1011</a>                    .into(),
+<a href=#1012 id=1012 data-nosnippet>1012</a>                    NestedField::required(
+<a href=#1013 id=1013 data-nosnippet>1013</a>                        <span class="number">12</span>,
+<a href=#1014 id=1014 data-nosnippet>1014</a>                        <span class="string">"timestamptz_ns_field"</span>,
+<a href=#1015 id=1015 data-nosnippet>1015</a>                        Type::Primitive(PrimitiveType::TimestamptzNs),
+<a href=#1016 id=1016 data-nosnippet>1016</a>                    )
+<a href=#1017 id=1017 data-nosnippet>1017</a>                    .into(),
+<a href=#1018 id=1018 data-nosnippet>1018</a>                    NestedField::required(<span class="number">13</span>, <span class="string">"uuid_field"</span>, Type::Primitive(PrimitiveType::Uuid))
+<a href=#1019 id=1019 data-nosnippet>1019</a>                        .into(),
+<a href=#1020 id=1020 data-nosnippet>1020</a>                    NestedField::required(
+<a href=#1021 id=1021 data-nosnippet>1021</a>                        <span class="number">14</span>,
+<a href=#1022 id=1022 data-nosnippet>1022</a>                        <span class="string">"fixed_field"</span>,
+<a href=#1023 id=1023 data-nosnippet>1023</a>                        Type::Primitive(PrimitiveType::Fixed(<span class="number">10</span>)),
+<a href=#1024 id=1024 data-nosnippet>1024</a>                    )
+<a href=#1025 id=1025 data-nosnippet>1025</a>                    .into(),
+<a href=#1026 id=1026 data-nosnippet>1026</a>                    NestedField::required(
+<a href=#1027 id=1027 data-nosnippet>1027</a>                        <span class="number">15</span>,
+<a href=#1028 id=1028 data-nosnippet>1028</a>                        <span class="string">"binary_field"</span>,
+<a href=#1029 id=1029 data-nosnippet>1029</a>                        Type::Primitive(PrimitiveType::Binary),
+<a href=#1030 id=1030 data-nosnippet>1030</a>                    )
+<a href=#1031 id=1031 data-nosnippet>1031</a>                    .into(),
+<a href=#1032 id=1032 data-nosnippet>1032</a>                    NestedField::required(
+<a href=#1033 id=1033 data-nosnippet>1033</a>                        <span class="number">16</span>,
+<a href=#1034 id=1034 data-nosnippet>1034</a>                        <span class="string">"string_field"</span>,
+<a href=#1035 id=1035 data-nosnippet>1035</a>                        Type::Primitive(PrimitiveType::String),
+<a href=#1036 id=1036 data-nosnippet>1036</a>                    )
+<a href=#1037 id=1037 data-nosnippet>1037</a>                    .into(),
+<a href=#1038 id=1038 data-nosnippet>1038</a>                ],
+<a href=#1039 id=1039 data-nosnippet>1039</a>                id_lookup: OnceLock::default(),
+<a href=#1040 id=1040 data-nosnippet>1040</a>                name_lookup: OnceLock::default(),
+<a href=#1041 id=1041 data-nosnippet>1041</a>            }),
+<a href=#1042 id=1042 data-nosnippet>1042</a>        )
+<a href=#1043 id=1043 data-nosnippet>1043</a>    }
+<a href=#1044 id=1044 data-nosnippet>1044</a>
+<a href=#1045 id=1045 data-nosnippet>1045</a>    <span class="attr">#[test]
+<a href=#1046 id=1046 data-nosnippet>1046</a>    </span><span class="kw">fn </span>struct_type() {
+<a href=#1047 id=1047 data-nosnippet>1047</a>        <span class="kw">let </span>record = <span class="string">r#"
+<a href=#1048 id=1048 data-nosnippet>1048</a>        {
+<a href=#1049 id=1049 data-nosnippet>1049</a>            "type": "struct",
+<a href=#1050 id=1050 data-nosnippet>1050</a>            "fields": [
+<a href=#1051 id=1051 data-nosnippet>1051</a>                {
+<a href=#1052 id=1052 data-nosnippet>1052</a>                    "id": 1,
+<a href=#1053 id=1053 data-nosnippet>1053</a>                    "name": "id",
+<a href=#1054 id=1054 data-nosnippet>1054</a>                    "required": true,
+<a href=#1055 id=1055 data-nosnippet>1055</a>                    "type": "uuid",
+<a href=#1056 id=1056 data-nosnippet>1056</a>                    "initial-default": "0db3e2a8-9d1d-42b9-aa7b-74ebe558dceb",
+<a href=#1057 id=1057 data-nosnippet>1057</a>                    "write-default": "ec5911be-b0a7-458c-8438-c9a3e53cffae"
+<a href=#1058 id=1058 data-nosnippet>1058</a>                }, {
+<a href=#1059 id=1059 data-nosnippet>1059</a>                    "id": 2,
+<a href=#1060 id=1060 data-nosnippet>1060</a>                    "name": "data",
+<a href=#1061 id=1061 data-nosnippet>1061</a>                    "required": false,
+<a href=#1062 id=1062 data-nosnippet>1062</a>                    "type": "int"
+<a href=#1063 id=1063 data-nosnippet>1063</a>                }
+<a href=#1064 id=1064 data-nosnippet>1064</a>            ]
+<a href=#1065 id=1065 data-nosnippet>1065</a>        }
+<a href=#1066 id=1066 data-nosnippet>1066</a>        "#</span>;
+<a href=#1067 id=1067 data-nosnippet>1067</a>
+<a href=#1068 id=1068 data-nosnippet>1068</a>        check_type_serde(
+<a href=#1069 id=1069 data-nosnippet>1069</a>            record,
+<a href=#1070 id=1070 data-nosnippet>1070</a>            Type::Struct(StructType {
+<a href=#1071 id=1071 data-nosnippet>1071</a>                fields: <span class="macro">vec!</span>[
+<a href=#1072 id=1072 data-nosnippet>1072</a>                    NestedField::required(<span class="number">1</span>, <span class="string">"id"</span>, Type::Primitive(PrimitiveType::Uuid))
+<a href=#1073 id=1073 data-nosnippet>1073</a>                        .with_initial_default(Literal::Primitive(PrimitiveLiteral::UInt128(
+<a href=#1074 id=1074 data-nosnippet>1074</a>                            Uuid::parse_str(<span class="string">"0db3e2a8-9d1d-42b9-aa7b-74ebe558dceb"</span>)
+<a href=#1075 id=1075 data-nosnippet>1075</a>                                .unwrap()
+<a href=#1076 id=1076 data-nosnippet>1076</a>                                .as_u128(),
+<a href=#1077 id=1077 data-nosnippet>1077</a>                        )))
+<a href=#1078 id=1078 data-nosnippet>1078</a>                        .with_write_default(Literal::Primitive(PrimitiveLiteral::UInt128(
+<a href=#1079 id=1079 data-nosnippet>1079</a>                            Uuid::parse_str(<span class="string">"ec5911be-b0a7-458c-8438-c9a3e53cffae"</span>)
+<a href=#1080 id=1080 data-nosnippet>1080</a>                                .unwrap()
+<a href=#1081 id=1081 data-nosnippet>1081</a>                                .as_u128(),
+<a href=#1082 id=1082 data-nosnippet>1082</a>                        )))
+<a href=#1083 id=1083 data-nosnippet>1083</a>                        .into(),
+<a href=#1084 id=1084 data-nosnippet>1084</a>                    NestedField::optional(<span class="number">2</span>, <span class="string">"data"</span>, Type::Primitive(PrimitiveType::Int)).into(),
+<a href=#1085 id=1085 data-nosnippet>1085</a>                ],
+<a href=#1086 id=1086 data-nosnippet>1086</a>                id_lookup: HashMap::from([(<span class="number">1</span>, <span class="number">0</span>), (<span class="number">2</span>, <span class="number">1</span>)]).into(),
+<a href=#1087 id=1087 data-nosnippet>1087</a>                name_lookup: HashMap::from([(<span class="string">"id"</span>.to_string(), <span class="number">0</span>), (<span class="string">"data"</span>.to_string(), <span class="number">1</span>)]).into(),
+<a href=#1088 id=1088 data-nosnippet>1088</a>            }),
+<a href=#1089 id=1089 data-nosnippet>1089</a>        )
+<a href=#1090 id=1090 data-nosnippet>1090</a>    }
+<a href=#1091 id=1091 data-nosnippet>1091</a>
+<a href=#1092 id=1092 data-nosnippet>1092</a>    <span class="attr">#[test]
+<a href=#1093 id=1093 data-nosnippet>1093</a>    </span><span class="kw">fn </span>test_deeply_nested_struct() {
+<a href=#1094 id=1094 data-nosnippet>1094</a>        <span class="kw">let </span>record = <span class="string">r#"
+<a href=#1095 id=1095 data-nosnippet>1095</a>{
+<a href=#1096 id=1096 data-nosnippet>1096</a>  "type": "struct",
+<a href=#1097 id=1097 data-nosnippet>1097</a>  "fields": [
+<a href=#1098 id=1098 data-nosnippet>1098</a>    {
+<a href=#1099 id=1099 data-nosnippet>1099</a>      "id": 1,
+<a href=#1100 id=1100 data-nosnippet>1100</a>      "name": "id",
+<a href=#1101 id=1101 data-nosnippet>1101</a>      "required": true,
+<a href=#1102 id=1102 data-nosnippet>1102</a>      "type": "uuid",
+<a href=#1103 id=1103 data-nosnippet>1103</a>      "initial-default": "0db3e2a8-9d1d-42b9-aa7b-74ebe558dceb",
+<a href=#1104 id=1104 data-nosnippet>1104</a>      "write-default": "ec5911be-b0a7-458c-8438-c9a3e53cffae"
+<a href=#1105 id=1105 data-nosnippet>1105</a>    },
+<a href=#1106 id=1106 data-nosnippet>1106</a>    {
+<a href=#1107 id=1107 data-nosnippet>1107</a>      "id": 2,
+<a href=#1108 id=1108 data-nosnippet>1108</a>      "name": "data",
+<a href=#1109 id=1109 data-nosnippet>1109</a>      "required": false,
+<a href=#1110 id=1110 data-nosnippet>1110</a>      "type": "int"
+<a href=#1111 id=1111 data-nosnippet>1111</a>    },
+<a href=#1112 id=1112 data-nosnippet>1112</a>    {
+<a href=#1113 id=1113 data-nosnippet>1113</a>      "id": 3,
+<a href=#1114 id=1114 data-nosnippet>1114</a>      "name": "address",
+<a href=#1115 id=1115 data-nosnippet>1115</a>      "required": true,
+<a href=#1116 id=1116 data-nosnippet>1116</a>      "type": {
+<a href=#1117 id=1117 data-nosnippet>1117</a>        "type": "struct",
+<a href=#1118 id=1118 data-nosnippet>1118</a>        "fields": [
+<a href=#1119 id=1119 data-nosnippet>1119</a>          {
+<a href=#1120 id=1120 data-nosnippet>1120</a>            "id": 4,
+<a href=#1121 id=1121 data-nosnippet>1121</a>            "name": "street",
+<a href=#1122 id=1122 data-nosnippet>1122</a>            "required": true,
+<a href=#1123 id=1123 data-nosnippet>1123</a>            "type": "string"
+<a href=#1124 id=1124 data-nosnippet>1124</a>          },
+<a href=#1125 id=1125 data-nosnippet>1125</a>          {
+<a href=#1126 id=1126 data-nosnippet>1126</a>            "id": 5,
+<a href=#1127 id=1127 data-nosnippet>1127</a>            "name": "province",
+<a href=#1128 id=1128 data-nosnippet>1128</a>            "required": false,
+<a href=#1129 id=1129 data-nosnippet>1129</a>            "type": "string"
+<a href=#1130 id=1130 data-nosnippet>1130</a>          },
+<a href=#1131 id=1131 data-nosnippet>1131</a>          {
+<a href=#1132 id=1132 data-nosnippet>1132</a>            "id": 6,
+<a href=#1133 id=1133 data-nosnippet>1133</a>            "name": "zip",
+<a href=#1134 id=1134 data-nosnippet>1134</a>            "required": true,
+<a href=#1135 id=1135 data-nosnippet>1135</a>            "type": "int"
+<a href=#1136 id=1136 data-nosnippet>1136</a>          }
+<a href=#1137 id=1137 data-nosnippet>1137</a>        ]
+<a href=#1138 id=1138 data-nosnippet>1138</a>      }
+<a href=#1139 id=1139 data-nosnippet>1139</a>    }
+<a href=#1140 id=1140 data-nosnippet>1140</a>  ]
+<a href=#1141 id=1141 data-nosnippet>1141</a>}
+<a href=#1142 id=1142 data-nosnippet>1142</a>"#</span>;
+<a href=#1143 id=1143 data-nosnippet>1143</a>
+<a href=#1144 id=1144 data-nosnippet>1144</a>        <span class="kw">let </span>struct_type = Type::Struct(StructType::new(<span class="macro">vec!</span>[
+<a href=#1145 id=1145 data-nosnippet>1145</a>            NestedField::required(<span class="number">1</span>, <span class="string">"id"</span>, Type::Primitive(PrimitiveType::Uuid))
+<a href=#1146 id=1146 data-nosnippet>1146</a>                .with_initial_default(Literal::Primitive(PrimitiveLiteral::UInt128(
+<a href=#1147 id=1147 data-nosnippet>1147</a>                    Uuid::parse_str(<span class="string">"0db3e2a8-9d1d-42b9-aa7b-74ebe558dceb"</span>)
+<a href=#1148 id=1148 data-nosnippet>1148</a>                        .unwrap()
+<a href=#1149 id=1149 data-nosnippet>1149</a>                        .as_u128(),
+<a href=#1150 id=1150 data-nosnippet>1150</a>                )))
+<a href=#1151 id=1151 data-nosnippet>1151</a>                .with_write_default(Literal::Primitive(PrimitiveLiteral::UInt128(
+<a href=#1152 id=1152 data-nosnippet>1152</a>                    Uuid::parse_str(<span class="string">"ec5911be-b0a7-458c-8438-c9a3e53cffae"</span>)
+<a href=#1153 id=1153 data-nosnippet>1153</a>                        .unwrap()
+<a href=#1154 id=1154 data-nosnippet>1154</a>                        .as_u128(),
+<a href=#1155 id=1155 data-nosnippet>1155</a>                )))
+<a href=#1156 id=1156 data-nosnippet>1156</a>                .into(),
+<a href=#1157 id=1157 data-nosnippet>1157</a>            NestedField::optional(<span class="number">2</span>, <span class="string">"data"</span>, Type::Primitive(PrimitiveType::Int)).into(),
+<a href=#1158 id=1158 data-nosnippet>1158</a>            NestedField::required(
+<a href=#1159 id=1159 data-nosnippet>1159</a>                <span class="number">3</span>,
+<a href=#1160 id=1160 data-nosnippet>1160</a>                <span class="string">"address"</span>,
+<a href=#1161 id=1161 data-nosnippet>1161</a>                Type::Struct(StructType::new(<span class="macro">vec!</span>[
+<a href=#1162 id=1162 data-nosnippet>1162</a>                    NestedField::required(<span class="number">4</span>, <span class="string">"street"</span>, Type::Primitive(PrimitiveType::String))
+<a href=#1163 id=1163 data-nosnippet>1163</a>                        .into(),
+<a href=#1164 id=1164 data-nosnippet>1164</a>                    NestedField::optional(<span class="number">5</span>, <span class="string">"province"</span>, Type::Primitive(PrimitiveType::String))
+<a href=#1165 id=1165 data-nosnippet>1165</a>                        .into(),
+<a href=#1166 id=1166 data-nosnippet>1166</a>                    NestedField::required(<span class="number">6</span>, <span class="string">"zip"</span>, Type::Primitive(PrimitiveType::Int)).into(),
+<a href=#1167 id=1167 data-nosnippet>1167</a>                ])),
+<a href=#1168 id=1168 data-nosnippet>1168</a>            )
+<a href=#1169 id=1169 data-nosnippet>1169</a>            .into(),
+<a href=#1170 id=1170 data-nosnippet>1170</a>        ]));
+<a href=#1171 id=1171 data-nosnippet>1171</a>
+<a href=#1172 id=1172 data-nosnippet>1172</a>        check_type_serde(record, struct_type)
+<a href=#1173 id=1173 data-nosnippet>1173</a>    }
+<a href=#1174 id=1174 data-nosnippet>1174</a>
+<a href=#1175 id=1175 data-nosnippet>1175</a>    <span class="attr">#[test]
+<a href=#1176 id=1176 data-nosnippet>1176</a>    </span><span class="kw">fn </span>list() {
+<a href=#1177 id=1177 data-nosnippet>1177</a>        <span class="kw">let </span>record = <span class="string">r#"
+<a href=#1178 id=1178 data-nosnippet>1178</a>        {
+<a href=#1179 id=1179 data-nosnippet>1179</a>            "type": "list",
+<a href=#1180 id=1180 data-nosnippet>1180</a>            "element-id": 3,
+<a href=#1181 id=1181 data-nosnippet>1181</a>            "element-required": true,
+<a href=#1182 id=1182 data-nosnippet>1182</a>            "element": "string"
+<a href=#1183 id=1183 data-nosnippet>1183</a>        }
+<a href=#1184 id=1184 data-nosnippet>1184</a>        "#</span>;
+<a href=#1185 id=1185 data-nosnippet>1185</a>
+<a href=#1186 id=1186 data-nosnippet>1186</a>        check_type_serde(
+<a href=#1187 id=1187 data-nosnippet>1187</a>            record,
+<a href=#1188 id=1188 data-nosnippet>1188</a>            Type::List(ListType {
+<a href=#1189 id=1189 data-nosnippet>1189</a>                element_field: NestedField::list_element(
+<a href=#1190 id=1190 data-nosnippet>1190</a>                    <span class="number">3</span>,
+<a href=#1191 id=1191 data-nosnippet>1191</a>                    Type::Primitive(PrimitiveType::String),
+<a href=#1192 id=1192 data-nosnippet>1192</a>                    <span class="bool-val">true</span>,
+<a href=#1193 id=1193 data-nosnippet>1193</a>                )
+<a href=#1194 id=1194 data-nosnippet>1194</a>                .into(),
+<a href=#1195 id=1195 data-nosnippet>1195</a>            }),
+<a href=#1196 id=1196 data-nosnippet>1196</a>        );
+<a href=#1197 id=1197 data-nosnippet>1197</a>    }
+<a href=#1198 id=1198 data-nosnippet>1198</a>
+<a href=#1199 id=1199 data-nosnippet>1199</a>    <span class="attr">#[test]
+<a href=#1200 id=1200 data-nosnippet>1200</a>    </span><span class="kw">fn </span>map() {
+<a href=#1201 id=1201 data-nosnippet>1201</a>        <span class="kw">let </span>record = <span class="string">r#"
+<a href=#1202 id=1202 data-nosnippet>1202</a>        {
+<a href=#1203 id=1203 data-nosnippet>1203</a>            "type": "map",
+<a href=#1204 id=1204 data-nosnippet>1204</a>            "key-id": 4,
+<a href=#1205 id=1205 data-nosnippet>1205</a>            "key": "string",
+<a href=#1206 id=1206 data-nosnippet>1206</a>            "value-id": 5,
+<a href=#1207 id=1207 data-nosnippet>1207</a>            "value-required": false,
+<a href=#1208 id=1208 data-nosnippet>1208</a>            "value": "double"
+<a href=#1209 id=1209 data-nosnippet>1209</a>        }
+<a href=#1210 id=1210 data-nosnippet>1210</a>        "#</span>;
+<a href=#1211 id=1211 data-nosnippet>1211</a>
+<a href=#1212 id=1212 data-nosnippet>1212</a>        check_type_serde(
+<a href=#1213 id=1213 data-nosnippet>1213</a>            record,
+<a href=#1214 id=1214 data-nosnippet>1214</a>            Type::Map(MapType {
+<a href=#1215 id=1215 data-nosnippet>1215</a>                key_field: NestedField::map_key_element(<span class="number">4</span>, Type::Primitive(PrimitiveType::String))
+<a href=#1216 id=1216 data-nosnippet>1216</a>                    .into(),
+<a href=#1217 id=1217 data-nosnippet>1217</a>                value_field: NestedField::map_value_element(
+<a href=#1218 id=1218 data-nosnippet>1218</a>                    <span class="number">5</span>,
+<a href=#1219 id=1219 data-nosnippet>1219</a>                    Type::Primitive(PrimitiveType::Double),
+<a href=#1220 id=1220 data-nosnippet>1220</a>                    <span class="bool-val">false</span>,
+<a href=#1221 id=1221 data-nosnippet>1221</a>                )
+<a href=#1222 id=1222 data-nosnippet>1222</a>                .into(),
+<a href=#1223 id=1223 data-nosnippet>1223</a>            }),
+<a href=#1224 id=1224 data-nosnippet>1224</a>        );
+<a href=#1225 id=1225 data-nosnippet>1225</a>
+<a href=#1226 id=1226 data-nosnippet>1226</a>        check_type_serde(
+<a href=#1227 id=1227 data-nosnippet>1227</a>            record,
+<a href=#1228 id=1228 data-nosnippet>1228</a>            Type::Map(MapType::optional(
+<a href=#1229 id=1229 data-nosnippet>1229</a>                <span class="number">4</span>,
+<a href=#1230 id=1230 data-nosnippet>1230</a>                Type::Primitive(PrimitiveType::String),
+<a href=#1231 id=1231 data-nosnippet>1231</a>                <span class="number">5</span>,
+<a href=#1232 id=1232 data-nosnippet>1232</a>                Type::Primitive(PrimitiveType::Double),
+<a href=#1233 id=1233 data-nosnippet>1233</a>            )),
+<a href=#1234 id=1234 data-nosnippet>1234</a>        );
+<a href=#1235 id=1235 data-nosnippet>1235</a>    }
+<a href=#1236 id=1236 data-nosnippet>1236</a>
+<a href=#1237 id=1237 data-nosnippet>1237</a>    <span class="attr">#[test]
+<a href=#1238 id=1238 data-nosnippet>1238</a>    </span><span class="kw">fn </span>map_int() {
+<a href=#1239 id=1239 data-nosnippet>1239</a>        <span class="kw">let </span>record = <span class="string">r#"
+<a href=#1240 id=1240 data-nosnippet>1240</a>        {
+<a href=#1241 id=1241 data-nosnippet>1241</a>            "type": "map",
+<a href=#1242 id=1242 data-nosnippet>1242</a>            "key-id": 4,
+<a href=#1243 id=1243 data-nosnippet>1243</a>            "key": "int",
+<a href=#1244 id=1244 data-nosnippet>1244</a>            "value-id": 5,
+<a href=#1245 id=1245 data-nosnippet>1245</a>            "value-required": false,
+<a href=#1246 id=1246 data-nosnippet>1246</a>            "value": "string"
+<a href=#1247 id=1247 data-nosnippet>1247</a>        }
+<a href=#1248 id=1248 data-nosnippet>1248</a>        "#</span>;
+<a href=#1249 id=1249 data-nosnippet>1249</a>
+<a href=#1250 id=1250 data-nosnippet>1250</a>        check_type_serde(
+<a href=#1251 id=1251 data-nosnippet>1251</a>            record,
+<a href=#1252 id=1252 data-nosnippet>1252</a>            Type::Map(MapType {
+<a href=#1253 id=1253 data-nosnippet>1253</a>                key_field: NestedField::map_key_element(<span class="number">4</span>, Type::Primitive(PrimitiveType::Int))
+<a href=#1254 id=1254 data-nosnippet>1254</a>                    .into(),
+<a href=#1255 id=1255 data-nosnippet>1255</a>                value_field: NestedField::map_value_element(
+<a href=#1256 id=1256 data-nosnippet>1256</a>                    <span class="number">5</span>,
+<a href=#1257 id=1257 data-nosnippet>1257</a>                    Type::Primitive(PrimitiveType::String),
+<a href=#1258 id=1258 data-nosnippet>1258</a>                    <span class="bool-val">false</span>,
+<a href=#1259 id=1259 data-nosnippet>1259</a>                )
+<a href=#1260 id=1260 data-nosnippet>1260</a>                .into(),
+<a href=#1261 id=1261 data-nosnippet>1261</a>            }),
+<a href=#1262 id=1262 data-nosnippet>1262</a>        );
+<a href=#1263 id=1263 data-nosnippet>1263</a>
+<a href=#1264 id=1264 data-nosnippet>1264</a>        check_type_serde(
+<a href=#1265 id=1265 data-nosnippet>1265</a>            record,
+<a href=#1266 id=1266 data-nosnippet>1266</a>            Type::Map(MapType::optional(
+<a href=#1267 id=1267 data-nosnippet>1267</a>                <span class="number">4</span>,
+<a href=#1268 id=1268 data-nosnippet>1268</a>                Type::Primitive(PrimitiveType::Int),
+<a href=#1269 id=1269 data-nosnippet>1269</a>                <span class="number">5</span>,
+<a href=#1270 id=1270 data-nosnippet>1270</a>                Type::Primitive(PrimitiveType::String),
+<a href=#1271 id=1271 data-nosnippet>1271</a>            )),
+<a href=#1272 id=1272 data-nosnippet>1272</a>        );
+<a href=#1273 id=1273 data-nosnippet>1273</a>    }
+<a href=#1274 id=1274 data-nosnippet>1274</a>
+<a href=#1275 id=1275 data-nosnippet>1275</a>    <span class="attr">#[test]
+<a href=#1276 id=1276 data-nosnippet>1276</a>    </span><span class="kw">fn </span>map_required_int() {
+<a href=#1277 id=1277 data-nosnippet>1277</a>        <span class="kw">let </span>record = <span class="string">r#"
+<a href=#1278 id=1278 data-nosnippet>1278</a>        {
+<a href=#1279 id=1279 data-nosnippet>1279</a>            "type": "map",
+<a href=#1280 id=1280 data-nosnippet>1280</a>            "key-id": 4,
+<a href=#1281 id=1281 data-nosnippet>1281</a>            "key": "int",
+<a href=#1282 id=1282 data-nosnippet>1282</a>            "value-id": 5,
+<a href=#1283 id=1283 data-nosnippet>1283</a>            "value-required": true,
+<a href=#1284 id=1284 data-nosnippet>1284</a>            "value": "string"
+<a href=#1285 id=1285 data-nosnippet>1285</a>        }
+<a href=#1286 id=1286 data-nosnippet>1286</a>        "#</span>;
+<a href=#1287 id=1287 data-nosnippet>1287</a>
+<a href=#1288 id=1288 data-nosnippet>1288</a>        check_type_serde(
+<a href=#1289 id=1289 data-nosnippet>1289</a>            record,
+<a href=#1290 id=1290 data-nosnippet>1290</a>            Type::Map(MapType::required(
+<a href=#1291 id=1291 data-nosnippet>1291</a>                <span class="number">4</span>,
+<a href=#1292 id=1292 data-nosnippet>1292</a>                Type::Primitive(PrimitiveType::Int),
+<a href=#1293 id=1293 data-nosnippet>1293</a>                <span class="number">5</span>,
+<a href=#1294 id=1294 data-nosnippet>1294</a>                Type::Primitive(PrimitiveType::String),
+<a href=#1295 id=1295 data-nosnippet>1295</a>            )),
+<a href=#1296 id=1296 data-nosnippet>1296</a>        );
+<a href=#1297 id=1297 data-nosnippet>1297</a>    }
+<a href=#1298 id=1298 data-nosnippet>1298</a>
+<a href=#1299 id=1299 data-nosnippet>1299</a>    <span class="attr">#[test]
+<a href=#1300 id=1300 data-nosnippet>1300</a>    </span><span class="kw">fn </span>test_decimal_precision() {
+<a href=#1301 id=1301 data-nosnippet>1301</a>        <span class="kw">let </span>expected_max_precision = [
+<a href=#1302 id=1302 data-nosnippet>1302</a>            <span class="number">2</span>, <span class="number">4</span>, <span class="number">6</span>, <span class="number">9</span>, <span class="number">11</span>, <span class="number">14</span>, <span class="number">16</span>, <span class="number">18</span>, <span class="number">21</span>, <span class="number">23</span>, <span class="number">26</span>, <span class="number">28</span>, <span class="number">31</span>, <span class="number">33 [...]
+<a href=#1303 id=1303 data-nosnippet>1303</a>            <span class="number">57</span>,
+<a href=#1304 id=1304 data-nosnippet>1304</a>        ];
+<a href=#1305 id=1305 data-nosnippet>1305</a>        <span class="kw">for </span>(i, max_precision) <span class="kw">in </span>expected_max_precision.iter().enumerate() {
+<a href=#1306 id=1306 data-nosnippet>1306</a>            <span class="macro">assert_eq!</span>(
+<a href=#1307 id=1307 data-nosnippet>1307</a>                <span class="kw-2">*</span>max_precision,
+<a href=#1308 id=1308 data-nosnippet>1308</a>                Type::decimal_max_precision(i <span class="kw">as </span>u32 + <span class="number">1</span>).unwrap(),
+<a href=#1309 id=1309 data-nosnippet>1309</a>                <span class="string">"Failed calculate max precision for {i}"
+<a href=#1310 id=1310 data-nosnippet>1310</a>            </span>);
+<a href=#1311 id=1311 data-nosnippet>1311</a>        }
 <a href=#1312 id=1312 data-nosnippet>1312</a>
-<a href=#1313 id=1313 data-nosnippet>1313</a>    <span class="attr">#[test]
-<a href=#1314 id=1314 data-nosnippet>1314</a>    </span><span class="kw">fn </span>test_primitive_type_compatible() {
-<a href=#1315 id=1315 data-nosnippet>1315</a>        <span class="kw">let </span>pairs = <span class="macro">vec!</span>[
-<a href=#1316 id=1316 data-nosnippet>1316</a>            (PrimitiveType::Boolean, PrimitiveLiteral::Boolean(<span class="bool-val">true</span>)),
-<a href=#1317 id=1317 data-nosnippet>1317</a>            (PrimitiveType::Int, PrimitiveLiteral::Int(<span class="number">1</span>)),
-<a href=#1318 id=1318 data-nosnippet>1318</a>            (PrimitiveType::Long, PrimitiveLiteral::Long(<span class="number">1</span>)),
-<a href=#1319 id=1319 data-nosnippet>1319</a>            (PrimitiveType::Float, PrimitiveLiteral::Float(<span class="number">1.0</span>.into())),
-<a href=#1320 id=1320 data-nosnippet>1320</a>            (PrimitiveType::Double, PrimitiveLiteral::Double(<span class="number">1.0</span>.into())),
-<a href=#1321 id=1321 data-nosnippet>1321</a>            (
-<a href=#1322 id=1322 data-nosnippet>1322</a>                PrimitiveType::Decimal {
-<a href=#1323 id=1323 data-nosnippet>1323</a>                    precision: <span class="number">9</span>,
-<a href=#1324 id=1324 data-nosnippet>1324</a>                    scale: <span class="number">2</span>,
-<a href=#1325 id=1325 data-nosnippet>1325</a>                },
-<a href=#1326 id=1326 data-nosnippet>1326</a>                PrimitiveLiteral::Int128(<span class="number">1</span>),
-<a href=#1327 id=1327 data-nosnippet>1327</a>            ),
-<a href=#1328 id=1328 data-nosnippet>1328</a>            (PrimitiveType::Date, PrimitiveLiteral::Int(<span class="number">1</span>)),
-<a href=#1329 id=1329 data-nosnippet>1329</a>            (PrimitiveType::Time, PrimitiveLiteral::Long(<span class="number">1</span>)),
-<a href=#1330 id=1330 data-nosnippet>1330</a>            (PrimitiveType::Timestamptz, PrimitiveLiteral::Long(<span class="number">1</span>)),
-<a href=#1331 id=1331 data-nosnippet>1331</a>            (PrimitiveType::Timestamp, PrimitiveLiteral::Long(<span class="number">1</span>)),
-<a href=#1332 id=1332 data-nosnippet>1332</a>            (PrimitiveType::TimestamptzNs, PrimitiveLiteral::Long(<span class="number">1</span>)),
-<a href=#1333 id=1333 data-nosnippet>1333</a>            (PrimitiveType::TimestampNs, PrimitiveLiteral::Long(<span class="number">1</span>)),
-<a href=#1334 id=1334 data-nosnippet>1334</a>            (
-<a href=#1335 id=1335 data-nosnippet>1335</a>                PrimitiveType::Uuid,
-<a href=#1336 id=1336 data-nosnippet>1336</a>                PrimitiveLiteral::UInt128(Uuid::new_v4().as_u128()),
-<a href=#1337 id=1337 data-nosnippet>1337</a>            ),
-<a href=#1338 id=1338 data-nosnippet>1338</a>            (PrimitiveType::Fixed(<span class="number">8</span>), PrimitiveLiteral::Binary(<span class="macro">vec!</span>[<span class="number">1</span>])),
-<a href=#1339 id=1339 data-nosnippet>1339</a>            (PrimitiveType::Binary, PrimitiveLiteral::Binary(<span class="macro">vec!</span>[<span class="number">1</span>])),
-<a href=#1340 id=1340 data-nosnippet>1340</a>        ];
-<a href=#1341 id=1341 data-nosnippet>1341</a>        <span class="kw">for </span>(ty, literal) <span class="kw">in </span>pairs {
-<a href=#1342 id=1342 data-nosnippet>1342</a>            <span class="macro">assert!</span>(ty.compatible(<span class="kw-2">&amp;</span>literal));
-<a href=#1343 id=1343 data-nosnippet>1343</a>        }
-<a href=#1344 id=1344 data-nosnippet>1344</a>    }
-<a href=#1345 id=1345 data-nosnippet>1345</a>
-<a href=#1346 id=1346 data-nosnippet>1346</a>    <span class="attr">#[test]
-<a href=#1347 id=1347 data-nosnippet>1347</a>    </span><span class="kw">fn </span>variant_type_serde() {
-<a href=#1348 id=1348 data-nosnippet>1348</a>        <span class="kw">let </span>json = <span class="string">r#"{"id": 1, "name": "v", "required": true, "type": "variant"}"#</span>;
-<a href=#1349 id=1349 data-nosnippet>1349</a>        <span class="kw">let </span>field: NestedField = serde_json::from_str(json).unwrap();
-<a href=#1350 id=1350 data-nosnippet>1350</a>        <span class="macro">assert_eq!</span>(<span class="kw-2">*</span>field.field_type, Type::Variant(VariantType));
-<a href=#1351 id=1351 data-nosnippet>1351</a>
-<a href=#1352 id=1352 data-nosnippet>1352</a>        <span class="kw">let </span>serialized = serde_json::to_string(<span class="kw-2">&amp;</span>field).unwrap();
-<a href=#1353 id=1353 data-nosnippet>1353</a>        <span class="kw">let </span>roundtrip: NestedField = serde_json::from_str(<span class="kw-2">&amp;</span>serialized).unwrap();
-<a href=#1354 id=1354 data-nosnippet>1354</a>        <span class="macro">assert_eq!</span>(field, roundtrip);
-<a href=#1355 id=1355 data-nosnippet>1355</a>    }
-<a href=#1356 id=1356 data-nosnippet>1356</a>
-<a href=#1357 id=1357 data-nosnippet>1357</a>    <span class="attr">#[test]
-<a href=#1358 id=1358 data-nosnippet>1358</a>    </span><span class="kw">fn </span>struct_type_with_type_field() {
-<a href=#1359 id=1359 data-nosnippet>1359</a>        <span class="comment">// Test that StructType properly deserializes JSON with "type":"struct" field
-<a href=#1360 id=1360 data-nosnippet>1360</a>        // This was previously broken because the deserializer wasn't consuming the type field value
-<a href=#1361 id=1361 data-nosnippet>1361</a>        </span><span class="kw">let </span>json = <span class="string">r#"
-<a href=#1362 id=1362 data-nosnippet>1362</a>        {
-<a href=#1363 id=1363 data-nosnippet>1363</a>            "type": "struct",
-<a href=#1364 id=1364 data-nosnippet>1364</a>            "fields": [
-<a href=#1365 id=1365 data-nosnippet>1365</a>                {"id": 1, "name": "field1", "required": true, "type": "string"}
-<a href=#1366 id=1366 data-nosnippet>1366</a>            ]
-<a href=#1367 id=1367 data-nosnippet>1367</a>        }
-<a href=#1368 id=1368 data-nosnippet>1368</a>        "#</span>;
-<a href=#1369 id=1369 data-nosnippet>1369</a>
-<a href=#1370 id=1370 data-nosnippet>1370</a>        <span class="kw">let </span>struct_type: StructType = serde_json::from_str(json)
-<a href=#1371 id=1371 data-nosnippet>1371</a>            .expect(<span class="string">"Should successfully deserialize StructType with type field"</span>);
-<a href=#1372 id=1372 data-nosnippet>1372</a>
-<a href=#1373 id=1373 data-nosnippet>1373</a>        <span class="macro">assert_eq!</span>(struct_type.fields().len(), <span class="number">1</span>);
-<a href=#1374 id=1374 data-nosnippet>1374</a>        <span class="macro">assert_eq!</span>(struct_type.fields()[<span class="number">0</span>].name, <span class="string">"field1"</span>);
-<a href=#1375 id=1375 data-nosnippet>1375</a>    }
-<a href=#1376 id=1376 data-nosnippet>1376</a>
-<a href=#1377 id=1377 data-nosnippet>1377</a>    <span class="attr">#[test]
-<a href=#1378 id=1378 data-nosnippet>1378</a>    </span><span class="kw">fn </span>struct_type_rejects_wrong_type() {
-<a href=#1379 id=1379 data-nosnippet>1379</a>        <span class="comment">// Test that StructType validation rejects incorrect type field values
-<a href=#1380 id=1380 data-nosnippet>1380</a>        </span><span class="kw">let </span>json = <span class="string">r#"
-<a href=#1381 id=1381 data-nosnippet>1381</a>        {
-<a href=#1382 id=1382 data-nosnippet>1382</a>            "type": "list",
-<a href=#1383 id=1383 data-nosnippet>1383</a>            "fields": [
-<a href=#1384 id=1384 data-nosnippet>1384</a>                {"id": 1, "name": "field1", "required": true, "type": "string"}
-<a href=#1385 id=1385 data-nosnippet>1385</a>            ]
-<a href=#1386 id=1386 data-nosnippet>1386</a>        }
-<a href=#1387 id=1387 data-nosnippet>1387</a>        "#</span>;
-<a href=#1388 id=1388 data-nosnippet>1388</a>
-<a href=#1389 id=1389 data-nosnippet>1389</a>        <span class="kw">let </span>result = serde_json::from_str::&lt;StructType&gt;(json);
-<a href=#1390 id=1390 data-nosnippet>1390</a>        <span class="macro">assert!</span>(
-<a href=#1391 id=1391 data-nosnippet>1391</a>            result.is_err(),
-<a href=#1392 id=1392 data-nosnippet>1392</a>            <span class="string">"Should reject StructType with wrong type field"
-<a href=#1393 id=1393 data-nosnippet>1393</a>        </span>);
-<a href=#1394 id=1394 data-nosnippet>1394</a>        <span class="macro">assert!</span>(
-<a href=#1395 id=1395 data-nosnippet>1395</a>            result
-<a href=#1396 id=1396 data-nosnippet>1396</a>                .unwrap_err()
-<a href=#1397 id=1397 data-nosnippet>1397</a>                .to_string()
-<a href=#1398 id=1398 data-nosnippet>1398</a>                .contains(<span class="string">"expected type 'struct'"</span>)
-<a href=#1399 id=1399 data-nosnippet>1399</a>        );
-<a href=#1400 id=1400 data-nosnippet>1400</a>    }
-<a href=#1401 id=1401 data-nosnippet>1401</a>}
+<a href=#1313 id=1313 data-nosnippet>1313</a>        <span class="macro">assert_eq!</span>(<span class="number">5</span>, Type::decimal_required_bytes(<span class="number">10</span>).unwrap());
+<a href=#1314 id=1314 data-nosnippet>1314</a>        <span class="macro">assert_eq!</span>(<span class="number">16</span>, Type::decimal_required_bytes(<span class="number">38</span>).unwrap());
+<a href=#1315 id=1315 data-nosnippet>1315</a>    }
+<a href=#1316 id=1316 data-nosnippet>1316</a>
+<a href=#1317 id=1317 data-nosnippet>1317</a>    <span class="attr">#[test]
+<a href=#1318 id=1318 data-nosnippet>1318</a>    </span><span class="kw">fn </span>test_primitive_type_compatible() {
+<a href=#1319 id=1319 data-nosnippet>1319</a>        <span class="kw">let </span>pairs = <span class="macro">vec!</span>[
+<a href=#1320 id=1320 data-nosnippet>1320</a>            (PrimitiveType::Boolean, PrimitiveLiteral::Boolean(<span class="bool-val">true</span>)),
+<a href=#1321 id=1321 data-nosnippet>1321</a>            (PrimitiveType::Int, PrimitiveLiteral::Int(<span class="number">1</span>)),
+<a href=#1322 id=1322 data-nosnippet>1322</a>            (PrimitiveType::Long, PrimitiveLiteral::Long(<span class="number">1</span>)),
+<a href=#1323 id=1323 data-nosnippet>1323</a>            (PrimitiveType::Float, PrimitiveLiteral::Float(<span class="number">1.0</span>.into())),
+<a href=#1324 id=1324 data-nosnippet>1324</a>            (PrimitiveType::Double, PrimitiveLiteral::Double(<span class="number">1.0</span>.into())),
+<a href=#1325 id=1325 data-nosnippet>1325</a>            (
+<a href=#1326 id=1326 data-nosnippet>1326</a>                PrimitiveType::Decimal {
+<a href=#1327 id=1327 data-nosnippet>1327</a>                    precision: <span class="number">9</span>,
+<a href=#1328 id=1328 data-nosnippet>1328</a>                    scale: <span class="number">2</span>,
+<a href=#1329 id=1329 data-nosnippet>1329</a>                },
+<a href=#1330 id=1330 data-nosnippet>1330</a>                PrimitiveLiteral::Int128(<span class="number">1</span>),
+<a href=#1331 id=1331 data-nosnippet>1331</a>            ),
+<a href=#1332 id=1332 data-nosnippet>1332</a>            (PrimitiveType::Date, PrimitiveLiteral::Int(<span class="number">1</span>)),
+<a href=#1333 id=1333 data-nosnippet>1333</a>            (PrimitiveType::Time, PrimitiveLiteral::Long(<span class="number">1</span>)),
+<a href=#1334 id=1334 data-nosnippet>1334</a>            (PrimitiveType::Timestamptz, PrimitiveLiteral::Long(<span class="number">1</span>)),
+<a href=#1335 id=1335 data-nosnippet>1335</a>            (PrimitiveType::Timestamp, PrimitiveLiteral::Long(<span class="number">1</span>)),
+<a href=#1336 id=1336 data-nosnippet>1336</a>            (PrimitiveType::TimestamptzNs, PrimitiveLiteral::Long(<span class="number">1</span>)),
+<a href=#1337 id=1337 data-nosnippet>1337</a>            (PrimitiveType::TimestampNs, PrimitiveLiteral::Long(<span class="number">1</span>)),
+<a href=#1338 id=1338 data-nosnippet>1338</a>            (
+<a href=#1339 id=1339 data-nosnippet>1339</a>                PrimitiveType::Uuid,
+<a href=#1340 id=1340 data-nosnippet>1340</a>                PrimitiveLiteral::UInt128(Uuid::new_v4().as_u128()),
+<a href=#1341 id=1341 data-nosnippet>1341</a>            ),
+<a href=#1342 id=1342 data-nosnippet>1342</a>            (PrimitiveType::Fixed(<span class="number">8</span>), PrimitiveLiteral::Binary(<span class="macro">vec!</span>[<span class="number">1</span>])),
+<a href=#1343 id=1343 data-nosnippet>1343</a>            (PrimitiveType::Binary, PrimitiveLiteral::Binary(<span class="macro">vec!</span>[<span class="number">1</span>])),
+<a href=#1344 id=1344 data-nosnippet>1344</a>        ];
+<a href=#1345 id=1345 data-nosnippet>1345</a>        <span class="kw">for </span>(ty, literal) <span class="kw">in </span>pairs {
+<a href=#1346 id=1346 data-nosnippet>1346</a>            <span class="macro">assert!</span>(ty.compatible(<span class="kw-2">&amp;</span>literal));
+<a href=#1347 id=1347 data-nosnippet>1347</a>        }
+<a href=#1348 id=1348 data-nosnippet>1348</a>    }
+<a href=#1349 id=1349 data-nosnippet>1349</a>
+<a href=#1350 id=1350 data-nosnippet>1350</a>    <span class="attr">#[test]
+<a href=#1351 id=1351 data-nosnippet>1351</a>    </span><span class="kw">fn </span>variant_type_serde() {
+<a href=#1352 id=1352 data-nosnippet>1352</a>        <span class="kw">let </span>json = <span class="string">r#"{"id": 1, "name": "v", "required": true, "type": "variant"}"#</span>;
+<a href=#1353 id=1353 data-nosnippet>1353</a>        <span class="kw">let </span>field: NestedField = serde_json::from_str(json).unwrap();
+<a href=#1354 id=1354 data-nosnippet>1354</a>        <span class="macro">assert_eq!</span>(<span class="kw-2">*</span>field.field_type, Type::Variant(VariantType));
+<a href=#1355 id=1355 data-nosnippet>1355</a>
+<a href=#1356 id=1356 data-nosnippet>1356</a>        <span class="kw">let </span>serialized = serde_json::to_string(<span class="kw-2">&amp;</span>field).unwrap();
+<a href=#1357 id=1357 data-nosnippet>1357</a>        <span class="kw">let </span>roundtrip: NestedField = serde_json::from_str(<span class="kw-2">&amp;</span>serialized).unwrap();
+<a href=#1358 id=1358 data-nosnippet>1358</a>        <span class="macro">assert_eq!</span>(field, roundtrip);
+<a href=#1359 id=1359 data-nosnippet>1359</a>    }
+<a href=#1360 id=1360 data-nosnippet>1360</a>
+<a href=#1361 id=1361 data-nosnippet>1361</a>    <span class="attr">#[test]
+<a href=#1362 id=1362 data-nosnippet>1362</a>    </span><span class="kw">fn </span>nested_field_rejects_invalid_map_defaults() {
+<a href=#1363 id=1363 data-nosnippet>1363</a>        <span class="kw">for </span>default_name <span class="kw">in </span>[<span class="string">"initial-default"</span>, <span class="string">"write-default"</span>] {
+<a href=#1364 id=1364 data-nosnippet>1364</a>            <span class="kw">let </span>json = <span class="macro">format!</span>(
+<a href=#1365 id=1365 data-nosnippet>1365</a>                <span class="string">r#"{{
+<a href=#1366 id=1366 data-nosnippet>1366</a>                    "id": 1,
+<a href=#1367 id=1367 data-nosnippet>1367</a>                    "name": "properties",
+<a href=#1368 id=1368 data-nosnippet>1368</a>                    "required": false,
+<a href=#1369 id=1369 data-nosnippet>1369</a>                    "type": {{
+<a href=#1370 id=1370 data-nosnippet>1370</a>                        "type": "map",
+<a href=#1371 id=1371 data-nosnippet>1371</a>                        "key-id": 2,
+<a href=#1372 id=1372 data-nosnippet>1372</a>                        "key": "string",
+<a href=#1373 id=1373 data-nosnippet>1373</a>                        "value-id": 3,
+<a href=#1374 id=1374 data-nosnippet>1374</a>                        "value-required": false,
+<a href=#1375 id=1375 data-nosnippet>1375</a>                        "value": "int"
+<a href=#1376 id=1376 data-nosnippet>1376</a>                    }},
+<a href=#1377 id=1377 data-nosnippet>1377</a>                    "{default_name}": {{"keys": ["a", "b"], "values": [1]}}
+<a href=#1378 id=1378 data-nosnippet>1378</a>                }}"#
+<a href=#1379 id=1379 data-nosnippet>1379</a>            </span>);
+<a href=#1380 id=1380 data-nosnippet>1380</a>
+<a href=#1381 id=1381 data-nosnippet>1381</a>            <span class="kw">let </span>error = serde_json::from_str::&lt;NestedField&gt;(<span class="kw-2">&amp;</span>json).unwrap_err();
+<a href=#1382 id=1382 data-nosnippet>1382</a>            <span class="macro">assert!</span>(error.to_string().contains(<span class="string">"must have the same length"</span>));
+<a href=#1383 id=1383 data-nosnippet>1383</a>        }
+<a href=#1384 id=1384 data-nosnippet>1384</a>    }
+<a href=#1385 id=1385 data-nosnippet>1385</a>
+<a href=#1386 id=1386 data-nosnippet>1386</a>    <span class="attr">#[test]
+<a href=#1387 id=1387 data-nosnippet>1387</a>    </span><span class="kw">fn </span>struct_type_with_type_field() {
+<a href=#1388 id=1388 data-nosnippet>1388</a>        <span class="comment">// Test that StructType properly deserializes JSON with "type":"struct" field
+<a href=#1389 id=1389 data-nosnippet>1389</a>        // This was previously broken because the deserializer wasn't consuming the type field value
+<a href=#1390 id=1390 data-nosnippet>1390</a>        </span><span class="kw">let </span>json = <span class="string">r#"
+<a href=#1391 id=1391 data-nosnippet>1391</a>        {
+<a href=#1392 id=1392 data-nosnippet>1392</a>            "type": "struct",
+<a href=#1393 id=1393 data-nosnippet>1393</a>            "fields": [
+<a href=#1394 id=1394 data-nosnippet>1394</a>                {"id": 1, "name": "field1", "required": true, "type": "string"}
+<a href=#1395 id=1395 data-nosnippet>1395</a>            ]
+<a href=#1396 id=1396 data-nosnippet>1396</a>        }
+<a href=#1397 id=1397 data-nosnippet>1397</a>        "#</span>;
+<a href=#1398 id=1398 data-nosnippet>1398</a>
+<a href=#1399 id=1399 data-nosnippet>1399</a>        <span class="kw">let </span>struct_type: StructType = serde_json::from_str(json)
+<a href=#1400 id=1400 data-nosnippet>1400</a>            .expect(<span class="string">"Should successfully deserialize StructType with type field"</span>);
+<a href=#1401 id=1401 data-nosnippet>1401</a>
+<a href=#1402 id=1402 data-nosnippet>1402</a>        <span class="macro">assert_eq!</span>(struct_type.fields().len(), <span class="number">1</span>);
+<a href=#1403 id=1403 data-nosnippet>1403</a>        <span class="macro">assert_eq!</span>(struct_type.fields()[<span class="number">0</span>].name, <span class="string">"field1"</span>);
+<a href=#1404 id=1404 data-nosnippet>1404</a>    }
+<a href=#1405 id=1405 data-nosnippet>1405</a>
+<a href=#1406 id=1406 data-nosnippet>1406</a>    <span class="attr">#[test]
+<a href=#1407 id=1407 data-nosnippet>1407</a>    </span><span class="kw">fn </span>struct_type_rejects_wrong_type() {
+<a href=#1408 id=1408 data-nosnippet>1408</a>        <span class="comment">// Test that StructType validation rejects incorrect type field values
+<a href=#1409 id=1409 data-nosnippet>1409</a>        </span><span class="kw">let </span>json = <span class="string">r#"
+<a href=#1410 id=1410 data-nosnippet>1410</a>        {
+<a href=#1411 id=1411 data-nosnippet>1411</a>            "type": "list",
+<a href=#1412 id=1412 data-nosnippet>1412</a>            "fields": [
+<a href=#1413 id=1413 data-nosnippet>1413</a>                {"id": 1, "name": "field1", "required": true, "type": "string"}
+<a href=#1414 id=1414 data-nosnippet>1414</a>            ]
+<a href=#1415 id=1415 data-nosnippet>1415</a>        }
+<a href=#1416 id=1416 data-nosnippet>1416</a>        "#</span>;
+<a href=#1417 id=1417 data-nosnippet>1417</a>
+<a href=#1418 id=1418 data-nosnippet>1418</a>        <span class="kw">let </span>result = serde_json::from_str::&lt;StructType&gt;(json);
+<a href=#1419 id=1419 data-nosnippet>1419</a>        <span class="macro">assert!</span>(
+<a href=#1420 id=1420 data-nosnippet>1420</a>            result.is_err(),
+<a href=#1421 id=1421 data-nosnippet>1421</a>            <span class="string">"Should reject StructType with wrong type field"
+<a href=#1422 id=1422 data-nosnippet>1422</a>        </span>);
+<a href=#1423 id=1423 data-nosnippet>1423</a>        <span class="macro">assert!</span>(
+<a href=#1424 id=1424 data-nosnippet>1424</a>            result
+<a href=#1425 id=1425 data-nosnippet>1425</a>                .unwrap_err()
+<a href=#1426 id=1426 data-nosnippet>1426</a>                .to_string()
+<a href=#1427 id=1427 data-nosnippet>1427</a>                .contains(<span class="string">"expected type 'struct'"</span>)
+<a href=#1428 id=1428 data-nosnippet>1428</a>        );
+<a href=#1429 id=1429 data-nosnippet>1429</a>    }
+<a href=#1430 id=1430 data-nosnippet>1430</a>}
 </code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/api/src/iceberg/spec/values/literal.rs.html b/api/src/iceberg/spec/values/literal.rs.html
index da9410549..355721557 100644
--- a/api/src/iceberg/spec/values/literal.rs.html
+++ b/api/src/iceberg/spec/values/literal.rs.html
@@ -598,240 +598,251 @@
 <a href=#598 id=598 data-nosnippet>598</a>                    <span class="kw">if let </span>(<span class="prelude-val">Some</span>(JsonValue::Array(keys)), <span class="prelude-val">Some</span>(JsonValue::Array(values))) =
 <a href=#599 id=599 data-nosnippet>599</a>                        (object.remove(<span class="string">"keys"</span>), object.remove(<span class="string">"values"</span>))
 <a href=#600 id=600 data-nosnippet>600</a>                    {
-<a href=#601 id=601 data-nosnippet>601</a>                        <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Map(Map::from_iter(
-<a href=#602 id=602 data-nosnippet>602</a>                            keys.into_iter()
-<a href=#603 id=603 data-nosnippet>603</a>                                .zip(values)
-<a href=#604 id=604 data-nosnippet>604</a>                                .map(|(key, value)| {
-<a href=#605 id=605 data-nosnippet>605</a>                                    <span class="prelude-val">Ok</span>((
-<a href=#606 id=606 data-nosnippet>606</a>                                        Literal::try_from_json(key, <span class="kw-2">&amp;</span>map.key_field.field_type)
-<a href=#607 id=607 data-nosnippet>607</a>                                            .and_then(|value| {
-<a href=#608 id=608 data-nosnippet>608</a>                                                value.ok_or(Error::new(
-<a href=#609 id=609 data-nosnippet>609</a>                                                    ErrorKind::DataInvalid,
-<a href=#610 id=610 data-nosnippet>610</a>                                                    <span class="string">"Key of map cannot be null"</span>,
-<a href=#611 id=611 data-nosnippet>611</a>                                                ))
-<a href=#612 id=612 data-nosnippet>612</a>                                            })<span class="question-mark">?</span>,
-<a href=#613 id=613 data-nosnippet>613</a>                                        Literal::try_from_json(value, <span class="kw-2">&amp;</span>map.value_field.field_type)<span class="question-mark">?</span>,
-<a href=#614 id=614 data-nosnippet>614</a>                                    ))
-<a href=#615 id=615 data-nosnippet>615</a>                                })
-<a href=#616 id=616 data-nosnippet>616</a>                                .collect::&lt;<span class="prelude-ty">Result</span>&lt;Vec&lt;<span class="kw">_</span>&gt;&gt;&gt;()<span class="question-mark">?</span>,
-<a href=#617 id=617 data-nosnippet>617</a>                        ))))
-<a href=#618 id=618 data-nosnippet>618</a>                    } <span class="kw">else </span>{
-<a href=#619 id=619 data-nosnippet>619</a>                        <span class="prelude-val">Err</span>(Error::new(
-<a href=#620 id=620 data-nosnippet>620</a>                            ErrorKind::DataInvalid,
-<a href=#621 id=621 data-nosnippet>621</a>                            <span class="string">"The json value for a list type must be an array."</span>,
-<a href=#622 id=622 data-nosnippet>622</a>                        ))
-<a href=#623 id=623 data-nosnippet>623</a>                    }
-<a href=#624 id=624 data-nosnippet>624</a>                } <span class="kw">else </span>{
-<a href=#625 id=625 data-nosnippet>625</a>                    <span class="prelude-val">Err</span>(Error::new(
-<a href=#626 id=626 data-nosnippet>626</a>                        ErrorKind::DataInvalid,
-<a href=#627 id=627 data-nosnippet>627</a>                        <span class="string">"The json value for a list type must be an array."</span>,
-<a href=#628 id=628 data-nosnippet>628</a>                    ))
-<a href=#629 id=629 data-nosnippet>629</a>                }
-<a href=#630 id=630 data-nosnippet>630</a>            }
-<a href=#631 id=631 data-nosnippet>631</a>            Type::Variant(<span class="kw">_</span>) =&gt; <span class="prelude-val">Err</span>(Error::new(
-<a href=#632 id=632 data-nosnippet>632</a>                ErrorKind::DataInvalid,
-<a href=#633 id=633 data-nosnippet>633</a>                <span class="string">"Variant type is not supported for single-value JSON serialization"</span>,
-<a href=#634 id=634 data-nosnippet>634</a>            )),
-<a href=#635 id=635 data-nosnippet>635</a>        }
-<a href=#636 id=636 data-nosnippet>636</a>    }
-<a href=#637 id=637 data-nosnippet>637</a>
-<a href=#638 id=638 data-nosnippet>638</a>    <span class="doccomment">/// Converting iceberg value to json value.
-<a href=#639 id=639 data-nosnippet>639</a>    ///
-<a href=#640 id=640 data-nosnippet>640</a>    /// See [this spec](https://iceberg.apache.org/spec/#json-single-value-serialization) for reference.
-<a href=#641 id=641 data-nosnippet>641</a>    </span><span class="kw">pub fn </span>try_into_json(<span class="self">self</span>, r#type: <span class="kw-2">&amp;</span>Type) -&gt; <span class="prelude-ty">Result</span>&lt;JsonValue&gt; {
-<a href=#642 id=642 data-nosnippet>642</a>        <span class="kw">match </span>(<span class="self">self</span>, r#type) {
-<a href=#643 id=643 data-nosnippet>643</a>            (Literal::Primitive(prim), Type::Primitive(prim_type)) =&gt; <span class="kw">match </span>(prim_type, prim) {
-<a href=#644 id=644 data-nosnippet>644</a>                (PrimitiveType::Boolean, PrimitiveLiteral::Boolean(val)) =&gt; {
-<a href=#645 id=645 data-nosnippet>645</a>                    <span class="prelude-val">Ok</span>(JsonValue::Bool(val))
-<a href=#646 id=646 data-nosnippet>646</a>                }
-<a href=#647 id=647 data-nosnippet>647</a>                (PrimitiveType::Int, PrimitiveLiteral::Int(val)) =&gt; {
-<a href=#648 id=648 data-nosnippet>648</a>                    <span class="prelude-val">Ok</span>(JsonValue::Number((val).into()))
-<a href=#649 id=649 data-nosnippet>649</a>                }
-<a href=#650 id=650 data-nosnippet>650</a>                (PrimitiveType::Long, PrimitiveLiteral::Long(val)) =&gt; {
-<a href=#651 id=651 data-nosnippet>651</a>                    <span class="prelude-val">Ok</span>(JsonValue::Number((val).into()))
-<a href=#652 id=652 data-nosnippet>652</a>                }
-<a href=#653 id=653 data-nosnippet>653</a>                (PrimitiveType::Float, PrimitiveLiteral::Float(val)) =&gt; {
-<a href=#654 id=654 data-nosnippet>654</a>                    <span class="kw">match </span>Number::from_f64(val.<span class="number">0 </span><span class="kw">as </span>f64) {
-<a href=#655 id=655 data-nosnippet>655</a>                        <span class="prelude-val">Some</span>(number) =&gt; <span class="prelude-val">Ok</span>(JsonValue::Number(number)),
-<a href=#656 id=656 data-nosnippet>656</a>                        <span class="prelude-val">None </span>=&gt; <span class="prelude-val">Ok</span>(JsonValue::Null),
-<a href=#657 id=657 data-nosnippet>657</a>                    }
-<a href=#658 id=658 data-nosnippet>658</a>                }
-<a href=#659 id=659 data-nosnippet>659</a>                (PrimitiveType::Double, PrimitiveLiteral::Double(val)) =&gt; {
-<a href=#660 id=660 data-nosnippet>660</a>                    <span class="kw">match </span>Number::from_f64(val.<span class="number">0</span>) {
-<a href=#661 id=661 data-nosnippet>661</a>                        <span class="prelude-val">Some</span>(number) =&gt; <span class="prelude-val">Ok</span>(JsonValue::Number(number)),
-<a href=#662 id=662 data-nosnippet>662</a>                        <span class="prelude-val">None </span>=&gt; <span class="prelude-val">Ok</span>(JsonValue::Null),
-<a href=#663 id=663 data-nosnippet>663</a>                    }
-<a href=#664 id=664 data-nosnippet>664</a>                }
-<a href=#665 id=665 data-nosnippet>665</a>                (PrimitiveType::Date, PrimitiveLiteral::Int(val)) =&gt; {
-<a href=#666 id=666 data-nosnippet>666</a>                    <span class="prelude-val">Ok</span>(JsonValue::String(date::days_to_date(val).to_string()))
-<a href=#667 id=667 data-nosnippet>667</a>                }
-<a href=#668 id=668 data-nosnippet>668</a>                (PrimitiveType::Time, PrimitiveLiteral::Long(val)) =&gt; <span class="prelude-val">Ok</span>(JsonValue::String(
-<a href=#669 id=669 data-nosnippet>669</a>                    time::microseconds_to_time(val).to_string(),
-<a href=#670 id=670 data-nosnippet>670</a>                )),
-<a href=#671 id=671 data-nosnippet>671</a>                (PrimitiveType::Timestamp, PrimitiveLiteral::Long(val)) =&gt; <span class="prelude-val">Ok</span>(JsonValue::String(
-<a href=#672 id=672 data-nosnippet>672</a>                    timestamp::microseconds_to_datetime(val)
-<a href=#673 id=673 data-nosnippet>673</a>                        .format(<span class="string">"%Y-%m-%dT%H:%M:%S%.f"</span>)
-<a href=#674 id=674 data-nosnippet>674</a>                        .to_string(),
-<a href=#675 id=675 data-nosnippet>675</a>                )),
-<a href=#676 id=676 data-nosnippet>676</a>                (PrimitiveType::Timestamptz, PrimitiveLiteral::Long(val)) =&gt; <span class="prelude-val">Ok</span>(JsonValue::String(
-<a href=#677 id=677 data-nosnippet>677</a>                    timestamptz::microseconds_to_datetimetz(val)
-<a href=#678 id=678 data-nosnippet>678</a>                        .format(<span class="string">"%Y-%m-%dT%H:%M:%S%.f+00:00"</span>)
-<a href=#679 id=679 data-nosnippet>679</a>                        .to_string(),
-<a href=#680 id=680 data-nosnippet>680</a>                )),
-<a href=#681 id=681 data-nosnippet>681</a>                (PrimitiveType::TimestampNs, PrimitiveLiteral::Long(val)) =&gt; <span class="prelude-val">Ok</span>(JsonValue::String(
-<a href=#682 id=682 data-nosnippet>682</a>                    timestamp::nanoseconds_to_datetime(val)
-<a href=#683 id=683 data-nosnippet>683</a>                        .format(<span class="string">"%Y-%m-%dT%H:%M:%S%.f"</span>)
-<a href=#684 id=684 data-nosnippet>684</a>                        .to_string(),
-<a href=#685 id=685 data-nosnippet>685</a>                )),
-<a href=#686 id=686 data-nosnippet>686</a>                (PrimitiveType::TimestamptzNs, PrimitiveLiteral::Long(val)) =&gt; {
-<a href=#687 id=687 data-nosnippet>687</a>                    <span class="prelude-val">Ok</span>(JsonValue::String(
-<a href=#688 id=688 data-nosnippet>688</a>                        timestamptz::nanoseconds_to_datetimetz(val)
-<a href=#689 id=689 data-nosnippet>689</a>                            .format(<span class="string">"%Y-%m-%dT%H:%M:%S%.f+00:00"</span>)
-<a href=#690 id=690 data-nosnippet>690</a>                            .to_string(),
-<a href=#691 id=691 data-nosnippet>691</a>                    ))
-<a href=#692 id=692 data-nosnippet>692</a>                }
-<a href=#693 id=693 data-nosnippet>693</a>                (PrimitiveType::String, PrimitiveLiteral::String(val)) =&gt; {
-<a href=#694 id=694 data-nosnippet>694</a>                    <span class="prelude-val">Ok</span>(JsonValue::String(val.clone()))
-<a href=#695 id=695 data-nosnippet>695</a>                }
-<a href=#696 id=696 data-nosnippet>696</a>                (<span class="kw">_</span>, PrimitiveLiteral::UInt128(val)) =&gt; {
-<a href=#697 id=697 data-nosnippet>697</a>                    <span class="prelude-val">Ok</span>(JsonValue::String(Uuid::from_u128(val).to_string()))
-<a href=#698 id=698 data-nosnippet>698</a>                }
-<a href=#699 id=699 data-nosnippet>699</a>                (PrimitiveType::Fixed(size), PrimitiveLiteral::Binary(val)) =&gt; {
-<a href=#700 id=700 data-nosnippet>700</a>                    validate_fixed_size(val.len(), <span class="kw-2">*</span>size)<span class="question-mark">?</span>;
-<a href=#701 id=701 data-nosnippet>701</a>                    <span class="prelude-val">Ok</span>(JsonValue::String(encode_hex_bytes(<span class="kw-2">&amp;</span>val)))
-<a href=#702 id=702 data-nosnippet>702</a>                }
-<a href=#703 id=703 data-nosnippet>703</a>                (PrimitiveType::Binary, PrimitiveLiteral::Binary(val)) =&gt; {
-<a href=#704 id=704 data-nosnippet>704</a>                    <span class="prelude-val">Ok</span>(JsonValue::String(encode_hex_bytes(<span class="kw-2">&amp;</span>val)))
-<a href=#705 id=705 data-nosnippet>705</a>                }
-<a href=#706 id=706 data-nosnippet>706</a>                (<span class="kw">_</span>, PrimitiveLiteral::Int128(val)) =&gt; <span class="kw">match </span>r#type {
-<a href=#707 id=707 data-nosnippet>707</a>                    Type::Primitive(PrimitiveType::Decimal {
-<a href=#708 id=708 data-nosnippet>708</a>                        precision: _precision,
-<a href=#709 id=709 data-nosnippet>709</a>                        scale,
-<a href=#710 id=710 data-nosnippet>710</a>                    }) =&gt; {
-<a href=#711 id=711 data-nosnippet>711</a>                        <span class="kw">let </span>decimal = try_decimal_from_i128_with_scale(val, <span class="kw-2">*</span>scale)<span class="question-mark">?</span>;
-<a href=#712 id=712 data-nosnippet>712</a>                        <span class="prelude-val">Ok</span>(JsonValue::String(decimal.to_string()))
-<a href=#713 id=713 data-nosnippet>713</a>                    }
-<a href=#714 id=714 data-nosnippet>714</a>                    <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(Error::new(
-<a href=#715 id=715 data-nosnippet>715</a>                        ErrorKind::DataInvalid,
-<a href=#716 id=716 data-nosnippet>716</a>                        <span class="string">"The iceberg type for decimal literal must be decimal."</span>,
-<a href=#717 id=717 data-nosnippet>717</a>                    ))<span class="question-mark">?</span>,
-<a href=#718 id=718 data-nosnippet>718</a>                },
-<a href=#719 id=719 data-nosnippet>719</a>                <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(Error::new(
-<a href=#720 id=720 data-nosnippet>720</a>                    ErrorKind::DataInvalid,
-<a href=#721 id=721 data-nosnippet>721</a>                    <span class="string">"The iceberg value doesn't fit to the iceberg type."</span>,
-<a href=#722 id=722 data-nosnippet>722</a>                )),
-<a href=#723 id=723 data-nosnippet>723</a>            },
-<a href=#724 id=724 data-nosnippet>724</a>            (Literal::Struct(s), Type::Struct(struct_type)) =&gt; {
-<a href=#725 id=725 data-nosnippet>725</a>                <span class="kw">let </span><span class="kw-2">mut </span>id_and_value = Vec::with_capacity(struct_type.fields().len());
-<a href=#726 id=726 data-nosnippet>726</a>                <span class="kw">for </span>(value, field) <span class="kw">in </span>s.into_iter().zip(struct_type.fields()) {
-<a href=#727 id=727 data-nosnippet>727</a>                    <span class="kw">let </span>json = <span class="kw">match </span>value {
-<a href=#728 id=728 data-nosnippet>728</a>                        <span class="prelude-val">Some</span>(val) =&gt; val.try_into_json(<span class="kw-2">&amp;</span>field.field_type)<span class="question-mark">?</span>,
-<a href=#729 id=729 data-nosnippet>729</a>                        <span class="prelude-val">None </span>=&gt; JsonValue::Null,
-<a href=#730 id=730 data-nosnippet>730</a>                    };
-<a href=#731 id=731 data-nosnippet>731</a>                    id_and_value.push((field.id.to_string(), json));
-<a href=#732 id=732 data-nosnippet>732</a>                }
-<a href=#733 id=733 data-nosnippet>733</a>                <span class="prelude-val">Ok</span>(JsonValue::Object(JsonMap::from_iter(id_and_value)))
-<a href=#734 id=734 data-nosnippet>734</a>            }
-<a href=#735 id=735 data-nosnippet>735</a>            (Literal::List(list), Type::List(list_type)) =&gt; <span class="prelude-val">Ok</span>(JsonValue::Array(
-<a href=#736 id=736 data-nosnippet>736</a>                list.into_iter()
-<a href=#737 id=737 data-nosnippet>737</a>                    .map(|opt| <span class="kw">match </span>opt {
-<a href=#738 id=738 data-nosnippet>738</a>                        <span class="prelude-val">Some</span>(literal) =&gt; literal.try_into_json(<span class="kw-2">&amp;</span>list_type.element_field.field_type),
-<a href=#739 id=739 data-nosnippet>739</a>                        <span class="prelude-val">None </span>=&gt; <span class="prelude-val">Ok</span>(JsonValue::Null),
-<a href=#740 id=740 data-nosnippet>740</a>                    })
-<a href=#741 id=741 data-nosnippet>741</a>                    .collect::&lt;<span class="prelude-ty">Result</span>&lt;Vec&lt;JsonValue&gt;&gt;&gt;()<span class="question-mark">?</span>,
-<a href=#742 id=742 data-nosnippet>742</a>            )),
-<a href=#743 id=743 data-nosnippet>743</a>            (Literal::Map(map), Type::Map(map_type)) =&gt; {
-<a href=#744 id=744 data-nosnippet>744</a>                <span class="kw">let </span><span class="kw-2">mut </span>object = JsonMap::with_capacity(<span class="number">2</span>);
-<a href=#745 id=745 data-nosnippet>745</a>                <span class="kw">let </span><span class="kw-2">mut </span>json_keys = Vec::with_capacity(map.len());
-<a href=#746 id=746 data-nosnippet>746</a>                <span class="kw">let </span><span class="kw-2">mut </span>json_values = Vec::with_capacity(map.len());
-<a href=#747 id=747 data-nosnippet>747</a>                <span class="kw">for </span>(key, value) <span class="kw">in </span>map.into_iter() {
-<a href=#748 id=748 data-nosnippet>748</a>                    json_keys.push(key.try_into_json(<span class="kw-2">&amp;</span>map_type.key_field.field_type)<span class="question-mark">?</span>);
-<a href=#749 id=749 data-nosnippet>749</a>                    json_values.push(<span class="kw">match </span>value {
-<a href=#750 id=750 data-nosnippet>750</a>                        <span class="prelude-val">Some</span>(literal) =&gt; literal.try_into_json(<span class="kw-2">&amp;</span>map_type.value_field.field_type)<span class="question-mark">?</span>,
-<a href=#751 id=751 data-nosnippet>751</a>                        <span class="prelude-val">None </span>=&gt; JsonValue::Null,
-<a href=#752 id=752 data-nosnippet>752</a>                    });
-<a href=#753 id=753 data-nosnippet>753</a>                }
-<a href=#754 id=754 data-nosnippet>754</a>                object.insert(<span class="string">"keys"</span>.to_string(), JsonValue::Array(json_keys));
-<a href=#755 id=755 data-nosnippet>755</a>                object.insert(<span class="string">"values"</span>.to_string(), JsonValue::Array(json_values));
-<a href=#756 id=756 data-nosnippet>756</a>                <span class="prelude-val">Ok</span>(JsonValue::Object(object))
-<a href=#757 id=757 data-nosnippet>757</a>            }
-<a href=#758 id=758 data-nosnippet>758</a>            (value, r#type) =&gt; <span class="prelude-val">Err</span>(Error::new(
-<a href=#759 id=759 data-nosnippet>759</a>                ErrorKind::DataInvalid,
-<a href=#760 id=760 data-nosnippet>760</a>                <span class="macro">format!</span>(<span class="string">"The iceberg value {value:?} doesn't fit to the iceberg type {type}."</span>),
-<a href=#761 id=761 data-nosnippet>761</a>            )),
-<a href=#762 id=762 data-nosnippet>762</a>        }
-<a href=#763 id=763 data-nosnippet>763</a>    }
-<a href=#764 id=764 data-nosnippet>764</a>
-<a href=#765 id=765 data-nosnippet>765</a>    <span class="doccomment">/// Convert Value to the any type
-<a href=#766 id=766 data-nosnippet>766</a>    </span><span class="kw">pub fn </span>into_any(<span class="self">self</span>) -&gt; Box&lt;<span class="kw">dyn </span>Any&gt; {
-<a href=#767 id=767 data-nosnippet>767</a>        <span class="kw">match </span><span class="self">self </span>{
-<a href=#768 id=768 data-nosnippet>768</a>            Literal::Primitive(prim) =&gt; <span class="kw">match </span>prim {
-<a href=#769 id=769 data-nosnippet>769</a>                PrimitiveLiteral::Boolean(any) =&gt; Box::new(any),
-<a href=#770 id=770 data-nosnippet>770</a>                PrimitiveLiteral::Int(any) =&gt; Box::new(any),
-<a href=#771 id=771 data-nosnippet>771</a>                PrimitiveLiteral::Long(any) =&gt; Box::new(any),
-<a href=#772 id=772 data-nosnippet>772</a>                PrimitiveLiteral::Float(any) =&gt; Box::new(any),
-<a href=#773 id=773 data-nosnippet>773</a>                PrimitiveLiteral::Double(any) =&gt; Box::new(any),
-<a href=#774 id=774 data-nosnippet>774</a>                PrimitiveLiteral::Binary(any) =&gt; Box::new(any),
-<a href=#775 id=775 data-nosnippet>775</a>                PrimitiveLiteral::String(any) =&gt; Box::new(any),
-<a href=#776 id=776 data-nosnippet>776</a>                PrimitiveLiteral::UInt128(any) =&gt; Box::new(any),
-<a href=#777 id=777 data-nosnippet>777</a>                PrimitiveLiteral::Int128(any) =&gt; Box::new(any),
-<a href=#778 id=778 data-nosnippet>778</a>                PrimitiveLiteral::AboveMax | PrimitiveLiteral::BelowMin =&gt; <span class="macro">unimplemented!</span>(),
-<a href=#779 id=779 data-nosnippet>779</a>            },
-<a href=#780 id=780 data-nosnippet>780</a>            <span class="kw">_ </span>=&gt; <span class="macro">unimplemented!</span>(),
-<a href=#781 id=781 data-nosnippet>781</a>        }
-<a href=#782 id=782 data-nosnippet>782</a>    }
-<a href=#783 id=783 data-nosnippet>783</a>}
-<a href=#784 id=784 data-nosnippet>784</a>
-<a href=#785 id=785 data-nosnippet>785</a><span class="kw">fn </span>decode_hex_bytes(value: <span class="kw-2">&amp;</span>str) -&gt; <span class="prelude-ty">Result</span>&lt;Vec&lt;u8&gt;&gt; {
-<a href=#786 id=786 data-nosnippet>786</a>    <span class="kw">if </span>!value.len().is_multiple_of(<span class="number">2</span>) {
-<a href=#787 id=787 data-nosnippet>787</a>        <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
-<a href=#788 id=788 data-nosnippet>788</a>            ErrorKind::DataInvalid,
-<a href=#789 id=789 data-nosnippet>789</a>            <span class="macro">format!</span>(<span class="string">"Hex string must have an even number of characters: {value:?}"</span>),
-<a href=#790 id=790 data-nosnippet>790</a>        ));
-<a href=#791 id=791 data-nosnippet>791</a>    }
-<a href=#792 id=792 data-nosnippet>792</a>
-<a href=#793 id=793 data-nosnippet>793</a>    value
-<a href=#794 id=794 data-nosnippet>794</a>        .as_bytes()
-<a href=#795 id=795 data-nosnippet>795</a>        .chunks_exact(<span class="number">2</span>)
-<a href=#796 id=796 data-nosnippet>796</a>        .map(|chunk| {
-<a href=#797 id=797 data-nosnippet>797</a>            <span class="kw">let </span>high = decode_hex_digit(chunk[<span class="number">0</span>], value)<span class="question-mark">?</span>;
-<a href=#798 id=798 data-nosnippet>798</a>            <span class="kw">let </span>low = decode_hex_digit(chunk[<span class="number">1</span>], value)<span class="question-mark">?</span>;
-<a href=#799 id=799 data-nosnippet>799</a>            <span class="prelude-val">Ok</span>((high &lt;&lt; <span class="number">4</span>) | low)
-<a href=#800 id=800 data-nosnippet>800</a>        })
-<a href=#801 id=801 data-nosnippet>801</a>        .collect()
-<a href=#802 id=802 data-nosnippet>802</a>}
+<a href=#601 id=601 data-nosnippet>601</a>                        <span class="kw">if </span>keys.len() != values.len() {
+<a href=#602 id=602 data-nosnippet>602</a>                            <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#603 id=603 data-nosnippet>603</a>                                ErrorKind::DataInvalid,
+<a href=#604 id=604 data-nosnippet>604</a>                                <span class="macro">format!</span>(
+<a href=#605 id=605 data-nosnippet>605</a>                                    <span class="string">"Map keys and values must have the same length, got {} keys and {} values"</span>,
+<a href=#606 id=606 data-nosnippet>606</a>                                    keys.len(),
+<a href=#607 id=607 data-nosnippet>607</a>                                    values.len()
+<a href=#608 id=608 data-nosnippet>608</a>                                ),
+<a href=#609 id=609 data-nosnippet>609</a>                            ));
+<a href=#610 id=610 data-nosnippet>610</a>                        }
+<a href=#611 id=611 data-nosnippet>611</a>
+<a href=#612 id=612 data-nosnippet>612</a>                        <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Map(Map::from_iter(
+<a href=#613 id=613 data-nosnippet>613</a>                            keys.into_iter()
+<a href=#614 id=614 data-nosnippet>614</a>                                .zip(values)
+<a href=#615 id=615 data-nosnippet>615</a>                                .map(|(key, value)| {
+<a href=#616 id=616 data-nosnippet>616</a>                                    <span class="prelude-val">Ok</span>((
+<a href=#617 id=617 data-nosnippet>617</a>                                        Literal::try_from_json(key, <span class="kw-2">&amp;</span>map.key_field.field_type)
+<a href=#618 id=618 data-nosnippet>618</a>                                            .and_then(|value| {
+<a href=#619 id=619 data-nosnippet>619</a>                                                value.ok_or(Error::new(
+<a href=#620 id=620 data-nosnippet>620</a>                                                    ErrorKind::DataInvalid,
+<a href=#621 id=621 data-nosnippet>621</a>                                                    <span class="string">"Key of map cannot be null"</span>,
+<a href=#622 id=622 data-nosnippet>622</a>                                                ))
+<a href=#623 id=623 data-nosnippet>623</a>                                            })<span class="question-mark">?</span>,
+<a href=#624 id=624 data-nosnippet>624</a>                                        Literal::try_from_json(value, <span class="kw-2">&amp;</span>map.value_field.field_type)<span class="question-mark">?</span>,
+<a href=#625 id=625 data-nosnippet>625</a>                                    ))
+<a href=#626 id=626 data-nosnippet>626</a>                                })
+<a href=#627 id=627 data-nosnippet>627</a>                                .collect::&lt;<span class="prelude-ty">Result</span>&lt;Vec&lt;<span class="kw">_</span>&gt;&gt;&gt;()<span class="question-mark">?</span>,
+<a href=#628 id=628 data-nosnippet>628</a>                        ))))
+<a href=#629 id=629 data-nosnippet>629</a>                    } <span class="kw">else </span>{
+<a href=#630 id=630 data-nosnippet>630</a>                        <span class="prelude-val">Err</span>(Error::new(
+<a href=#631 id=631 data-nosnippet>631</a>                            ErrorKind::DataInvalid,
+<a href=#632 id=632 data-nosnippet>632</a>                            <span class="string">"The json value for a list type must be an array."</span>,
+<a href=#633 id=633 data-nosnippet>633</a>                        ))
+<a href=#634 id=634 data-nosnippet>634</a>                    }
+<a href=#635 id=635 data-nosnippet>635</a>                } <span class="kw">else </span>{
+<a href=#636 id=636 data-nosnippet>636</a>                    <span class="prelude-val">Err</span>(Error::new(
+<a href=#637 id=637 data-nosnippet>637</a>                        ErrorKind::DataInvalid,
+<a href=#638 id=638 data-nosnippet>638</a>                        <span class="string">"The json value for a list type must be an array."</span>,
+<a href=#639 id=639 data-nosnippet>639</a>                    ))
+<a href=#640 id=640 data-nosnippet>640</a>                }
+<a href=#641 id=641 data-nosnippet>641</a>            }
+<a href=#642 id=642 data-nosnippet>642</a>            Type::Variant(<span class="kw">_</span>) =&gt; <span class="prelude-val">Err</span>(Error::new(
+<a href=#643 id=643 data-nosnippet>643</a>                ErrorKind::DataInvalid,
+<a href=#644 id=644 data-nosnippet>644</a>                <span class="string">"Variant type is not supported for single-value JSON serialization"</span>,
+<a href=#645 id=645 data-nosnippet>645</a>            )),
+<a href=#646 id=646 data-nosnippet>646</a>        }
+<a href=#647 id=647 data-nosnippet>647</a>    }
+<a href=#648 id=648 data-nosnippet>648</a>
+<a href=#649 id=649 data-nosnippet>649</a>    <span class="doccomment">/// Converting iceberg value to json value.
+<a href=#650 id=650 data-nosnippet>650</a>    ///
+<a href=#651 id=651 data-nosnippet>651</a>    /// See [this spec](https://iceberg.apache.org/spec/#json-single-value-serialization) for reference.
+<a href=#652 id=652 data-nosnippet>652</a>    </span><span class="kw">pub fn </span>try_into_json(<span class="self">self</span>, r#type: <span class="kw-2">&amp;</span>Type) -&gt; <span class="prelude-ty">Result</span>&lt;JsonValue&gt; {
+<a href=#653 id=653 data-nosnippet>653</a>        <span class="kw">match </span>(<span class="self">self</span>, r#type) {
+<a href=#654 id=654 data-nosnippet>654</a>            (Literal::Primitive(prim), Type::Primitive(prim_type)) =&gt; <span class="kw">match </span>(prim_type, prim) {
+<a href=#655 id=655 data-nosnippet>655</a>                (PrimitiveType::Boolean, PrimitiveLiteral::Boolean(val)) =&gt; {
+<a href=#656 id=656 data-nosnippet>656</a>                    <span class="prelude-val">Ok</span>(JsonValue::Bool(val))
+<a href=#657 id=657 data-nosnippet>657</a>                }
+<a href=#658 id=658 data-nosnippet>658</a>                (PrimitiveType::Int, PrimitiveLiteral::Int(val)) =&gt; {
+<a href=#659 id=659 data-nosnippet>659</a>                    <span class="prelude-val">Ok</span>(JsonValue::Number((val).into()))
+<a href=#660 id=660 data-nosnippet>660</a>                }
+<a href=#661 id=661 data-nosnippet>661</a>                (PrimitiveType::Long, PrimitiveLiteral::Long(val)) =&gt; {
+<a href=#662 id=662 data-nosnippet>662</a>                    <span class="prelude-val">Ok</span>(JsonValue::Number((val).into()))
+<a href=#663 id=663 data-nosnippet>663</a>                }
+<a href=#664 id=664 data-nosnippet>664</a>                (PrimitiveType::Float, PrimitiveLiteral::Float(val)) =&gt; {
+<a href=#665 id=665 data-nosnippet>665</a>                    <span class="kw">match </span>Number::from_f64(val.<span class="number">0 </span><span class="kw">as </span>f64) {
+<a href=#666 id=666 data-nosnippet>666</a>                        <span class="prelude-val">Some</span>(number) =&gt; <span class="prelude-val">Ok</span>(JsonValue::Number(number)),
+<a href=#667 id=667 data-nosnippet>667</a>                        <span class="prelude-val">None </span>=&gt; <span class="prelude-val">Ok</span>(JsonValue::Null),
+<a href=#668 id=668 data-nosnippet>668</a>                    }
+<a href=#669 id=669 data-nosnippet>669</a>                }
+<a href=#670 id=670 data-nosnippet>670</a>                (PrimitiveType::Double, PrimitiveLiteral::Double(val)) =&gt; {
+<a href=#671 id=671 data-nosnippet>671</a>                    <span class="kw">match </span>Number::from_f64(val.<span class="number">0</span>) {
+<a href=#672 id=672 data-nosnippet>672</a>                        <span class="prelude-val">Some</span>(number) =&gt; <span class="prelude-val">Ok</span>(JsonValue::Number(number)),
+<a href=#673 id=673 data-nosnippet>673</a>                        <span class="prelude-val">None </span>=&gt; <span class="prelude-val">Ok</span>(JsonValue::Null),
+<a href=#674 id=674 data-nosnippet>674</a>                    }
+<a href=#675 id=675 data-nosnippet>675</a>                }
+<a href=#676 id=676 data-nosnippet>676</a>                (PrimitiveType::Date, PrimitiveLiteral::Int(val)) =&gt; {
+<a href=#677 id=677 data-nosnippet>677</a>                    <span class="prelude-val">Ok</span>(JsonValue::String(date::days_to_date(val).to_string()))
+<a href=#678 id=678 data-nosnippet>678</a>                }
+<a href=#679 id=679 data-nosnippet>679</a>                (PrimitiveType::Time, PrimitiveLiteral::Long(val)) =&gt; <span class="prelude-val">Ok</span>(JsonValue::String(
+<a href=#680 id=680 data-nosnippet>680</a>                    time::microseconds_to_time(val).to_string(),
+<a href=#681 id=681 data-nosnippet>681</a>                )),
+<a href=#682 id=682 data-nosnippet>682</a>                (PrimitiveType::Timestamp, PrimitiveLiteral::Long(val)) =&gt; <span class="prelude-val">Ok</span>(JsonValue::String(
+<a href=#683 id=683 data-nosnippet>683</a>                    timestamp::microseconds_to_datetime(val)
+<a href=#684 id=684 data-nosnippet>684</a>                        .format(<span class="string">"%Y-%m-%dT%H:%M:%S%.f"</span>)
+<a href=#685 id=685 data-nosnippet>685</a>                        .to_string(),
+<a href=#686 id=686 data-nosnippet>686</a>                )),
+<a href=#687 id=687 data-nosnippet>687</a>                (PrimitiveType::Timestamptz, PrimitiveLiteral::Long(val)) =&gt; <span class="prelude-val">Ok</span>(JsonValue::String(
+<a href=#688 id=688 data-nosnippet>688</a>                    timestamptz::microseconds_to_datetimetz(val)
+<a href=#689 id=689 data-nosnippet>689</a>                        .format(<span class="string">"%Y-%m-%dT%H:%M:%S%.f+00:00"</span>)
+<a href=#690 id=690 data-nosnippet>690</a>                        .to_string(),
+<a href=#691 id=691 data-nosnippet>691</a>                )),
+<a href=#692 id=692 data-nosnippet>692</a>                (PrimitiveType::TimestampNs, PrimitiveLiteral::Long(val)) =&gt; <span class="prelude-val">Ok</span>(JsonValue::String(
+<a href=#693 id=693 data-nosnippet>693</a>                    timestamp::nanoseconds_to_datetime(val)
+<a href=#694 id=694 data-nosnippet>694</a>                        .format(<span class="string">"%Y-%m-%dT%H:%M:%S%.f"</span>)
+<a href=#695 id=695 data-nosnippet>695</a>                        .to_string(),
+<a href=#696 id=696 data-nosnippet>696</a>                )),
+<a href=#697 id=697 data-nosnippet>697</a>                (PrimitiveType::TimestamptzNs, PrimitiveLiteral::Long(val)) =&gt; {
+<a href=#698 id=698 data-nosnippet>698</a>                    <span class="prelude-val">Ok</span>(JsonValue::String(
+<a href=#699 id=699 data-nosnippet>699</a>                        timestamptz::nanoseconds_to_datetimetz(val)
+<a href=#700 id=700 data-nosnippet>700</a>                            .format(<span class="string">"%Y-%m-%dT%H:%M:%S%.f+00:00"</span>)
+<a href=#701 id=701 data-nosnippet>701</a>                            .to_string(),
+<a href=#702 id=702 data-nosnippet>702</a>                    ))
+<a href=#703 id=703 data-nosnippet>703</a>                }
+<a href=#704 id=704 data-nosnippet>704</a>                (PrimitiveType::String, PrimitiveLiteral::String(val)) =&gt; {
+<a href=#705 id=705 data-nosnippet>705</a>                    <span class="prelude-val">Ok</span>(JsonValue::String(val.clone()))
+<a href=#706 id=706 data-nosnippet>706</a>                }
+<a href=#707 id=707 data-nosnippet>707</a>                (<span class="kw">_</span>, PrimitiveLiteral::UInt128(val)) =&gt; {
+<a href=#708 id=708 data-nosnippet>708</a>                    <span class="prelude-val">Ok</span>(JsonValue::String(Uuid::from_u128(val).to_string()))
+<a href=#709 id=709 data-nosnippet>709</a>                }
+<a href=#710 id=710 data-nosnippet>710</a>                (PrimitiveType::Fixed(size), PrimitiveLiteral::Binary(val)) =&gt; {
+<a href=#711 id=711 data-nosnippet>711</a>                    validate_fixed_size(val.len(), <span class="kw-2">*</span>size)<span class="question-mark">?</span>;
+<a href=#712 id=712 data-nosnippet>712</a>                    <span class="prelude-val">Ok</span>(JsonValue::String(encode_hex_bytes(<span class="kw-2">&amp;</span>val)))
+<a href=#713 id=713 data-nosnippet>713</a>                }
+<a href=#714 id=714 data-nosnippet>714</a>                (PrimitiveType::Binary, PrimitiveLiteral::Binary(val)) =&gt; {
+<a href=#715 id=715 data-nosnippet>715</a>                    <span class="prelude-val">Ok</span>(JsonValue::String(encode_hex_bytes(<span class="kw-2">&amp;</span>val)))
+<a href=#716 id=716 data-nosnippet>716</a>                }
+<a href=#717 id=717 data-nosnippet>717</a>                (<span class="kw">_</span>, PrimitiveLiteral::Int128(val)) =&gt; <span class="kw">match </span>r#type {
+<a href=#718 id=718 data-nosnippet>718</a>                    Type::Primitive(PrimitiveType::Decimal {
+<a href=#719 id=719 data-nosnippet>719</a>                        precision: _precision,
+<a href=#720 id=720 data-nosnippet>720</a>                        scale,
+<a href=#721 id=721 data-nosnippet>721</a>                    }) =&gt; {
+<a href=#722 id=722 data-nosnippet>722</a>                        <span class="kw">let </span>decimal = try_decimal_from_i128_with_scale(val, <span class="kw-2">*</span>scale)<span class="question-mark">?</span>;
+<a href=#723 id=723 data-nosnippet>723</a>                        <span class="prelude-val">Ok</span>(JsonValue::String(decimal.to_string()))
+<a href=#724 id=724 data-nosnippet>724</a>                    }
+<a href=#725 id=725 data-nosnippet>725</a>                    <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(Error::new(
+<a href=#726 id=726 data-nosnippet>726</a>                        ErrorKind::DataInvalid,
+<a href=#727 id=727 data-nosnippet>727</a>                        <span class="string">"The iceberg type for decimal literal must be decimal."</span>,
+<a href=#728 id=728 data-nosnippet>728</a>                    ))<span class="question-mark">?</span>,
+<a href=#729 id=729 data-nosnippet>729</a>                },
+<a href=#730 id=730 data-nosnippet>730</a>                <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(Error::new(
+<a href=#731 id=731 data-nosnippet>731</a>                    ErrorKind::DataInvalid,
+<a href=#732 id=732 data-nosnippet>732</a>                    <span class="string">"The iceberg value doesn't fit to the iceberg type."</span>,
+<a href=#733 id=733 data-nosnippet>733</a>                )),
+<a href=#734 id=734 data-nosnippet>734</a>            },
+<a href=#735 id=735 data-nosnippet>735</a>            (Literal::Struct(s), Type::Struct(struct_type)) =&gt; {
+<a href=#736 id=736 data-nosnippet>736</a>                <span class="kw">let </span><span class="kw-2">mut </span>id_and_value = Vec::with_capacity(struct_type.fields().len());
+<a href=#737 id=737 data-nosnippet>737</a>                <span class="kw">for </span>(value, field) <span class="kw">in </span>s.into_iter().zip(struct_type.fields()) {
+<a href=#738 id=738 data-nosnippet>738</a>                    <span class="kw">let </span>json = <span class="kw">match </span>value {
+<a href=#739 id=739 data-nosnippet>739</a>                        <span class="prelude-val">Some</span>(val) =&gt; val.try_into_json(<span class="kw-2">&amp;</span>field.field_type)<span class="question-mark">?</span>,
+<a href=#740 id=740 data-nosnippet>740</a>                        <span class="prelude-val">None </span>=&gt; JsonValue::Null,
+<a href=#741 id=741 data-nosnippet>741</a>                    };
+<a href=#742 id=742 data-nosnippet>742</a>                    id_and_value.push((field.id.to_string(), json));
+<a href=#743 id=743 data-nosnippet>743</a>                }
+<a href=#744 id=744 data-nosnippet>744</a>                <span class="prelude-val">Ok</span>(JsonValue::Object(JsonMap::from_iter(id_and_value)))
+<a href=#745 id=745 data-nosnippet>745</a>            }
+<a href=#746 id=746 data-nosnippet>746</a>            (Literal::List(list), Type::List(list_type)) =&gt; <span class="prelude-val">Ok</span>(JsonValue::Array(
+<a href=#747 id=747 data-nosnippet>747</a>                list.into_iter()
+<a href=#748 id=748 data-nosnippet>748</a>                    .map(|opt| <span class="kw">match </span>opt {
+<a href=#749 id=749 data-nosnippet>749</a>                        <span class="prelude-val">Some</span>(literal) =&gt; literal.try_into_json(<span class="kw-2">&amp;</span>list_type.element_field.field_type),
+<a href=#750 id=750 data-nosnippet>750</a>                        <span class="prelude-val">None </span>=&gt; <span class="prelude-val">Ok</span>(JsonValue::Null),
+<a href=#751 id=751 data-nosnippet>751</a>                    })
+<a href=#752 id=752 data-nosnippet>752</a>                    .collect::&lt;<span class="prelude-ty">Result</span>&lt;Vec&lt;JsonValue&gt;&gt;&gt;()<span class="question-mark">?</span>,
+<a href=#753 id=753 data-nosnippet>753</a>            )),
+<a href=#754 id=754 data-nosnippet>754</a>            (Literal::Map(map), Type::Map(map_type)) =&gt; {
+<a href=#755 id=755 data-nosnippet>755</a>                <span class="kw">let </span><span class="kw-2">mut </span>object = JsonMap::with_capacity(<span class="number">2</span>);
+<a href=#756 id=756 data-nosnippet>756</a>                <span class="kw">let </span><span class="kw-2">mut </span>json_keys = Vec::with_capacity(map.len());
+<a href=#757 id=757 data-nosnippet>757</a>                <span class="kw">let </span><span class="kw-2">mut </span>json_values = Vec::with_capacity(map.len());
+<a href=#758 id=758 data-nosnippet>758</a>                <span class="kw">for </span>(key, value) <span class="kw">in </span>map.into_iter() {
+<a href=#759 id=759 data-nosnippet>759</a>                    json_keys.push(key.try_into_json(<span class="kw-2">&amp;</span>map_type.key_field.field_type)<span class="question-mark">?</span>);
+<a href=#760 id=760 data-nosnippet>760</a>                    json_values.push(<span class="kw">match </span>value {
+<a href=#761 id=761 data-nosnippet>761</a>                        <span class="prelude-val">Some</span>(literal) =&gt; literal.try_into_json(<span class="kw-2">&amp;</span>map_type.value_field.field_type)<span class="question-mark">?</span>,
+<a href=#762 id=762 data-nosnippet>762</a>                        <span class="prelude-val">None </span>=&gt; JsonValue::Null,
+<a href=#763 id=763 data-nosnippet>763</a>                    });
+<a href=#764 id=764 data-nosnippet>764</a>                }
+<a href=#765 id=765 data-nosnippet>765</a>                object.insert(<span class="string">"keys"</span>.to_string(), JsonValue::Array(json_keys));
+<a href=#766 id=766 data-nosnippet>766</a>                object.insert(<span class="string">"values"</span>.to_string(), JsonValue::Array(json_values));
+<a href=#767 id=767 data-nosnippet>767</a>                <span class="prelude-val">Ok</span>(JsonValue::Object(object))
+<a href=#768 id=768 data-nosnippet>768</a>            }
+<a href=#769 id=769 data-nosnippet>769</a>            (value, r#type) =&gt; <span class="prelude-val">Err</span>(Error::new(
+<a href=#770 id=770 data-nosnippet>770</a>                ErrorKind::DataInvalid,
+<a href=#771 id=771 data-nosnippet>771</a>                <span class="macro">format!</span>(<span class="string">"The iceberg value {value:?} doesn't fit to the iceberg type {type}."</span>),
+<a href=#772 id=772 data-nosnippet>772</a>            )),
+<a href=#773 id=773 data-nosnippet>773</a>        }
+<a href=#774 id=774 data-nosnippet>774</a>    }
+<a href=#775 id=775 data-nosnippet>775</a>
+<a href=#776 id=776 data-nosnippet>776</a>    <span class="doccomment">/// Convert Value to the any type
+<a href=#777 id=777 data-nosnippet>777</a>    </span><span class="kw">pub fn </span>into_any(<span class="self">self</span>) -&gt; Box&lt;<span class="kw">dyn </span>Any&gt; {
+<a href=#778 id=778 data-nosnippet>778</a>        <span class="kw">match </span><span class="self">self </span>{
+<a href=#779 id=779 data-nosnippet>779</a>            Literal::Primitive(prim) =&gt; <span class="kw">match </span>prim {
+<a href=#780 id=780 data-nosnippet>780</a>                PrimitiveLiteral::Boolean(any) =&gt; Box::new(any),
+<a href=#781 id=781 data-nosnippet>781</a>                PrimitiveLiteral::Int(any) =&gt; Box::new(any),
+<a href=#782 id=782 data-nosnippet>782</a>                PrimitiveLiteral::Long(any) =&gt; Box::new(any),
+<a href=#783 id=783 data-nosnippet>783</a>                PrimitiveLiteral::Float(any) =&gt; Box::new(any),
+<a href=#784 id=784 data-nosnippet>784</a>                PrimitiveLiteral::Double(any) =&gt; Box::new(any),
+<a href=#785 id=785 data-nosnippet>785</a>                PrimitiveLiteral::Binary(any) =&gt; Box::new(any),
+<a href=#786 id=786 data-nosnippet>786</a>                PrimitiveLiteral::String(any) =&gt; Box::new(any),
+<a href=#787 id=787 data-nosnippet>787</a>                PrimitiveLiteral::UInt128(any) =&gt; Box::new(any),
+<a href=#788 id=788 data-nosnippet>788</a>                PrimitiveLiteral::Int128(any) =&gt; Box::new(any),
+<a href=#789 id=789 data-nosnippet>789</a>                PrimitiveLiteral::AboveMax | PrimitiveLiteral::BelowMin =&gt; <span class="macro">unimplemented!</span>(),
+<a href=#790 id=790 data-nosnippet>790</a>            },
+<a href=#791 id=791 data-nosnippet>791</a>            <span class="kw">_ </span>=&gt; <span class="macro">unimplemented!</span>(),
+<a href=#792 id=792 data-nosnippet>792</a>        }
+<a href=#793 id=793 data-nosnippet>793</a>    }
+<a href=#794 id=794 data-nosnippet>794</a>}
+<a href=#795 id=795 data-nosnippet>795</a>
+<a href=#796 id=796 data-nosnippet>796</a><span class="kw">fn </span>decode_hex_bytes(value: <span class="kw-2">&amp;</span>str) -&gt; <span class="prelude-ty">Result</span>&lt;Vec&lt;u8&gt;&gt; {
+<a href=#797 id=797 data-nosnippet>797</a>    <span class="kw">if </span>!value.len().is_multiple_of(<span class="number">2</span>) {
+<a href=#798 id=798 data-nosnippet>798</a>        <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#799 id=799 data-nosnippet>799</a>            ErrorKind::DataInvalid,
+<a href=#800 id=800 data-nosnippet>800</a>            <span class="macro">format!</span>(<span class="string">"Hex string must have an even number of characters: {value:?}"</span>),
+<a href=#801 id=801 data-nosnippet>801</a>        ));
+<a href=#802 id=802 data-nosnippet>802</a>    }
 <a href=#803 id=803 data-nosnippet>803</a>
-<a href=#804 id=804 data-nosnippet>804</a><span class="kw">fn </span>decode_hex_digit(digit: u8, value: <span class="kw-2">&amp;</span>str) -&gt; <span class="prelude-ty">Result</span>&lt;u8&gt; {
-<a href=#805 id=805 data-nosnippet>805</a>    <span class="kw">match </span>digit {
-<a href=#806 id=806 data-nosnippet>806</a>        <span class="string">b'0'</span>..=<span class="string">b'9' </span>=&gt; <span class="prelude-val">Ok</span>(digit - <span class="string">b'0'</span>),
-<a href=#807 id=807 data-nosnippet>807</a>        <span class="string">b'a'</span>..=<span class="string">b'f' </span>=&gt; <span class="prelude-val">Ok</span>(digit - <span class="string">b'a' </span>+ <span class="number">10</span>),
-<a href=#808 id=808 data-nosnippet>808</a>        <span class="string">b'A'</span>..=<span class="string">b'F' </span>=&gt; <span class="prelude-val">Ok</span>(digit - <span class="string">b'A' </span>+ <span class="number">10</span>),
-<a href=#809 id=809 data-nosnippet>809</a>        <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(Error::new(
-<a href=#810 id=810 data-nosnippet>810</a>            ErrorKind::DataInvalid,
-<a href=#811 id=811 data-nosnippet>811</a>            <span class="macro">format!</span>(<span class="string">"Hex string contains invalid character: {value:?}"</span>),
-<a href=#812 id=812 data-nosnippet>812</a>        )),
-<a href=#813 id=813 data-nosnippet>813</a>    }
-<a href=#814 id=814 data-nosnippet>814</a>}
-<a href=#815 id=815 data-nosnippet>815</a>
-<a href=#816 id=816 data-nosnippet>816</a><span class="kw">fn </span>encode_hex_bytes(bytes: <span class="kw-2">&amp;</span>[u8]) -&gt; String {
-<a href=#817 id=817 data-nosnippet>817</a>    <span class="kw">const </span>HEX_DIGITS: <span class="kw-2">&amp;</span>[u8; <span class="number">16</span>] = <span class="string">b"0123456789abcdef"</span>;
-<a href=#818 id=818 data-nosnippet>818</a>
-<a href=#819 id=819 data-nosnippet>819</a>    <span class="kw">let </span><span class="kw-2">mut </span>output = String::with_capacity(bytes.len() * <span class="number">2</span>);
-<a href=#820 id=820 data-nosnippet>820</a>    <span class="kw">for </span>byte <span class="kw">in </span>bytes {
-<a href=#821 id=821 data-nosnippet>821</a>        output.push(HEX_DIGITS[(byte &gt;&gt; <span class="number">4</span>) <span class="kw">as </span>usize] <span class="kw">as </span>char);
-<a href=#822 id=822 data-nosnippet>822</a>        output.push(HEX_DIGITS[(byte &amp; <span class="number">0x0f</span>) <span class="kw">as </span>usize] <span class="kw">as </span>char);
-<a href=#823 id=823 data-nosnippet>823</a>    }
-<a href=#824 id=824 data-nosnippet>824</a>    output
+<a href=#804 id=804 data-nosnippet>804</a>    value
+<a href=#805 id=805 data-nosnippet>805</a>        .as_bytes()
+<a href=#806 id=806 data-nosnippet>806</a>        .chunks_exact(<span class="number">2</span>)
+<a href=#807 id=807 data-nosnippet>807</a>        .map(|chunk| {
+<a href=#808 id=808 data-nosnippet>808</a>            <span class="kw">let </span>high = decode_hex_digit(chunk[<span class="number">0</span>], value)<span class="question-mark">?</span>;
+<a href=#809 id=809 data-nosnippet>809</a>            <span class="kw">let </span>low = decode_hex_digit(chunk[<span class="number">1</span>], value)<span class="question-mark">?</span>;
+<a href=#810 id=810 data-nosnippet>810</a>            <span class="prelude-val">Ok</span>((high &lt;&lt; <span class="number">4</span>) | low)
+<a href=#811 id=811 data-nosnippet>811</a>        })
+<a href=#812 id=812 data-nosnippet>812</a>        .collect()
+<a href=#813 id=813 data-nosnippet>813</a>}
+<a href=#814 id=814 data-nosnippet>814</a>
+<a href=#815 id=815 data-nosnippet>815</a><span class="kw">fn </span>decode_hex_digit(digit: u8, value: <span class="kw-2">&amp;</span>str) -&gt; <span class="prelude-ty">Result</span>&lt;u8&gt; {
+<a href=#816 id=816 data-nosnippet>816</a>    <span class="kw">match </span>digit {
+<a href=#817 id=817 data-nosnippet>817</a>        <span class="string">b'0'</span>..=<span class="string">b'9' </span>=&gt; <span class="prelude-val">Ok</span>(digit - <span class="string">b'0'</span>),
+<a href=#818 id=818 data-nosnippet>818</a>        <span class="string">b'a'</span>..=<span class="string">b'f' </span>=&gt; <span class="prelude-val">Ok</span>(digit - <span class="string">b'a' </span>+ <span class="number">10</span>),
+<a href=#819 id=819 data-nosnippet>819</a>        <span class="string">b'A'</span>..=<span class="string">b'F' </span>=&gt; <span class="prelude-val">Ok</span>(digit - <span class="string">b'A' </span>+ <span class="number">10</span>),
+<a href=#820 id=820 data-nosnippet>820</a>        <span class="kw">_ </span>=&gt; <span class="prelude-val">Err</span>(Error::new(
+<a href=#821 id=821 data-nosnippet>821</a>            ErrorKind::DataInvalid,
+<a href=#822 id=822 data-nosnippet>822</a>            <span class="macro">format!</span>(<span class="string">"Hex string contains invalid character: {value:?}"</span>),
+<a href=#823 id=823 data-nosnippet>823</a>        )),
+<a href=#824 id=824 data-nosnippet>824</a>    }
 <a href=#825 id=825 data-nosnippet>825</a>}
 <a href=#826 id=826 data-nosnippet>826</a>
-<a href=#827 id=827 data-nosnippet>827</a><span class="kw">fn </span>validate_fixed_size(actual: usize, expected: u64) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
-<a href=#828 id=828 data-nosnippet>828</a>    <span class="kw">if </span>actual <span class="kw">as </span>u64 == expected {
-<a href=#829 id=829 data-nosnippet>829</a>        <span class="prelude-val">Ok</span>(())
-<a href=#830 id=830 data-nosnippet>830</a>    } <span class="kw">else </span>{
-<a href=#831 id=831 data-nosnippet>831</a>        <span class="prelude-val">Err</span>(Error::new(
-<a href=#832 id=832 data-nosnippet>832</a>            ErrorKind::DataInvalid,
-<a href=#833 id=833 data-nosnippet>833</a>            <span class="macro">format!</span>(<span class="string">"Fixed type must be exactly {expected} bytes, got {actual}"</span>),
-<a href=#834 id=834 data-nosnippet>834</a>        ))
-<a href=#835 id=835 data-nosnippet>835</a>    }
+<a href=#827 id=827 data-nosnippet>827</a><span class="kw">fn </span>encode_hex_bytes(bytes: <span class="kw-2">&amp;</span>[u8]) -&gt; String {
+<a href=#828 id=828 data-nosnippet>828</a>    <span class="kw">const </span>HEX_DIGITS: <span class="kw-2">&amp;</span>[u8; <span class="number">16</span>] = <span class="string">b"0123456789abcdef"</span>;
+<a href=#829 id=829 data-nosnippet>829</a>
+<a href=#830 id=830 data-nosnippet>830</a>    <span class="kw">let </span><span class="kw-2">mut </span>output = String::with_capacity(bytes.len() * <span class="number">2</span>);
+<a href=#831 id=831 data-nosnippet>831</a>    <span class="kw">for </span>byte <span class="kw">in </span>bytes {
+<a href=#832 id=832 data-nosnippet>832</a>        output.push(HEX_DIGITS[(byte &gt;&gt; <span class="number">4</span>) <span class="kw">as </span>usize] <span class="kw">as </span>char);
+<a href=#833 id=833 data-nosnippet>833</a>        output.push(HEX_DIGITS[(byte &amp; <span class="number">0x0f</span>) <span class="kw">as </span>usize] <span class="kw">as </span>char);
+<a href=#834 id=834 data-nosnippet>834</a>    }
+<a href=#835 id=835 data-nosnippet>835</a>    output
 <a href=#836 id=836 data-nosnippet>836</a>}
+<a href=#837 id=837 data-nosnippet>837</a>
+<a href=#838 id=838 data-nosnippet>838</a><span class="kw">fn </span>validate_fixed_size(actual: usize, expected: u64) -&gt; <span class="prelude-ty">Result</span>&lt;()&gt; {
+<a href=#839 id=839 data-nosnippet>839</a>    <span class="kw">if </span>actual <span class="kw">as </span>u64 == expected {
+<a href=#840 id=840 data-nosnippet>840</a>        <span class="prelude-val">Ok</span>(())
+<a href=#841 id=841 data-nosnippet>841</a>    } <span class="kw">else </span>{
+<a href=#842 id=842 data-nosnippet>842</a>        <span class="prelude-val">Err</span>(Error::new(
+<a href=#843 id=843 data-nosnippet>843</a>            ErrorKind::DataInvalid,
+<a href=#844 id=844 data-nosnippet>844</a>            <span class="macro">format!</span>(<span class="string">"Fixed type must be exactly {expected} bytes, got {actual}"</span>),
+<a href=#845 id=845 data-nosnippet>845</a>        ))
+<a href=#846 id=846 data-nosnippet>846</a>    }
+<a href=#847 id=847 data-nosnippet>847</a>}
 </code></pre></div></section></main></body></html>
\ No newline at end of file