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 2025/06/09 09:15:00 UTC
(iceberg-rust) branch gh-pages updated: deploy: c74a27ac0d77314926240d325701107e5360f836
This is an automated email from the ASF dual-hosted git repository.
github-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 bfdf0644 deploy: c74a27ac0d77314926240d325701107e5360f836
bfdf0644 is described below
commit bfdf064437abd04c8e6527df31344fa3d0f25b95
Author: liurenjie1024 <li...@users.noreply.github.com>
AuthorDate: Mon Jun 9 09:14:56 2025 +0000
deploy: c74a27ac0d77314926240d325701107e5360f836
---
api/iceberg/spec/enum.Literal.html | 66 +-
api/iceberg/spec/enum.PrimitiveLiteral.html | 12 +-
api/iceberg/spec/struct.Datum.html | 78 +-
api/iceberg/spec/struct.Map.html | 22 +-
api/iceberg/spec/struct.RawLiteral.html | 10 +-
api/iceberg/spec/struct.Struct.html | 16 +-
api/src/iceberg/spec/values.rs.html | 7552 ++++++++++++++-------------
7 files changed, 3927 insertions(+), 3829 deletions(-)
diff --git a/api/iceberg/spec/enum.Literal.html b/api/iceberg/spec/enum.Literal.html
index 90e3ad78..db4df0a1 100644
--- a/api/iceberg/spec/enum.Literal.html
+++ b/api/iceberg/spec/enum.Literal.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="Values present in iceberg type"><title>Literal 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-Medium [...]
+<!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="Values present in iceberg type"><title>Literal 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-Medium [...]
Primitive(<a class="enum" href="enum.PrimitiveLiteral.html" title="enum iceberg::spec::PrimitiveLiteral">PrimitiveLiteral</a>),
Struct(<a class="struct" href="struct.Struct.html" title="struct iceberg::spec::Struct">Struct</a>),
List(<a class="struct" href="https://doc.rust-lang.org/nightly/alloc/vec/struct.Vec.html" title="struct alloc::vec::Vec">Vec</a><<a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="enum" href="enum.Literal.html" title="enum iceberg::spec::Literal">Literal</a>>>),
@@ -14,14 +14,14 @@ 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.rs.html#1381-1750">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::Liter [...]
+</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.rs.html#1412-1781">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::Liter [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::{Literal, PrimitiveLiteral};
<span class="kw">let </span>t = Literal::bool(<span class="bool-val">true</span>);
<span class="macro">assert_eq!</span>(Literal::Primitive(PrimitiveLiteral::Boolean(<span class="bool-val">true</span>)), t);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.bool_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1405-1410">Source</a><h4 class="code-header">pub fn <a href="#method.bool_from_str" class="fn">bool_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.rust-lang.o [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.bool_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1436-1441">Source</a><h4 class="code-header">pub fn <a href="#method.bool_from_str" class="fn">bool_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.rust-lang.o [...]
See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromStr-for-bool">Parse bool from str</a> for reference.</p>
<p>Example:</p>
@@ -29,21 +29,21 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
<span class="kw">let </span>t = Literal::bool_from_str(<span class="string">"false"</span>).unwrap();
<span class="macro">assert_eq!</span>(Literal::Primitive(PrimitiveLiteral::Boolean(<span class="bool-val">false</span>)), t);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.int" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1421-1423">Source</a><h4 class="code-header">pub fn <a href="#method.int" class="fn">int</a><T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.int" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1452-1454">Source</a><h4 class="code-header">pub fn <a href="#method.int" class="fn">int</a><T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::{Literal, PrimitiveLiteral};
<span class="kw">let </span>t = Literal::int(<span class="number">23i8</span>);
<span class="macro">assert_eq!</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">23</span>)), t);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.long" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1434-1436">Source</a><h4 class="code-header">pub fn <a href="#method.long" class="fn">long</a><T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.h [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.long" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1465-1467">Source</a><h4 class="code-header">pub fn <a href="#method.long" class="fn">long</a><T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.h [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::{Literal, PrimitiveLiteral};
<span class="kw">let </span>t = Literal::long(<span class="number">24i8</span>);
<span class="macro">assert_eq!</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">24</span>)), t);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.float" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1451-1453">Source</a><h4 class="code-header">pub fn <a href="#method.float" class="fn">float</a><T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.f3 [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.float" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1482-1484">Source</a><h4 class="code-header">pub fn <a href="#method.float" class="fn">float</a><T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.f3 [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::{Literal, PrimitiveLiteral};
@@ -54,7 +54,7 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
Literal::Primitive(PrimitiveLiteral::Float(OrderedFloat(<span class="number">32.1</span>))),
t
);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.double" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1468-1470">Source</a><h4 class="code-header">pub fn <a href="#method.double" class="fn">double</a><T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.double" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1499-1501">Source</a><h4 class="code-header">pub fn <a href="#method.double" class="fn">double</a><T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::{Literal, PrimitiveLiteral};
@@ -65,8 +65,8 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
Literal::Primitive(PrimitiveLiteral::Double(OrderedFloat(<span class="number">32.1</span>))),
t
);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.date" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1473-1475">Source</a><h4 class="code-header">pub fn <a href="#method.date" class="fn">date</a>(days: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates date literal from number of days from unix epoch di [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.date_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1488-1498">Source</a><h4 class="code-header">pub fn <a href="#method.date_from_str" class="fn">date_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.rust-lang.o [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.date" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1504-1506">Source</a><h4 class="code-header">pub fn <a href="#method.date" class="fn">date</a>(days: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates date literal from number of days from unix epoch di [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.date_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1519-1529">Source</a><h4 class="code-header">pub fn <a href="#method.date_from_str" class="fn">date_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.rust-lang.o [...]
<p>See <a href="https://docs.rs/chrono/latest/chrono/naive/date/struct.NaiveDate.html#method.from_str" title="associated function chrono::naive::date::NaiveDate::from_str"><code>NaiveDate::from_str</code></a>.</p>
<p>Example</p>
@@ -74,7 +74,7 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
<span class="kw">let </span>t = Literal::date_from_str(<span class="string">"1970-01-03"</span>).unwrap();
<span class="macro">assert_eq!</span>(Literal::date(<span class="number">2</span>), t);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.date_from_ymd" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1512-1521">Source</a><h4 class="code-header">pub fn <a href="#method.date_from_ymd" class="fn">date_from_ymd</a>(year: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>, month: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html"> [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.date_from_ymd" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1543-1552">Source</a><h4 class="code-header">pub fn <a href="#method.date_from_ymd" class="fn">date_from_ymd</a>(year: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>, month: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html"> [...]
<p>See <a href="https://docs.rs/chrono/latest/chrono/naive/date/struct.NaiveDate.html#method.from_ymd_opt" title="associated function chrono::naive::date::NaiveDate::from_ymd_opt"><code>NaiveDate::from_ymd_opt</code></a>.</p>
<p>Example:</p>
@@ -82,8 +82,8 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
<span class="kw">let </span>t = Literal::date_from_ymd(<span class="number">1970</span>, <span class="number">1</span>, <span class="number">5</span>).unwrap();
<span class="macro">assert_eq!</span>(Literal::date(<span class="number">4</span>), t);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.time" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1524-1526">Source</a><h4 class="code-header">pub fn <a href="#method.time" class="fn">time</a>(value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates time in microseconds directly</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.time_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1554-1564">Source</a><h4 class="code-header">pub fn <a href="#method.time_from_str" class="fn">time_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.rust-lang.o [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.time" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1555-1557">Source</a><h4 class="code-header">pub fn <a href="#method.time" class="fn">time</a>(value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates time in microseconds directly</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.time_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1585-1595">Source</a><h4 class="code-header">pub fn <a href="#method.time_from_str" class="fn">time_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.rust-lang.o [...]
<p>See <a href="https://docs.rs/chrono/latest/chrono/naive/time/struct.NaiveTime.html#method.from_str" title="associated function chrono::naive::time::NaiveTime::from_str"><code>NaiveTime::from_str</code></a> for details.</p>
<p>Example:</p>
@@ -97,7 +97,7 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
</span><span class="number">888999 </span><span class="comment">// microseconds
</span>};
<span class="macro">assert_eq!</span>(Literal::time(micro_secs), t);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.time_from_hms_micro" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1577-1584">Source</a><h4 class="code-header">pub fn <a href="#method.time_from_hms_micro" class="fn">time_from_hms_micro</a>(
+</div></details><details class="toggle method-toggle" open><summary><section id="method.time_from_hms_micro" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1608-1615">Source</a><h4 class="code-header">pub fn <a href="#method.time_from_hms_micro" class="fn">time_from_hms_micro</a>(
hour: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u32</a>,
min: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u32</a>,
sec: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u32</a>,
@@ -110,11 +110,11 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
<span class="kw">let </span>t = Literal::time_from_hms_micro(<span class="number">22</span>, <span class="number">15</span>, <span class="number">33</span>, <span class="number">111</span>).unwrap();
<span class="macro">assert_eq!</span>(Literal::time_from_str(<span class="string">"22:15:33.000111"</span>).unwrap(), t);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamp" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1587-1589">Source</a><h4 class="code-header">pub fn <a href="#method.timestamp" class="fn">timestamp</a>(value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates a timestamp from unix epoch in micr [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamptz" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1592-1594">Source</a><h4 class="code-header">pub fn <a href="#method.timestamptz" class="fn">timestamptz</a>(value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates a timestamp with timezone fro [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamp_from_datetime" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1607-1609">Source</a><h4 class="code-header">pub fn <a href="#method.timestamp_from_datetime" class="fn">timestamp_from_datetime</a><T: <a class="trait" href="https://docs.rs/chrono/latest/chrono/offset/trait.TimeZone.html" title="trait chrono::offset::TimeZone">TimeZone</a>>(dt: <a class [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamptz_from_datetime" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1612-1614">Source</a><h4 class="code-header">pub fn <a href="#method.timestamptz_from_datetime" class="fn">timestamptz_from_datetime</a><T: <a class="trait" href="https://docs.rs/chrono/latest/chrono/offset/trait.TimeZone.html" title="trait chrono::offset::TimeZone">TimeZone</a>>(dt: <a [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamp_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1639-1645">Source</a><h4 class="code-header">pub fn <a href="#method.timestamp_from_str" class="fn">timestamp_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https:// [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamp" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1618-1620">Source</a><h4 class="code-header">pub fn <a href="#method.timestamp" class="fn">timestamp</a>(value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates a timestamp from unix epoch in micr [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamptz" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1623-1625">Source</a><h4 class="code-header">pub fn <a href="#method.timestamptz" class="fn">timestamptz</a>(value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates a timestamp with timezone fro [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamp_from_datetime" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1638-1640">Source</a><h4 class="code-header">pub fn <a href="#method.timestamp_from_datetime" class="fn">timestamp_from_datetime</a><T: <a class="trait" href="https://docs.rs/chrono/latest/chrono/offset/trait.TimeZone.html" title="trait chrono::offset::TimeZone">TimeZone</a>>(dt: <a class [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamptz_from_datetime" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1643-1645">Source</a><h4 class="code-header">pub fn <a href="#method.timestamptz_from_datetime" class="fn">timestamptz_from_datetime</a><T: <a class="trait" href="https://docs.rs/chrono/latest/chrono/offset/trait.TimeZone.html" title="trait chrono::offset::TimeZone">TimeZone</a>>(dt: <a [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamp_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1670-1676">Source</a><h4 class="code-header">pub fn <a href="#method.timestamp_from_str" class="fn">timestamp_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https:// [...]
<p>See <a href="https://docs.rs/chrono/latest/chrono/datetime/struct.DateTime.html#method.from_str" title="associated function chrono::datetime::DateTime::from_str"><code>DateTime<Utc>::from_str</code></a>.</p>
<p>Example:</p>
@@ -133,10 +133,10 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
};
<span class="macro">assert_eq!</span>(t, t2);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamptz_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1648-1654">Source</a><h4 class="code-header">pub fn <a href="#method.timestamptz_from_str" class="fn">timestamptz_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="ht [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.string" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1657-1659">Source</a><h4 class="code-header">pub fn <a href="#method.string" class="fn">string</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/alloc/string/trait.ToString.html" title="trait alloc::string::ToString">ToString</a>>(s: S) -> Self</h4></section></summary><div class="docblock [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.uuid" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1662-1664">Source</a><h4 class="code-header">pub fn <a href="#method.uuid" class="fn">uuid</a>(uuid: <a class="struct" href="https://docs.rs/uuid/1.17.0/uuid/struct.Uuid.html" title="struct uuid::Uuid">Uuid</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates uuid literal.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.uuid_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1678-1687">Source</a><h4 class="code-header">pub fn <a href="#method.uuid_from_str" class="fn">uuid_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.rust-lang.o [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamptz_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1679-1685">Source</a><h4 class="code-header">pub fn <a href="#method.timestamptz_from_str" class="fn">timestamptz_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="ht [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.string" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1688-1690">Source</a><h4 class="code-header">pub fn <a href="#method.string" class="fn">string</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/alloc/string/trait.ToString.html" title="trait alloc::string::ToString">ToString</a>>(s: S) -> Self</h4></section></summary><div class="docblock [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.uuid" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1693-1695">Source</a><h4 class="code-header">pub fn <a href="#method.uuid" class="fn">uuid</a>(uuid: <a class="struct" href="https://docs.rs/uuid/1.17.0/uuid/struct.Uuid.html" title="struct uuid::Uuid">Uuid</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates uuid literal.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.uuid_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1709-1718">Source</a><h4 class="code-header">pub fn <a href="#method.uuid_from_str" class="fn">uuid_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.rust-lang.o [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::Literal;
@@ -145,7 +145,7 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
<span class="kw">let </span>t2 = Literal::uuid(Uuid::from_u128_le(<span class="number">0xd8d7d6d5d4d3d2d1c2c1b2b1a4a3a2a1</span>));
<span class="macro">assert_eq!</span>(t1, t2);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.fixed" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1700-1702">Source</a><h4 class="code-header">pub fn <a href="#method.fixed" class="fn">fixed</a><I: <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/traits/collect/trait.IntoIterator.html" title="trait core::iter::traits::collect::IntoIterator">IntoIterator</a><Item = <a class="primitive" [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.fixed" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1731-1733">Source</a><h4 class="code-header">pub fn <a href="#method.fixed" class="fn">fixed</a><I: <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/traits/collect/trait.IntoIterator.html" title="trait core::iter::traits::collect::IntoIterator">IntoIterator</a><Item = <a class="primitive" [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::{Literal, PrimitiveLiteral};
@@ -153,7 +153,7 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
<span class="kw">let </span>t2 = Literal::Primitive(PrimitiveLiteral::Binary(<span class="macro">vec!</span>[<span class="number">1u8</span>, <span class="number">2u8</span>]));
<span class="macro">assert_eq!</span>(t1, t2);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.binary" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1715-1717">Source</a><h4 class="code-header">pub fn <a href="#method.binary" class="fn">binary</a><I: <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/traits/collect/trait.IntoIterator.html" title="trait core::iter::traits::collect::IntoIterator">IntoIterator</a><Item = <a class="primiti [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.binary" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1746-1748">Source</a><h4 class="code-header">pub fn <a href="#method.binary" class="fn">binary</a><I: <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/traits/collect/trait.IntoIterator.html" title="trait core::iter::traits::collect::IntoIterator">IntoIterator</a><Item = <a class="primiti [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::{Literal, PrimitiveLiteral};
@@ -161,8 +161,8 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
<span class="kw">let </span>t2 = Literal::Primitive(PrimitiveLiteral::Binary(<span class="macro">vec!</span>[<span class="number">1u8</span>, <span class="number">2u8</span>]));
<span class="macro">assert_eq!</span>(t1, t2);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.decimal" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1720-1722">Source</a><h4 class="code-header">pub fn <a href="#method.decimal" class="fn">decimal</a>(decimal: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i128.html">i128</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates a decimal literal.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.decimal_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1736-1741">Source</a><h4 class="code-header">pub fn <a href="#method.decimal_from_str" class="fn">decimal_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.ru [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.decimal" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1751-1753">Source</a><h4 class="code-header">pub fn <a href="#method.decimal" class="fn">decimal</a>(decimal: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i128.html">i128</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates a decimal literal.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.decimal_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1767-1772">Source</a><h4 class="code-header">pub fn <a href="#method.decimal_from_str" class="fn">decimal_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.ru [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::Literal;
@@ -171,16 +171,16 @@ 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.rs.html#1744-1749">Source</a><h4 class="code-header">pub fn <a href="#method.as_primitive_literal" class="fn">as_primitive_literal</a>(&self) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="enum" href [...]
-</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Literal-1" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1809-2126">Source</a><a href="#impl-Literal-1" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.Literal.html" title="enum iceberg::spec::Literal">Literal</a></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><secti [...]
+</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.rs.html#1775-1780">Source</a><h4 class="code-header">pub fn <a href="#method.as_primitive_literal" class="fn">as_primitive_literal</a>(&self) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="enum" href [...]
+</div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Literal-1" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1840-2157">Source</a><a href="#impl-Literal-1" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.Literal.html" title="enum iceberg::spec::Literal">Literal</a></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><secti [...]
<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.rs.html#1981-2106">Source</a><h4 class="code-header">pub fn <a href="#method.try_into_json" class="fn">try_into_json</a>(self, type: &<a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type</a>) -> <a class="type" href="../type.Result.html" title="type iceberg::Result">Result</a><<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.rs.html#2012-2137">Source</a><h4 class="code-header">pub fn <a href="#method.try_into_json" class="fn">try_into_json</a>(self, type: &<a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type</a>) -> <a class="type" href="../type.Result.html" title="type iceberg::Result">Result</a><<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.rs.html#2109-2125">Source</a><h4 class="code-header">pub fn <a href="#method.into_any" class="fn">into_any</a>(self) -> <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a><dyn <a class="trait" href="https://doc.rust-lang.org/nightly/cor [...]
-</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.rs.html#1363">Source</a><a href="#impl-Clone-for-Literal" class="anchor">§</a><h3 class="code-header">impl <a class [...]
+</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.rs.html#2140-2156">Source</a><h4 class="code-header">pub fn <a href="#method.into_any" class="fn">into_any</a>(self) -> <a class="struct" href="https://doc.rust-lang.org/nightly/alloc/boxed/struct.Box.html" title="struct alloc::boxed::Box">Box</a><dyn <a class="trait" href="https://doc.rust-lang.org/nightly/cor [...]
+</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.rs.html#1394">Source</a><a href="#impl-Clone-for-Literal" class="anchor">§</a><h3 class="code-header">impl <a class [...]
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><section id="impl-Eq-for-Literal" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1363">Source</a><a href="#impl-Eq-for-Literal" 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="enum" href="enum.Literal.html" title="enum iceberg::spec::Litera [...]
+ 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><section id="impl-Eq-for-Literal" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1394">Source</a><a href="#impl-Eq-for-Literal" 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="enum" href="enum.Literal.html" title="enum iceberg::spec::Litera [...]
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#139">Source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<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.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#211">Source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
T: ?<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.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#218">Source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/api/iceberg/spec/enum.PrimitiveLiteral.html b/api/iceberg/spec/enum.PrimitiveLiteral.html
index fbdc3d15..d12f0891 100644
--- a/api/iceberg/spec/enum.PrimitiveLiteral.html
+++ b/api/iceberg/spec/enum.PrimitiveLiteral.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="Values present in iceberg type"><title>PrimitiveLiteral 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,FiraSa [...]
+<!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="Values present in iceberg type"><title>PrimitiveLiteral 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,FiraSa [...]
Boolean(<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a>),
Int(<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>),
Long(<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>),
@@ -22,15 +22,15 @@
</div><section id="variant.UInt128" class="variant"><a href="#variant.UInt128" class="anchor">§</a><h3 class="code-header">UInt128(<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u128.html">u128</a>)</h3></section><div class="docblock"><p>Stored as 16-byte little-endian</p>
</div><section id="variant.AboveMax" class="variant"><a href="#variant.AboveMax" class="anchor">§</a><h3 class="code-header">AboveMax</h3></section><div class="docblock"><p>When a number is larger than it can hold</p>
</div><section id="variant.BelowMin" class="variant"><a href="#variant.BelowMin" class="anchor">§</a><h3 class="code-header">BelowMin</h3></section><div class="docblock"><p>When a number is smaller than it can hold</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-PrimitiveLiteral" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#89-99">Source</a><a href="#impl-PrimitiveLiteral" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.PrimitiveLiteral.html" title="en [...]
+</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-PrimitiveLiteral" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#90-100">Source</a><a href="#impl-PrimitiveLiteral" class="anchor">§</a><h3 class="code-header">impl <a class="enum" href="enum.PrimitiveLiteral.html" title="e [...]
that can be a NaN, and that it’s value is NaN</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-PrimitiveLiteral" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#63">Source</a><a href="#impl-Clone-for-PrimitiveLiteral" class="anchor">§</a><h3 class="code-heade [...]
+</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-PrimitiveLiteral" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#64">Source</a><a href="#impl-Clone-for-PrimitiveLiteral" class="anchor">§</a><h3 class="code-heade [...]
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-PartialOrd-for-PrimitiveLiteral" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#63">Source</a><a href="#impl-PartialOrd-for-PrimitiveLiteral" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html" title="trait co [...]
+ 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-PartialOrd-for-PrimitiveLiteral" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#64">Source</a><a href="#impl-PartialOrd-for-PrimitiveLiteral" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html" title="trait co [...]
<code><=</code> operator. <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html#method.le">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.gt" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#1407">Source</a></span><a href="#method.gt" class="anchor">§</a><h4 clas [...]
operator. <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html#method.gt">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.ge" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#1425">Source</a></span><a href="#method.ge" class="anchor">§</a><h4 class="code-header">fn [...]
-the <code>>=</code> operator. <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html#method.ge">Read more</a></div></details></div></details><section id="impl-Eq-for-PrimitiveLiteral" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#63">Source</a><a href="#impl-Eq-for-PrimitiveLiteral" 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::c [...]
+the <code>>=</code> operator. <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html#method.ge">Read more</a></div></details></div></details><section id="impl-Eq-for-PrimitiveLiteral" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#64">Source</a><a href="#impl-Eq-for-PrimitiveLiteral" 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::c [...]
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#139">Source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<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.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#211">Source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
T: ?<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.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#218">Source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/api/iceberg/spec/struct.Datum.html b/api/iceberg/spec/struct.Datum.html
index 00ebf613..095a5d08 100644
--- a/api/iceberg/spec/struct.Datum.html
+++ b/api/iceberg/spec/struct.Datum.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="Literal associated with its type. The value and type pair is checked when construction, so the type and value is guaranteed to be correct when used."><title>Datum in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","So [...]
+<!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="Literal associated with its type. The value and type pair is checked when construction, so the type and value is guaranteed to be correct when used."><title>Datum in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","So [...]
guaranteed to be correct when used.</p>
<p>By default, we decouple the type and value of a literal, so we can use avoid the cost of storing extra type info
for each literal. But associate type with literal can be useful in some cases, for example, in unbound expression.</p>
-</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-Datum" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#387-1238">Source</a><a href="#impl-Datum" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Datum.html" title="struct iceberg::spec::Da [...]
+</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-Datum" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#418-1269">Source</a><a href="#impl-Datum" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Datum.html" title="struct iceberg::spec::Da [...]
<p>See <a href="https://iceberg.apache.org/spec/#binary-single-value-serialization">this spec</a> for reference.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.to_bytes" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#465-523">Source</a><h4 class="code-header">pub fn <a href="#method.to_bytes" class="fn">to_bytes</a>(&self) -> <a class="type" href="../type.Result.html" title="type iceberg::Result">Result</a><<a class="struct" href="struct.ByteBuf.html" title="struct iceberg::spec::ByteBuf">ByteBuf</a>></h4></s [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.to_bytes" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#496-554">Source</a><h4 class="code-header">pub fn <a href="#method.to_bytes" class="fn">to_bytes</a>(&self) -> <a class="type" href="../type.Result.html" title="type iceberg::Result">Result</a><<a class="struct" href="struct.ByteBuf.html" title="struct iceberg::spec::ByteBuf">ByteBuf</a>></h4></s [...]
<p>See <a href="https://iceberg.apache.org/spec/#binary-single-value-serialization">this spec</a> for reference.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.bool" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#538-543">Source</a><h4 class="code-header">pub fn <a href="#method.bool" class="fn">bool</a><T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.ht [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.bool" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#569-574">Source</a><h4 class="code-header">pub fn <a href="#method.bool" class="fn">bool</a><T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.ht [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::{Datum, Literal, PrimitiveLiteral};
@@ -17,7 +17,7 @@ for each literal. But associate type with literal can be useful in some cases, f
Literal::from(t),
Literal::Primitive(PrimitiveLiteral::Boolean(<span class="bool-val">true</span>))
);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.bool_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#559-564">Source</a><h4 class="code-header">pub fn <a href="#method.bool_from_str" class="fn">bool_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.rust-lang.org [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.bool_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#590-595">Source</a><h4 class="code-header">pub fn <a href="#method.bool_from_str" class="fn">bool_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.rust-lang.org [...]
See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromStr-for-bool">Parse bool from str</a> for reference.</p>
<p>Example:</p>
@@ -29,7 +29,7 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
Literal::Primitive(PrimitiveLiteral::Boolean(<span class="bool-val">false</span>)),
t.into()
);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.int" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#576-581">Source</a><h4 class="code-header">pub fn <a href="#method.int" class="fn">int</a><T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html"> [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.int" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#607-612">Source</a><h4 class="code-header">pub fn <a href="#method.int" class="fn">int</a><T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html"> [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::{Datum, Literal, PrimitiveLiteral};
@@ -37,7 +37,7 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{}"</span>, t), <span class="string">"23"</span>);
<span class="macro">assert_eq!</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">23</span>)), t.into());</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.long" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#593-598">Source</a><h4 class="code-header">pub fn <a href="#method.long" class="fn">long</a><T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.htm [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.long" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#624-629">Source</a><h4 class="code-header">pub fn <a href="#method.long" class="fn">long</a><T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.htm [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::{Datum, Literal, PrimitiveLiteral};
@@ -45,7 +45,7 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"24"</span>);
<span class="macro">assert_eq!</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">24</span>)), t.into());</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.float" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#614-619">Source</a><h4 class="code-header">pub fn <a href="#method.float" class="fn">float</a><T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.f32. [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.float" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#645-650">Source</a><h4 class="code-header">pub fn <a href="#method.float" class="fn">float</a><T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.f32. [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::{Datum, Literal, PrimitiveLiteral};
@@ -57,7 +57,7 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
Literal::Primitive(PrimitiveLiteral::Float(OrderedFloat(<span class="number">32.1</span>))),
t.into()
);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.double" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#635-640">Source</a><h4 class="code-header">pub fn <a href="#method.double" class="fn">double</a><T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.f [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.double" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#666-671">Source</a><h4 class="code-header">pub fn <a href="#method.double" class="fn">double</a><T: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.f [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::{Datum, Literal, PrimitiveLiteral};
@@ -69,7 +69,7 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
Literal::Primitive(PrimitiveLiteral::Double(OrderedFloat(<span class="number">32.1</span>))),
t.into()
);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.date" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#653-658">Source</a><h4 class="code-header">pub fn <a href="#method.date" class="fn">date</a>(days: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates date literal from number of days from unix epoch dire [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.date" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#684-689">Source</a><h4 class="code-header">pub fn <a href="#method.date" class="fn">date</a>(days: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates date literal from number of days from unix epoch dire [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::{Datum, Literal, PrimitiveLiteral};
@@ -78,7 +78,7 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"1970-01-03"</span>);
<span class="macro">assert_eq!</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>)), t.into());</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.date_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#672-682">Source</a><h4 class="code-header">pub fn <a href="#method.date_from_str" class="fn">date_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.rust-lang.org [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.date_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#703-713">Source</a><h4 class="code-header">pub fn <a href="#method.date_from_str" class="fn">date_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.rust-lang.org [...]
<p>See <a href="https://docs.rs/chrono/latest/chrono/naive/date/struct.NaiveDate.html#method.from_str" title="associated function chrono::naive::date::NaiveDate::from_str"><code>NaiveDate::from_str</code></a>.</p>
<p>Example</p>
@@ -87,7 +87,7 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"1970-01-05"</span>);
<span class="macro">assert_eq!</span>(Literal::date(<span class="number">4</span>), t.into());</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.date_from_ymd" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#697-706">Source</a><h4 class="code-header">pub fn <a href="#method.date_from_ymd" class="fn">date_from_ymd</a>(year: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>, month: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u3 [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.date_from_ymd" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#728-737">Source</a><h4 class="code-header">pub fn <a href="#method.date_from_ymd" class="fn">date_from_ymd</a>(year: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i32.html">i32</a>, month: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u3 [...]
<p>See <a href="https://docs.rs/chrono/latest/chrono/naive/date/struct.NaiveDate.html#method.from_ymd_opt" title="associated function chrono::naive::date::NaiveDate::from_ymd_opt"><code>NaiveDate::from_ymd_opt</code></a>.</p>
<p>Example:</p>
@@ -96,7 +96,7 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"1970-01-05"</span>);
<span class="macro">assert_eq!</span>(Literal::date(<span class="number">4</span>), t.into());</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.time_micros" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#734-745">Source</a><h4 class="code-header">pub fn <a href="#method.time_micros" class="fn">time_micros</a>(value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>) -> <a class="type" href="../type.Result.html" title="type iceberg::Result">Result</a><Self> [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.time_micros" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#765-776">Source</a><h4 class="code-header">pub fn <a href="#method.time_micros" class="fn">time_micros</a>(value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>) -> <a class="type" href="../type.Result.html" title="type iceberg::Result">Result</a><Self> [...]
<p>It will return error when it’s negative or too large to fit in 24 hours.</p>
<p>Example:</p>
@@ -118,7 +118,7 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
<span class="kw">let </span>too_large_value = <span class="number">36 </span>* <span class="number">60 </span>* <span class="number">60 </span>* <span class="number">1_000_000</span>; <span class="comment">// Too large to fit in 24 hours.
</span><span class="macro">assert!</span>(Datum::time_micros(too_large_value).is_err());</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.time_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#770-780">Source</a><h4 class="code-header">pub fn <a href="#method.time_from_str" class="fn">time_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.rust-lang.org [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.time_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#801-811">Source</a><h4 class="code-header">pub fn <a href="#method.time_from_str" class="fn">time_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.rust-lang.org [...]
<p>See <a href="https://docs.rs/chrono/latest/chrono/naive/time/struct.NaiveTime.html#method.from_str" title="associated function chrono::naive::time::NaiveTime::from_str"><code>NaiveTime::from_str</code></a> for details.</p>
<p>Example:</p>
@@ -126,7 +126,7 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
<span class="kw">let </span>t = Datum::time_from_str(<span class="string">"01:02:01.888999777"</span>).unwrap();
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"01:02:01.888999"</span>);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.time_from_hms_micro" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#793-800">Source</a><h4 class="code-header">pub fn <a href="#method.time_from_hms_micro" class="fn">time_from_hms_micro</a>(
+</div></details><details class="toggle method-toggle" open><summary><section id="method.time_from_hms_micro" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#824-831">Source</a><h4 class="code-header">pub fn <a href="#method.time_from_hms_micro" class="fn">time_from_hms_micro</a>(
hour: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u32</a>,
min: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u32</a>,
sec: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u32</a>,
@@ -139,21 +139,21 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
<span class="kw">let </span>t = Datum::time_from_hms_micro(<span class="number">22</span>, <span class="number">15</span>, <span class="number">33</span>, <span class="number">111</span>).unwrap();
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"22:15:33.000111"</span>);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamp_micros" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#812-817">Source</a><h4 class="code-header">pub fn <a href="#method.timestamp_micros" class="fn">timestamp_micros</a>(value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates a timestamp from [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamp_micros" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#843-848">Source</a><h4 class="code-header">pub fn <a href="#method.timestamp_micros" class="fn">timestamp_micros</a>(value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates a timestamp from [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::Datum;
<span class="kw">let </span>t = Datum::timestamp_micros(<span class="number">1000</span>);
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"1970-01-01 00:00:00.001"</span>);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamp_nanos" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#829-834">Source</a><h4 class="code-header">pub fn <a href="#method.timestamp_nanos" class="fn">timestamp_nanos</a>(value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates a timestamp from un [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamp_nanos" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#860-865">Source</a><h4 class="code-header">pub fn <a href="#method.timestamp_nanos" class="fn">timestamp_nanos</a>(value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates a timestamp from un [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::Datum;
<span class="kw">let </span>t = Datum::timestamp_nanos(<span class="number">1000</span>);
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"1970-01-01 00:00:00.000001"</span>);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamp_from_datetime" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#852-854">Source</a><h4 class="code-header">pub fn <a href="#method.timestamp_from_datetime" class="fn">timestamp_from_datetime</a>(dt: <a class="struct" href="https://docs.rs/chrono/latest/chrono/naive/datetime/struct.NaiveDateTime.html" title="struct chrono::naive::datetime::NaiveDateTime">Nai [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamp_from_datetime" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#883-885">Source</a><h4 class="code-header">pub fn <a href="#method.timestamp_from_datetime" class="fn">timestamp_from_datetime</a>(dt: <a class="struct" href="https://docs.rs/chrono/latest/chrono/naive/datetime/struct.NaiveDateTime.html" title="struct chrono::naive::datetime::NaiveDateTime">Nai [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>chrono::{NaiveDate, NaiveDateTime, TimeZone, Utc};
@@ -166,7 +166,7 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
);
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"1992-03-01 01:02:03.000088"</span>);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamp_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#869-875">Source</a><h4 class="code-header">pub fn <a href="#method.timestamp_from_str" class="fn">timestamp_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://do [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamp_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#900-906">Source</a><h4 class="code-header">pub fn <a href="#method.timestamp_from_str" class="fn">timestamp_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://do [...]
<p>See <a href="https://docs.rs/chrono/latest/chrono/naive/datetime/struct.NaiveDateTime.html#method.from_str" title="associated function chrono::naive::datetime::NaiveDateTime::from_str"><code>NaiveDateTime::from_str</code></a>.</p>
<p>Example:</p>
@@ -175,21 +175,21 @@ See <a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromS
<span class="kw">let </span>t = Datum::timestamp_from_str(<span class="string">"1992-03-01T01:02:03.000088"</span>).unwrap();
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"1992-03-01 01:02:03.000088"</span>);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamptz_micros" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#887-892">Source</a><h4 class="code-header">pub fn <a href="#method.timestamptz_micros" class="fn">timestamptz_micros</a>(value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates a timestam [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamptz_micros" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#918-923">Source</a><h4 class="code-header">pub fn <a href="#method.timestamptz_micros" class="fn">timestamptz_micros</a>(value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates a timestam [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::Datum;
<span class="kw">let </span>t = Datum::timestamptz_micros(<span class="number">1000</span>);
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"1970-01-01 00:00:00.001 UTC"</span>);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamptz_nanos" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#904-909">Source</a><h4 class="code-header">pub fn <a href="#method.timestamptz_nanos" class="fn">timestamptz_nanos</a>(value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates a timestamp w [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamptz_nanos" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#935-940">Source</a><h4 class="code-header">pub fn <a href="#method.timestamptz_nanos" class="fn">timestamptz_nanos</a>(value: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.i64.html">i64</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates a timestamp w [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::Datum;
<span class="kw">let </span>t = Datum::timestamptz_nanos(<span class="number">1000</span>);
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"1970-01-01 00:00:00.000001 UTC"</span>);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamptz_from_datetime" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#921-923">Source</a><h4 class="code-header">pub fn <a href="#method.timestamptz_from_datetime" class="fn">timestamptz_from_datetime</a><T: <a class="trait" href="https://docs.rs/chrono/latest/chrono/offset/trait.TimeZone.html" title="trait chrono::offset::TimeZone">TimeZone</a>>(dt: <a c [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamptz_from_datetime" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#952-954">Source</a><h4 class="code-header">pub fn <a href="#method.timestamptz_from_datetime" class="fn">timestamptz_from_datetime</a><T: <a class="trait" href="https://docs.rs/chrono/latest/chrono/offset/trait.TimeZone.html" title="trait chrono::offset::TimeZone">TimeZone</a>>(dt: <a c [...]
Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>chrono::{TimeZone, Utc};
@@ -197,7 +197,7 @@ Example:</p>
<span class="kw">let </span>t = Datum::timestamptz_from_datetime(Utc.timestamp_opt(<span class="number">1000</span>, <span class="number">0</span>).unwrap());
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"1970-01-01 00:16:40 UTC"</span>);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamptz_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#938-944">Source</a><h4 class="code-header">pub fn <a href="#method.timestamptz_from_str" class="fn">timestamptz_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="http [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.timestamptz_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#969-975">Source</a><h4 class="code-header">pub fn <a href="#method.timestamptz_from_str" class="fn">timestamptz_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="http [...]
<p>See <a href="https://docs.rs/chrono/latest/chrono/datetime/struct.DateTime.html#method.from_str" title="associated function chrono::datetime::DateTime::from_str"><code>DateTime::from_str</code></a>.</p>
<p>Example:</p>
@@ -206,14 +206,14 @@ Example:</p>
<span class="kw">let </span>t = Datum::timestamptz_from_str(<span class="string">"1992-03-01T01:02:03.000088+08:00"</span>).unwrap();
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"1992-02-29 17:02:03.000088 UTC"</span>);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.string" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#956-961">Source</a><h4 class="code-header">pub fn <a href="#method.string" class="fn">string</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/alloc/string/trait.ToString.html" title="trait alloc::string::ToString">ToString</a>>(s: S) -> Self</h4></section></summary><div class="docblock"> [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.string" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#987-992">Source</a><h4 class="code-header">pub fn <a href="#method.string" class="fn">string</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/alloc/string/trait.ToString.html" title="trait alloc::string::ToString">ToString</a>>(s: S) -> Self</h4></section></summary><div class="docblock"> [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::Datum;
<span class="kw">let </span>t = Datum::string(<span class="string">"ss"</span>);
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">r#""ss""#</span>);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.uuid" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#974-979">Source</a><h4 class="code-header">pub fn <a href="#method.uuid" class="fn">uuid</a>(uuid: <a class="struct" href="https://docs.rs/uuid/1.17.0/uuid/struct.Uuid.html" title="struct uuid::Uuid">Uuid</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates uuid literal.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.uuid" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1005-1010">Source</a><h4 class="code-header">pub fn <a href="#method.uuid" class="fn">uuid</a>(uuid: <a class="struct" href="https://docs.rs/uuid/1.17.0/uuid/struct.Uuid.html" title="struct uuid::Uuid">Uuid</a>) -> Self</h4></section></summary><div class="docblock"><p>Creates uuid literal.</p>
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::Datum;
@@ -221,28 +221,28 @@ Example:</p>
<span class="kw">let </span>t = Datum::uuid(<span class="macro">uuid!</span>(<span class="string">"a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8"</span>));
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8"</span>);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.uuid_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#991-1000">Source</a><h4 class="code-header">pub fn <a href="#method.uuid_from_str" class="fn">uuid_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.rust-lang.or [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.uuid_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1022-1031">Source</a><h4 class="code-header">pub fn <a href="#method.uuid_from_str" class="fn">uuid_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.rust-lang.o [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::Datum;
<span class="kw">let </span>t = Datum::uuid_from_str(<span class="string">"a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8"</span>).unwrap();
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8"</span>);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.fixed" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1012-1018">Source</a><h4 class="code-header">pub fn <a href="#method.fixed" class="fn">fixed</a><I: <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/traits/collect/trait.IntoIterator.html" title="trait core::iter::traits::collect::IntoIterator">IntoIterator</a><Item = <a class="primitive" [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.fixed" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1043-1049">Source</a><h4 class="code-header">pub fn <a href="#method.fixed" class="fn">fixed</a><I: <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/traits/collect/trait.IntoIterator.html" title="trait core::iter::traits::collect::IntoIterator">IntoIterator</a><Item = <a class="primitive" [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::{Datum, Literal, PrimitiveLiteral};
<span class="kw">let </span>t = Datum::fixed(<span class="macro">vec!</span>[<span class="number">1u8</span>, <span class="number">2u8</span>]);
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"0102"</span>);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.binary" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1030-1035">Source</a><h4 class="code-header">pub fn <a href="#method.binary" class="fn">binary</a><I: <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/traits/collect/trait.IntoIterator.html" title="trait core::iter::traits::collect::IntoIterator">IntoIterator</a><Item = <a class="primiti [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.binary" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1061-1066">Source</a><h4 class="code-header">pub fn <a href="#method.binary" class="fn">binary</a><I: <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/traits/collect/trait.IntoIterator.html" title="trait core::iter::traits::collect::IntoIterator">IntoIterator</a><Item = <a class="primiti [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::Datum;
<span class="kw">let </span>t = Datum::binary(<span class="macro">vec!</span>[<span class="number">1u8</span>, <span class="number">100u8</span>]);
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"0164"</span>);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.decimal_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1049-1055">Source</a><h4 class="code-header">pub fn <a href="#method.decimal_from_str" class="fn">decimal_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.ru [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.decimal_from_str" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1080-1086">Source</a><h4 class="code-header">pub fn <a href="#method.decimal_from_str" class="fn">decimal_from_str</a><S: <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.AsRef.html" title="trait core::convert::AsRef">AsRef</a><<a class="primitive" href="https://doc.ru [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::Datum;
@@ -251,7 +251,7 @@ Example:</p>
<span class="kw">let </span>t = Datum::decimal_from_str(<span class="string">"123.45"</span>).unwrap();
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"123.45"</span>);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.decimal" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1069-1082">Source</a><h4 class="code-header">pub fn <a href="#method.decimal" class="fn">decimal</a>(value: impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><Decimal>) -> <a class="type" href="../type.Result.html" tit [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.decimal" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1100-1113">Source</a><h4 class="code-header">pub fn <a href="#method.decimal" class="fn">decimal</a>(value: impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><Decimal>) -> <a class="type" href="../type.Result.html" tit [...]
<p>Example:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>iceberg::spec::Datum;
@@ -260,7 +260,7 @@ Example:</p>
<span class="kw">let </span>t = Datum::decimal(Decimal::new(<span class="number">123</span>, <span class="number">2</span>)).unwrap();
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"1.23"</span>);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.decimal_with_precision" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1096-1122">Source</a><h4 class="code-header">pub fn <a href="#method.decimal_with_precision" class="fn">decimal_with_precision</a>(
+</div></details><details class="toggle method-toggle" open><summary><section id="method.decimal_with_precision" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1127-1153">Source</a><h4 class="code-header">pub fn <a href="#method.decimal_with_precision" class="fn">decimal_with_precision</a>(
value: impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a><Decimal>,
precision: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u32</a>,
) -> <a class="type" href="../type.Result.html" title="type iceberg::Result">Result</a><Self></h4></section></summary><div class="docblock"><p>Try to create a decimal literal from [<code>Decimal</code>] with precision.</p>
@@ -272,18 +272,18 @@ Example:</p>
<span class="kw">let </span>t = Datum::decimal_with_precision(Decimal::new(<span class="number">123</span>, <span class="number">2</span>), <span class="number">30</span>).unwrap();
<span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{t}"</span>), <span class="string">"1.23"</span>);</code></pre></div>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.to" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1161-1217">Source</a><h4 class="code-header">pub fn <a href="#method.to" class="fn">to</a>(self, target_type: &<a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type</a>) -> <a class="type" href="../type.Result.html" title="type iceberg::Result">Result</a><<a class="struct" href="stru [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.literal" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1220-1222">Source</a><h4 class="code-header">pub fn <a href="#method.literal" class="fn">literal</a>(&self) -> &<a class="enum" href="enum.PrimitiveLiteral.html" title="enum iceberg::spec::PrimitiveLiteral">PrimitiveLiteral</a></h4></section></summary><div class="docblock"><p>Get the primitive liter [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.data_type" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1225-1227">Source</a><h4 class="code-header">pub fn <a href="#method.data_type" class="fn">data_type</a>(&self) -> &<a class="enum" href="enum.PrimitiveType.html" title="enum iceberg::spec::PrimitiveType">PrimitiveType</a></h4></section></summary><div class="docblock"><p>Get the primitive type fro [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.is_nan" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1231-1237">Source</a><h4 class="code-header">pub fn <a href="#method.is_nan" class="fn">is_nan</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Returns true if the Literal represents a primitive type
+</div></details><details class="toggle method-toggle" open><summary><section id="method.to" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1192-1248">Source</a><h4 class="code-header">pub fn <a href="#method.to" class="fn">to</a>(self, target_type: &<a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type</a>) -> <a class="type" href="../type.Result.html" title="type iceberg::Result">Result</a><<a class="struct" href="stru [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.literal" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1251-1253">Source</a><h4 class="code-header">pub fn <a href="#method.literal" class="fn">literal</a>(&self) -> &<a class="enum" href="enum.PrimitiveLiteral.html" title="enum iceberg::spec::PrimitiveLiteral">PrimitiveLiteral</a></h4></section></summary><div class="docblock"><p>Get the primitive liter [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.data_type" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1256-1258">Source</a><h4 class="code-header">pub fn <a href="#method.data_type" class="fn">data_type</a>(&self) -> &<a class="enum" href="enum.PrimitiveType.html" title="enum iceberg::spec::PrimitiveType">PrimitiveType</a></h4></section></summary><div class="docblock"><p>Get the primitive type fro [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.is_nan" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1262-1268">Source</a><h4 class="code-header">pub fn <a href="#method.is_nan" class="fn">is_nan</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Returns true if the Literal represents a primitive type
that can be a NaN, and that it’s value is NaN</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-Datum" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#106">Source</a><a href="#impl-Clone-for-Datum" class="anchor">§</a><h3 class="code-header">impl <a class="tra [...]
+</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-Datum" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#107">Source</a><a href="#impl-Clone-for-Datum" class="anchor">§</a><h3 class="code-header">impl <a class="tra [...]
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-PartialOrd-for-Datum" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#217-318">Source</a><a href="#impl-PartialOrd-for-Datum" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html" title="trait core::cmp::PartialO [...]
+ 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-PartialOrd-for-Datum" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#248-349">Source</a><a href="#impl-PartialOrd-for-Datum" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html" title="trait core::cmp::PartialO [...]
<code><=</code> operator. <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html#method.le">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.gt" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#1407">Source</a></span><a href="#method.gt" class="anchor">§</a><h4 clas [...]
operator. <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html#method.gt">Read more</a></div></details><details class="toggle method-toggle" open><summary><section id="method.ge" class="method trait-impl"><span class="rightside"><span class="since" title="Stable since Rust version 1.0.0">1.0.0</span> · <a class="src" href="https://doc.rust-lang.org/nightly/src/core/cmp.rs.html#1425">Source</a></span><a href="#method.ge" class="anchor">§</a><h4 class="code-header">fn [...]
-the <code>>=</code> operator. <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html#method.ge">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Serialize-for-Datum" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#112-135">Source</a><a href="#impl-Serialize-for-Datum" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://docs.rs/serde/1 [...]
+the <code>>=</code> operator. <a href="https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html#method.ge">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Serialize-for-Datum" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#113-136">Source</a><a href="#impl-Serialize-for-Datum" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://docs.rs/serde/1 [...]
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#139">Source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<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.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#211">Source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
T: ?<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.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#218">Source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/api/iceberg/spec/struct.Map.html b/api/iceberg/spec/struct.Map.html
index 25140efc..a2e637fe 100644
--- a/api/iceberg/spec/struct.Map.html
+++ b/api/iceberg/spec/struct.Map.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="Map is a collection of key-value pairs with a key type and a value type. It used in Literal::Map, to make it hashable, the order of key-value pairs is stored in a separate vector so that we can hash the map in a deterministic way. But it also means that the order of key-value pairs is ma [...]
+<!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="Map is a collection of key-value pairs with a key type and a value type. It used in Literal::Map, to make it hashable, the order of key-value pairs is stored in a separate vector so that we can hash the map in a deterministic way. But it also means that the order of key-value pairs is ma [...]
It used in Literal::Map, to make it hashable, the order of key-value pairs is stored in a separate vector
so that we can hash the map in a deterministic way. But it also means that the order of key-value pairs is matter
for the hash value.</p>
@@ -13,25 +13,25 @@ the default field name “key_value”.</p>
].into()),
false
);
-'''</code></pre></div></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-Map" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1266-1320">Source</a><a href="#impl-Map" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Map.html" ti [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.len" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1276-1278">Source</a><h4 class="code-header">pub fn <a href="#method.len" class="fn">len</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a></h4></section></summary><div class="docblock"><p>Return the number of key-value pairs in the map.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.is_empty" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1281-1283">Source</a><h4 class="code-header">pub fn <a href="#method.is_empty" class="fn">is_empty</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Returns true if the map contains no elements.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.insert" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1288-1297">Source</a><h4 class="code-header">pub fn <a href="#method.insert" class="fn">insert</a>(
+'''</code></pre></div></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-Map" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1297-1351">Source</a><a href="#impl-Map" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Map.html" ti [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.len" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1307-1309">Source</a><h4 class="code-header">pub fn <a href="#method.len" class="fn">len</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a></h4></section></summary><div class="docblock"><p>Return the number of key-value pairs in the map.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.is_empty" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1312-1314">Source</a><h4 class="code-header">pub fn <a href="#method.is_empty" class="fn">is_empty</a>(&self) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.bool.html">bool</a></h4></section></summary><div class="docblock"><p>Returns true if the map contains no elements.</p>
+</div></details><details class="toggle method-toggle" open><summary><section id="method.insert" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1319-1328">Source</a><h4 class="code-header">pub fn <a href="#method.insert" class="fn">insert</a>(
&mut self,
key: <a class="enum" href="enum.Literal.html" title="enum iceberg::spec::Literal">Literal</a>,
value: <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="enum" href="enum.Literal.html" title="enum iceberg::spec::Literal">Literal</a>>,
) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="enum" href="enum.Literal.html" title="enum iceberg::spec::Literal">Literal</a>>></h4></section></summary><div class="docblock"><p>Inserts a key-value pair into the map.
If the map did not have this key present, None is returned.
If the map did have this key present, the value is updated, and the old value is returned.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.get" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1301-1303">Source</a><h4 class="code-header">pub fn <a href="#method.get" class="fn">get</a>(&self, key: &<a class="enum" href="enum.Literal.html" title="enum iceberg::spec::Literal">Literal</a>) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::o [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.get" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1332-1334">Source</a><h4 class="code-header">pub fn <a href="#method.get" class="fn">get</a>(&self, key: &<a class="enum" href="enum.Literal.html" title="enum iceberg::spec::Literal">Literal</a>) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::o [...]
If the key is not present in the map, None is returned.</p>
-</div></details><details class="toggle method-toggle" open><summary><section id="method.has_same_content" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1306-1319">Source</a><h4 class="code-header">pub fn <a href="#method.has_same_content" class="fn">has_same_content</a>(&self, other: &<a class="struct" href="struct.Map.html" title="struct iceberg::spec::Map">Map</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primi [...]
-</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-Map" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1260">Source</a><a href="#impl-Clone-for-Map" class="anchor">§</a><h3 class="code-header">impl <a class="trait" [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.has_same_content" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1337-1350">Source</a><h4 class="code-header">pub fn <a href="#method.has_same_content" class="fn">has_same_content</a>(&self, other: &<a class="struct" href="struct.Map.html" title="struct iceberg::spec::Map">Map</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primi [...]
+</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-Map" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1291">Source</a><a href="#impl-Clone-for-Map" class="anchor">§</a><h3 class="code-header">impl <a class="trait" [...]
iter: T,
-) -> Self</h4></section></summary><div class='docblock'>Creates a value from an iterator. <a href="https://doc.rust-lang.org/nightly/core/iter/traits/collect/trait.FromIterator.html#tymethod.from_iter">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Hash-for-Map" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1328-1335">Source</a><a href="#impl-Hash-for-Map" class="anchor">§</a> [...]
+) -> Self</h4></section></summary><div class='docblock'>Creates a value from an iterator. <a href="https://doc.rust-lang.org/nightly/core/iter/traits/collect/trait.FromIterator.html#tymethod.from_iter">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Hash-for-Map" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1359-1366">Source</a><a href="#impl-Hash-for-Map" class="anchor">§</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 [...]
-and should not be overridden without very good reason.</div></details></div></details><section id="impl-Eq-for-Map" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1260">Source</a><a href="#impl-Eq-for-Map" 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.Map.html" title="struct iceberg::spec::Map">Map</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><section id="impl-Eq-for-Map" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1291">Source</a><a href="#impl-Eq-for-Map" 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.Map.html" title="struct iceberg::spec::Map">Map</a> [...]
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#139">Source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<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.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#211">Source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
T: ?<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.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#218">Source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/api/iceberg/spec/struct.RawLiteral.html b/api/iceberg/spec/struct.RawLiteral.html
index a04d0579..f5b5545a 100644
--- a/api/iceberg/spec/struct.RawLiteral.html
+++ b/api/iceberg/spec/struct.RawLiteral.html
@@ -1,8 +1,8 @@
-<!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="Raw literal representation used for serde. The serialize way is used for Avro serializer."><title>RawLiteral in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic- [...]
-</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-RawLiteral" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#2229-2239">Source</a><a href="#impl-RawLiteral" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.RawLiteral.html" title="struct i [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.try_into" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#2236-2238">Source</a><h4 class="code-header">pub fn <a href="#method.try_into" class="fn">try_into</a>(self, ty: &<a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type</a>) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::r [...]
-</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-Debug-for-RawLiteral" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#2224">Source</a><a href="#impl-Debug-for-RawLiteral" class="anchor">§</a><h3 class="code-header">impl <a [...]
- __D: <a class="trait" href="https://docs.rs/serde/1.0.217/serde/de/trait.Deserializer.html" title="trait serde::de::Deserializer">Deserializer</a><'de>,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde/1.0.217/serde/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Seria [...]
+<!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="Raw literal representation used for serde. The serialize way is used for Avro serializer."><title>RawLiteral in iceberg::spec - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic- [...]
+</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-RawLiteral" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#2260-2270">Source</a><a href="#impl-RawLiteral" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.RawLiteral.html" title="struct i [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.try_into" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#2267-2269">Source</a><h4 class="code-header">pub fn <a href="#method.try_into" class="fn">try_into</a>(self, ty: &<a class="enum" href="enum.Type.html" title="enum iceberg::spec::Type">Type</a>) -> <a class="enum" href="https://doc.rust-lang.org/nightly/core/result/enum.Result.html" title="enum core::r [...]
+</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-Debug-for-RawLiteral" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#2255">Source</a><a href="#impl-Debug-for-RawLiteral" class="anchor">§</a><h3 class="code-header">impl <a [...]
+ __D: <a class="trait" href="https://docs.rs/serde/1.0.217/serde/de/trait.Deserializer.html" title="trait serde::de::Deserializer">Deserializer</a><'de>,</div></h4></section></summary><div class='docblock'>Deserialize this value from the given Serde deserializer. <a href="https://docs.rs/serde/1.0.217/serde/de/trait.Deserialize.html#tymethod.deserialize">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Seria [...]
__S: <a class="trait" href="https://docs.rs/serde/1.0.217/serde/ser/trait.Serializer.html" title="trait serde::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/1.0.217/serde/ser/trait.Serialize.html#tymethod.serialize">Read more</a></div></details></div></details></div><h2 id="synthetic-implementations" class="section-header">Auto Trait Implementations<a href="#syn [...]
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#139">Source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<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.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#211">Source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
diff --git a/api/iceberg/spec/struct.Struct.html b/api/iceberg/spec/struct.Struct.html
index 4399547f..7bad3ec9 100644
--- a/api/iceberg/spec/struct.Struct.html
+++ b/api/iceberg/spec/struct.Struct.html
@@ -1,14 +1,14 @@
-<!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="The partition struct stores the tuple of partition values for each file. Its type is derived from the partition fields of the partition spec used to write the manifest file. In v2, the partition struct’s field ids must match the ids from the partition spec."><title>Struct in iceberg::spe [...]
+<!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="The partition struct stores the tuple of partition values for each file. Its type is derived from the partition fields of the partition spec used to write the manifest file. In v2, the partition struct’s field ids must match the ids from the partition spec."><title>Struct in iceberg::spe [...]
Its type is derived from the partition fields of the partition spec used to write the manifest file.
In v2, the partition struct’s field ids must match the ids from the partition spec.</p>
-</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-Struct" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1761-1781">Source</a><a href="#impl-Struct" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Struct.html" title="struct iceberg::spec [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.iter" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1768-1770">Source</a><h4 class="code-header">pub fn <a href="#method.iter" class="fn">iter</a>(&self) -> impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/traits/exact_size/trait.ExactSizeIterator.html" title="trait core::iter::traits::exact_size::ExactSizeIterator">ExactSizeIterator< [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.is_null_at_index" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1773-1775">Source</a><h4 class="code-header">pub fn <a href="#method.is_null_at_index" class="fn">is_null_at_index</a>(&self, index: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/ [...]
-</div></details><details class="toggle method-toggle" open><summary><section id="method.fields" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1778-1780">Source</a><h4 class="code-header">pub fn <a href="#method.fields" class="fn">fields</a>(&self) -> &[<a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="enum" href="enum.Literal.html" title="enum ice [...]
-</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-Struct" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1755">Source</a><a href="#impl-Clone-for-Struct" class="anchor">§</a><h3 class="code-header">impl <a class=" [...]
+</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-Struct" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1792-1812">Source</a><a href="#impl-Struct" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Struct.html" title="struct iceberg::spec [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.iter" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1799-1801">Source</a><h4 class="code-header">pub fn <a href="#method.iter" class="fn">iter</a>(&self) -> impl <a class="trait" href="https://doc.rust-lang.org/nightly/core/iter/traits/exact_size/trait.ExactSizeIterator.html" title="trait core::iter::traits::exact_size::ExactSizeIterator">ExactSizeIterator< [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.is_null_at_index" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1804-1806">Source</a><h4 class="code-header">pub fn <a href="#method.is_null_at_index" class="fn">is_null_at_index</a>(&self, index: <a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.usize.html">usize</a>) -> <a class="primitive" href="https://doc.rust-lang.org/nightly/ [...]
+</div></details><details class="toggle method-toggle" open><summary><section id="method.fields" class="method"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1809-1811">Source</a><h4 class="code-header">pub fn <a href="#method.fields" class="fn">fields</a>(&self) -> &[<a class="enum" href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="enum" href="enum.Literal.html" title="enum ice [...]
+</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-Struct" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1786">Source</a><a href="#impl-Clone-for-Struct" class="anchor">§</a><h3 class="code-header">impl <a class=" [...]
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><section id="impl-Eq-for-Struct" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1755">Source</a><a href="#impl-Eq-for-Struct" 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.Struct.html" title="struct iceberg::spec::Str [...]
+ 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><section id="impl-Eq-for-Struct" class="impl"><a class="src rightside" href="../../src/iceberg/spec/values.rs.html#1786">Source</a><a href="#impl-Eq-for-Struct" 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.Struct.html" title="struct iceberg::spec::Str [...]
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#139">Source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href [...]
T: ?<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.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#211">Source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https:/ [...]
T: ?<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.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#218">Source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href= [...]
diff --git a/api/src/iceberg/spec/values.rs.html b/api/src/iceberg/spec/values.rs.html
index 1caa1a9c..3f60686e 100644
--- a/api/src/iceberg/spec/values.rs.html
+++ b/api/src/iceberg/spec/values.rs.html
@@ -20,3829 +20,3927 @@
<a href=#20 id=20 data-nosnippet>20</a> */
<a href=#21 id=21 data-nosnippet>21</a>
<a href=#22 id=22 data-nosnippet>22</a></span><span class="kw">use </span>std::any::Any;
-<a href=#23 id=23 data-nosnippet>23</a><span class="kw">use </span>std::collections::HashMap;
-<a href=#24 id=24 data-nosnippet>24</a><span class="kw">use </span>std::fmt::{Display, Formatter};
-<a href=#25 id=25 data-nosnippet>25</a><span class="kw">use </span>std::hash::Hash;
-<a href=#26 id=26 data-nosnippet>26</a><span class="kw">use </span>std::ops::Index;
-<a href=#27 id=27 data-nosnippet>27</a><span class="kw">use </span>std::str::FromStr;
-<a href=#28 id=28 data-nosnippet>28</a>
-<a href=#29 id=29 data-nosnippet>29</a><span class="kw">pub use </span>_serde::RawLiteral;
-<a href=#30 id=30 data-nosnippet>30</a><span class="kw">use </span>chrono::{DateTime, NaiveDate, NaiveDateTime, NaiveTime, TimeZone, Utc};
-<a href=#31 id=31 data-nosnippet>31</a><span class="kw">use </span>num_bigint::BigInt;
-<a href=#32 id=32 data-nosnippet>32</a><span class="kw">use </span>ordered_float::OrderedFloat;
-<a href=#33 id=33 data-nosnippet>33</a><span class="kw">use </span>rust_decimal::Decimal;
-<a href=#34 id=34 data-nosnippet>34</a><span class="kw">use </span>rust_decimal::prelude::ToPrimitive;
-<a href=#35 id=35 data-nosnippet>35</a><span class="kw">use </span>serde::de::{
-<a href=#36 id=36 data-nosnippet>36</a> MapAccess, {<span class="self">self</span>},
-<a href=#37 id=37 data-nosnippet>37</a>};
-<a href=#38 id=38 data-nosnippet>38</a><span class="kw">use </span>serde::ser::SerializeStruct;
-<a href=#39 id=39 data-nosnippet>39</a><span class="kw">use </span>serde::{Deserialize, Serialize};
-<a href=#40 id=40 data-nosnippet>40</a><span class="kw">use </span>serde_bytes::ByteBuf;
-<a href=#41 id=41 data-nosnippet>41</a><span class="kw">use </span>serde_json::{Map <span class="kw">as </span>JsonMap, Number, Value <span class="kw">as </span>JsonValue};
-<a href=#42 id=42 data-nosnippet>42</a><span class="kw">use </span>timestamp::nanoseconds_to_datetime;
-<a href=#43 id=43 data-nosnippet>43</a><span class="kw">use </span>uuid::Uuid;
-<a href=#44 id=44 data-nosnippet>44</a>
-<a href=#45 id=45 data-nosnippet>45</a><span class="kw">use </span><span class="kw">super</span>::datatypes::{PrimitiveType, Type};
-<a href=#46 id=46 data-nosnippet>46</a><span class="kw">use </span><span class="kw">crate</span>::error::Result;
-<a href=#47 id=47 data-nosnippet>47</a><span class="kw">use </span><span class="kw">crate</span>::spec::MAX_DECIMAL_PRECISION;
-<a href=#48 id=48 data-nosnippet>48</a><span class="kw">use </span><span class="kw">crate</span>::spec::values::date::{date_from_naive_date, days_to_date, unix_epoch};
-<a href=#49 id=49 data-nosnippet>49</a><span class="kw">use </span><span class="kw">crate</span>::spec::values::time::microseconds_to_time;
-<a href=#50 id=50 data-nosnippet>50</a><span class="kw">use </span><span class="kw">crate</span>::spec::values::timestamp::microseconds_to_datetime;
-<a href=#51 id=51 data-nosnippet>51</a><span class="kw">use </span><span class="kw">crate</span>::spec::values::timestamptz::{microseconds_to_datetimetz, nanoseconds_to_datetimetz};
-<a href=#52 id=52 data-nosnippet>52</a><span class="kw">use crate</span>::{Error, ErrorKind, ensure_data_valid};
-<a href=#53 id=53 data-nosnippet>53</a>
-<a href=#54 id=54 data-nosnippet>54</a><span class="doccomment">/// Maximum value for [`PrimitiveType::Time`] type in microseconds, e.g. 23 hours 59 minutes 59 seconds 999999 microseconds.
-<a href=#55 id=55 data-nosnippet>55</a></span><span class="kw">const </span>MAX_TIME_VALUE: i64 = <span class="number">24 </span>* <span class="number">60 </span>* <span class="number">60 </span>* <span class="number">1_000_000i64 </span>- <span class="number">1</span>;
-<a href=#56 id=56 data-nosnippet>56</a>
-<a href=#57 id=57 data-nosnippet>57</a><span class="kw">const </span>INT_MAX: i32 = <span class="number">2147483647</span>;
-<a href=#58 id=58 data-nosnippet>58</a><span class="kw">const </span>INT_MIN: i32 = -<span class="number">2147483648</span>;
-<a href=#59 id=59 data-nosnippet>59</a><span class="kw">const </span>LONG_MAX: i64 = <span class="number">9223372036854775807</span>;
-<a href=#60 id=60 data-nosnippet>60</a><span class="kw">const </span>LONG_MIN: i64 = -<span class="number">9223372036854775808</span>;
-<a href=#61 id=61 data-nosnippet>61</a>
-<a href=#62 id=62 data-nosnippet>62</a><span class="doccomment">/// Values present in iceberg type
-<a href=#63 id=63 data-nosnippet>63</a></span><span class="attr">#[derive(Clone, Debug, PartialOrd, PartialEq, Hash, Eq)]
-<a href=#64 id=64 data-nosnippet>64</a></span><span class="kw">pub enum </span>PrimitiveLiteral {
-<a href=#65 id=65 data-nosnippet>65</a> <span class="doccomment">/// 0x00 for false, non-zero byte for true
-<a href=#66 id=66 data-nosnippet>66</a> </span>Boolean(bool),
-<a href=#67 id=67 data-nosnippet>67</a> <span class="doccomment">/// Stored as 4-byte little-endian
-<a href=#68 id=68 data-nosnippet>68</a> </span>Int(i32),
-<a href=#69 id=69 data-nosnippet>69</a> <span class="doccomment">/// Stored as 8-byte little-endian
-<a href=#70 id=70 data-nosnippet>70</a> </span>Long(i64),
-<a href=#71 id=71 data-nosnippet>71</a> <span class="doccomment">/// Stored as 4-byte little-endian
-<a href=#72 id=72 data-nosnippet>72</a> </span>Float(OrderedFloat<f32>),
-<a href=#73 id=73 data-nosnippet>73</a> <span class="doccomment">/// Stored as 8-byte little-endian
-<a href=#74 id=74 data-nosnippet>74</a> </span>Double(OrderedFloat<f64>),
-<a href=#75 id=75 data-nosnippet>75</a> <span class="doccomment">/// UTF-8 bytes (without length)
-<a href=#76 id=76 data-nosnippet>76</a> </span>String(String),
-<a href=#77 id=77 data-nosnippet>77</a> <span class="doccomment">/// Binary value (without length)
-<a href=#78 id=78 data-nosnippet>78</a> </span>Binary(Vec<u8>),
-<a href=#79 id=79 data-nosnippet>79</a> <span class="doccomment">/// Stored as 16-byte little-endian
-<a href=#80 id=80 data-nosnippet>80</a> </span>Int128(i128),
-<a href=#81 id=81 data-nosnippet>81</a> <span class="doccomment">/// Stored as 16-byte little-endian
-<a href=#82 id=82 data-nosnippet>82</a> </span>UInt128(u128),
-<a href=#83 id=83 data-nosnippet>83</a> <span class="doccomment">/// When a number is larger than it can hold
-<a href=#84 id=84 data-nosnippet>84</a> </span>AboveMax,
-<a href=#85 id=85 data-nosnippet>85</a> <span class="doccomment">/// When a number is smaller than it can hold
-<a href=#86 id=86 data-nosnippet>86</a> </span>BelowMin,
-<a href=#87 id=87 data-nosnippet>87</a>}
-<a href=#88 id=88 data-nosnippet>88</a>
-<a href=#89 id=89 data-nosnippet>89</a><span class="kw">impl </span>PrimitiveLiteral {
-<a href=#90 id=90 data-nosnippet>90</a> <span class="doccomment">/// Returns true if the Literal represents a primitive type
-<a href=#91 id=91 data-nosnippet>91</a> /// that can be a NaN, and that it's value is NaN
-<a href=#92 id=92 data-nosnippet>92</a> </span><span class="kw">pub fn </span>is_nan(<span class="kw-2">&</span><span class="self">self</span>) -> bool {
-<a href=#93 id=93 data-nosnippet>93</a> <span class="kw">match </span><span class="self">self </span>{
-<a href=#94 id=94 data-nosnippet>94</a> PrimitiveLiteral::Double(val) => val.is_nan(),
-<a href=#95 id=95 data-nosnippet>95</a> PrimitiveLiteral::Float(val) => val.is_nan(),
-<a href=#96 id=96 data-nosnippet>96</a> <span class="kw">_ </span>=> <span class="bool-val">false</span>,
-<a href=#97 id=97 data-nosnippet>97</a> }
-<a href=#98 id=98 data-nosnippet>98</a> }
-<a href=#99 id=99 data-nosnippet>99</a>}
-<a href=#100 id=100 data-nosnippet>100</a>
-<a href=#101 id=101 data-nosnippet>101</a><span class="doccomment">/// Literal associated with its type. The value and type pair is checked when construction, so the type and value is
-<a href=#102 id=102 data-nosnippet>102</a>/// guaranteed to be correct when used.
-<a href=#103 id=103 data-nosnippet>103</a>///
-<a href=#104 id=104 data-nosnippet>104</a>/// By default, we decouple the type and value of a literal, so we can use avoid the cost of storing extra type info
-<a href=#105 id=105 data-nosnippet>105</a>/// for each literal. But associate type with literal can be useful in some cases, for example, in unbound expression.
-<a href=#106 id=106 data-nosnippet>106</a></span><span class="attr">#[derive(Clone, Debug, PartialEq, Hash, Eq)]
-<a href=#107 id=107 data-nosnippet>107</a></span><span class="kw">pub struct </span>Datum {
-<a href=#108 id=108 data-nosnippet>108</a> r#type: PrimitiveType,
-<a href=#109 id=109 data-nosnippet>109</a> literal: PrimitiveLiteral,
-<a href=#110 id=110 data-nosnippet>110</a>}
-<a href=#111 id=111 data-nosnippet>111</a>
-<a href=#112 id=112 data-nosnippet>112</a><span class="kw">impl </span>Serialize <span class="kw">for </span>Datum {
-<a href=#113 id=113 data-nosnippet>113</a> <span class="kw">fn </span>serialize<S: serde::Serializer>(
-<a href=#114 id=114 data-nosnippet>114</a> <span class="kw-2">&</span><span class="self">self</span>,
-<a href=#115 id=115 data-nosnippet>115</a> serializer: S,
-<a href=#116 id=116 data-nosnippet>116</a> ) -> std::result::Result<S::Ok, S::Error> {
-<a href=#117 id=117 data-nosnippet>117</a> <span class="kw">let </span><span class="kw-2">mut </span>struct_ser = serializer
-<a href=#118 id=118 data-nosnippet>118</a> .serialize_struct(<span class="string">"Datum"</span>, <span class="number">2</span>)
-<a href=#119 id=119 data-nosnippet>119</a> .map_err(serde::ser::Error::custom)<span class="question-mark">?</span>;
-<a href=#120 id=120 data-nosnippet>120</a> struct_ser
-<a href=#121 id=121 data-nosnippet>121</a> .serialize_field(<span class="string">"type"</span>, <span class="kw-2">&</span><span class="self">self</span>.r#type)
-<a href=#122 id=122 data-nosnippet>122</a> .map_err(serde::ser::Error::custom)<span class="question-mark">?</span>;
-<a href=#123 id=123 data-nosnippet>123</a> struct_ser
-<a href=#124 id=124 data-nosnippet>124</a> .serialize_field(
-<a href=#125 id=125 data-nosnippet>125</a> <span class="string">"literal"</span>,
-<a href=#126 id=126 data-nosnippet>126</a> <span class="kw-2">&</span>RawLiteral::try_from(
-<a href=#127 id=127 data-nosnippet>127</a> Literal::Primitive(<span class="self">self</span>.literal.clone()),
-<a href=#128 id=128 data-nosnippet>128</a> <span class="kw-2">&</span>Type::Primitive(<span class="self">self</span>.r#type.clone()),
-<a href=#129 id=129 data-nosnippet>129</a> )
-<a href=#130 id=130 data-nosnippet>130</a> .map_err(serde::ser::Error::custom)<span class="question-mark">?</span>,
-<a href=#131 id=131 data-nosnippet>131</a> )
-<a href=#132 id=132 data-nosnippet>132</a> .map_err(serde::ser::Error::custom)<span class="question-mark">?</span>;
-<a href=#133 id=133 data-nosnippet>133</a> struct_ser.end()
-<a href=#134 id=134 data-nosnippet>134</a> }
-<a href=#135 id=135 data-nosnippet>135</a>}
-<a href=#136 id=136 data-nosnippet>136</a>
-<a href=#137 id=137 data-nosnippet>137</a><span class="kw">impl</span><<span class="lifetime">'de</span>> Deserialize<<span class="lifetime">'de</span>> <span class="kw">for </span>Datum {
-<a href=#138 id=138 data-nosnippet>138</a> <span class="kw">fn </span>deserialize<D: serde::Deserializer<<span class="lifetime">'de</span>>>(
-<a href=#139 id=139 data-nosnippet>139</a> deserializer: D,
-<a href=#140 id=140 data-nosnippet>140</a> ) -> std::result::Result<<span class="self">Self</span>, D::Error> {
-<a href=#141 id=141 data-nosnippet>141</a> <span class="attr">#[derive(Deserialize)]
-<a href=#142 id=142 data-nosnippet>142</a> #[serde(field_identifier, rename_all = <span class="string">"lowercase"</span>)]
-<a href=#143 id=143 data-nosnippet>143</a> </span><span class="kw">enum </span>Field {
-<a href=#144 id=144 data-nosnippet>144</a> Type,
-<a href=#145 id=145 data-nosnippet>145</a> Literal,
-<a href=#146 id=146 data-nosnippet>146</a> }
-<a href=#147 id=147 data-nosnippet>147</a>
-<a href=#148 id=148 data-nosnippet>148</a> <span class="kw">struct </span>DatumVisitor;
-<a href=#149 id=149 data-nosnippet>149</a>
-<a href=#150 id=150 data-nosnippet>150</a> <span class="kw">impl</span><<span class="lifetime">'de</span>> serde::de::Visitor<<span class="lifetime">'de</span>> <span class="kw">for </span>DatumVisitor {
-<a href=#151 id=151 data-nosnippet>151</a> <span class="kw">type </span>Value = Datum;
-<a href=#152 id=152 data-nosnippet>152</a>
-<a href=#153 id=153 data-nosnippet>153</a> <span class="kw">fn </span>expecting(<span class="kw-2">&</span><span class="self">self</span>, formatter: <span class="kw-2">&mut </span>std::fmt::Formatter) -> std::fmt::Result {
-<a href=#154 id=154 data-nosnippet>154</a> formatter.write_str(<span class="string">"struct Datum"</span>)
-<a href=#155 id=155 data-nosnippet>155</a> }
-<a href=#156 id=156 data-nosnippet>156</a>
-<a href=#157 id=157 data-nosnippet>157</a> <span class="kw">fn </span>visit_seq<A>(<span class="self">self</span>, <span class="kw-2">mut </span>seq: A) -> std::result::Result<<span class="self">Self</span>::Value, A::Error>
-<a href=#158 id=158 data-nosnippet>158</a> <span class="kw">where </span>A: serde::de::SeqAccess<<span class="lifetime">'de</span>> {
-<a href=#159 id=159 data-nosnippet>159</a> <span class="kw">let </span>r#type = seq
-<a href=#160 id=160 data-nosnippet>160</a> .next_element::<PrimitiveType>()<span class="question-mark">?
-<a href=#161 id=161 data-nosnippet>161</a> </span>.ok_or_else(|| serde::de::Error::invalid_length(<span class="number">0</span>, <span class="kw-2">&</span><span class="self">self</span>))<span class="question-mark">?</span>;
-<a href=#162 id=162 data-nosnippet>162</a> <span class="kw">let </span>value = seq
-<a href=#163 id=163 data-nosnippet>163</a> .next_element::<RawLiteral>()<span class="question-mark">?
-<a href=#164 id=164 data-nosnippet>164</a> </span>.ok_or_else(|| serde::de::Error::invalid_length(<span class="number">1</span>, <span class="kw-2">&</span><span class="self">self</span>))<span class="question-mark">?</span>;
-<a href=#165 id=165 data-nosnippet>165</a> <span class="kw">let </span>Literal::Primitive(primitive) = value
-<a href=#166 id=166 data-nosnippet>166</a> .try_into(<span class="kw-2">&</span>Type::Primitive(r#type.clone()))
-<a href=#167 id=167 data-nosnippet>167</a> .map_err(serde::de::Error::custom)<span class="question-mark">?
-<a href=#168 id=168 data-nosnippet>168</a> </span>.ok_or_else(|| serde::de::Error::custom(<span class="string">"None value"</span>))<span class="question-mark">?
-<a href=#169 id=169 data-nosnippet>169</a> </span><span class="kw">else </span>{
-<a href=#170 id=170 data-nosnippet>170</a> <span class="kw">return </span><span class="prelude-val">Err</span>(serde::de::Error::custom(<span class="string">"Invalid value"</span>));
-<a href=#171 id=171 data-nosnippet>171</a> };
-<a href=#172 id=172 data-nosnippet>172</a>
-<a href=#173 id=173 data-nosnippet>173</a> <span class="prelude-val">Ok</span>(Datum::new(r#type, primitive))
-<a href=#174 id=174 data-nosnippet>174</a> }
-<a href=#175 id=175 data-nosnippet>175</a>
-<a href=#176 id=176 data-nosnippet>176</a> <span class="kw">fn </span>visit_map<V>(<span class="self">self</span>, <span class="kw-2">mut </span>map: V) -> std::result::Result<Datum, V::Error>
-<a href=#177 id=177 data-nosnippet>177</a> <span class="kw">where </span>V: MapAccess<<span class="lifetime">'de</span>> {
-<a href=#178 id=178 data-nosnippet>178</a> <span class="kw">let </span><span class="kw-2">mut </span>raw_primitive: <span class="prelude-ty">Option</span><RawLiteral> = <span class="prelude-val">None</span>;
-<a href=#179 id=179 data-nosnippet>179</a> <span class="kw">let </span><span class="kw-2">mut </span>r#type: <span class="prelude-ty">Option</span><PrimitiveType> = <span class="prelude-val">None</span>;
-<a href=#180 id=180 data-nosnippet>180</a> <span class="kw">while let </span><span class="prelude-val">Some</span>(key) = map.next_key()<span class="question-mark">? </span>{
-<a href=#181 id=181 data-nosnippet>181</a> <span class="kw">match </span>key {
-<a href=#182 id=182 data-nosnippet>182</a> Field::Type => {
-<a href=#183 id=183 data-nosnippet>183</a> <span class="kw">if </span>r#type.is_some() {
-<a href=#184 id=184 data-nosnippet>184</a> <span class="kw">return </span><span class="prelude-val">Err</span>(de::Error::duplicate_field(<span class="string">"type"</span>));
-<a href=#185 id=185 data-nosnippet>185</a> }
-<a href=#186 id=186 data-nosnippet>186</a> r#type = <span class="prelude-val">Some</span>(map.next_value()<span class="question-mark">?</span>);
-<a href=#187 id=187 data-nosnippet>187</a> }
-<a href=#188 id=188 data-nosnippet>188</a> Field::Literal => {
-<a href=#189 id=189 data-nosnippet>189</a> <span class="kw">if </span>raw_primitive.is_some() {
-<a href=#190 id=190 data-nosnippet>190</a> <span class="kw">return </span><span class="prelude-val">Err</span>(de::Error::duplicate_field(<span class="string">"literal"</span>));
-<a href=#191 id=191 data-nosnippet>191</a> }
-<a href=#192 id=192 data-nosnippet>192</a> raw_primitive = <span class="prelude-val">Some</span>(map.next_value()<span class="question-mark">?</span>);
-<a href=#193 id=193 data-nosnippet>193</a> }
-<a href=#194 id=194 data-nosnippet>194</a> }
-<a href=#195 id=195 data-nosnippet>195</a> }
-<a href=#196 id=196 data-nosnippet>196</a> <span class="kw">let </span><span class="prelude-val">Some</span>(r#type) = r#type <span class="kw">else </span>{
-<a href=#197 id=197 data-nosnippet>197</a> <span class="kw">return </span><span class="prelude-val">Err</span>(serde::de::Error::missing_field(<span class="string">"type"</span>));
-<a href=#198 id=198 data-nosnippet>198</a> };
-<a href=#199 id=199 data-nosnippet>199</a> <span class="kw">let </span><span class="prelude-val">Some</span>(raw_primitive) = raw_primitive <span class="kw">else </span>{
-<a href=#200 id=200 data-nosnippet>200</a> <span class="kw">return </span><span class="prelude-val">Err</span>(serde::de::Error::missing_field(<span class="string">"literal"</span>));
-<a href=#201 id=201 data-nosnippet>201</a> };
-<a href=#202 id=202 data-nosnippet>202</a> <span class="kw">let </span>Literal::Primitive(primitive) = raw_primitive
-<a href=#203 id=203 data-nosnippet>203</a> .try_into(<span class="kw-2">&</span>Type::Primitive(r#type.clone()))
-<a href=#204 id=204 data-nosnippet>204</a> .map_err(serde::de::Error::custom)<span class="question-mark">?
-<a href=#205 id=205 data-nosnippet>205</a> </span>.ok_or_else(|| serde::de::Error::custom(<span class="string">"None value"</span>))<span class="question-mark">?
-<a href=#206 id=206 data-nosnippet>206</a> </span><span class="kw">else </span>{
-<a href=#207 id=207 data-nosnippet>207</a> <span class="kw">return </span><span class="prelude-val">Err</span>(serde::de::Error::custom(<span class="string">"Invalid value"</span>));
-<a href=#208 id=208 data-nosnippet>208</a> };
-<a href=#209 id=209 data-nosnippet>209</a> <span class="prelude-val">Ok</span>(Datum::new(r#type, primitive))
-<a href=#210 id=210 data-nosnippet>210</a> }
-<a href=#211 id=211 data-nosnippet>211</a> }
-<a href=#212 id=212 data-nosnippet>212</a> <span class="kw">const </span>FIELDS: <span class="kw-2">&</span>[<span class="kw-2">&</span>str] = <span class="kw-2">&</span>[<span class="string">"type"</span>, <span class="string">"literal"</span>];
-<a href=#213 id=213 data-nosnippet>213</a> deserializer.deserialize_struct(<span class="string">"Datum"</span>, FIELDS, DatumVisitor)
-<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>
-<a href=#217 id=217 data-nosnippet>217</a><span class="kw">impl </span>PartialOrd <span class="kw">for </span>Datum {
-<a href=#218 id=218 data-nosnippet>218</a> <span class="kw">fn </span>partial_cmp(<span class="kw-2">&</span><span class="self">self</span>, other: <span class="kw-2">&</span><span class="self">Self</span>) -> <span class="prelude-ty">Option</span><std::cmp::Ordering> {
-<a href=#219 id=219 data-nosnippet>219</a> <span class="kw">match </span>(<span class="kw-2">&</span><span class="self">self</span>.literal, <span class="kw-2">&</span>other.literal, <span class="kw-2">&</span><span class="self">self</span>.r#type, <span class="kw-2">&</span>other.r#type) {
-<a href=#220 id=220 data-nosnippet>220</a> <span class="comment">// generate the arm with same type and same literal
-<a href=#221 id=221 data-nosnippet>221</a> </span>(
-<a href=#222 id=222 data-nosnippet>222</a> PrimitiveLiteral::Boolean(val),
-<a href=#223 id=223 data-nosnippet>223</a> PrimitiveLiteral::Boolean(other_val),
-<a href=#224 id=224 data-nosnippet>224</a> PrimitiveType::Boolean,
-<a href=#225 id=225 data-nosnippet>225</a> PrimitiveType::Boolean,
-<a href=#226 id=226 data-nosnippet>226</a> ) => val.partial_cmp(other_val),
-<a href=#227 id=227 data-nosnippet>227</a> (
-<a href=#228 id=228 data-nosnippet>228</a> PrimitiveLiteral::Int(val),
-<a href=#229 id=229 data-nosnippet>229</a> PrimitiveLiteral::Int(other_val),
-<a href=#230 id=230 data-nosnippet>230</a> PrimitiveType::Int,
-<a href=#231 id=231 data-nosnippet>231</a> PrimitiveType::Int,
-<a href=#232 id=232 data-nosnippet>232</a> ) => val.partial_cmp(other_val),
-<a href=#233 id=233 data-nosnippet>233</a> (
-<a href=#234 id=234 data-nosnippet>234</a> PrimitiveLiteral::Long(val),
-<a href=#235 id=235 data-nosnippet>235</a> PrimitiveLiteral::Long(other_val),
-<a href=#236 id=236 data-nosnippet>236</a> PrimitiveType::Long,
-<a href=#237 id=237 data-nosnippet>237</a> PrimitiveType::Long,
-<a href=#238 id=238 data-nosnippet>238</a> ) => val.partial_cmp(other_val),
-<a href=#239 id=239 data-nosnippet>239</a> (
-<a href=#240 id=240 data-nosnippet>240</a> PrimitiveLiteral::Float(val),
-<a href=#241 id=241 data-nosnippet>241</a> PrimitiveLiteral::Float(other_val),
-<a href=#242 id=242 data-nosnippet>242</a> PrimitiveType::Float,
-<a href=#243 id=243 data-nosnippet>243</a> PrimitiveType::Float,
-<a href=#244 id=244 data-nosnippet>244</a> ) => val.partial_cmp(other_val),
-<a href=#245 id=245 data-nosnippet>245</a> (
-<a href=#246 id=246 data-nosnippet>246</a> PrimitiveLiteral::Double(val),
-<a href=#247 id=247 data-nosnippet>247</a> PrimitiveLiteral::Double(other_val),
-<a href=#248 id=248 data-nosnippet>248</a> PrimitiveType::Double,
-<a href=#249 id=249 data-nosnippet>249</a> PrimitiveType::Double,
-<a href=#250 id=250 data-nosnippet>250</a> ) => val.partial_cmp(other_val),
-<a href=#251 id=251 data-nosnippet>251</a> (
-<a href=#252 id=252 data-nosnippet>252</a> PrimitiveLiteral::Int(val),
-<a href=#253 id=253 data-nosnippet>253</a> PrimitiveLiteral::Int(other_val),
-<a href=#254 id=254 data-nosnippet>254</a> PrimitiveType::Date,
-<a href=#255 id=255 data-nosnippet>255</a> PrimitiveType::Date,
-<a href=#256 id=256 data-nosnippet>256</a> ) => val.partial_cmp(other_val),
-<a href=#257 id=257 data-nosnippet>257</a> (
-<a href=#258 id=258 data-nosnippet>258</a> PrimitiveLiteral::Long(val),
-<a href=#259 id=259 data-nosnippet>259</a> PrimitiveLiteral::Long(other_val),
-<a href=#260 id=260 data-nosnippet>260</a> PrimitiveType::Time,
-<a href=#261 id=261 data-nosnippet>261</a> PrimitiveType::Time,
-<a href=#262 id=262 data-nosnippet>262</a> ) => val.partial_cmp(other_val),
-<a href=#263 id=263 data-nosnippet>263</a> (
-<a href=#264 id=264 data-nosnippet>264</a> PrimitiveLiteral::Long(val),
-<a href=#265 id=265 data-nosnippet>265</a> PrimitiveLiteral::Long(other_val),
-<a href=#266 id=266 data-nosnippet>266</a> PrimitiveType::Timestamp,
-<a href=#267 id=267 data-nosnippet>267</a> PrimitiveType::Timestamp,
-<a href=#268 id=268 data-nosnippet>268</a> ) => val.partial_cmp(other_val),
-<a href=#269 id=269 data-nosnippet>269</a> (
-<a href=#270 id=270 data-nosnippet>270</a> PrimitiveLiteral::Long(val),
-<a href=#271 id=271 data-nosnippet>271</a> PrimitiveLiteral::Long(other_val),
-<a href=#272 id=272 data-nosnippet>272</a> PrimitiveType::Timestamptz,
-<a href=#273 id=273 data-nosnippet>273</a> PrimitiveType::Timestamptz,
-<a href=#274 id=274 data-nosnippet>274</a> ) => val.partial_cmp(other_val),
-<a href=#275 id=275 data-nosnippet>275</a> (
-<a href=#276 id=276 data-nosnippet>276</a> PrimitiveLiteral::String(val),
-<a href=#277 id=277 data-nosnippet>277</a> PrimitiveLiteral::String(other_val),
-<a href=#278 id=278 data-nosnippet>278</a> PrimitiveType::String,
-<a href=#279 id=279 data-nosnippet>279</a> PrimitiveType::String,
-<a href=#280 id=280 data-nosnippet>280</a> ) => val.partial_cmp(other_val),
-<a href=#281 id=281 data-nosnippet>281</a> (
-<a href=#282 id=282 data-nosnippet>282</a> PrimitiveLiteral::UInt128(val),
-<a href=#283 id=283 data-nosnippet>283</a> PrimitiveLiteral::UInt128(other_val),
-<a href=#284 id=284 data-nosnippet>284</a> PrimitiveType::Uuid,
-<a href=#285 id=285 data-nosnippet>285</a> PrimitiveType::Uuid,
-<a href=#286 id=286 data-nosnippet>286</a> ) => Uuid::from_u128(<span class="kw-2">*</span>val).partial_cmp(<span class="kw-2">&</span>Uuid::from_u128(<span class="kw-2">*</span>other_val)),
-<a href=#287 id=287 data-nosnippet>287</a> (
-<a href=#288 id=288 data-nosnippet>288</a> PrimitiveLiteral::Binary(val),
-<a href=#289 id=289 data-nosnippet>289</a> PrimitiveLiteral::Binary(other_val),
-<a href=#290 id=290 data-nosnippet>290</a> PrimitiveType::Fixed(<span class="kw">_</span>),
-<a href=#291 id=291 data-nosnippet>291</a> PrimitiveType::Fixed(<span class="kw">_</span>),
-<a href=#292 id=292 data-nosnippet>292</a> ) => val.partial_cmp(other_val),
-<a href=#293 id=293 data-nosnippet>293</a> (
-<a href=#294 id=294 data-nosnippet>294</a> PrimitiveLiteral::Binary(val),
-<a href=#295 id=295 data-nosnippet>295</a> PrimitiveLiteral::Binary(other_val),
-<a href=#296 id=296 data-nosnippet>296</a> PrimitiveType::Binary,
-<a href=#297 id=297 data-nosnippet>297</a> PrimitiveType::Binary,
-<a href=#298 id=298 data-nosnippet>298</a> ) => val.partial_cmp(other_val),
-<a href=#299 id=299 data-nosnippet>299</a> (
-<a href=#300 id=300 data-nosnippet>300</a> PrimitiveLiteral::Int128(val),
-<a href=#301 id=301 data-nosnippet>301</a> PrimitiveLiteral::Int128(other_val),
-<a href=#302 id=302 data-nosnippet>302</a> PrimitiveType::Decimal {
-<a href=#303 id=303 data-nosnippet>303</a> precision: <span class="kw">_</span>,
-<a href=#304 id=304 data-nosnippet>304</a> scale,
-<a href=#305 id=305 data-nosnippet>305</a> },
-<a href=#306 id=306 data-nosnippet>306</a> PrimitiveType::Decimal {
-<a href=#307 id=307 data-nosnippet>307</a> precision: <span class="kw">_</span>,
-<a href=#308 id=308 data-nosnippet>308</a> scale: other_scale,
-<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">let </span>val = Decimal::from_i128_with_scale(<span class="kw-2">*</span>val, <span class="kw-2">*</span>scale);
-<a href=#312 id=312 data-nosnippet>312</a> <span class="kw">let </span>other_val = Decimal::from_i128_with_scale(<span class="kw-2">*</span>other_val, <span class="kw-2">*</span>other_scale);
-<a href=#313 id=313 data-nosnippet>313</a> val.partial_cmp(<span class="kw-2">&</span>other_val)
-<a href=#314 id=314 data-nosnippet>314</a> }
-<a href=#315 id=315 data-nosnippet>315</a> <span class="kw">_ </span>=> <span class="prelude-val">None</span>,
-<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>
-<a href=#320 id=320 data-nosnippet>320</a><span class="kw">impl </span>Display <span class="kw">for </span>Datum {
-<a href=#321 id=321 data-nosnippet>321</a> <span class="kw">fn </span>fmt(<span class="kw-2">&</span><span class="self">self</span>, f: <span class="kw-2">&mut </span>Formatter<<span class="lifetime">'_</span>>) -> std::fmt::Result {
-<a href=#322 id=322 data-nosnippet>322</a> <span class="kw">match </span>(<span class="kw-2">&</span><span class="self">self</span>.r#type, <span class="kw-2">&</span><span class="self">self</span>.literal) {
-<a href=#323 id=323 data-nosnippet>323</a> (<span class="kw">_</span>, PrimitiveLiteral::Boolean(val)) => <span class="macro">write!</span>(f, <span class="string">"{}"</span>, val),
-<a href=#324 id=324 data-nosnippet>324</a> (PrimitiveType::Int, PrimitiveLiteral::Int(val)) => <span class="macro">write!</span>(f, <span class="string">"{}"</span>, val),
-<a href=#325 id=325 data-nosnippet>325</a> (PrimitiveType::Long, PrimitiveLiteral::Long(val)) => <span class="macro">write!</span>(f, <span class="string">"{}"</span>, val),
-<a href=#326 id=326 data-nosnippet>326</a> (<span class="kw">_</span>, PrimitiveLiteral::Float(val)) => <span class="macro">write!</span>(f, <span class="string">"{}"</span>, val),
-<a href=#327 id=327 data-nosnippet>327</a> (<span class="kw">_</span>, PrimitiveLiteral::Double(val)) => <span class="macro">write!</span>(f, <span class="string">"{}"</span>, val),
-<a href=#328 id=328 data-nosnippet>328</a> (PrimitiveType::Date, PrimitiveLiteral::Int(val)) => {
-<a href=#329 id=329 data-nosnippet>329</a> <span class="macro">write!</span>(f, <span class="string">"{}"</span>, days_to_date(<span class="kw-2">*</span>val))
-<a href=#330 id=330 data-nosnippet>330</a> }
-<a href=#331 id=331 data-nosnippet>331</a> (PrimitiveType::Time, PrimitiveLiteral::Long(val)) => {
-<a href=#332 id=332 data-nosnippet>332</a> <span class="macro">write!</span>(f, <span class="string">"{}"</span>, microseconds_to_time(<span class="kw-2">*</span>val))
-<a href=#333 id=333 data-nosnippet>333</a> }
-<a href=#334 id=334 data-nosnippet>334</a> (PrimitiveType::Timestamp, PrimitiveLiteral::Long(val)) => {
-<a href=#335 id=335 data-nosnippet>335</a> <span class="macro">write!</span>(f, <span class="string">"{}"</span>, microseconds_to_datetime(<span class="kw-2">*</span>val))
-<a href=#336 id=336 data-nosnippet>336</a> }
-<a href=#337 id=337 data-nosnippet>337</a> (PrimitiveType::Timestamptz, PrimitiveLiteral::Long(val)) => {
-<a href=#338 id=338 data-nosnippet>338</a> <span class="macro">write!</span>(f, <span class="string">"{}"</span>, microseconds_to_datetimetz(<span class="kw-2">*</span>val))
-<a href=#339 id=339 data-nosnippet>339</a> }
-<a href=#340 id=340 data-nosnippet>340</a> (PrimitiveType::TimestampNs, PrimitiveLiteral::Long(val)) => {
-<a href=#341 id=341 data-nosnippet>341</a> <span class="macro">write!</span>(f, <span class="string">"{}"</span>, nanoseconds_to_datetime(<span class="kw-2">*</span>val))
-<a href=#342 id=342 data-nosnippet>342</a> }
-<a href=#343 id=343 data-nosnippet>343</a> (PrimitiveType::TimestamptzNs, PrimitiveLiteral::Long(val)) => {
-<a href=#344 id=344 data-nosnippet>344</a> <span class="macro">write!</span>(f, <span class="string">"{}"</span>, nanoseconds_to_datetimetz(<span class="kw-2">*</span>val))
+<a href=#23 id=23 data-nosnippet>23</a><span class="kw">use </span>std::cmp::Ordering;
+<a href=#24 id=24 data-nosnippet>24</a><span class="kw">use </span>std::collections::HashMap;
+<a href=#25 id=25 data-nosnippet>25</a><span class="kw">use </span>std::fmt::{Display, Formatter};
+<a href=#26 id=26 data-nosnippet>26</a><span class="kw">use </span>std::hash::Hash;
+<a href=#27 id=27 data-nosnippet>27</a><span class="kw">use </span>std::ops::Index;
+<a href=#28 id=28 data-nosnippet>28</a><span class="kw">use </span>std::str::FromStr;
+<a href=#29 id=29 data-nosnippet>29</a>
+<a href=#30 id=30 data-nosnippet>30</a><span class="kw">pub use </span>_serde::RawLiteral;
+<a href=#31 id=31 data-nosnippet>31</a><span class="kw">use </span>chrono::{DateTime, NaiveDate, NaiveDateTime, NaiveTime, TimeZone, Utc};
+<a href=#32 id=32 data-nosnippet>32</a><span class="kw">use </span>num_bigint::BigInt;
+<a href=#33 id=33 data-nosnippet>33</a><span class="kw">use </span>ordered_float::{Float, OrderedFloat};
+<a href=#34 id=34 data-nosnippet>34</a><span class="kw">use </span>rust_decimal::Decimal;
+<a href=#35 id=35 data-nosnippet>35</a><span class="kw">use </span>rust_decimal::prelude::ToPrimitive;
+<a href=#36 id=36 data-nosnippet>36</a><span class="kw">use </span>serde::de::{
+<a href=#37 id=37 data-nosnippet>37</a> MapAccess, {<span class="self">self</span>},
+<a href=#38 id=38 data-nosnippet>38</a>};
+<a href=#39 id=39 data-nosnippet>39</a><span class="kw">use </span>serde::ser::SerializeStruct;
+<a href=#40 id=40 data-nosnippet>40</a><span class="kw">use </span>serde::{Deserialize, Serialize};
+<a href=#41 id=41 data-nosnippet>41</a><span class="kw">use </span>serde_bytes::ByteBuf;
+<a href=#42 id=42 data-nosnippet>42</a><span class="kw">use </span>serde_json::{Map <span class="kw">as </span>JsonMap, Number, Value <span class="kw">as </span>JsonValue};
+<a href=#43 id=43 data-nosnippet>43</a><span class="kw">use </span>timestamp::nanoseconds_to_datetime;
+<a href=#44 id=44 data-nosnippet>44</a><span class="kw">use </span>uuid::Uuid;
+<a href=#45 id=45 data-nosnippet>45</a>
+<a href=#46 id=46 data-nosnippet>46</a><span class="kw">use </span><span class="kw">super</span>::datatypes::{PrimitiveType, Type};
+<a href=#47 id=47 data-nosnippet>47</a><span class="kw">use </span><span class="kw">crate</span>::error::Result;
+<a href=#48 id=48 data-nosnippet>48</a><span class="kw">use </span><span class="kw">crate</span>::spec::MAX_DECIMAL_PRECISION;
+<a href=#49 id=49 data-nosnippet>49</a><span class="kw">use </span><span class="kw">crate</span>::spec::values::date::{date_from_naive_date, days_to_date, unix_epoch};
+<a href=#50 id=50 data-nosnippet>50</a><span class="kw">use </span><span class="kw">crate</span>::spec::values::time::microseconds_to_time;
+<a href=#51 id=51 data-nosnippet>51</a><span class="kw">use </span><span class="kw">crate</span>::spec::values::timestamp::microseconds_to_datetime;
+<a href=#52 id=52 data-nosnippet>52</a><span class="kw">use </span><span class="kw">crate</span>::spec::values::timestamptz::{microseconds_to_datetimetz, nanoseconds_to_datetimetz};
+<a href=#53 id=53 data-nosnippet>53</a><span class="kw">use crate</span>::{Error, ErrorKind, ensure_data_valid};
+<a href=#54 id=54 data-nosnippet>54</a>
+<a href=#55 id=55 data-nosnippet>55</a><span class="doccomment">/// Maximum value for [`PrimitiveType::Time`] type in microseconds, e.g. 23 hours 59 minutes 59 seconds 999999 microseconds.
+<a href=#56 id=56 data-nosnippet>56</a></span><span class="kw">const </span>MAX_TIME_VALUE: i64 = <span class="number">24 </span>* <span class="number">60 </span>* <span class="number">60 </span>* <span class="number">1_000_000i64 </span>- <span class="number">1</span>;
+<a href=#57 id=57 data-nosnippet>57</a>
+<a href=#58 id=58 data-nosnippet>58</a><span class="kw">const </span>INT_MAX: i32 = <span class="number">2147483647</span>;
+<a href=#59 id=59 data-nosnippet>59</a><span class="kw">const </span>INT_MIN: i32 = -<span class="number">2147483648</span>;
+<a href=#60 id=60 data-nosnippet>60</a><span class="kw">const </span>LONG_MAX: i64 = <span class="number">9223372036854775807</span>;
+<a href=#61 id=61 data-nosnippet>61</a><span class="kw">const </span>LONG_MIN: i64 = -<span class="number">9223372036854775808</span>;
+<a href=#62 id=62 data-nosnippet>62</a>
+<a href=#63 id=63 data-nosnippet>63</a><span class="doccomment">/// Values present in iceberg type
+<a href=#64 id=64 data-nosnippet>64</a></span><span class="attr">#[derive(Clone, Debug, PartialOrd, PartialEq, Hash, Eq)]
+<a href=#65 id=65 data-nosnippet>65</a></span><span class="kw">pub enum </span>PrimitiveLiteral {
+<a href=#66 id=66 data-nosnippet>66</a> <span class="doccomment">/// 0x00 for false, non-zero byte for true
+<a href=#67 id=67 data-nosnippet>67</a> </span>Boolean(bool),
+<a href=#68 id=68 data-nosnippet>68</a> <span class="doccomment">/// Stored as 4-byte little-endian
+<a href=#69 id=69 data-nosnippet>69</a> </span>Int(i32),
+<a href=#70 id=70 data-nosnippet>70</a> <span class="doccomment">/// Stored as 8-byte little-endian
+<a href=#71 id=71 data-nosnippet>71</a> </span>Long(i64),
+<a href=#72 id=72 data-nosnippet>72</a> <span class="doccomment">/// Stored as 4-byte little-endian
+<a href=#73 id=73 data-nosnippet>73</a> </span>Float(OrderedFloat<f32>),
+<a href=#74 id=74 data-nosnippet>74</a> <span class="doccomment">/// Stored as 8-byte little-endian
+<a href=#75 id=75 data-nosnippet>75</a> </span>Double(OrderedFloat<f64>),
+<a href=#76 id=76 data-nosnippet>76</a> <span class="doccomment">/// UTF-8 bytes (without length)
+<a href=#77 id=77 data-nosnippet>77</a> </span>String(String),
+<a href=#78 id=78 data-nosnippet>78</a> <span class="doccomment">/// Binary value (without length)
+<a href=#79 id=79 data-nosnippet>79</a> </span>Binary(Vec<u8>),
+<a href=#80 id=80 data-nosnippet>80</a> <span class="doccomment">/// Stored as 16-byte little-endian
+<a href=#81 id=81 data-nosnippet>81</a> </span>Int128(i128),
+<a href=#82 id=82 data-nosnippet>82</a> <span class="doccomment">/// Stored as 16-byte little-endian
+<a href=#83 id=83 data-nosnippet>83</a> </span>UInt128(u128),
+<a href=#84 id=84 data-nosnippet>84</a> <span class="doccomment">/// When a number is larger than it can hold
+<a href=#85 id=85 data-nosnippet>85</a> </span>AboveMax,
+<a href=#86 id=86 data-nosnippet>86</a> <span class="doccomment">/// When a number is smaller than it can hold
+<a href=#87 id=87 data-nosnippet>87</a> </span>BelowMin,
+<a href=#88 id=88 data-nosnippet>88</a>}
+<a href=#89 id=89 data-nosnippet>89</a>
+<a href=#90 id=90 data-nosnippet>90</a><span class="kw">impl </span>PrimitiveLiteral {
+<a href=#91 id=91 data-nosnippet>91</a> <span class="doccomment">/// Returns true if the Literal represents a primitive type
+<a href=#92 id=92 data-nosnippet>92</a> /// that can be a NaN, and that it's value is NaN
+<a href=#93 id=93 data-nosnippet>93</a> </span><span class="kw">pub fn </span>is_nan(<span class="kw-2">&</span><span class="self">self</span>) -> bool {
+<a href=#94 id=94 data-nosnippet>94</a> <span class="kw">match </span><span class="self">self </span>{
+<a href=#95 id=95 data-nosnippet>95</a> PrimitiveLiteral::Double(val) => val.is_nan(),
+<a href=#96 id=96 data-nosnippet>96</a> PrimitiveLiteral::Float(val) => val.is_nan(),
+<a href=#97 id=97 data-nosnippet>97</a> <span class="kw">_ </span>=> <span class="bool-val">false</span>,
+<a href=#98 id=98 data-nosnippet>98</a> }
+<a href=#99 id=99 data-nosnippet>99</a> }
+<a href=#100 id=100 data-nosnippet>100</a>}
+<a href=#101 id=101 data-nosnippet>101</a>
+<a href=#102 id=102 data-nosnippet>102</a><span class="doccomment">/// Literal associated with its type. The value and type pair is checked when construction, so the type and value is
+<a href=#103 id=103 data-nosnippet>103</a>/// guaranteed to be correct when used.
+<a href=#104 id=104 data-nosnippet>104</a>///
+<a href=#105 id=105 data-nosnippet>105</a>/// By default, we decouple the type and value of a literal, so we can use avoid the cost of storing extra type info
+<a href=#106 id=106 data-nosnippet>106</a>/// for each literal. But associate type with literal can be useful in some cases, for example, in unbound expression.
+<a href=#107 id=107 data-nosnippet>107</a></span><span class="attr">#[derive(Clone, Debug, PartialEq, Hash, Eq)]
+<a href=#108 id=108 data-nosnippet>108</a></span><span class="kw">pub struct </span>Datum {
+<a href=#109 id=109 data-nosnippet>109</a> r#type: PrimitiveType,
+<a href=#110 id=110 data-nosnippet>110</a> literal: PrimitiveLiteral,
+<a href=#111 id=111 data-nosnippet>111</a>}
+<a href=#112 id=112 data-nosnippet>112</a>
+<a href=#113 id=113 data-nosnippet>113</a><span class="kw">impl </span>Serialize <span class="kw">for </span>Datum {
+<a href=#114 id=114 data-nosnippet>114</a> <span class="kw">fn </span>serialize<S: serde::Serializer>(
+<a href=#115 id=115 data-nosnippet>115</a> <span class="kw-2">&</span><span class="self">self</span>,
+<a href=#116 id=116 data-nosnippet>116</a> serializer: S,
+<a href=#117 id=117 data-nosnippet>117</a> ) -> std::result::Result<S::Ok, S::Error> {
+<a href=#118 id=118 data-nosnippet>118</a> <span class="kw">let </span><span class="kw-2">mut </span>struct_ser = serializer
+<a href=#119 id=119 data-nosnippet>119</a> .serialize_struct(<span class="string">"Datum"</span>, <span class="number">2</span>)
+<a href=#120 id=120 data-nosnippet>120</a> .map_err(serde::ser::Error::custom)<span class="question-mark">?</span>;
+<a href=#121 id=121 data-nosnippet>121</a> struct_ser
+<a href=#122 id=122 data-nosnippet>122</a> .serialize_field(<span class="string">"type"</span>, <span class="kw-2">&</span><span class="self">self</span>.r#type)
+<a href=#123 id=123 data-nosnippet>123</a> .map_err(serde::ser::Error::custom)<span class="question-mark">?</span>;
+<a href=#124 id=124 data-nosnippet>124</a> struct_ser
+<a href=#125 id=125 data-nosnippet>125</a> .serialize_field(
+<a href=#126 id=126 data-nosnippet>126</a> <span class="string">"literal"</span>,
+<a href=#127 id=127 data-nosnippet>127</a> <span class="kw-2">&</span>RawLiteral::try_from(
+<a href=#128 id=128 data-nosnippet>128</a> Literal::Primitive(<span class="self">self</span>.literal.clone()),
+<a href=#129 id=129 data-nosnippet>129</a> <span class="kw-2">&</span>Type::Primitive(<span class="self">self</span>.r#type.clone()),
+<a href=#130 id=130 data-nosnippet>130</a> )
+<a href=#131 id=131 data-nosnippet>131</a> .map_err(serde::ser::Error::custom)<span class="question-mark">?</span>,
+<a href=#132 id=132 data-nosnippet>132</a> )
+<a href=#133 id=133 data-nosnippet>133</a> .map_err(serde::ser::Error::custom)<span class="question-mark">?</span>;
+<a href=#134 id=134 data-nosnippet>134</a> struct_ser.end()
+<a href=#135 id=135 data-nosnippet>135</a> }
+<a href=#136 id=136 data-nosnippet>136</a>}
+<a href=#137 id=137 data-nosnippet>137</a>
+<a href=#138 id=138 data-nosnippet>138</a><span class="kw">impl</span><<span class="lifetime">'de</span>> Deserialize<<span class="lifetime">'de</span>> <span class="kw">for </span>Datum {
+<a href=#139 id=139 data-nosnippet>139</a> <span class="kw">fn </span>deserialize<D: serde::Deserializer<<span class="lifetime">'de</span>>>(
+<a href=#140 id=140 data-nosnippet>140</a> deserializer: D,
+<a href=#141 id=141 data-nosnippet>141</a> ) -> std::result::Result<<span class="self">Self</span>, D::Error> {
+<a href=#142 id=142 data-nosnippet>142</a> <span class="attr">#[derive(Deserialize)]
+<a href=#143 id=143 data-nosnippet>143</a> #[serde(field_identifier, rename_all = <span class="string">"lowercase"</span>)]
+<a href=#144 id=144 data-nosnippet>144</a> </span><span class="kw">enum </span>Field {
+<a href=#145 id=145 data-nosnippet>145</a> Type,
+<a href=#146 id=146 data-nosnippet>146</a> Literal,
+<a href=#147 id=147 data-nosnippet>147</a> }
+<a href=#148 id=148 data-nosnippet>148</a>
+<a href=#149 id=149 data-nosnippet>149</a> <span class="kw">struct </span>DatumVisitor;
+<a href=#150 id=150 data-nosnippet>150</a>
+<a href=#151 id=151 data-nosnippet>151</a> <span class="kw">impl</span><<span class="lifetime">'de</span>> serde::de::Visitor<<span class="lifetime">'de</span>> <span class="kw">for </span>DatumVisitor {
+<a href=#152 id=152 data-nosnippet>152</a> <span class="kw">type </span>Value = Datum;
+<a href=#153 id=153 data-nosnippet>153</a>
+<a href=#154 id=154 data-nosnippet>154</a> <span class="kw">fn </span>expecting(<span class="kw-2">&</span><span class="self">self</span>, formatter: <span class="kw-2">&mut </span>std::fmt::Formatter) -> std::fmt::Result {
+<a href=#155 id=155 data-nosnippet>155</a> formatter.write_str(<span class="string">"struct Datum"</span>)
+<a href=#156 id=156 data-nosnippet>156</a> }
+<a href=#157 id=157 data-nosnippet>157</a>
+<a href=#158 id=158 data-nosnippet>158</a> <span class="kw">fn </span>visit_seq<A>(<span class="self">self</span>, <span class="kw-2">mut </span>seq: A) -> std::result::Result<<span class="self">Self</span>::Value, A::Error>
+<a href=#159 id=159 data-nosnippet>159</a> <span class="kw">where </span>A: serde::de::SeqAccess<<span class="lifetime">'de</span>> {
+<a href=#160 id=160 data-nosnippet>160</a> <span class="kw">let </span>r#type = seq
+<a href=#161 id=161 data-nosnippet>161</a> .next_element::<PrimitiveType>()<span class="question-mark">?
+<a href=#162 id=162 data-nosnippet>162</a> </span>.ok_or_else(|| serde::de::Error::invalid_length(<span class="number">0</span>, <span class="kw-2">&</span><span class="self">self</span>))<span class="question-mark">?</span>;
+<a href=#163 id=163 data-nosnippet>163</a> <span class="kw">let </span>value = seq
+<a href=#164 id=164 data-nosnippet>164</a> .next_element::<RawLiteral>()<span class="question-mark">?
+<a href=#165 id=165 data-nosnippet>165</a> </span>.ok_or_else(|| serde::de::Error::invalid_length(<span class="number">1</span>, <span class="kw-2">&</span><span class="self">self</span>))<span class="question-mark">?</span>;
+<a href=#166 id=166 data-nosnippet>166</a> <span class="kw">let </span>Literal::Primitive(primitive) = value
+<a href=#167 id=167 data-nosnippet>167</a> .try_into(<span class="kw-2">&</span>Type::Primitive(r#type.clone()))
+<a href=#168 id=168 data-nosnippet>168</a> .map_err(serde::de::Error::custom)<span class="question-mark">?
+<a href=#169 id=169 data-nosnippet>169</a> </span>.ok_or_else(|| serde::de::Error::custom(<span class="string">"None value"</span>))<span class="question-mark">?
+<a href=#170 id=170 data-nosnippet>170</a> </span><span class="kw">else </span>{
+<a href=#171 id=171 data-nosnippet>171</a> <span class="kw">return </span><span class="prelude-val">Err</span>(serde::de::Error::custom(<span class="string">"Invalid value"</span>));
+<a href=#172 id=172 data-nosnippet>172</a> };
+<a href=#173 id=173 data-nosnippet>173</a>
+<a href=#174 id=174 data-nosnippet>174</a> <span class="prelude-val">Ok</span>(Datum::new(r#type, primitive))
+<a href=#175 id=175 data-nosnippet>175</a> }
+<a href=#176 id=176 data-nosnippet>176</a>
+<a href=#177 id=177 data-nosnippet>177</a> <span class="kw">fn </span>visit_map<V>(<span class="self">self</span>, <span class="kw-2">mut </span>map: V) -> std::result::Result<Datum, V::Error>
+<a href=#178 id=178 data-nosnippet>178</a> <span class="kw">where </span>V: MapAccess<<span class="lifetime">'de</span>> {
+<a href=#179 id=179 data-nosnippet>179</a> <span class="kw">let </span><span class="kw-2">mut </span>raw_primitive: <span class="prelude-ty">Option</span><RawLiteral> = <span class="prelude-val">None</span>;
+<a href=#180 id=180 data-nosnippet>180</a> <span class="kw">let </span><span class="kw-2">mut </span>r#type: <span class="prelude-ty">Option</span><PrimitiveType> = <span class="prelude-val">None</span>;
+<a href=#181 id=181 data-nosnippet>181</a> <span class="kw">while let </span><span class="prelude-val">Some</span>(key) = map.next_key()<span class="question-mark">? </span>{
+<a href=#182 id=182 data-nosnippet>182</a> <span class="kw">match </span>key {
+<a href=#183 id=183 data-nosnippet>183</a> Field::Type => {
+<a href=#184 id=184 data-nosnippet>184</a> <span class="kw">if </span>r#type.is_some() {
+<a href=#185 id=185 data-nosnippet>185</a> <span class="kw">return </span><span class="prelude-val">Err</span>(de::Error::duplicate_field(<span class="string">"type"</span>));
+<a href=#186 id=186 data-nosnippet>186</a> }
+<a href=#187 id=187 data-nosnippet>187</a> r#type = <span class="prelude-val">Some</span>(map.next_value()<span class="question-mark">?</span>);
+<a href=#188 id=188 data-nosnippet>188</a> }
+<a href=#189 id=189 data-nosnippet>189</a> Field::Literal => {
+<a href=#190 id=190 data-nosnippet>190</a> <span class="kw">if </span>raw_primitive.is_some() {
+<a href=#191 id=191 data-nosnippet>191</a> <span class="kw">return </span><span class="prelude-val">Err</span>(de::Error::duplicate_field(<span class="string">"literal"</span>));
+<a href=#192 id=192 data-nosnippet>192</a> }
+<a href=#193 id=193 data-nosnippet>193</a> raw_primitive = <span class="prelude-val">Some</span>(map.next_value()<span class="question-mark">?</span>);
+<a href=#194 id=194 data-nosnippet>194</a> }
+<a href=#195 id=195 data-nosnippet>195</a> }
+<a href=#196 id=196 data-nosnippet>196</a> }
+<a href=#197 id=197 data-nosnippet>197</a> <span class="kw">let </span><span class="prelude-val">Some</span>(r#type) = r#type <span class="kw">else </span>{
+<a href=#198 id=198 data-nosnippet>198</a> <span class="kw">return </span><span class="prelude-val">Err</span>(serde::de::Error::missing_field(<span class="string">"type"</span>));
+<a href=#199 id=199 data-nosnippet>199</a> };
+<a href=#200 id=200 data-nosnippet>200</a> <span class="kw">let </span><span class="prelude-val">Some</span>(raw_primitive) = raw_primitive <span class="kw">else </span>{
+<a href=#201 id=201 data-nosnippet>201</a> <span class="kw">return </span><span class="prelude-val">Err</span>(serde::de::Error::missing_field(<span class="string">"literal"</span>));
+<a href=#202 id=202 data-nosnippet>202</a> };
+<a href=#203 id=203 data-nosnippet>203</a> <span class="kw">let </span>Literal::Primitive(primitive) = raw_primitive
+<a href=#204 id=204 data-nosnippet>204</a> .try_into(<span class="kw-2">&</span>Type::Primitive(r#type.clone()))
+<a href=#205 id=205 data-nosnippet>205</a> .map_err(serde::de::Error::custom)<span class="question-mark">?
+<a href=#206 id=206 data-nosnippet>206</a> </span>.ok_or_else(|| serde::de::Error::custom(<span class="string">"None value"</span>))<span class="question-mark">?
+<a href=#207 id=207 data-nosnippet>207</a> </span><span class="kw">else </span>{
+<a href=#208 id=208 data-nosnippet>208</a> <span class="kw">return </span><span class="prelude-val">Err</span>(serde::de::Error::custom(<span class="string">"Invalid value"</span>));
+<a href=#209 id=209 data-nosnippet>209</a> };
+<a href=#210 id=210 data-nosnippet>210</a> <span class="prelude-val">Ok</span>(Datum::new(r#type, primitive))
+<a href=#211 id=211 data-nosnippet>211</a> }
+<a href=#212 id=212 data-nosnippet>212</a> }
+<a href=#213 id=213 data-nosnippet>213</a> <span class="kw">const </span>FIELDS: <span class="kw-2">&</span>[<span class="kw-2">&</span>str] = <span class="kw-2">&</span>[<span class="string">"type"</span>, <span class="string">"literal"</span>];
+<a href=#214 id=214 data-nosnippet>214</a> deserializer.deserialize_struct(<span class="string">"Datum"</span>, FIELDS, DatumVisitor)
+<a href=#215 id=215 data-nosnippet>215</a> }
+<a href=#216 id=216 data-nosnippet>216</a>}
+<a href=#217 id=217 data-nosnippet>217</a>
+<a href=#218 id=218 data-nosnippet>218</a><span class="comment">// Compare following iceberg float ordering rules:
+<a href=#219 id=219 data-nosnippet>219</a>// -NaN < -Infinity < -value < -0 < 0 < value < Infinity < NaN
+<a href=#220 id=220 data-nosnippet>220</a></span><span class="kw">fn </span>iceberg_float_cmp<T: Float>(a: T, b: T) -> <span class="prelude-ty">Option</span><Ordering> {
+<a href=#221 id=221 data-nosnippet>221</a> <span class="kw">if </span>a.is_nan() && b.is_nan() {
+<a href=#222 id=222 data-nosnippet>222</a> <span class="kw">return match </span>(a.is_sign_negative(), b.is_sign_negative()) {
+<a href=#223 id=223 data-nosnippet>223</a> (<span class="bool-val">true</span>, <span class="bool-val">false</span>) => <span class="prelude-val">Some</span>(Ordering::Less),
+<a href=#224 id=224 data-nosnippet>224</a> (<span class="bool-val">false</span>, <span class="bool-val">true</span>) => <span class="prelude-val">Some</span>(Ordering::Greater),
+<a href=#225 id=225 data-nosnippet>225</a> <span class="kw">_ </span>=> <span class="prelude-val">Some</span>(Ordering::Equal),
+<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>
+<a href=#229 id=229 data-nosnippet>229</a> <span class="kw">if </span>a.is_nan() {
+<a href=#230 id=230 data-nosnippet>230</a> <span class="kw">return </span><span class="prelude-val">Some</span>(<span class="kw">if </span>a.is_sign_negative() {
+<a href=#231 id=231 data-nosnippet>231</a> Ordering::Less
+<a href=#232 id=232 data-nosnippet>232</a> } <span class="kw">else </span>{
+<a href=#233 id=233 data-nosnippet>233</a> Ordering::Greater
+<a href=#234 id=234 data-nosnippet>234</a> });
+<a href=#235 id=235 data-nosnippet>235</a> }
+<a href=#236 id=236 data-nosnippet>236</a>
+<a href=#237 id=237 data-nosnippet>237</a> <span class="kw">if </span>b.is_nan() {
+<a href=#238 id=238 data-nosnippet>238</a> <span class="kw">return </span><span class="prelude-val">Some</span>(<span class="kw">if </span>b.is_sign_negative() {
+<a href=#239 id=239 data-nosnippet>239</a> Ordering::Greater
+<a href=#240 id=240 data-nosnippet>240</a> } <span class="kw">else </span>{
+<a href=#241 id=241 data-nosnippet>241</a> Ordering::Less
+<a href=#242 id=242 data-nosnippet>242</a> });
+<a href=#243 id=243 data-nosnippet>243</a> }
+<a href=#244 id=244 data-nosnippet>244</a>
+<a href=#245 id=245 data-nosnippet>245</a> a.partial_cmp(<span class="kw-2">&</span>b)
+<a href=#246 id=246 data-nosnippet>246</a>}
+<a href=#247 id=247 data-nosnippet>247</a>
+<a href=#248 id=248 data-nosnippet>248</a><span class="kw">impl </span>PartialOrd <span class="kw">for </span>Datum {
+<a href=#249 id=249 data-nosnippet>249</a> <span class="kw">fn </span>partial_cmp(<span class="kw-2">&</span><span class="self">self</span>, other: <span class="kw-2">&</span><span class="self">Self</span>) -> <span class="prelude-ty">Option</span><std::cmp::Ordering> {
+<a href=#250 id=250 data-nosnippet>250</a> <span class="kw">match </span>(<span class="kw-2">&</span><span class="self">self</span>.literal, <span class="kw-2">&</span>other.literal, <span class="kw-2">&</span><span class="self">self</span>.r#type, <span class="kw-2">&</span>other.r#type) {
+<a href=#251 id=251 data-nosnippet>251</a> <span class="comment">// generate the arm with same type and same literal
+<a href=#252 id=252 data-nosnippet>252</a> </span>(
+<a href=#253 id=253 data-nosnippet>253</a> PrimitiveLiteral::Boolean(val),
+<a href=#254 id=254 data-nosnippet>254</a> PrimitiveLiteral::Boolean(other_val),
+<a href=#255 id=255 data-nosnippet>255</a> PrimitiveType::Boolean,
+<a href=#256 id=256 data-nosnippet>256</a> PrimitiveType::Boolean,
+<a href=#257 id=257 data-nosnippet>257</a> ) => val.partial_cmp(other_val),
+<a href=#258 id=258 data-nosnippet>258</a> (
+<a href=#259 id=259 data-nosnippet>259</a> PrimitiveLiteral::Int(val),
+<a href=#260 id=260 data-nosnippet>260</a> PrimitiveLiteral::Int(other_val),
+<a href=#261 id=261 data-nosnippet>261</a> PrimitiveType::Int,
+<a href=#262 id=262 data-nosnippet>262</a> PrimitiveType::Int,
+<a href=#263 id=263 data-nosnippet>263</a> ) => val.partial_cmp(other_val),
+<a href=#264 id=264 data-nosnippet>264</a> (
+<a href=#265 id=265 data-nosnippet>265</a> PrimitiveLiteral::Long(val),
+<a href=#266 id=266 data-nosnippet>266</a> PrimitiveLiteral::Long(other_val),
+<a href=#267 id=267 data-nosnippet>267</a> PrimitiveType::Long,
+<a href=#268 id=268 data-nosnippet>268</a> PrimitiveType::Long,
+<a href=#269 id=269 data-nosnippet>269</a> ) => val.partial_cmp(other_val),
+<a href=#270 id=270 data-nosnippet>270</a> (
+<a href=#271 id=271 data-nosnippet>271</a> PrimitiveLiteral::Float(val),
+<a href=#272 id=272 data-nosnippet>272</a> PrimitiveLiteral::Float(other_val),
+<a href=#273 id=273 data-nosnippet>273</a> PrimitiveType::Float,
+<a href=#274 id=274 data-nosnippet>274</a> PrimitiveType::Float,
+<a href=#275 id=275 data-nosnippet>275</a> ) => iceberg_float_cmp(<span class="kw-2">*</span>val, <span class="kw-2">*</span>other_val),
+<a href=#276 id=276 data-nosnippet>276</a> (
+<a href=#277 id=277 data-nosnippet>277</a> PrimitiveLiteral::Double(val),
+<a href=#278 id=278 data-nosnippet>278</a> PrimitiveLiteral::Double(other_val),
+<a href=#279 id=279 data-nosnippet>279</a> PrimitiveType::Double,
+<a href=#280 id=280 data-nosnippet>280</a> PrimitiveType::Double,
+<a href=#281 id=281 data-nosnippet>281</a> ) => iceberg_float_cmp(<span class="kw-2">*</span>val, <span class="kw-2">*</span>other_val),
+<a href=#282 id=282 data-nosnippet>282</a> (
+<a href=#283 id=283 data-nosnippet>283</a> PrimitiveLiteral::Int(val),
+<a href=#284 id=284 data-nosnippet>284</a> PrimitiveLiteral::Int(other_val),
+<a href=#285 id=285 data-nosnippet>285</a> PrimitiveType::Date,
+<a href=#286 id=286 data-nosnippet>286</a> PrimitiveType::Date,
+<a href=#287 id=287 data-nosnippet>287</a> ) => val.partial_cmp(other_val),
+<a href=#288 id=288 data-nosnippet>288</a> (
+<a href=#289 id=289 data-nosnippet>289</a> PrimitiveLiteral::Long(val),
+<a href=#290 id=290 data-nosnippet>290</a> PrimitiveLiteral::Long(other_val),
+<a href=#291 id=291 data-nosnippet>291</a> PrimitiveType::Time,
+<a href=#292 id=292 data-nosnippet>292</a> PrimitiveType::Time,
+<a href=#293 id=293 data-nosnippet>293</a> ) => val.partial_cmp(other_val),
+<a href=#294 id=294 data-nosnippet>294</a> (
+<a href=#295 id=295 data-nosnippet>295</a> PrimitiveLiteral::Long(val),
+<a href=#296 id=296 data-nosnippet>296</a> PrimitiveLiteral::Long(other_val),
+<a href=#297 id=297 data-nosnippet>297</a> PrimitiveType::Timestamp,
+<a href=#298 id=298 data-nosnippet>298</a> PrimitiveType::Timestamp,
+<a href=#299 id=299 data-nosnippet>299</a> ) => val.partial_cmp(other_val),
+<a href=#300 id=300 data-nosnippet>300</a> (
+<a href=#301 id=301 data-nosnippet>301</a> PrimitiveLiteral::Long(val),
+<a href=#302 id=302 data-nosnippet>302</a> PrimitiveLiteral::Long(other_val),
+<a href=#303 id=303 data-nosnippet>303</a> PrimitiveType::Timestamptz,
+<a href=#304 id=304 data-nosnippet>304</a> PrimitiveType::Timestamptz,
+<a href=#305 id=305 data-nosnippet>305</a> ) => val.partial_cmp(other_val),
+<a href=#306 id=306 data-nosnippet>306</a> (
+<a href=#307 id=307 data-nosnippet>307</a> PrimitiveLiteral::String(val),
+<a href=#308 id=308 data-nosnippet>308</a> PrimitiveLiteral::String(other_val),
+<a href=#309 id=309 data-nosnippet>309</a> PrimitiveType::String,
+<a href=#310 id=310 data-nosnippet>310</a> PrimitiveType::String,
+<a href=#311 id=311 data-nosnippet>311</a> ) => val.partial_cmp(other_val),
+<a href=#312 id=312 data-nosnippet>312</a> (
+<a href=#313 id=313 data-nosnippet>313</a> PrimitiveLiteral::UInt128(val),
+<a href=#314 id=314 data-nosnippet>314</a> PrimitiveLiteral::UInt128(other_val),
+<a href=#315 id=315 data-nosnippet>315</a> PrimitiveType::Uuid,
+<a href=#316 id=316 data-nosnippet>316</a> PrimitiveType::Uuid,
+<a href=#317 id=317 data-nosnippet>317</a> ) => Uuid::from_u128(<span class="kw-2">*</span>val).partial_cmp(<span class="kw-2">&</span>Uuid::from_u128(<span class="kw-2">*</span>other_val)),
+<a href=#318 id=318 data-nosnippet>318</a> (
+<a href=#319 id=319 data-nosnippet>319</a> PrimitiveLiteral::Binary(val),
+<a href=#320 id=320 data-nosnippet>320</a> PrimitiveLiteral::Binary(other_val),
+<a href=#321 id=321 data-nosnippet>321</a> PrimitiveType::Fixed(<span class="kw">_</span>),
+<a href=#322 id=322 data-nosnippet>322</a> PrimitiveType::Fixed(<span class="kw">_</span>),
+<a href=#323 id=323 data-nosnippet>323</a> ) => val.partial_cmp(other_val),
+<a href=#324 id=324 data-nosnippet>324</a> (
+<a href=#325 id=325 data-nosnippet>325</a> PrimitiveLiteral::Binary(val),
+<a href=#326 id=326 data-nosnippet>326</a> PrimitiveLiteral::Binary(other_val),
+<a href=#327 id=327 data-nosnippet>327</a> PrimitiveType::Binary,
+<a href=#328 id=328 data-nosnippet>328</a> PrimitiveType::Binary,
+<a href=#329 id=329 data-nosnippet>329</a> ) => val.partial_cmp(other_val),
+<a href=#330 id=330 data-nosnippet>330</a> (
+<a href=#331 id=331 data-nosnippet>331</a> PrimitiveLiteral::Int128(val),
+<a href=#332 id=332 data-nosnippet>332</a> PrimitiveLiteral::Int128(other_val),
+<a href=#333 id=333 data-nosnippet>333</a> PrimitiveType::Decimal {
+<a href=#334 id=334 data-nosnippet>334</a> precision: <span class="kw">_</span>,
+<a href=#335 id=335 data-nosnippet>335</a> scale,
+<a href=#336 id=336 data-nosnippet>336</a> },
+<a href=#337 id=337 data-nosnippet>337</a> PrimitiveType::Decimal {
+<a href=#338 id=338 data-nosnippet>338</a> precision: <span class="kw">_</span>,
+<a href=#339 id=339 data-nosnippet>339</a> scale: other_scale,
+<a href=#340 id=340 data-nosnippet>340</a> },
+<a href=#341 id=341 data-nosnippet>341</a> ) => {
+<a href=#342 id=342 data-nosnippet>342</a> <span class="kw">let </span>val = Decimal::from_i128_with_scale(<span class="kw-2">*</span>val, <span class="kw-2">*</span>scale);
+<a href=#343 id=343 data-nosnippet>343</a> <span class="kw">let </span>other_val = Decimal::from_i128_with_scale(<span class="kw-2">*</span>other_val, <span class="kw-2">*</span>other_scale);
+<a href=#344 id=344 data-nosnippet>344</a> val.partial_cmp(<span class="kw-2">&</span>other_val)
<a href=#345 id=345 data-nosnippet>345</a> }
-<a href=#346 id=346 data-nosnippet>346</a> (<span class="kw">_</span>, PrimitiveLiteral::String(val)) => <span class="macro">write!</span>(f, <span class="string">r#""{}""#</span>, val),
-<a href=#347 id=347 data-nosnippet>347</a> (PrimitiveType::Uuid, PrimitiveLiteral::UInt128(val)) => {
-<a href=#348 id=348 data-nosnippet>348</a> <span class="macro">write!</span>(f, <span class="string">"{}"</span>, Uuid::from_u128(<span class="kw-2">*</span>val))
-<a href=#349 id=349 data-nosnippet>349</a> }
-<a href=#350 id=350 data-nosnippet>350</a> (<span class="kw">_</span>, PrimitiveLiteral::Binary(val)) => display_bytes(val, f),
-<a href=#351 id=351 data-nosnippet>351</a> (
-<a href=#352 id=352 data-nosnippet>352</a> PrimitiveType::Decimal {
-<a href=#353 id=353 data-nosnippet>353</a> precision: <span class="kw">_</span>,
-<a href=#354 id=354 data-nosnippet>354</a> scale,
-<a href=#355 id=355 data-nosnippet>355</a> },
-<a href=#356 id=356 data-nosnippet>356</a> PrimitiveLiteral::Int128(val),
-<a href=#357 id=357 data-nosnippet>357</a> ) => {
-<a href=#358 id=358 data-nosnippet>358</a> <span class="macro">write!</span>(f, <span class="string">"{}"</span>, Decimal::from_i128_with_scale(<span class="kw-2">*</span>val, <span class="kw-2">*</span>scale))
-<a href=#359 id=359 data-nosnippet>359</a> }
-<a href=#360 id=360 data-nosnippet>360</a> (<span class="kw">_</span>, <span class="kw">_</span>) => {
-<a href=#361 id=361 data-nosnippet>361</a> <span class="macro">unreachable!</span>()
-<a href=#362 id=362 data-nosnippet>362</a> }
-<a href=#363 id=363 data-nosnippet>363</a> }
-<a href=#364 id=364 data-nosnippet>364</a> }
-<a href=#365 id=365 data-nosnippet>365</a>}
-<a href=#366 id=366 data-nosnippet>366</a>
-<a href=#367 id=367 data-nosnippet>367</a><span class="kw">fn </span>display_bytes(bytes: <span class="kw-2">&</span>[u8], f: <span class="kw-2">&mut </span>Formatter<<span class="lifetime">'_</span>>) -> std::fmt::Result {
-<a href=#368 id=368 data-nosnippet>368</a> <span class="kw">let </span><span class="kw-2">mut </span>s = String::with_capacity(bytes.len() * <span class="number">2</span>);
-<a href=#369 id=369 data-nosnippet>369</a> <span class="kw">for </span>b <span class="kw">in </span>bytes {
-<a href=#370 id=370 data-nosnippet>370</a> s.push_str(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{:02X}"</span>, b));
-<a href=#371 id=371 data-nosnippet>371</a> }
-<a href=#372 id=372 data-nosnippet>372</a> f.write_str(<span class="kw-2">&</span>s)
-<a href=#373 id=373 data-nosnippet>373</a>}
-<a href=#374 id=374 data-nosnippet>374</a>
-<a href=#375 id=375 data-nosnippet>375</a><span class="kw">impl </span>From<Datum> <span class="kw">for </span>Literal {
-<a href=#376 id=376 data-nosnippet>376</a> <span class="kw">fn </span>from(value: Datum) -> <span class="self">Self </span>{
-<a href=#377 id=377 data-nosnippet>377</a> Literal::Primitive(value.literal)
-<a href=#378 id=378 data-nosnippet>378</a> }
-<a href=#379 id=379 data-nosnippet>379</a>}
-<a href=#380 id=380 data-nosnippet>380</a>
-<a href=#381 id=381 data-nosnippet>381</a><span class="kw">impl </span>From<Datum> <span class="kw">for </span>PrimitiveLiteral {
-<a href=#382 id=382 data-nosnippet>382</a> <span class="kw">fn </span>from(value: Datum) -> <span class="self">Self </span>{
-<a href=#383 id=383 data-nosnippet>383</a> value.literal
-<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>
-<a href=#387 id=387 data-nosnippet>387</a><span class="kw">impl </span>Datum {
-<a href=#388 id=388 data-nosnippet>388</a> <span class="doccomment">/// Creates a `Datum` from a `PrimitiveType` and a `PrimitiveLiteral`
-<a href=#389 id=389 data-nosnippet>389</a> </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>new(r#type: PrimitiveType, literal: PrimitiveLiteral) -> <span class="self">Self </span>{
-<a href=#390 id=390 data-nosnippet>390</a> Datum { r#type, literal }
-<a href=#391 id=391 data-nosnippet>391</a> }
-<a href=#392 id=392 data-nosnippet>392</a>
-<a href=#393 id=393 data-nosnippet>393</a> <span class="doccomment">/// Create iceberg value from bytes.
-<a href=#394 id=394 data-nosnippet>394</a> ///
-<a href=#395 id=395 data-nosnippet>395</a> /// See [this spec](https://iceberg.apache.org/spec/#binary-single-value-serialization) for reference.
-<a href=#396 id=396 data-nosnippet>396</a> </span><span class="kw">pub fn </span>try_from_bytes(bytes: <span class="kw-2">&</span>[u8], data_type: PrimitiveType) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#397 id=397 data-nosnippet>397</a> <span class="kw">let </span>literal = <span class="kw">match </span>data_type {
-<a href=#398 id=398 data-nosnippet>398</a> PrimitiveType::Boolean => {
-<a href=#399 id=399 data-nosnippet>399</a> <span class="kw">if </span>bytes.len() == <span class="number">1 </span>&& bytes[<span class="number">0</span>] == <span class="number">0u8 </span>{
-<a href=#400 id=400 data-nosnippet>400</a> PrimitiveLiteral::Boolean(<span class="bool-val">false</span>)
-<a href=#401 id=401 data-nosnippet>401</a> } <span class="kw">else </span>{
-<a href=#402 id=402 data-nosnippet>402</a> PrimitiveLiteral::Boolean(<span class="bool-val">true</span>)
-<a href=#403 id=403 data-nosnippet>403</a> }
-<a href=#404 id=404 data-nosnippet>404</a> }
-<a href=#405 id=405 data-nosnippet>405</a> PrimitiveType::Int => PrimitiveLiteral::Int(i32::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>)),
-<a href=#406 id=406 data-nosnippet>406</a> PrimitiveType::Long => {
-<a href=#407 id=407 data-nosnippet>407</a> <span class="kw">if </span>bytes.len() == <span class="number">4 </span>{
-<a href=#408 id=408 data-nosnippet>408</a> <span class="comment">// In the case of an evolved field
-<a href=#409 id=409 data-nosnippet>409</a> </span>PrimitiveLiteral::Long(i32::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>) <span class="kw">as </span>i64)
-<a href=#410 id=410 data-nosnippet>410</a> } <span class="kw">else </span>{
-<a href=#411 id=411 data-nosnippet>411</a> PrimitiveLiteral::Long(i64::from_le_bytes(bytes.try_into()<span class="question-mark">?</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> PrimitiveType::Float => {
-<a href=#415 id=415 data-nosnippet>415</a> PrimitiveLiteral::Float(OrderedFloat(f32::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>)))
-<a href=#416 id=416 data-nosnippet>416</a> }
-<a href=#417 id=417 data-nosnippet>417</a> PrimitiveType::Double => {
-<a href=#418 id=418 data-nosnippet>418</a> <span class="kw">if </span>bytes.len() == <span class="number">4 </span>{
-<a href=#419 id=419 data-nosnippet>419</a> <span class="comment">// In the case of an evolved field
-<a href=#420 id=420 data-nosnippet>420</a> </span>PrimitiveLiteral::Double(OrderedFloat(
-<a href=#421 id=421 data-nosnippet>421</a> f32::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>) <span class="kw">as </span>f64
-<a href=#422 id=422 data-nosnippet>422</a> ))
-<a href=#423 id=423 data-nosnippet>423</a> } <span class="kw">else </span>{
-<a href=#424 id=424 data-nosnippet>424</a> PrimitiveLiteral::Double(OrderedFloat(f64::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>)))
-<a href=#425 id=425 data-nosnippet>425</a> }
-<a href=#426 id=426 data-nosnippet>426</a> }
-<a href=#427 id=427 data-nosnippet>427</a> PrimitiveType::Date => PrimitiveLiteral::Int(i32::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>)),
-<a href=#428 id=428 data-nosnippet>428</a> PrimitiveType::Time => PrimitiveLiteral::Long(i64::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>)),
-<a href=#429 id=429 data-nosnippet>429</a> PrimitiveType::Timestamp => {
-<a href=#430 id=430 data-nosnippet>430</a> PrimitiveLiteral::Long(i64::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>))
-<a href=#431 id=431 data-nosnippet>431</a> }
-<a href=#432 id=432 data-nosnippet>432</a> PrimitiveType::Timestamptz => {
-<a href=#433 id=433 data-nosnippet>433</a> PrimitiveLiteral::Long(i64::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>))
-<a href=#434 id=434 data-nosnippet>434</a> }
-<a href=#435 id=435 data-nosnippet>435</a> PrimitiveType::TimestampNs => {
-<a href=#436 id=436 data-nosnippet>436</a> PrimitiveLiteral::Long(i64::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>))
-<a href=#437 id=437 data-nosnippet>437</a> }
-<a href=#438 id=438 data-nosnippet>438</a> PrimitiveType::TimestamptzNs => {
-<a href=#439 id=439 data-nosnippet>439</a> PrimitiveLiteral::Long(i64::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>))
-<a href=#440 id=440 data-nosnippet>440</a> }
-<a href=#441 id=441 data-nosnippet>441</a> PrimitiveType::String => {
-<a href=#442 id=442 data-nosnippet>442</a> PrimitiveLiteral::String(std::str::from_utf8(bytes)<span class="question-mark">?</span>.to_string())
-<a href=#443 id=443 data-nosnippet>443</a> }
-<a href=#444 id=444 data-nosnippet>444</a> PrimitiveType::Uuid => {
-<a href=#445 id=445 data-nosnippet>445</a> PrimitiveLiteral::UInt128(u128::from_be_bytes(bytes.try_into()<span class="question-mark">?</span>))
-<a href=#446 id=446 data-nosnippet>446</a> }
-<a href=#447 id=447 data-nosnippet>447</a> PrimitiveType::Fixed(<span class="kw">_</span>) => PrimitiveLiteral::Binary(Vec::from(bytes)),
-<a href=#448 id=448 data-nosnippet>448</a> PrimitiveType::Binary => PrimitiveLiteral::Binary(Vec::from(bytes)),
-<a href=#449 id=449 data-nosnippet>449</a> PrimitiveType::Decimal { .. } => {
-<a href=#450 id=450 data-nosnippet>450</a> <span class="kw">let </span>unscaled_value = BigInt::from_signed_bytes_be(bytes);
-<a href=#451 id=451 data-nosnippet>451</a> PrimitiveLiteral::Int128(unscaled_value.to_i128().ok_or_else(|| {
-<a href=#452 id=452 data-nosnippet>452</a> Error::new(
-<a href=#453 id=453 data-nosnippet>453</a> ErrorKind::DataInvalid,
-<a href=#454 id=454 data-nosnippet>454</a> <span class="macro">format!</span>(<span class="string">"Can't convert bytes to i128: {:?}"</span>, bytes),
-<a href=#455 id=455 data-nosnippet>455</a> )
-<a href=#456 id=456 data-nosnippet>456</a> })<span class="question-mark">?</span>)
+<a href=#346 id=346 data-nosnippet>346</a> <span class="kw">_ </span>=> <span class="prelude-val">None</span>,
+<a href=#347 id=347 data-nosnippet>347</a> }
+<a href=#348 id=348 data-nosnippet>348</a> }
+<a href=#349 id=349 data-nosnippet>349</a>}
+<a href=#350 id=350 data-nosnippet>350</a>
+<a href=#351 id=351 data-nosnippet>351</a><span class="kw">impl </span>Display <span class="kw">for </span>Datum {
+<a href=#352 id=352 data-nosnippet>352</a> <span class="kw">fn </span>fmt(<span class="kw-2">&</span><span class="self">self</span>, f: <span class="kw-2">&mut </span>Formatter<<span class="lifetime">'_</span>>) -> std::fmt::Result {
+<a href=#353 id=353 data-nosnippet>353</a> <span class="kw">match </span>(<span class="kw-2">&</span><span class="self">self</span>.r#type, <span class="kw-2">&</span><span class="self">self</span>.literal) {
+<a href=#354 id=354 data-nosnippet>354</a> (<span class="kw">_</span>, PrimitiveLiteral::Boolean(val)) => <span class="macro">write!</span>(f, <span class="string">"{}"</span>, val),
+<a href=#355 id=355 data-nosnippet>355</a> (PrimitiveType::Int, PrimitiveLiteral::Int(val)) => <span class="macro">write!</span>(f, <span class="string">"{}"</span>, val),
+<a href=#356 id=356 data-nosnippet>356</a> (PrimitiveType::Long, PrimitiveLiteral::Long(val)) => <span class="macro">write!</span>(f, <span class="string">"{}"</span>, val),
+<a href=#357 id=357 data-nosnippet>357</a> (<span class="kw">_</span>, PrimitiveLiteral::Float(val)) => <span class="macro">write!</span>(f, <span class="string">"{}"</span>, val),
+<a href=#358 id=358 data-nosnippet>358</a> (<span class="kw">_</span>, PrimitiveLiteral::Double(val)) => <span class="macro">write!</span>(f, <span class="string">"{}"</span>, val),
+<a href=#359 id=359 data-nosnippet>359</a> (PrimitiveType::Date, PrimitiveLiteral::Int(val)) => {
+<a href=#360 id=360 data-nosnippet>360</a> <span class="macro">write!</span>(f, <span class="string">"{}"</span>, days_to_date(<span class="kw-2">*</span>val))
+<a href=#361 id=361 data-nosnippet>361</a> }
+<a href=#362 id=362 data-nosnippet>362</a> (PrimitiveType::Time, PrimitiveLiteral::Long(val)) => {
+<a href=#363 id=363 data-nosnippet>363</a> <span class="macro">write!</span>(f, <span class="string">"{}"</span>, microseconds_to_time(<span class="kw-2">*</span>val))
+<a href=#364 id=364 data-nosnippet>364</a> }
+<a href=#365 id=365 data-nosnippet>365</a> (PrimitiveType::Timestamp, PrimitiveLiteral::Long(val)) => {
+<a href=#366 id=366 data-nosnippet>366</a> <span class="macro">write!</span>(f, <span class="string">"{}"</span>, microseconds_to_datetime(<span class="kw-2">*</span>val))
+<a href=#367 id=367 data-nosnippet>367</a> }
+<a href=#368 id=368 data-nosnippet>368</a> (PrimitiveType::Timestamptz, PrimitiveLiteral::Long(val)) => {
+<a href=#369 id=369 data-nosnippet>369</a> <span class="macro">write!</span>(f, <span class="string">"{}"</span>, microseconds_to_datetimetz(<span class="kw-2">*</span>val))
+<a href=#370 id=370 data-nosnippet>370</a> }
+<a href=#371 id=371 data-nosnippet>371</a> (PrimitiveType::TimestampNs, PrimitiveLiteral::Long(val)) => {
+<a href=#372 id=372 data-nosnippet>372</a> <span class="macro">write!</span>(f, <span class="string">"{}"</span>, nanoseconds_to_datetime(<span class="kw-2">*</span>val))
+<a href=#373 id=373 data-nosnippet>373</a> }
+<a href=#374 id=374 data-nosnippet>374</a> (PrimitiveType::TimestamptzNs, PrimitiveLiteral::Long(val)) => {
+<a href=#375 id=375 data-nosnippet>375</a> <span class="macro">write!</span>(f, <span class="string">"{}"</span>, nanoseconds_to_datetimetz(<span class="kw-2">*</span>val))
+<a href=#376 id=376 data-nosnippet>376</a> }
+<a href=#377 id=377 data-nosnippet>377</a> (<span class="kw">_</span>, PrimitiveLiteral::String(val)) => <span class="macro">write!</span>(f, <span class="string">r#""{}""#</span>, val),
+<a href=#378 id=378 data-nosnippet>378</a> (PrimitiveType::Uuid, PrimitiveLiteral::UInt128(val)) => {
+<a href=#379 id=379 data-nosnippet>379</a> <span class="macro">write!</span>(f, <span class="string">"{}"</span>, Uuid::from_u128(<span class="kw-2">*</span>val))
+<a href=#380 id=380 data-nosnippet>380</a> }
+<a href=#381 id=381 data-nosnippet>381</a> (<span class="kw">_</span>, PrimitiveLiteral::Binary(val)) => display_bytes(val, f),
+<a href=#382 id=382 data-nosnippet>382</a> (
+<a href=#383 id=383 data-nosnippet>383</a> PrimitiveType::Decimal {
+<a href=#384 id=384 data-nosnippet>384</a> precision: <span class="kw">_</span>,
+<a href=#385 id=385 data-nosnippet>385</a> scale,
+<a href=#386 id=386 data-nosnippet>386</a> },
+<a href=#387 id=387 data-nosnippet>387</a> PrimitiveLiteral::Int128(val),
+<a href=#388 id=388 data-nosnippet>388</a> ) => {
+<a href=#389 id=389 data-nosnippet>389</a> <span class="macro">write!</span>(f, <span class="string">"{}"</span>, Decimal::from_i128_with_scale(<span class="kw-2">*</span>val, <span class="kw-2">*</span>scale))
+<a href=#390 id=390 data-nosnippet>390</a> }
+<a href=#391 id=391 data-nosnippet>391</a> (<span class="kw">_</span>, <span class="kw">_</span>) => {
+<a href=#392 id=392 data-nosnippet>392</a> <span class="macro">unreachable!</span>()
+<a href=#393 id=393 data-nosnippet>393</a> }
+<a href=#394 id=394 data-nosnippet>394</a> }
+<a href=#395 id=395 data-nosnippet>395</a> }
+<a href=#396 id=396 data-nosnippet>396</a>}
+<a href=#397 id=397 data-nosnippet>397</a>
+<a href=#398 id=398 data-nosnippet>398</a><span class="kw">fn </span>display_bytes(bytes: <span class="kw-2">&</span>[u8], f: <span class="kw-2">&mut </span>Formatter<<span class="lifetime">'_</span>>) -> std::fmt::Result {
+<a href=#399 id=399 data-nosnippet>399</a> <span class="kw">let </span><span class="kw-2">mut </span>s = String::with_capacity(bytes.len() * <span class="number">2</span>);
+<a href=#400 id=400 data-nosnippet>400</a> <span class="kw">for </span>b <span class="kw">in </span>bytes {
+<a href=#401 id=401 data-nosnippet>401</a> s.push_str(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{:02X}"</span>, b));
+<a href=#402 id=402 data-nosnippet>402</a> }
+<a href=#403 id=403 data-nosnippet>403</a> f.write_str(<span class="kw-2">&</span>s)
+<a href=#404 id=404 data-nosnippet>404</a>}
+<a href=#405 id=405 data-nosnippet>405</a>
+<a href=#406 id=406 data-nosnippet>406</a><span class="kw">impl </span>From<Datum> <span class="kw">for </span>Literal {
+<a href=#407 id=407 data-nosnippet>407</a> <span class="kw">fn </span>from(value: Datum) -> <span class="self">Self </span>{
+<a href=#408 id=408 data-nosnippet>408</a> Literal::Primitive(value.literal)
+<a href=#409 id=409 data-nosnippet>409</a> }
+<a href=#410 id=410 data-nosnippet>410</a>}
+<a href=#411 id=411 data-nosnippet>411</a>
+<a href=#412 id=412 data-nosnippet>412</a><span class="kw">impl </span>From<Datum> <span class="kw">for </span>PrimitiveLiteral {
+<a href=#413 id=413 data-nosnippet>413</a> <span class="kw">fn </span>from(value: Datum) -> <span class="self">Self </span>{
+<a href=#414 id=414 data-nosnippet>414</a> value.literal
+<a href=#415 id=415 data-nosnippet>415</a> }
+<a href=#416 id=416 data-nosnippet>416</a>}
+<a href=#417 id=417 data-nosnippet>417</a>
+<a href=#418 id=418 data-nosnippet>418</a><span class="kw">impl </span>Datum {
+<a href=#419 id=419 data-nosnippet>419</a> <span class="doccomment">/// Creates a `Datum` from a `PrimitiveType` and a `PrimitiveLiteral`
+<a href=#420 id=420 data-nosnippet>420</a> </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>new(r#type: PrimitiveType, literal: PrimitiveLiteral) -> <span class="self">Self </span>{
+<a href=#421 id=421 data-nosnippet>421</a> Datum { r#type, literal }
+<a href=#422 id=422 data-nosnippet>422</a> }
+<a href=#423 id=423 data-nosnippet>423</a>
+<a href=#424 id=424 data-nosnippet>424</a> <span class="doccomment">/// Create iceberg value from bytes.
+<a href=#425 id=425 data-nosnippet>425</a> ///
+<a href=#426 id=426 data-nosnippet>426</a> /// See [this spec](https://iceberg.apache.org/spec/#binary-single-value-serialization) for reference.
+<a href=#427 id=427 data-nosnippet>427</a> </span><span class="kw">pub fn </span>try_from_bytes(bytes: <span class="kw-2">&</span>[u8], data_type: PrimitiveType) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#428 id=428 data-nosnippet>428</a> <span class="kw">let </span>literal = <span class="kw">match </span>data_type {
+<a href=#429 id=429 data-nosnippet>429</a> PrimitiveType::Boolean => {
+<a href=#430 id=430 data-nosnippet>430</a> <span class="kw">if </span>bytes.len() == <span class="number">1 </span>&& bytes[<span class="number">0</span>] == <span class="number">0u8 </span>{
+<a href=#431 id=431 data-nosnippet>431</a> PrimitiveLiteral::Boolean(<span class="bool-val">false</span>)
+<a href=#432 id=432 data-nosnippet>432</a> } <span class="kw">else </span>{
+<a href=#433 id=433 data-nosnippet>433</a> PrimitiveLiteral::Boolean(<span class="bool-val">true</span>)
+<a href=#434 id=434 data-nosnippet>434</a> }
+<a href=#435 id=435 data-nosnippet>435</a> }
+<a href=#436 id=436 data-nosnippet>436</a> PrimitiveType::Int => PrimitiveLiteral::Int(i32::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>)),
+<a href=#437 id=437 data-nosnippet>437</a> PrimitiveType::Long => {
+<a href=#438 id=438 data-nosnippet>438</a> <span class="kw">if </span>bytes.len() == <span class="number">4 </span>{
+<a href=#439 id=439 data-nosnippet>439</a> <span class="comment">// In the case of an evolved field
+<a href=#440 id=440 data-nosnippet>440</a> </span>PrimitiveLiteral::Long(i32::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>) <span class="kw">as </span>i64)
+<a href=#441 id=441 data-nosnippet>441</a> } <span class="kw">else </span>{
+<a href=#442 id=442 data-nosnippet>442</a> PrimitiveLiteral::Long(i64::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>))
+<a href=#443 id=443 data-nosnippet>443</a> }
+<a href=#444 id=444 data-nosnippet>444</a> }
+<a href=#445 id=445 data-nosnippet>445</a> PrimitiveType::Float => {
+<a href=#446 id=446 data-nosnippet>446</a> PrimitiveLiteral::Float(OrderedFloat(f32::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>)))
+<a href=#447 id=447 data-nosnippet>447</a> }
+<a href=#448 id=448 data-nosnippet>448</a> PrimitiveType::Double => {
+<a href=#449 id=449 data-nosnippet>449</a> <span class="kw">if </span>bytes.len() == <span class="number">4 </span>{
+<a href=#450 id=450 data-nosnippet>450</a> <span class="comment">// In the case of an evolved field
+<a href=#451 id=451 data-nosnippet>451</a> </span>PrimitiveLiteral::Double(OrderedFloat(
+<a href=#452 id=452 data-nosnippet>452</a> f32::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>) <span class="kw">as </span>f64
+<a href=#453 id=453 data-nosnippet>453</a> ))
+<a href=#454 id=454 data-nosnippet>454</a> } <span class="kw">else </span>{
+<a href=#455 id=455 data-nosnippet>455</a> PrimitiveLiteral::Double(OrderedFloat(f64::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>)))
+<a href=#456 id=456 data-nosnippet>456</a> }
<a href=#457 id=457 data-nosnippet>457</a> }
-<a href=#458 id=458 data-nosnippet>458</a> };
-<a href=#459 id=459 data-nosnippet>459</a> <span class="prelude-val">Ok</span>(Datum::new(data_type, literal))
-<a href=#460 id=460 data-nosnippet>460</a> }
-<a href=#461 id=461 data-nosnippet>461</a>
-<a href=#462 id=462 data-nosnippet>462</a> <span class="doccomment">/// Convert the value to bytes
-<a href=#463 id=463 data-nosnippet>463</a> ///
-<a href=#464 id=464 data-nosnippet>464</a> /// See [this spec](https://iceberg.apache.org/spec/#binary-single-value-serialization) for reference.
-<a href=#465 id=465 data-nosnippet>465</a> </span><span class="kw">pub fn </span>to_bytes(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="prelude-ty">Result</span><ByteBuf> {
-<a href=#466 id=466 data-nosnippet>466</a> <span class="kw">let </span>buf = <span class="kw">match </span><span class="kw-2">&</span><span class="self">self</span>.literal {
-<a href=#467 id=467 data-nosnippet>467</a> PrimitiveLiteral::Boolean(val) => {
-<a href=#468 id=468 data-nosnippet>468</a> <span class="kw">if </span><span class="kw-2">*</span>val {
-<a href=#469 id=469 data-nosnippet>469</a> ByteBuf::from([<span class="number">1u8</span>])
-<a href=#470 id=470 data-nosnippet>470</a> } <span class="kw">else </span>{
-<a href=#471 id=471 data-nosnippet>471</a> ByteBuf::from([<span class="number">0u8</span>])
-<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> PrimitiveLiteral::Int(val) => ByteBuf::from(val.to_le_bytes()),
-<a href=#475 id=475 data-nosnippet>475</a> PrimitiveLiteral::Long(val) => ByteBuf::from(val.to_le_bytes()),
-<a href=#476 id=476 data-nosnippet>476</a> PrimitiveLiteral::Float(val) => ByteBuf::from(val.to_le_bytes()),
-<a href=#477 id=477 data-nosnippet>477</a> PrimitiveLiteral::Double(val) => ByteBuf::from(val.to_le_bytes()),
-<a href=#478 id=478 data-nosnippet>478</a> PrimitiveLiteral::String(val) => ByteBuf::from(val.as_bytes()),
-<a href=#479 id=479 data-nosnippet>479</a> PrimitiveLiteral::UInt128(val) => ByteBuf::from(val.to_be_bytes()),
-<a href=#480 id=480 data-nosnippet>480</a> PrimitiveLiteral::Binary(val) => ByteBuf::from(val.as_slice()),
-<a href=#481 id=481 data-nosnippet>481</a> PrimitiveLiteral::Int128(val) => {
-<a href=#482 id=482 data-nosnippet>482</a> <span class="kw">let </span>PrimitiveType::Decimal { precision, .. } = <span class="self">self</span>.r#type <span class="kw">else </span>{
-<a href=#483 id=483 data-nosnippet>483</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#458 id=458 data-nosnippet>458</a> PrimitiveType::Date => PrimitiveLiteral::Int(i32::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>)),
+<a href=#459 id=459 data-nosnippet>459</a> PrimitiveType::Time => PrimitiveLiteral::Long(i64::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>)),
+<a href=#460 id=460 data-nosnippet>460</a> PrimitiveType::Timestamp => {
+<a href=#461 id=461 data-nosnippet>461</a> PrimitiveLiteral::Long(i64::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>))
+<a href=#462 id=462 data-nosnippet>462</a> }
+<a href=#463 id=463 data-nosnippet>463</a> PrimitiveType::Timestamptz => {
+<a href=#464 id=464 data-nosnippet>464</a> PrimitiveLiteral::Long(i64::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>))
+<a href=#465 id=465 data-nosnippet>465</a> }
+<a href=#466 id=466 data-nosnippet>466</a> PrimitiveType::TimestampNs => {
+<a href=#467 id=467 data-nosnippet>467</a> PrimitiveLiteral::Long(i64::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>))
+<a href=#468 id=468 data-nosnippet>468</a> }
+<a href=#469 id=469 data-nosnippet>469</a> PrimitiveType::TimestamptzNs => {
+<a href=#470 id=470 data-nosnippet>470</a> PrimitiveLiteral::Long(i64::from_le_bytes(bytes.try_into()<span class="question-mark">?</span>))
+<a href=#471 id=471 data-nosnippet>471</a> }
+<a href=#472 id=472 data-nosnippet>472</a> PrimitiveType::String => {
+<a href=#473 id=473 data-nosnippet>473</a> PrimitiveLiteral::String(std::str::from_utf8(bytes)<span class="question-mark">?</span>.to_string())
+<a href=#474 id=474 data-nosnippet>474</a> }
+<a href=#475 id=475 data-nosnippet>475</a> PrimitiveType::Uuid => {
+<a href=#476 id=476 data-nosnippet>476</a> PrimitiveLiteral::UInt128(u128::from_be_bytes(bytes.try_into()<span class="question-mark">?</span>))
+<a href=#477 id=477 data-nosnippet>477</a> }
+<a href=#478 id=478 data-nosnippet>478</a> PrimitiveType::Fixed(<span class="kw">_</span>) => PrimitiveLiteral::Binary(Vec::from(bytes)),
+<a href=#479 id=479 data-nosnippet>479</a> PrimitiveType::Binary => PrimitiveLiteral::Binary(Vec::from(bytes)),
+<a href=#480 id=480 data-nosnippet>480</a> PrimitiveType::Decimal { .. } => {
+<a href=#481 id=481 data-nosnippet>481</a> <span class="kw">let </span>unscaled_value = BigInt::from_signed_bytes_be(bytes);
+<a href=#482 id=482 data-nosnippet>482</a> PrimitiveLiteral::Int128(unscaled_value.to_i128().ok_or_else(|| {
+<a href=#483 id=483 data-nosnippet>483</a> Error::new(
<a href=#484 id=484 data-nosnippet>484</a> ErrorKind::DataInvalid,
-<a href=#485 id=485 data-nosnippet>485</a> <span class="macro">format!</span>(
-<a href=#486 id=486 data-nosnippet>486</a> <span class="string">"PrimitiveLiteral Int128 must be PrimitiveType Decimal but got {}"</span>,
-<a href=#487 id=487 data-nosnippet>487</a> <span class="kw-2">&</span><span class="self">self</span>.r#type
-<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>
-<a href=#492 id=492 data-nosnippet>492</a> <span class="comment">// It's required by iceberg spec that we must keep the minimum
-<a href=#493 id=493 data-nosnippet>493</a> // number of bytes for the value
-<a href=#494 id=494 data-nosnippet>494</a> </span><span class="kw">let </span><span class="prelude-val">Ok</span>(required_bytes) = Type::decimal_required_bytes(precision) <span class="kw">else </span>{
-<a href=#495 id=495 data-nosnippet>495</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
-<a href=#496 id=496 data-nosnippet>496</a> ErrorKind::DataInvalid,
-<a href=#497 id=497 data-nosnippet>497</a> <span class="macro">format!</span>(
-<a href=#498 id=498 data-nosnippet>498</a> <span class="string">"PrimitiveType Decimal must has valid precision but got {}"</span>,
-<a href=#499 id=499 data-nosnippet>499</a> precision
-<a href=#500 id=500 data-nosnippet>500</a> ),
-<a href=#501 id=501 data-nosnippet>501</a> ));
-<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="comment">// The primitive literal is unscaled value.
-<a href=#505 id=505 data-nosnippet>505</a> </span><span class="kw">let </span>unscaled_value = BigInt::from(<span class="kw-2">*</span>val);
-<a href=#506 id=506 data-nosnippet>506</a> <span class="comment">// Convert into two's-complement byte representation of the BigInt
-<a href=#507 id=507 data-nosnippet>507</a> // in big-endian byte order.
-<a href=#508 id=508 data-nosnippet>508</a> </span><span class="kw">let </span><span class="kw-2">mut </span>bytes = unscaled_value.to_signed_bytes_be();
-<a href=#509 id=509 data-nosnippet>509</a> <span class="comment">// Truncate with required bytes to make sure.
-<a href=#510 id=510 data-nosnippet>510</a> </span>bytes.truncate(required_bytes <span class="kw">as </span>usize);
-<a href=#511 id=511 data-nosnippet>511</a>
-<a href=#512 id=512 data-nosnippet>512</a> ByteBuf::from(bytes)
-<a href=#513 id=513 data-nosnippet>513</a> }
-<a href=#514 id=514 data-nosnippet>514</a> PrimitiveLiteral::AboveMax | PrimitiveLiteral::BelowMin => {
-<a href=#515 id=515 data-nosnippet>515</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
-<a href=#516 id=516 data-nosnippet>516</a> ErrorKind::DataInvalid,
-<a href=#517 id=517 data-nosnippet>517</a> <span class="string">"Cannot convert AboveMax or BelowMin to bytes"</span>.to_string(),
-<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> };
-<a href=#521 id=521 data-nosnippet>521</a>
-<a href=#522 id=522 data-nosnippet>522</a> <span class="prelude-val">Ok</span>(buf)
-<a href=#523 id=523 data-nosnippet>523</a> }
-<a href=#524 id=524 data-nosnippet>524</a>
-<a href=#525 id=525 data-nosnippet>525</a> <span class="doccomment">/// Creates a boolean value.
-<a href=#526 id=526 data-nosnippet>526</a> ///
-<a href=#527 id=527 data-nosnippet>527</a> /// Example:
-<a href=#528 id=528 data-nosnippet>528</a> /// ```rust
-<a href=#529 id=529 data-nosnippet>529</a> /// use iceberg::spec::{Datum, Literal, PrimitiveLiteral};
-<a href=#530 id=530 data-nosnippet>530</a> /// let t = Datum::bool(true);
-<a href=#531 id=531 data-nosnippet>531</a> ///
-<a href=#532 id=532 data-nosnippet>532</a> /// assert_eq!(format!("{}", t), "true".to_string());
-<a href=#533 id=533 data-nosnippet>533</a> /// assert_eq!(
-<a href=#534 id=534 data-nosnippet>534</a> /// Literal::from(t),
-<a href=#535 id=535 data-nosnippet>535</a> /// Literal::Primitive(PrimitiveLiteral::Boolean(true))
-<a href=#536 id=536 data-nosnippet>536</a> /// );
-<a href=#537 id=537 data-nosnippet>537</a> /// ```
-<a href=#538 id=538 data-nosnippet>538</a> </span><span class="kw">pub fn </span>bool<T: Into<bool>>(t: T) -> <span class="self">Self </span>{
-<a href=#539 id=539 data-nosnippet>539</a> <span class="self">Self </span>{
-<a href=#540 id=540 data-nosnippet>540</a> r#type: PrimitiveType::Boolean,
-<a href=#541 id=541 data-nosnippet>541</a> literal: PrimitiveLiteral::Boolean(t.into()),
-<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="doccomment">/// Creates a boolean value from string.
-<a href=#546 id=546 data-nosnippet>546</a> /// See [Parse bool from str](https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromStr-for-bool) for reference.
-<a href=#547 id=547 data-nosnippet>547</a> ///
-<a href=#548 id=548 data-nosnippet>548</a> /// Example:
-<a href=#549 id=549 data-nosnippet>549</a> /// ```rust
-<a href=#550 id=550 data-nosnippet>550</a> /// use iceberg::spec::{Datum, Literal, PrimitiveLiteral};
-<a href=#551 id=551 data-nosnippet>551</a> /// let t = Datum::bool_from_str("false").unwrap();
-<a href=#552 id=552 data-nosnippet>552</a> ///
-<a href=#553 id=553 data-nosnippet>553</a> /// assert_eq!(&format!("{}", t), "false");
-<a href=#554 id=554 data-nosnippet>554</a> /// assert_eq!(
-<a href=#555 id=555 data-nosnippet>555</a> /// Literal::Primitive(PrimitiveLiteral::Boolean(false)),
-<a href=#556 id=556 data-nosnippet>556</a> /// t.into()
-<a href=#557 id=557 data-nosnippet>557</a> /// );
-<a href=#558 id=558 data-nosnippet>558</a> /// ```
-<a href=#559 id=559 data-nosnippet>559</a> </span><span class="kw">pub fn </span>bool_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#560 id=560 data-nosnippet>560</a> <span class="kw">let </span>v = s.as_ref().parse::<bool>().map_err(|e| {
-<a href=#561 id=561 data-nosnippet>561</a> Error::new(ErrorKind::DataInvalid, <span class="string">"Can't parse string to bool."</span>).with_source(e)
-<a href=#562 id=562 data-nosnippet>562</a> })<span class="question-mark">?</span>;
-<a href=#563 id=563 data-nosnippet>563</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::bool(v))
-<a href=#564 id=564 data-nosnippet>564</a> }
-<a href=#565 id=565 data-nosnippet>565</a>
-<a href=#566 id=566 data-nosnippet>566</a> <span class="doccomment">/// Creates an 32bit integer.
-<a href=#567 id=567 data-nosnippet>567</a> ///
-<a href=#568 id=568 data-nosnippet>568</a> /// Example:
-<a href=#569 id=569 data-nosnippet>569</a> /// ```rust
-<a href=#570 id=570 data-nosnippet>570</a> /// use iceberg::spec::{Datum, Literal, PrimitiveLiteral};
-<a href=#571 id=571 data-nosnippet>571</a> /// let t = Datum::int(23i8);
-<a href=#572 id=572 data-nosnippet>572</a> ///
-<a href=#573 id=573 data-nosnippet>573</a> /// assert_eq!(&format!("{}", t), "23");
-<a href=#574 id=574 data-nosnippet>574</a> /// assert_eq!(Literal::Primitive(PrimitiveLiteral::Int(23)), t.into());
-<a href=#575 id=575 data-nosnippet>575</a> /// ```
-<a href=#576 id=576 data-nosnippet>576</a> </span><span class="kw">pub fn </span>int<T: Into<i32>>(t: T) -> <span class="self">Self </span>{
-<a href=#577 id=577 data-nosnippet>577</a> <span class="self">Self </span>{
-<a href=#578 id=578 data-nosnippet>578</a> r#type: PrimitiveType::Int,
-<a href=#579 id=579 data-nosnippet>579</a> literal: PrimitiveLiteral::Int(t.into()),
-<a href=#580 id=580 data-nosnippet>580</a> }
-<a href=#581 id=581 data-nosnippet>581</a> }
-<a href=#582 id=582 data-nosnippet>582</a>
-<a href=#583 id=583 data-nosnippet>583</a> <span class="doccomment">/// Creates an 64bit integer.
-<a href=#584 id=584 data-nosnippet>584</a> ///
-<a href=#585 id=585 data-nosnippet>585</a> /// Example:
-<a href=#586 id=586 data-nosnippet>586</a> /// ```rust
-<a href=#587 id=587 data-nosnippet>587</a> /// use iceberg::spec::{Datum, Literal, PrimitiveLiteral};
-<a href=#588 id=588 data-nosnippet>588</a> /// let t = Datum::long(24i8);
-<a href=#589 id=589 data-nosnippet>589</a> ///
-<a href=#590 id=590 data-nosnippet>590</a> /// assert_eq!(&format!("{t}"), "24");
-<a href=#591 id=591 data-nosnippet>591</a> /// assert_eq!(Literal::Primitive(PrimitiveLiteral::Long(24)), t.into());
-<a href=#592 id=592 data-nosnippet>592</a> /// ```
-<a href=#593 id=593 data-nosnippet>593</a> </span><span class="kw">pub fn </span>long<T: Into<i64>>(t: T) -> <span class="self">Self </span>{
-<a href=#594 id=594 data-nosnippet>594</a> <span class="self">Self </span>{
-<a href=#595 id=595 data-nosnippet>595</a> r#type: PrimitiveType::Long,
-<a href=#596 id=596 data-nosnippet>596</a> literal: PrimitiveLiteral::Long(t.into()),
-<a href=#597 id=597 data-nosnippet>597</a> }
-<a href=#598 id=598 data-nosnippet>598</a> }
-<a href=#599 id=599 data-nosnippet>599</a>
-<a href=#600 id=600 data-nosnippet>600</a> <span class="doccomment">/// Creates an 32bit floating point number.
-<a href=#601 id=601 data-nosnippet>601</a> ///
-<a href=#602 id=602 data-nosnippet>602</a> /// Example:
-<a href=#603 id=603 data-nosnippet>603</a> /// ```rust
-<a href=#604 id=604 data-nosnippet>604</a> /// use iceberg::spec::{Datum, Literal, PrimitiveLiteral};
-<a href=#605 id=605 data-nosnippet>605</a> /// use ordered_float::OrderedFloat;
-<a href=#606 id=606 data-nosnippet>606</a> /// let t = Datum::float(32.1f32);
-<a href=#607 id=607 data-nosnippet>607</a> ///
-<a href=#608 id=608 data-nosnippet>608</a> /// assert_eq!(&format!("{t}"), "32.1");
-<a href=#609 id=609 data-nosnippet>609</a> /// assert_eq!(
-<a href=#610 id=610 data-nosnippet>610</a> /// Literal::Primitive(PrimitiveLiteral::Float(OrderedFloat(32.1))),
-<a href=#611 id=611 data-nosnippet>611</a> /// t.into()
-<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> </span><span class="kw">pub fn </span>float<T: Into<f32>>(t: T) -> <span class="self">Self </span>{
-<a href=#615 id=615 data-nosnippet>615</a> <span class="self">Self </span>{
-<a href=#616 id=616 data-nosnippet>616</a> r#type: PrimitiveType::Float,
-<a href=#617 id=617 data-nosnippet>617</a> literal: PrimitiveLiteral::Float(OrderedFloat(t.into())),
-<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>
-<a href=#621 id=621 data-nosnippet>621</a> <span class="doccomment">/// Creates an 64bit floating point number.
-<a href=#622 id=622 data-nosnippet>622</a> ///
-<a href=#623 id=623 data-nosnippet>623</a> /// Example:
-<a href=#624 id=624 data-nosnippet>624</a> /// ```rust
-<a href=#625 id=625 data-nosnippet>625</a> /// use iceberg::spec::{Datum, Literal, PrimitiveLiteral};
-<a href=#626 id=626 data-nosnippet>626</a> /// use ordered_float::OrderedFloat;
-<a href=#627 id=627 data-nosnippet>627</a> /// let t = Datum::double(32.1f64);
-<a href=#628 id=628 data-nosnippet>628</a> ///
-<a href=#629 id=629 data-nosnippet>629</a> /// assert_eq!(&format!("{t}"), "32.1");
-<a href=#630 id=630 data-nosnippet>630</a> /// assert_eq!(
-<a href=#631 id=631 data-nosnippet>631</a> /// Literal::Primitive(PrimitiveLiteral::Double(OrderedFloat(32.1))),
-<a href=#632 id=632 data-nosnippet>632</a> /// t.into()
-<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><span class="kw">pub fn </span>double<T: Into<f64>>(t: T) -> <span class="self">Self </span>{
-<a href=#636 id=636 data-nosnippet>636</a> <span class="self">Self </span>{
-<a href=#637 id=637 data-nosnippet>637</a> r#type: PrimitiveType::Double,
-<a href=#638 id=638 data-nosnippet>638</a> literal: PrimitiveLiteral::Double(OrderedFloat(t.into())),
-<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> <span class="doccomment">/// Creates date literal from number of days from unix epoch directly.
-<a href=#643 id=643 data-nosnippet>643</a> ///
-<a href=#644 id=644 data-nosnippet>644</a> /// Example:
-<a href=#645 id=645 data-nosnippet>645</a> /// ```rust
-<a href=#646 id=646 data-nosnippet>646</a> /// use iceberg::spec::{Datum, Literal, PrimitiveLiteral};
-<a href=#647 id=647 data-nosnippet>647</a> /// // 2 days after 1970-01-01
-<a href=#648 id=648 data-nosnippet>648</a> /// let t = Datum::date(2);
-<a href=#649 id=649 data-nosnippet>649</a> ///
-<a href=#650 id=650 data-nosnippet>650</a> /// assert_eq!(&format!("{t}"), "1970-01-03");
-<a href=#651 id=651 data-nosnippet>651</a> /// assert_eq!(Literal::Primitive(PrimitiveLiteral::Int(2)), t.into());
-<a href=#652 id=652 data-nosnippet>652</a> /// ```
-<a href=#653 id=653 data-nosnippet>653</a> </span><span class="kw">pub fn </span>date(days: i32) -> <span class="self">Self </span>{
-<a href=#654 id=654 data-nosnippet>654</a> <span class="self">Self </span>{
-<a href=#655 id=655 data-nosnippet>655</a> r#type: PrimitiveType::Date,
-<a href=#656 id=656 data-nosnippet>656</a> literal: PrimitiveLiteral::Int(days),
-<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>
-<a href=#660 id=660 data-nosnippet>660</a> <span class="doccomment">/// Creates date literal in `%Y-%m-%d` format, assume in utc timezone.
-<a href=#661 id=661 data-nosnippet>661</a> ///
-<a href=#662 id=662 data-nosnippet>662</a> /// See [`NaiveDate::from_str`].
-<a href=#663 id=663 data-nosnippet>663</a> ///
-<a href=#664 id=664 data-nosnippet>664</a> /// Example
-<a href=#665 id=665 data-nosnippet>665</a> /// ```rust
-<a href=#666 id=666 data-nosnippet>666</a> /// use iceberg::spec::{Datum, Literal};
-<a href=#667 id=667 data-nosnippet>667</a> /// let t = Datum::date_from_str("1970-01-05").unwrap();
-<a href=#668 id=668 data-nosnippet>668</a> ///
-<a href=#669 id=669 data-nosnippet>669</a> /// assert_eq!(&format!("{t}"), "1970-01-05");
-<a href=#670 id=670 data-nosnippet>670</a> /// assert_eq!(Literal::date(4), t.into());
-<a href=#671 id=671 data-nosnippet>671</a> /// ```
-<a href=#672 id=672 data-nosnippet>672</a> </span><span class="kw">pub fn </span>date_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#673 id=673 data-nosnippet>673</a> <span class="kw">let </span>t = s.as_ref().parse::<NaiveDate>().map_err(|e| {
-<a href=#674 id=674 data-nosnippet>674</a> Error::new(
-<a href=#675 id=675 data-nosnippet>675</a> ErrorKind::DataInvalid,
-<a href=#676 id=676 data-nosnippet>676</a> <span class="macro">format!</span>(<span class="string">"Can't parse date from string: {}"</span>, s.as_ref()),
-<a href=#677 id=677 data-nosnippet>677</a> )
-<a href=#678 id=678 data-nosnippet>678</a> .with_source(e)
-<a href=#679 id=679 data-nosnippet>679</a> })<span class="question-mark">?</span>;
-<a href=#680 id=680 data-nosnippet>680</a>
-<a href=#681 id=681 data-nosnippet>681</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::date(date_from_naive_date(t)))
-<a href=#682 id=682 data-nosnippet>682</a> }
-<a href=#683 id=683 data-nosnippet>683</a>
-<a href=#684 id=684 data-nosnippet>684</a> <span class="doccomment">/// Create date literal from calendar date (year, month and day).
-<a href=#685 id=685 data-nosnippet>685</a> ///
-<a href=#686 id=686 data-nosnippet>686</a> /// See [`NaiveDate::from_ymd_opt`].
-<a href=#687 id=687 data-nosnippet>687</a> ///
-<a href=#688 id=688 data-nosnippet>688</a> /// Example:
-<a href=#689 id=689 data-nosnippet>689</a> ///
-<a href=#690 id=690 data-nosnippet>690</a> ///```rust
-<a href=#691 id=691 data-nosnippet>691</a> /// use iceberg::spec::{Datum, Literal};
-<a href=#692 id=692 data-nosnippet>692</a> /// let t = Datum::date_from_ymd(1970, 1, 5).unwrap();
-<a href=#693 id=693 data-nosnippet>693</a> ///
-<a href=#694 id=694 data-nosnippet>694</a> /// assert_eq!(&format!("{t}"), "1970-01-05");
-<a href=#695 id=695 data-nosnippet>695</a> /// assert_eq!(Literal::date(4), t.into());
-<a href=#696 id=696 data-nosnippet>696</a> /// ```
-<a href=#697 id=697 data-nosnippet>697</a> </span><span class="kw">pub fn </span>date_from_ymd(year: i32, month: u32, day: u32) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#698 id=698 data-nosnippet>698</a> <span class="kw">let </span>t = NaiveDate::from_ymd_opt(year, month, day).ok_or_else(|| {
-<a href=#699 id=699 data-nosnippet>699</a> Error::new(
-<a href=#700 id=700 data-nosnippet>700</a> ErrorKind::DataInvalid,
-<a href=#701 id=701 data-nosnippet>701</a> <span class="macro">format!</span>(<span class="string">"Can't create date from year: {year}, month: {month}, day: {day}"</span>),
-<a href=#702 id=702 data-nosnippet>702</a> )
-<a href=#703 id=703 data-nosnippet>703</a> })<span class="question-mark">?</span>;
-<a href=#704 id=704 data-nosnippet>704</a>
-<a href=#705 id=705 data-nosnippet>705</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::date(date_from_naive_date(t)))
-<a href=#706 id=706 data-nosnippet>706</a> }
-<a href=#707 id=707 data-nosnippet>707</a>
-<a href=#708 id=708 data-nosnippet>708</a> <span class="doccomment">/// Creates time literal in microseconds directly.
-<a href=#709 id=709 data-nosnippet>709</a> ///
-<a href=#710 id=710 data-nosnippet>710</a> /// It will return error when it's negative or too large to fit in 24 hours.
-<a href=#711 id=711 data-nosnippet>711</a> ///
-<a href=#712 id=712 data-nosnippet>712</a> /// Example:
-<a href=#713 id=713 data-nosnippet>713</a> ///
-<a href=#714 id=714 data-nosnippet>714</a> /// ```rust
-<a href=#715 id=715 data-nosnippet>715</a> /// use iceberg::spec::{Datum, Literal};
-<a href=#716 id=716 data-nosnippet>716</a> /// let micro_secs = {
-<a href=#717 id=717 data-nosnippet>717</a> /// 1 * 3600 * 1_000_000 + // 1 hour
-<a href=#718 id=718 data-nosnippet>718</a> /// 2 * 60 * 1_000_000 + // 2 minutes
-<a href=#719 id=719 data-nosnippet>719</a> /// 1 * 1_000_000 + // 1 second
-<a href=#720 id=720 data-nosnippet>720</a> /// 888999 // microseconds
-<a href=#721 id=721 data-nosnippet>721</a> /// };
-<a href=#722 id=722 data-nosnippet>722</a> ///
-<a href=#723 id=723 data-nosnippet>723</a> /// let t = Datum::time_micros(micro_secs).unwrap();
+<a href=#485 id=485 data-nosnippet>485</a> <span class="macro">format!</span>(<span class="string">"Can't convert bytes to i128: {:?}"</span>, bytes),
+<a href=#486 id=486 data-nosnippet>486</a> )
+<a href=#487 id=487 data-nosnippet>487</a> })<span class="question-mark">?</span>)
+<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="prelude-val">Ok</span>(Datum::new(data_type, literal))
+<a href=#491 id=491 data-nosnippet>491</a> }
+<a href=#492 id=492 data-nosnippet>492</a>
+<a href=#493 id=493 data-nosnippet>493</a> <span class="doccomment">/// Convert the value to bytes
+<a href=#494 id=494 data-nosnippet>494</a> ///
+<a href=#495 id=495 data-nosnippet>495</a> /// See [this spec](https://iceberg.apache.org/spec/#binary-single-value-serialization) for reference.
+<a href=#496 id=496 data-nosnippet>496</a> </span><span class="kw">pub fn </span>to_bytes(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="prelude-ty">Result</span><ByteBuf> {
+<a href=#497 id=497 data-nosnippet>497</a> <span class="kw">let </span>buf = <span class="kw">match </span><span class="kw-2">&</span><span class="self">self</span>.literal {
+<a href=#498 id=498 data-nosnippet>498</a> PrimitiveLiteral::Boolean(val) => {
+<a href=#499 id=499 data-nosnippet>499</a> <span class="kw">if </span><span class="kw-2">*</span>val {
+<a href=#500 id=500 data-nosnippet>500</a> ByteBuf::from([<span class="number">1u8</span>])
+<a href=#501 id=501 data-nosnippet>501</a> } <span class="kw">else </span>{
+<a href=#502 id=502 data-nosnippet>502</a> ByteBuf::from([<span class="number">0u8</span>])
+<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> PrimitiveLiteral::Int(val) => ByteBuf::from(val.to_le_bytes()),
+<a href=#506 id=506 data-nosnippet>506</a> PrimitiveLiteral::Long(val) => ByteBuf::from(val.to_le_bytes()),
+<a href=#507 id=507 data-nosnippet>507</a> PrimitiveLiteral::Float(val) => ByteBuf::from(val.to_le_bytes()),
+<a href=#508 id=508 data-nosnippet>508</a> PrimitiveLiteral::Double(val) => ByteBuf::from(val.to_le_bytes()),
+<a href=#509 id=509 data-nosnippet>509</a> PrimitiveLiteral::String(val) => ByteBuf::from(val.as_bytes()),
+<a href=#510 id=510 data-nosnippet>510</a> PrimitiveLiteral::UInt128(val) => ByteBuf::from(val.to_be_bytes()),
+<a href=#511 id=511 data-nosnippet>511</a> PrimitiveLiteral::Binary(val) => ByteBuf::from(val.as_slice()),
+<a href=#512 id=512 data-nosnippet>512</a> PrimitiveLiteral::Int128(val) => {
+<a href=#513 id=513 data-nosnippet>513</a> <span class="kw">let </span>PrimitiveType::Decimal { precision, .. } = <span class="self">self</span>.r#type <span class="kw">else </span>{
+<a href=#514 id=514 data-nosnippet>514</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#515 id=515 data-nosnippet>515</a> ErrorKind::DataInvalid,
+<a href=#516 id=516 data-nosnippet>516</a> <span class="macro">format!</span>(
+<a href=#517 id=517 data-nosnippet>517</a> <span class="string">"PrimitiveLiteral Int128 must be PrimitiveType Decimal but got {}"</span>,
+<a href=#518 id=518 data-nosnippet>518</a> <span class="kw-2">&</span><span class="self">self</span>.r#type
+<a href=#519 id=519 data-nosnippet>519</a> ),
+<a href=#520 id=520 data-nosnippet>520</a> ));
+<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="comment">// It's required by iceberg spec that we must keep the minimum
+<a href=#524 id=524 data-nosnippet>524</a> // number of bytes for the value
+<a href=#525 id=525 data-nosnippet>525</a> </span><span class="kw">let </span><span class="prelude-val">Ok</span>(required_bytes) = Type::decimal_required_bytes(precision) <span class="kw">else </span>{
+<a href=#526 id=526 data-nosnippet>526</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#527 id=527 data-nosnippet>527</a> ErrorKind::DataInvalid,
+<a href=#528 id=528 data-nosnippet>528</a> <span class="macro">format!</span>(
+<a href=#529 id=529 data-nosnippet>529</a> <span class="string">"PrimitiveType Decimal must has valid precision but got {}"</span>,
+<a href=#530 id=530 data-nosnippet>530</a> precision
+<a href=#531 id=531 data-nosnippet>531</a> ),
+<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="comment">// The primitive literal is unscaled value.
+<a href=#536 id=536 data-nosnippet>536</a> </span><span class="kw">let </span>unscaled_value = BigInt::from(<span class="kw-2">*</span>val);
+<a href=#537 id=537 data-nosnippet>537</a> <span class="comment">// Convert into two's-complement byte representation of the BigInt
+<a href=#538 id=538 data-nosnippet>538</a> // in big-endian byte order.
+<a href=#539 id=539 data-nosnippet>539</a> </span><span class="kw">let </span><span class="kw-2">mut </span>bytes = unscaled_value.to_signed_bytes_be();
+<a href=#540 id=540 data-nosnippet>540</a> <span class="comment">// Truncate with required bytes to make sure.
+<a href=#541 id=541 data-nosnippet>541</a> </span>bytes.truncate(required_bytes <span class="kw">as </span>usize);
+<a href=#542 id=542 data-nosnippet>542</a>
+<a href=#543 id=543 data-nosnippet>543</a> ByteBuf::from(bytes)
+<a href=#544 id=544 data-nosnippet>544</a> }
+<a href=#545 id=545 data-nosnippet>545</a> PrimitiveLiteral::AboveMax | PrimitiveLiteral::BelowMin => {
+<a href=#546 id=546 data-nosnippet>546</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#547 id=547 data-nosnippet>547</a> ErrorKind::DataInvalid,
+<a href=#548 id=548 data-nosnippet>548</a> <span class="string">"Cannot convert AboveMax or BelowMin to bytes"</span>.to_string(),
+<a href=#549 id=549 data-nosnippet>549</a> ));
+<a href=#550 id=550 data-nosnippet>550</a> }
+<a href=#551 id=551 data-nosnippet>551</a> };
+<a href=#552 id=552 data-nosnippet>552</a>
+<a href=#553 id=553 data-nosnippet>553</a> <span class="prelude-val">Ok</span>(buf)
+<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="doccomment">/// Creates a boolean value.
+<a href=#557 id=557 data-nosnippet>557</a> ///
+<a href=#558 id=558 data-nosnippet>558</a> /// Example:
+<a href=#559 id=559 data-nosnippet>559</a> /// ```rust
+<a href=#560 id=560 data-nosnippet>560</a> /// use iceberg::spec::{Datum, Literal, PrimitiveLiteral};
+<a href=#561 id=561 data-nosnippet>561</a> /// let t = Datum::bool(true);
+<a href=#562 id=562 data-nosnippet>562</a> ///
+<a href=#563 id=563 data-nosnippet>563</a> /// assert_eq!(format!("{}", t), "true".to_string());
+<a href=#564 id=564 data-nosnippet>564</a> /// assert_eq!(
+<a href=#565 id=565 data-nosnippet>565</a> /// Literal::from(t),
+<a href=#566 id=566 data-nosnippet>566</a> /// Literal::Primitive(PrimitiveLiteral::Boolean(true))
+<a href=#567 id=567 data-nosnippet>567</a> /// );
+<a href=#568 id=568 data-nosnippet>568</a> /// ```
+<a href=#569 id=569 data-nosnippet>569</a> </span><span class="kw">pub fn </span>bool<T: Into<bool>>(t: T) -> <span class="self">Self </span>{
+<a href=#570 id=570 data-nosnippet>570</a> <span class="self">Self </span>{
+<a href=#571 id=571 data-nosnippet>571</a> r#type: PrimitiveType::Boolean,
+<a href=#572 id=572 data-nosnippet>572</a> literal: PrimitiveLiteral::Boolean(t.into()),
+<a href=#573 id=573 data-nosnippet>573</a> }
+<a href=#574 id=574 data-nosnippet>574</a> }
+<a href=#575 id=575 data-nosnippet>575</a>
+<a href=#576 id=576 data-nosnippet>576</a> <span class="doccomment">/// Creates a boolean value from string.
+<a href=#577 id=577 data-nosnippet>577</a> /// See [Parse bool from str](https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromStr-for-bool) for reference.
+<a href=#578 id=578 data-nosnippet>578</a> ///
+<a href=#579 id=579 data-nosnippet>579</a> /// Example:
+<a href=#580 id=580 data-nosnippet>580</a> /// ```rust
+<a href=#581 id=581 data-nosnippet>581</a> /// use iceberg::spec::{Datum, Literal, PrimitiveLiteral};
+<a href=#582 id=582 data-nosnippet>582</a> /// let t = Datum::bool_from_str("false").unwrap();
+<a href=#583 id=583 data-nosnippet>583</a> ///
+<a href=#584 id=584 data-nosnippet>584</a> /// assert_eq!(&format!("{}", t), "false");
+<a href=#585 id=585 data-nosnippet>585</a> /// assert_eq!(
+<a href=#586 id=586 data-nosnippet>586</a> /// Literal::Primitive(PrimitiveLiteral::Boolean(false)),
+<a href=#587 id=587 data-nosnippet>587</a> /// t.into()
+<a href=#588 id=588 data-nosnippet>588</a> /// );
+<a href=#589 id=589 data-nosnippet>589</a> /// ```
+<a href=#590 id=590 data-nosnippet>590</a> </span><span class="kw">pub fn </span>bool_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#591 id=591 data-nosnippet>591</a> <span class="kw">let </span>v = s.as_ref().parse::<bool>().map_err(|e| {
+<a href=#592 id=592 data-nosnippet>592</a> Error::new(ErrorKind::DataInvalid, <span class="string">"Can't parse string to bool."</span>).with_source(e)
+<a href=#593 id=593 data-nosnippet>593</a> })<span class="question-mark">?</span>;
+<a href=#594 id=594 data-nosnippet>594</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::bool(v))
+<a href=#595 id=595 data-nosnippet>595</a> }
+<a href=#596 id=596 data-nosnippet>596</a>
+<a href=#597 id=597 data-nosnippet>597</a> <span class="doccomment">/// Creates an 32bit integer.
+<a href=#598 id=598 data-nosnippet>598</a> ///
+<a href=#599 id=599 data-nosnippet>599</a> /// Example:
+<a href=#600 id=600 data-nosnippet>600</a> /// ```rust
+<a href=#601 id=601 data-nosnippet>601</a> /// use iceberg::spec::{Datum, Literal, PrimitiveLiteral};
+<a href=#602 id=602 data-nosnippet>602</a> /// let t = Datum::int(23i8);
+<a href=#603 id=603 data-nosnippet>603</a> ///
+<a href=#604 id=604 data-nosnippet>604</a> /// assert_eq!(&format!("{}", t), "23");
+<a href=#605 id=605 data-nosnippet>605</a> /// assert_eq!(Literal::Primitive(PrimitiveLiteral::Int(23)), t.into());
+<a href=#606 id=606 data-nosnippet>606</a> /// ```
+<a href=#607 id=607 data-nosnippet>607</a> </span><span class="kw">pub fn </span>int<T: Into<i32>>(t: T) -> <span class="self">Self </span>{
+<a href=#608 id=608 data-nosnippet>608</a> <span class="self">Self </span>{
+<a href=#609 id=609 data-nosnippet>609</a> r#type: PrimitiveType::Int,
+<a href=#610 id=610 data-nosnippet>610</a> literal: PrimitiveLiteral::Int(t.into()),
+<a href=#611 id=611 data-nosnippet>611</a> }
+<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> <span class="doccomment">/// Creates an 64bit integer.
+<a href=#615 id=615 data-nosnippet>615</a> ///
+<a href=#616 id=616 data-nosnippet>616</a> /// Example:
+<a href=#617 id=617 data-nosnippet>617</a> /// ```rust
+<a href=#618 id=618 data-nosnippet>618</a> /// use iceberg::spec::{Datum, Literal, PrimitiveLiteral};
+<a href=#619 id=619 data-nosnippet>619</a> /// let t = Datum::long(24i8);
+<a href=#620 id=620 data-nosnippet>620</a> ///
+<a href=#621 id=621 data-nosnippet>621</a> /// assert_eq!(&format!("{t}"), "24");
+<a href=#622 id=622 data-nosnippet>622</a> /// assert_eq!(Literal::Primitive(PrimitiveLiteral::Long(24)), t.into());
+<a href=#623 id=623 data-nosnippet>623</a> /// ```
+<a href=#624 id=624 data-nosnippet>624</a> </span><span class="kw">pub fn </span>long<T: Into<i64>>(t: T) -> <span class="self">Self </span>{
+<a href=#625 id=625 data-nosnippet>625</a> <span class="self">Self </span>{
+<a href=#626 id=626 data-nosnippet>626</a> r#type: PrimitiveType::Long,
+<a href=#627 id=627 data-nosnippet>627</a> literal: PrimitiveLiteral::Long(t.into()),
+<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> <span class="doccomment">/// Creates an 32bit floating point number.
+<a href=#632 id=632 data-nosnippet>632</a> ///
+<a href=#633 id=633 data-nosnippet>633</a> /// Example:
+<a href=#634 id=634 data-nosnippet>634</a> /// ```rust
+<a href=#635 id=635 data-nosnippet>635</a> /// use iceberg::spec::{Datum, Literal, PrimitiveLiteral};
+<a href=#636 id=636 data-nosnippet>636</a> /// use ordered_float::OrderedFloat;
+<a href=#637 id=637 data-nosnippet>637</a> /// let t = Datum::float(32.1f32);
+<a href=#638 id=638 data-nosnippet>638</a> ///
+<a href=#639 id=639 data-nosnippet>639</a> /// assert_eq!(&format!("{t}"), "32.1");
+<a href=#640 id=640 data-nosnippet>640</a> /// assert_eq!(
+<a href=#641 id=641 data-nosnippet>641</a> /// Literal::Primitive(PrimitiveLiteral::Float(OrderedFloat(32.1))),
+<a href=#642 id=642 data-nosnippet>642</a> /// t.into()
+<a href=#643 id=643 data-nosnippet>643</a> /// );
+<a href=#644 id=644 data-nosnippet>644</a> /// ```
+<a href=#645 id=645 data-nosnippet>645</a> </span><span class="kw">pub fn </span>float<T: Into<f32>>(t: T) -> <span class="self">Self </span>{
+<a href=#646 id=646 data-nosnippet>646</a> <span class="self">Self </span>{
+<a href=#647 id=647 data-nosnippet>647</a> r#type: PrimitiveType::Float,
+<a href=#648 id=648 data-nosnippet>648</a> literal: PrimitiveLiteral::Float(OrderedFloat(t.into())),
+<a href=#649 id=649 data-nosnippet>649</a> }
+<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> <span class="doccomment">/// Creates an 64bit floating point number.
+<a href=#653 id=653 data-nosnippet>653</a> ///
+<a href=#654 id=654 data-nosnippet>654</a> /// Example:
+<a href=#655 id=655 data-nosnippet>655</a> /// ```rust
+<a href=#656 id=656 data-nosnippet>656</a> /// use iceberg::spec::{Datum, Literal, PrimitiveLiteral};
+<a href=#657 id=657 data-nosnippet>657</a> /// use ordered_float::OrderedFloat;
+<a href=#658 id=658 data-nosnippet>658</a> /// let t = Datum::double(32.1f64);
+<a href=#659 id=659 data-nosnippet>659</a> ///
+<a href=#660 id=660 data-nosnippet>660</a> /// assert_eq!(&format!("{t}"), "32.1");
+<a href=#661 id=661 data-nosnippet>661</a> /// assert_eq!(
+<a href=#662 id=662 data-nosnippet>662</a> /// Literal::Primitive(PrimitiveLiteral::Double(OrderedFloat(32.1))),
+<a href=#663 id=663 data-nosnippet>663</a> /// t.into()
+<a href=#664 id=664 data-nosnippet>664</a> /// );
+<a href=#665 id=665 data-nosnippet>665</a> /// ```
+<a href=#666 id=666 data-nosnippet>666</a> </span><span class="kw">pub fn </span>double<T: Into<f64>>(t: T) -> <span class="self">Self </span>{
+<a href=#667 id=667 data-nosnippet>667</a> <span class="self">Self </span>{
+<a href=#668 id=668 data-nosnippet>668</a> r#type: PrimitiveType::Double,
+<a href=#669 id=669 data-nosnippet>669</a> literal: PrimitiveLiteral::Double(OrderedFloat(t.into())),
+<a href=#670 id=670 data-nosnippet>670</a> }
+<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">/// Creates date literal from number of days from unix epoch directly.
+<a href=#674 id=674 data-nosnippet>674</a> ///
+<a href=#675 id=675 data-nosnippet>675</a> /// Example:
+<a href=#676 id=676 data-nosnippet>676</a> /// ```rust
+<a href=#677 id=677 data-nosnippet>677</a> /// use iceberg::spec::{Datum, Literal, PrimitiveLiteral};
+<a href=#678 id=678 data-nosnippet>678</a> /// // 2 days after 1970-01-01
+<a href=#679 id=679 data-nosnippet>679</a> /// let t = Datum::date(2);
+<a href=#680 id=680 data-nosnippet>680</a> ///
+<a href=#681 id=681 data-nosnippet>681</a> /// assert_eq!(&format!("{t}"), "1970-01-03");
+<a href=#682 id=682 data-nosnippet>682</a> /// assert_eq!(Literal::Primitive(PrimitiveLiteral::Int(2)), t.into());
+<a href=#683 id=683 data-nosnippet>683</a> /// ```
+<a href=#684 id=684 data-nosnippet>684</a> </span><span class="kw">pub fn </span>date(days: i32) -> <span class="self">Self </span>{
+<a href=#685 id=685 data-nosnippet>685</a> <span class="self">Self </span>{
+<a href=#686 id=686 data-nosnippet>686</a> r#type: PrimitiveType::Date,
+<a href=#687 id=687 data-nosnippet>687</a> literal: PrimitiveLiteral::Int(days),
+<a href=#688 id=688 data-nosnippet>688</a> }
+<a href=#689 id=689 data-nosnippet>689</a> }
+<a href=#690 id=690 data-nosnippet>690</a>
+<a href=#691 id=691 data-nosnippet>691</a> <span class="doccomment">/// Creates date literal in `%Y-%m-%d` format, assume in utc timezone.
+<a href=#692 id=692 data-nosnippet>692</a> ///
+<a href=#693 id=693 data-nosnippet>693</a> /// See [`NaiveDate::from_str`].
+<a href=#694 id=694 data-nosnippet>694</a> ///
+<a href=#695 id=695 data-nosnippet>695</a> /// Example
+<a href=#696 id=696 data-nosnippet>696</a> /// ```rust
+<a href=#697 id=697 data-nosnippet>697</a> /// use iceberg::spec::{Datum, Literal};
+<a href=#698 id=698 data-nosnippet>698</a> /// let t = Datum::date_from_str("1970-01-05").unwrap();
+<a href=#699 id=699 data-nosnippet>699</a> ///
+<a href=#700 id=700 data-nosnippet>700</a> /// assert_eq!(&format!("{t}"), "1970-01-05");
+<a href=#701 id=701 data-nosnippet>701</a> /// assert_eq!(Literal::date(4), t.into());
+<a href=#702 id=702 data-nosnippet>702</a> /// ```
+<a href=#703 id=703 data-nosnippet>703</a> </span><span class="kw">pub fn </span>date_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#704 id=704 data-nosnippet>704</a> <span class="kw">let </span>t = s.as_ref().parse::<NaiveDate>().map_err(|e| {
+<a href=#705 id=705 data-nosnippet>705</a> Error::new(
+<a href=#706 id=706 data-nosnippet>706</a> ErrorKind::DataInvalid,
+<a href=#707 id=707 data-nosnippet>707</a> <span class="macro">format!</span>(<span class="string">"Can't parse date from string: {}"</span>, s.as_ref()),
+<a href=#708 id=708 data-nosnippet>708</a> )
+<a href=#709 id=709 data-nosnippet>709</a> .with_source(e)
+<a href=#710 id=710 data-nosnippet>710</a> })<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>(<span class="self">Self</span>::date(date_from_naive_date(t)))
+<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> <span class="doccomment">/// Create date literal from calendar date (year, month and day).
+<a href=#716 id=716 data-nosnippet>716</a> ///
+<a href=#717 id=717 data-nosnippet>717</a> /// See [`NaiveDate::from_ymd_opt`].
+<a href=#718 id=718 data-nosnippet>718</a> ///
+<a href=#719 id=719 data-nosnippet>719</a> /// Example:
+<a href=#720 id=720 data-nosnippet>720</a> ///
+<a href=#721 id=721 data-nosnippet>721</a> ///```rust
+<a href=#722 id=722 data-nosnippet>722</a> /// use iceberg::spec::{Datum, Literal};
+<a href=#723 id=723 data-nosnippet>723</a> /// let t = Datum::date_from_ymd(1970, 1, 5).unwrap();
<a href=#724 id=724 data-nosnippet>724</a> ///
-<a href=#725 id=725 data-nosnippet>725</a> /// assert_eq!(&format!("{t}"), "01:02:01.888999");
-<a href=#726 id=726 data-nosnippet>726</a> /// assert_eq!(Literal::time(micro_secs), t.into());
-<a href=#727 id=727 data-nosnippet>727</a> ///
-<a href=#728 id=728 data-nosnippet>728</a> /// let negative_value = -100;
-<a href=#729 id=729 data-nosnippet>729</a> /// assert!(Datum::time_micros(negative_value).is_err());
-<a href=#730 id=730 data-nosnippet>730</a> ///
-<a href=#731 id=731 data-nosnippet>731</a> /// let too_large_value = 36 * 60 * 60 * 1_000_000; // Too large to fit in 24 hours.
-<a href=#732 id=732 data-nosnippet>732</a> /// assert!(Datum::time_micros(too_large_value).is_err());
-<a href=#733 id=733 data-nosnippet>733</a> /// ```
-<a href=#734 id=734 data-nosnippet>734</a> </span><span class="kw">pub fn </span>time_micros(value: i64) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#735 id=735 data-nosnippet>735</a> <span class="macro">ensure_data_valid!</span>(
-<a href=#736 id=736 data-nosnippet>736</a> (<span class="number">0</span>..=MAX_TIME_VALUE).contains(<span class="kw-2">&</span>value),
-<a href=#737 id=737 data-nosnippet>737</a> <span class="string">"Invalid value for Time type: {}"</span>,
-<a href=#738 id=738 data-nosnippet>738</a> value
-<a href=#739 id=739 data-nosnippet>739</a> );
-<a href=#740 id=740 data-nosnippet>740</a>
-<a href=#741 id=741 data-nosnippet>741</a> <span class="prelude-val">Ok</span>(<span class="self">Self </span>{
-<a href=#742 id=742 data-nosnippet>742</a> r#type: PrimitiveType::Time,
-<a href=#743 id=743 data-nosnippet>743</a> literal: PrimitiveLiteral::Long(value),
-<a href=#744 id=744 data-nosnippet>744</a> })
-<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">/// Creates time literal from [`chrono::NaiveTime`].
-<a href=#748 id=748 data-nosnippet>748</a> </span><span class="kw">fn </span>time_from_naive_time(t: NaiveTime) -> <span class="self">Self </span>{
-<a href=#749 id=749 data-nosnippet>749</a> <span class="kw">let </span>duration = t - unix_epoch().time();
-<a href=#750 id=750 data-nosnippet>750</a> <span class="comment">// It's safe to unwrap here since less than 24 hours will never overflow.
-<a href=#751 id=751 data-nosnippet>751</a> </span><span class="kw">let </span>micro_secs = duration.num_microseconds().unwrap();
-<a href=#752 id=752 data-nosnippet>752</a>
-<a href=#753 id=753 data-nosnippet>753</a> <span class="self">Self </span>{
-<a href=#754 id=754 data-nosnippet>754</a> r#type: PrimitiveType::Time,
-<a href=#755 id=755 data-nosnippet>755</a> literal: PrimitiveLiteral::Long(micro_secs),
-<a href=#756 id=756 data-nosnippet>756</a> }
-<a href=#757 id=757 data-nosnippet>757</a> }
-<a href=#758 id=758 data-nosnippet>758</a>
-<a href=#759 id=759 data-nosnippet>759</a> <span class="doccomment">/// Creates time literal in microseconds in `%H:%M:%S:.f` format.
-<a href=#760 id=760 data-nosnippet>760</a> ///
-<a href=#761 id=761 data-nosnippet>761</a> /// See [`NaiveTime::from_str`] for details.
-<a href=#762 id=762 data-nosnippet>762</a> ///
-<a href=#763 id=763 data-nosnippet>763</a> /// Example:
-<a href=#764 id=764 data-nosnippet>764</a> /// ```rust
-<a href=#765 id=765 data-nosnippet>765</a> /// use iceberg::spec::{Datum, Literal};
-<a href=#766 id=766 data-nosnippet>766</a> /// let t = Datum::time_from_str("01:02:01.888999777").unwrap();
-<a href=#767 id=767 data-nosnippet>767</a> ///
-<a href=#768 id=768 data-nosnippet>768</a> /// assert_eq!(&format!("{t}"), "01:02:01.888999");
-<a href=#769 id=769 data-nosnippet>769</a> /// ```
-<a href=#770 id=770 data-nosnippet>770</a> </span><span class="kw">pub fn </span>time_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#771 id=771 data-nosnippet>771</a> <span class="kw">let </span>t = s.as_ref().parse::<NaiveTime>().map_err(|e| {
-<a href=#772 id=772 data-nosnippet>772</a> Error::new(
-<a href=#773 id=773 data-nosnippet>773</a> ErrorKind::DataInvalid,
-<a href=#774 id=774 data-nosnippet>774</a> <span class="macro">format!</span>(<span class="string">"Can't parse time from string: {}"</span>, s.as_ref()),
-<a href=#775 id=775 data-nosnippet>775</a> )
-<a href=#776 id=776 data-nosnippet>776</a> .with_source(e)
-<a href=#777 id=777 data-nosnippet>777</a> })<span class="question-mark">?</span>;
-<a href=#778 id=778 data-nosnippet>778</a>
-<a href=#779 id=779 data-nosnippet>779</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::time_from_naive_time(t))
-<a href=#780 id=780 data-nosnippet>780</a> }
-<a href=#781 id=781 data-nosnippet>781</a>
-<a href=#782 id=782 data-nosnippet>782</a> <span class="doccomment">/// Creates time literal from hour, minute, second, and microseconds.
-<a href=#783 id=783 data-nosnippet>783</a> ///
-<a href=#784 id=784 data-nosnippet>784</a> /// See [`NaiveTime::from_hms_micro_opt`].
-<a href=#785 id=785 data-nosnippet>785</a> ///
-<a href=#786 id=786 data-nosnippet>786</a> /// Example:
-<a href=#787 id=787 data-nosnippet>787</a> /// ```rust
-<a href=#788 id=788 data-nosnippet>788</a> /// use iceberg::spec::{Datum, Literal};
-<a href=#789 id=789 data-nosnippet>789</a> /// let t = Datum::time_from_hms_micro(22, 15, 33, 111).unwrap();
-<a href=#790 id=790 data-nosnippet>790</a> ///
-<a href=#791 id=791 data-nosnippet>791</a> /// assert_eq!(&format!("{t}"), "22:15:33.000111");
-<a href=#792 id=792 data-nosnippet>792</a> /// ```
-<a href=#793 id=793 data-nosnippet>793</a> </span><span class="kw">pub fn </span>time_from_hms_micro(hour: u32, min: u32, sec: u32, micro: u32) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#794 id=794 data-nosnippet>794</a> <span class="kw">let </span>t = NaiveTime::from_hms_micro_opt(hour, min, sec, micro)
-<a href=#795 id=795 data-nosnippet>795</a> .ok_or_else(|| Error::new(
-<a href=#796 id=796 data-nosnippet>796</a> ErrorKind::DataInvalid,
-<a href=#797 id=797 data-nosnippet>797</a> <span class="macro">format!</span>(<span class="string">"Can't create time from hour: {hour}, min: {min}, second: {sec}, microsecond: {micro}"</span>),
-<a href=#798 id=798 data-nosnippet>798</a> ))<span class="question-mark">?</span>;
-<a href=#799 id=799 data-nosnippet>799</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::time_from_naive_time(t))
-<a href=#800 id=800 data-nosnippet>800</a> }
-<a href=#801 id=801 data-nosnippet>801</a>
-<a href=#802 id=802 data-nosnippet>802</a> <span class="doccomment">/// Creates a timestamp from unix epoch in microseconds.
-<a href=#803 id=803 data-nosnippet>803</a> ///
-<a href=#804 id=804 data-nosnippet>804</a> /// Example:
-<a href=#805 id=805 data-nosnippet>805</a> ///
-<a href=#806 id=806 data-nosnippet>806</a> /// ```rust
-<a href=#807 id=807 data-nosnippet>807</a> /// use iceberg::spec::Datum;
-<a href=#808 id=808 data-nosnippet>808</a> /// let t = Datum::timestamp_micros(1000);
-<a href=#809 id=809 data-nosnippet>809</a> ///
-<a href=#810 id=810 data-nosnippet>810</a> /// assert_eq!(&format!("{t}"), "1970-01-01 00:00:00.001");
-<a href=#811 id=811 data-nosnippet>811</a> /// ```
-<a href=#812 id=812 data-nosnippet>812</a> </span><span class="kw">pub fn </span>timestamp_micros(value: i64) -> <span class="self">Self </span>{
-<a href=#813 id=813 data-nosnippet>813</a> <span class="self">Self </span>{
-<a href=#814 id=814 data-nosnippet>814</a> r#type: PrimitiveType::Timestamp,
-<a href=#815 id=815 data-nosnippet>815</a> literal: PrimitiveLiteral::Long(value),
-<a href=#816 id=816 data-nosnippet>816</a> }
-<a href=#817 id=817 data-nosnippet>817</a> }
-<a href=#818 id=818 data-nosnippet>818</a>
-<a href=#819 id=819 data-nosnippet>819</a> <span class="doccomment">/// Creates a timestamp from unix epoch in nanoseconds.
-<a href=#820 id=820 data-nosnippet>820</a> ///
-<a href=#821 id=821 data-nosnippet>821</a> /// Example:
-<a href=#822 id=822 data-nosnippet>822</a> ///
-<a href=#823 id=823 data-nosnippet>823</a> /// ```rust
-<a href=#824 id=824 data-nosnippet>824</a> /// use iceberg::spec::Datum;
-<a href=#825 id=825 data-nosnippet>825</a> /// let t = Datum::timestamp_nanos(1000);
-<a href=#826 id=826 data-nosnippet>826</a> ///
-<a href=#827 id=827 data-nosnippet>827</a> /// assert_eq!(&format!("{t}"), "1970-01-01 00:00:00.000001");
-<a href=#828 id=828 data-nosnippet>828</a> /// ```
-<a href=#829 id=829 data-nosnippet>829</a> </span><span class="kw">pub fn </span>timestamp_nanos(value: i64) -> <span class="self">Self </span>{
-<a href=#830 id=830 data-nosnippet>830</a> <span class="self">Self </span>{
-<a href=#831 id=831 data-nosnippet>831</a> r#type: PrimitiveType::TimestampNs,
-<a href=#832 id=832 data-nosnippet>832</a> literal: PrimitiveLiteral::Long(value),
-<a href=#833 id=833 data-nosnippet>833</a> }
-<a href=#834 id=834 data-nosnippet>834</a> }
-<a href=#835 id=835 data-nosnippet>835</a>
-<a href=#836 id=836 data-nosnippet>836</a> <span class="doccomment">/// Creates a timestamp from [`DateTime`].
-<a href=#837 id=837 data-nosnippet>837</a> ///
-<a href=#838 id=838 data-nosnippet>838</a> /// Example:
-<a href=#839 id=839 data-nosnippet>839</a> ///
-<a href=#840 id=840 data-nosnippet>840</a> /// ```rust
-<a href=#841 id=841 data-nosnippet>841</a> /// use chrono::{NaiveDate, NaiveDateTime, TimeZone, Utc};
-<a href=#842 id=842 data-nosnippet>842</a> /// use iceberg::spec::Datum;
-<a href=#843 id=843 data-nosnippet>843</a> /// let t = Datum::timestamp_from_datetime(
-<a href=#844 id=844 data-nosnippet>844</a> /// NaiveDate::from_ymd_opt(1992, 3, 1)
-<a href=#845 id=845 data-nosnippet>845</a> /// .unwrap()
-<a href=#846 id=846 data-nosnippet>846</a> /// .and_hms_micro_opt(1, 2, 3, 88)
-<a href=#847 id=847 data-nosnippet>847</a> /// .unwrap(),
-<a href=#848 id=848 data-nosnippet>848</a> /// );
-<a href=#849 id=849 data-nosnippet>849</a> ///
-<a href=#850 id=850 data-nosnippet>850</a> /// assert_eq!(&format!("{t}"), "1992-03-01 01:02:03.000088");
-<a href=#851 id=851 data-nosnippet>851</a> /// ```
-<a href=#852 id=852 data-nosnippet>852</a> </span><span class="kw">pub fn </span>timestamp_from_datetime(dt: NaiveDateTime) -> <span class="self">Self </span>{
-<a href=#853 id=853 data-nosnippet>853</a> <span class="self">Self</span>::timestamp_micros(dt.and_utc().timestamp_micros())
-<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="doccomment">/// Parse a timestamp in [`%Y-%m-%dT%H:%M:%S%.f`] format.
+<a href=#725 id=725 data-nosnippet>725</a> /// assert_eq!(&format!("{t}"), "1970-01-05");
+<a href=#726 id=726 data-nosnippet>726</a> /// assert_eq!(Literal::date(4), t.into());
+<a href=#727 id=727 data-nosnippet>727</a> /// ```
+<a href=#728 id=728 data-nosnippet>728</a> </span><span class="kw">pub fn </span>date_from_ymd(year: i32, month: u32, day: u32) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#729 id=729 data-nosnippet>729</a> <span class="kw">let </span>t = NaiveDate::from_ymd_opt(year, month, day).ok_or_else(|| {
+<a href=#730 id=730 data-nosnippet>730</a> Error::new(
+<a href=#731 id=731 data-nosnippet>731</a> ErrorKind::DataInvalid,
+<a href=#732 id=732 data-nosnippet>732</a> <span class="macro">format!</span>(<span class="string">"Can't create date from year: {year}, month: {month}, day: {day}"</span>),
+<a href=#733 id=733 data-nosnippet>733</a> )
+<a href=#734 id=734 data-nosnippet>734</a> })<span class="question-mark">?</span>;
+<a href=#735 id=735 data-nosnippet>735</a>
+<a href=#736 id=736 data-nosnippet>736</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::date(date_from_naive_date(t)))
+<a href=#737 id=737 data-nosnippet>737</a> }
+<a href=#738 id=738 data-nosnippet>738</a>
+<a href=#739 id=739 data-nosnippet>739</a> <span class="doccomment">/// Creates time literal in microseconds directly.
+<a href=#740 id=740 data-nosnippet>740</a> ///
+<a href=#741 id=741 data-nosnippet>741</a> /// It will return error when it's negative or too large to fit in 24 hours.
+<a href=#742 id=742 data-nosnippet>742</a> ///
+<a href=#743 id=743 data-nosnippet>743</a> /// Example:
+<a href=#744 id=744 data-nosnippet>744</a> ///
+<a href=#745 id=745 data-nosnippet>745</a> /// ```rust
+<a href=#746 id=746 data-nosnippet>746</a> /// use iceberg::spec::{Datum, Literal};
+<a href=#747 id=747 data-nosnippet>747</a> /// let micro_secs = {
+<a href=#748 id=748 data-nosnippet>748</a> /// 1 * 3600 * 1_000_000 + // 1 hour
+<a href=#749 id=749 data-nosnippet>749</a> /// 2 * 60 * 1_000_000 + // 2 minutes
+<a href=#750 id=750 data-nosnippet>750</a> /// 1 * 1_000_000 + // 1 second
+<a href=#751 id=751 data-nosnippet>751</a> /// 888999 // microseconds
+<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> /// let t = Datum::time_micros(micro_secs).unwrap();
+<a href=#755 id=755 data-nosnippet>755</a> ///
+<a href=#756 id=756 data-nosnippet>756</a> /// assert_eq!(&format!("{t}"), "01:02:01.888999");
+<a href=#757 id=757 data-nosnippet>757</a> /// assert_eq!(Literal::time(micro_secs), t.into());
+<a href=#758 id=758 data-nosnippet>758</a> ///
+<a href=#759 id=759 data-nosnippet>759</a> /// let negative_value = -100;
+<a href=#760 id=760 data-nosnippet>760</a> /// assert!(Datum::time_micros(negative_value).is_err());
+<a href=#761 id=761 data-nosnippet>761</a> ///
+<a href=#762 id=762 data-nosnippet>762</a> /// let too_large_value = 36 * 60 * 60 * 1_000_000; // Too large to fit in 24 hours.
+<a href=#763 id=763 data-nosnippet>763</a> /// assert!(Datum::time_micros(too_large_value).is_err());
+<a href=#764 id=764 data-nosnippet>764</a> /// ```
+<a href=#765 id=765 data-nosnippet>765</a> </span><span class="kw">pub fn </span>time_micros(value: i64) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#766 id=766 data-nosnippet>766</a> <span class="macro">ensure_data_valid!</span>(
+<a href=#767 id=767 data-nosnippet>767</a> (<span class="number">0</span>..=MAX_TIME_VALUE).contains(<span class="kw-2">&</span>value),
+<a href=#768 id=768 data-nosnippet>768</a> <span class="string">"Invalid value for Time type: {}"</span>,
+<a href=#769 id=769 data-nosnippet>769</a> value
+<a href=#770 id=770 data-nosnippet>770</a> );
+<a href=#771 id=771 data-nosnippet>771</a>
+<a href=#772 id=772 data-nosnippet>772</a> <span class="prelude-val">Ok</span>(<span class="self">Self </span>{
+<a href=#773 id=773 data-nosnippet>773</a> r#type: PrimitiveType::Time,
+<a href=#774 id=774 data-nosnippet>774</a> literal: PrimitiveLiteral::Long(value),
+<a href=#775 id=775 data-nosnippet>775</a> })
+<a href=#776 id=776 data-nosnippet>776</a> }
+<a href=#777 id=777 data-nosnippet>777</a>
+<a href=#778 id=778 data-nosnippet>778</a> <span class="doccomment">/// Creates time literal from [`chrono::NaiveTime`].
+<a href=#779 id=779 data-nosnippet>779</a> </span><span class="kw">fn </span>time_from_naive_time(t: NaiveTime) -> <span class="self">Self </span>{
+<a href=#780 id=780 data-nosnippet>780</a> <span class="kw">let </span>duration = t - unix_epoch().time();
+<a href=#781 id=781 data-nosnippet>781</a> <span class="comment">// It's safe to unwrap here since less than 24 hours will never overflow.
+<a href=#782 id=782 data-nosnippet>782</a> </span><span class="kw">let </span>micro_secs = duration.num_microseconds().unwrap();
+<a href=#783 id=783 data-nosnippet>783</a>
+<a href=#784 id=784 data-nosnippet>784</a> <span class="self">Self </span>{
+<a href=#785 id=785 data-nosnippet>785</a> r#type: PrimitiveType::Time,
+<a href=#786 id=786 data-nosnippet>786</a> literal: PrimitiveLiteral::Long(micro_secs),
+<a href=#787 id=787 data-nosnippet>787</a> }
+<a href=#788 id=788 data-nosnippet>788</a> }
+<a href=#789 id=789 data-nosnippet>789</a>
+<a href=#790 id=790 data-nosnippet>790</a> <span class="doccomment">/// Creates time literal in microseconds in `%H:%M:%S:.f` format.
+<a href=#791 id=791 data-nosnippet>791</a> ///
+<a href=#792 id=792 data-nosnippet>792</a> /// See [`NaiveTime::from_str`] for details.
+<a href=#793 id=793 data-nosnippet>793</a> ///
+<a href=#794 id=794 data-nosnippet>794</a> /// Example:
+<a href=#795 id=795 data-nosnippet>795</a> /// ```rust
+<a href=#796 id=796 data-nosnippet>796</a> /// use iceberg::spec::{Datum, Literal};
+<a href=#797 id=797 data-nosnippet>797</a> /// let t = Datum::time_from_str("01:02:01.888999777").unwrap();
+<a href=#798 id=798 data-nosnippet>798</a> ///
+<a href=#799 id=799 data-nosnippet>799</a> /// assert_eq!(&format!("{t}"), "01:02:01.888999");
+<a href=#800 id=800 data-nosnippet>800</a> /// ```
+<a href=#801 id=801 data-nosnippet>801</a> </span><span class="kw">pub fn </span>time_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#802 id=802 data-nosnippet>802</a> <span class="kw">let </span>t = s.as_ref().parse::<NaiveTime>().map_err(|e| {
+<a href=#803 id=803 data-nosnippet>803</a> Error::new(
+<a href=#804 id=804 data-nosnippet>804</a> ErrorKind::DataInvalid,
+<a href=#805 id=805 data-nosnippet>805</a> <span class="macro">format!</span>(<span class="string">"Can't parse time from string: {}"</span>, s.as_ref()),
+<a href=#806 id=806 data-nosnippet>806</a> )
+<a href=#807 id=807 data-nosnippet>807</a> .with_source(e)
+<a href=#808 id=808 data-nosnippet>808</a> })<span class="question-mark">?</span>;
+<a href=#809 id=809 data-nosnippet>809</a>
+<a href=#810 id=810 data-nosnippet>810</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::time_from_naive_time(t))
+<a href=#811 id=811 data-nosnippet>811</a> }
+<a href=#812 id=812 data-nosnippet>812</a>
+<a href=#813 id=813 data-nosnippet>813</a> <span class="doccomment">/// Creates time literal from hour, minute, second, and microseconds.
+<a href=#814 id=814 data-nosnippet>814</a> ///
+<a href=#815 id=815 data-nosnippet>815</a> /// See [`NaiveTime::from_hms_micro_opt`].
+<a href=#816 id=816 data-nosnippet>816</a> ///
+<a href=#817 id=817 data-nosnippet>817</a> /// Example:
+<a href=#818 id=818 data-nosnippet>818</a> /// ```rust
+<a href=#819 id=819 data-nosnippet>819</a> /// use iceberg::spec::{Datum, Literal};
+<a href=#820 id=820 data-nosnippet>820</a> /// let t = Datum::time_from_hms_micro(22, 15, 33, 111).unwrap();
+<a href=#821 id=821 data-nosnippet>821</a> ///
+<a href=#822 id=822 data-nosnippet>822</a> /// assert_eq!(&format!("{t}"), "22:15:33.000111");
+<a href=#823 id=823 data-nosnippet>823</a> /// ```
+<a href=#824 id=824 data-nosnippet>824</a> </span><span class="kw">pub fn </span>time_from_hms_micro(hour: u32, min: u32, sec: u32, micro: u32) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#825 id=825 data-nosnippet>825</a> <span class="kw">let </span>t = NaiveTime::from_hms_micro_opt(hour, min, sec, micro)
+<a href=#826 id=826 data-nosnippet>826</a> .ok_or_else(|| Error::new(
+<a href=#827 id=827 data-nosnippet>827</a> ErrorKind::DataInvalid,
+<a href=#828 id=828 data-nosnippet>828</a> <span class="macro">format!</span>(<span class="string">"Can't create time from hour: {hour}, min: {min}, second: {sec}, microsecond: {micro}"</span>),
+<a href=#829 id=829 data-nosnippet>829</a> ))<span class="question-mark">?</span>;
+<a href=#830 id=830 data-nosnippet>830</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::time_from_naive_time(t))
+<a href=#831 id=831 data-nosnippet>831</a> }
+<a href=#832 id=832 data-nosnippet>832</a>
+<a href=#833 id=833 data-nosnippet>833</a> <span class="doccomment">/// Creates a timestamp from unix epoch in microseconds.
+<a href=#834 id=834 data-nosnippet>834</a> ///
+<a href=#835 id=835 data-nosnippet>835</a> /// Example:
+<a href=#836 id=836 data-nosnippet>836</a> ///
+<a href=#837 id=837 data-nosnippet>837</a> /// ```rust
+<a href=#838 id=838 data-nosnippet>838</a> /// use iceberg::spec::Datum;
+<a href=#839 id=839 data-nosnippet>839</a> /// let t = Datum::timestamp_micros(1000);
+<a href=#840 id=840 data-nosnippet>840</a> ///
+<a href=#841 id=841 data-nosnippet>841</a> /// assert_eq!(&format!("{t}"), "1970-01-01 00:00:00.001");
+<a href=#842 id=842 data-nosnippet>842</a> /// ```
+<a href=#843 id=843 data-nosnippet>843</a> </span><span class="kw">pub fn </span>timestamp_micros(value: i64) -> <span class="self">Self </span>{
+<a href=#844 id=844 data-nosnippet>844</a> <span class="self">Self </span>{
+<a href=#845 id=845 data-nosnippet>845</a> r#type: PrimitiveType::Timestamp,
+<a href=#846 id=846 data-nosnippet>846</a> literal: PrimitiveLiteral::Long(value),
+<a href=#847 id=847 data-nosnippet>847</a> }
+<a href=#848 id=848 data-nosnippet>848</a> }
+<a href=#849 id=849 data-nosnippet>849</a>
+<a href=#850 id=850 data-nosnippet>850</a> <span class="doccomment">/// Creates a timestamp from unix epoch in nanoseconds.
+<a href=#851 id=851 data-nosnippet>851</a> ///
+<a href=#852 id=852 data-nosnippet>852</a> /// Example:
+<a href=#853 id=853 data-nosnippet>853</a> ///
+<a href=#854 id=854 data-nosnippet>854</a> /// ```rust
+<a href=#855 id=855 data-nosnippet>855</a> /// use iceberg::spec::Datum;
+<a href=#856 id=856 data-nosnippet>856</a> /// let t = Datum::timestamp_nanos(1000);
<a href=#857 id=857 data-nosnippet>857</a> ///
-<a href=#858 id=858 data-nosnippet>858</a> /// See [`NaiveDateTime::from_str`].
-<a href=#859 id=859 data-nosnippet>859</a> ///
-<a href=#860 id=860 data-nosnippet>860</a> /// Example:
-<a href=#861 id=861 data-nosnippet>861</a> ///
-<a href=#862 id=862 data-nosnippet>862</a> /// ```rust
-<a href=#863 id=863 data-nosnippet>863</a> /// use chrono::{DateTime, FixedOffset, NaiveDate, NaiveDateTime, NaiveTime};
-<a href=#864 id=864 data-nosnippet>864</a> /// use iceberg::spec::{Datum, Literal};
-<a href=#865 id=865 data-nosnippet>865</a> /// let t = Datum::timestamp_from_str("1992-03-01T01:02:03.000088").unwrap();
-<a href=#866 id=866 data-nosnippet>866</a> ///
-<a href=#867 id=867 data-nosnippet>867</a> /// assert_eq!(&format!("{t}"), "1992-03-01 01:02:03.000088");
-<a href=#868 id=868 data-nosnippet>868</a> /// ```
-<a href=#869 id=869 data-nosnippet>869</a> </span><span class="kw">pub fn </span>timestamp_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#870 id=870 data-nosnippet>870</a> <span class="kw">let </span>dt = s.as_ref().parse::<NaiveDateTime>().map_err(|e| {
-<a href=#871 id=871 data-nosnippet>871</a> Error::new(ErrorKind::DataInvalid, <span class="string">"Can't parse timestamp."</span>).with_source(e)
-<a href=#872 id=872 data-nosnippet>872</a> })<span class="question-mark">?</span>;
-<a href=#873 id=873 data-nosnippet>873</a>
-<a href=#874 id=874 data-nosnippet>874</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::timestamp_from_datetime(dt))
-<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> <span class="doccomment">/// Creates a timestamp with timezone from unix epoch in microseconds.
-<a href=#878 id=878 data-nosnippet>878</a> ///
-<a href=#879 id=879 data-nosnippet>879</a> /// Example:
+<a href=#858 id=858 data-nosnippet>858</a> /// assert_eq!(&format!("{t}"), "1970-01-01 00:00:00.000001");
+<a href=#859 id=859 data-nosnippet>859</a> /// ```
+<a href=#860 id=860 data-nosnippet>860</a> </span><span class="kw">pub fn </span>timestamp_nanos(value: i64) -> <span class="self">Self </span>{
+<a href=#861 id=861 data-nosnippet>861</a> <span class="self">Self </span>{
+<a href=#862 id=862 data-nosnippet>862</a> r#type: PrimitiveType::TimestampNs,
+<a href=#863 id=863 data-nosnippet>863</a> literal: PrimitiveLiteral::Long(value),
+<a href=#864 id=864 data-nosnippet>864</a> }
+<a href=#865 id=865 data-nosnippet>865</a> }
+<a href=#866 id=866 data-nosnippet>866</a>
+<a href=#867 id=867 data-nosnippet>867</a> <span class="doccomment">/// Creates a timestamp from [`DateTime`].
+<a href=#868 id=868 data-nosnippet>868</a> ///
+<a href=#869 id=869 data-nosnippet>869</a> /// Example:
+<a href=#870 id=870 data-nosnippet>870</a> ///
+<a href=#871 id=871 data-nosnippet>871</a> /// ```rust
+<a href=#872 id=872 data-nosnippet>872</a> /// use chrono::{NaiveDate, NaiveDateTime, TimeZone, Utc};
+<a href=#873 id=873 data-nosnippet>873</a> /// use iceberg::spec::Datum;
+<a href=#874 id=874 data-nosnippet>874</a> /// let t = Datum::timestamp_from_datetime(
+<a href=#875 id=875 data-nosnippet>875</a> /// NaiveDate::from_ymd_opt(1992, 3, 1)
+<a href=#876 id=876 data-nosnippet>876</a> /// .unwrap()
+<a href=#877 id=877 data-nosnippet>877</a> /// .and_hms_micro_opt(1, 2, 3, 88)
+<a href=#878 id=878 data-nosnippet>878</a> /// .unwrap(),
+<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> /// ```rust
-<a href=#882 id=882 data-nosnippet>882</a> /// use iceberg::spec::Datum;
-<a href=#883 id=883 data-nosnippet>883</a> /// let t = Datum::timestamptz_micros(1000);
-<a href=#884 id=884 data-nosnippet>884</a> ///
-<a href=#885 id=885 data-nosnippet>885</a> /// assert_eq!(&format!("{t}"), "1970-01-01 00:00:00.001 UTC");
-<a href=#886 id=886 data-nosnippet>886</a> /// ```
-<a href=#887 id=887 data-nosnippet>887</a> </span><span class="kw">pub fn </span>timestamptz_micros(value: i64) -> <span class="self">Self </span>{
-<a href=#888 id=888 data-nosnippet>888</a> <span class="self">Self </span>{
-<a href=#889 id=889 data-nosnippet>889</a> r#type: PrimitiveType::Timestamptz,
-<a href=#890 id=890 data-nosnippet>890</a> literal: PrimitiveLiteral::Long(value),
-<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>
-<a href=#894 id=894 data-nosnippet>894</a> <span class="doccomment">/// Creates a timestamp with timezone from unix epoch in nanoseconds.
-<a href=#895 id=895 data-nosnippet>895</a> ///
-<a href=#896 id=896 data-nosnippet>896</a> /// Example:
+<a href=#881 id=881 data-nosnippet>881</a> /// assert_eq!(&format!("{t}"), "1992-03-01 01:02:03.000088");
+<a href=#882 id=882 data-nosnippet>882</a> /// ```
+<a href=#883 id=883 data-nosnippet>883</a> </span><span class="kw">pub fn </span>timestamp_from_datetime(dt: NaiveDateTime) -> <span class="self">Self </span>{
+<a href=#884 id=884 data-nosnippet>884</a> <span class="self">Self</span>::timestamp_micros(dt.and_utc().timestamp_micros())
+<a href=#885 id=885 data-nosnippet>885</a> }
+<a href=#886 id=886 data-nosnippet>886</a>
+<a href=#887 id=887 data-nosnippet>887</a> <span class="doccomment">/// Parse a timestamp in [`%Y-%m-%dT%H:%M:%S%.f`] format.
+<a href=#888 id=888 data-nosnippet>888</a> ///
+<a href=#889 id=889 data-nosnippet>889</a> /// See [`NaiveDateTime::from_str`].
+<a href=#890 id=890 data-nosnippet>890</a> ///
+<a href=#891 id=891 data-nosnippet>891</a> /// Example:
+<a href=#892 id=892 data-nosnippet>892</a> ///
+<a href=#893 id=893 data-nosnippet>893</a> /// ```rust
+<a href=#894 id=894 data-nosnippet>894</a> /// use chrono::{DateTime, FixedOffset, NaiveDate, NaiveDateTime, NaiveTime};
+<a href=#895 id=895 data-nosnippet>895</a> /// use iceberg::spec::{Datum, Literal};
+<a href=#896 id=896 data-nosnippet>896</a> /// let t = Datum::timestamp_from_str("1992-03-01T01:02:03.000088").unwrap();
<a href=#897 id=897 data-nosnippet>897</a> ///
-<a href=#898 id=898 data-nosnippet>898</a> /// ```rust
-<a href=#899 id=899 data-nosnippet>899</a> /// use iceberg::spec::Datum;
-<a href=#900 id=900 data-nosnippet>900</a> /// let t = Datum::timestamptz_nanos(1000);
-<a href=#901 id=901 data-nosnippet>901</a> ///
-<a href=#902 id=902 data-nosnippet>902</a> /// assert_eq!(&format!("{t}"), "1970-01-01 00:00:00.000001 UTC");
-<a href=#903 id=903 data-nosnippet>903</a> /// ```
-<a href=#904 id=904 data-nosnippet>904</a> </span><span class="kw">pub fn </span>timestamptz_nanos(value: i64) -> <span class="self">Self </span>{
-<a href=#905 id=905 data-nosnippet>905</a> <span class="self">Self </span>{
-<a href=#906 id=906 data-nosnippet>906</a> r#type: PrimitiveType::TimestamptzNs,
-<a href=#907 id=907 data-nosnippet>907</a> literal: PrimitiveLiteral::Long(value),
-<a href=#908 id=908 data-nosnippet>908</a> }
-<a href=#909 id=909 data-nosnippet>909</a> }
-<a href=#910 id=910 data-nosnippet>910</a>
-<a href=#911 id=911 data-nosnippet>911</a> <span class="doccomment">/// Creates a timestamp with timezone from [`DateTime`].
-<a href=#912 id=912 data-nosnippet>912</a> /// Example:
-<a href=#913 id=913 data-nosnippet>913</a> ///
-<a href=#914 id=914 data-nosnippet>914</a> /// ```rust
-<a href=#915 id=915 data-nosnippet>915</a> /// use chrono::{TimeZone, Utc};
-<a href=#916 id=916 data-nosnippet>916</a> /// use iceberg::spec::Datum;
-<a href=#917 id=917 data-nosnippet>917</a> /// let t = Datum::timestamptz_from_datetime(Utc.timestamp_opt(1000, 0).unwrap());
-<a href=#918 id=918 data-nosnippet>918</a> ///
-<a href=#919 id=919 data-nosnippet>919</a> /// assert_eq!(&format!("{t}"), "1970-01-01 00:16:40 UTC");
-<a href=#920 id=920 data-nosnippet>920</a> /// ```
-<a href=#921 id=921 data-nosnippet>921</a> </span><span class="kw">pub fn </span>timestamptz_from_datetime<T: TimeZone>(dt: DateTime<T>) -> <span class="self">Self </span>{
-<a href=#922 id=922 data-nosnippet>922</a> <span class="self">Self</span>::timestamptz_micros(dt.with_timezone(<span class="kw-2">&</span>Utc).timestamp_micros())
+<a href=#898 id=898 data-nosnippet>898</a> /// assert_eq!(&format!("{t}"), "1992-03-01 01:02:03.000088");
+<a href=#899 id=899 data-nosnippet>899</a> /// ```
+<a href=#900 id=900 data-nosnippet>900</a> </span><span class="kw">pub fn </span>timestamp_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#901 id=901 data-nosnippet>901</a> <span class="kw">let </span>dt = s.as_ref().parse::<NaiveDateTime>().map_err(|e| {
+<a href=#902 id=902 data-nosnippet>902</a> Error::new(ErrorKind::DataInvalid, <span class="string">"Can't parse timestamp."</span>).with_source(e)
+<a href=#903 id=903 data-nosnippet>903</a> })<span class="question-mark">?</span>;
+<a href=#904 id=904 data-nosnippet>904</a>
+<a href=#905 id=905 data-nosnippet>905</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::timestamp_from_datetime(dt))
+<a href=#906 id=906 data-nosnippet>906</a> }
+<a href=#907 id=907 data-nosnippet>907</a>
+<a href=#908 id=908 data-nosnippet>908</a> <span class="doccomment">/// Creates a timestamp with timezone from unix epoch in microseconds.
+<a href=#909 id=909 data-nosnippet>909</a> ///
+<a href=#910 id=910 data-nosnippet>910</a> /// Example:
+<a href=#911 id=911 data-nosnippet>911</a> ///
+<a href=#912 id=912 data-nosnippet>912</a> /// ```rust
+<a href=#913 id=913 data-nosnippet>913</a> /// use iceberg::spec::Datum;
+<a href=#914 id=914 data-nosnippet>914</a> /// let t = Datum::timestamptz_micros(1000);
+<a href=#915 id=915 data-nosnippet>915</a> ///
+<a href=#916 id=916 data-nosnippet>916</a> /// assert_eq!(&format!("{t}"), "1970-01-01 00:00:00.001 UTC");
+<a href=#917 id=917 data-nosnippet>917</a> /// ```
+<a href=#918 id=918 data-nosnippet>918</a> </span><span class="kw">pub fn </span>timestamptz_micros(value: i64) -> <span class="self">Self </span>{
+<a href=#919 id=919 data-nosnippet>919</a> <span class="self">Self </span>{
+<a href=#920 id=920 data-nosnippet>920</a> r#type: PrimitiveType::Timestamptz,
+<a href=#921 id=921 data-nosnippet>921</a> literal: PrimitiveLiteral::Long(value),
+<a href=#922 id=922 data-nosnippet>922</a> }
<a href=#923 id=923 data-nosnippet>923</a> }
<a href=#924 id=924 data-nosnippet>924</a>
-<a href=#925 id=925 data-nosnippet>925</a> <span class="doccomment">/// Parse timestamp with timezone in RFC3339 format.
+<a href=#925 id=925 data-nosnippet>925</a> <span class="doccomment">/// Creates a timestamp with timezone from unix epoch in nanoseconds.
<a href=#926 id=926 data-nosnippet>926</a> ///
-<a href=#927 id=927 data-nosnippet>927</a> /// See [`DateTime::from_str`].
+<a href=#927 id=927 data-nosnippet>927</a> /// Example:
<a href=#928 id=928 data-nosnippet>928</a> ///
-<a href=#929 id=929 data-nosnippet>929</a> /// Example:
-<a href=#930 id=930 data-nosnippet>930</a> ///
-<a href=#931 id=931 data-nosnippet>931</a> /// ```rust
-<a href=#932 id=932 data-nosnippet>932</a> /// use chrono::{DateTime, FixedOffset, NaiveDate, NaiveDateTime, NaiveTime};
-<a href=#933 id=933 data-nosnippet>933</a> /// use iceberg::spec::{Datum, Literal};
-<a href=#934 id=934 data-nosnippet>934</a> /// let t = Datum::timestamptz_from_str("1992-03-01T01:02:03.000088+08:00").unwrap();
-<a href=#935 id=935 data-nosnippet>935</a> ///
-<a href=#936 id=936 data-nosnippet>936</a> /// assert_eq!(&format!("{t}"), "1992-02-29 17:02:03.000088 UTC");
-<a href=#937 id=937 data-nosnippet>937</a> /// ```
-<a href=#938 id=938 data-nosnippet>938</a> </span><span class="kw">pub fn </span>timestamptz_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#939 id=939 data-nosnippet>939</a> <span class="kw">let </span>dt = DateTime::<Utc>::from_str(s.as_ref()).map_err(|e| {
-<a href=#940 id=940 data-nosnippet>940</a> Error::new(ErrorKind::DataInvalid, <span class="string">"Can't parse datetime."</span>).with_source(e)
-<a href=#941 id=941 data-nosnippet>941</a> })<span class="question-mark">?</span>;
-<a href=#942 id=942 data-nosnippet>942</a>
-<a href=#943 id=943 data-nosnippet>943</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::timestamptz_from_datetime(dt))
-<a href=#944 id=944 data-nosnippet>944</a> }
-<a href=#945 id=945 data-nosnippet>945</a>
-<a href=#946 id=946 data-nosnippet>946</a> <span class="doccomment">/// Creates a string literal.
-<a href=#947 id=947 data-nosnippet>947</a> ///
-<a href=#948 id=948 data-nosnippet>948</a> /// Example:
+<a href=#929 id=929 data-nosnippet>929</a> /// ```rust
+<a href=#930 id=930 data-nosnippet>930</a> /// use iceberg::spec::Datum;
+<a href=#931 id=931 data-nosnippet>931</a> /// let t = Datum::timestamptz_nanos(1000);
+<a href=#932 id=932 data-nosnippet>932</a> ///
+<a href=#933 id=933 data-nosnippet>933</a> /// assert_eq!(&format!("{t}"), "1970-01-01 00:00:00.000001 UTC");
+<a href=#934 id=934 data-nosnippet>934</a> /// ```
+<a href=#935 id=935 data-nosnippet>935</a> </span><span class="kw">pub fn </span>timestamptz_nanos(value: i64) -> <span class="self">Self </span>{
+<a href=#936 id=936 data-nosnippet>936</a> <span class="self">Self </span>{
+<a href=#937 id=937 data-nosnippet>937</a> r#type: PrimitiveType::TimestamptzNs,
+<a href=#938 id=938 data-nosnippet>938</a> literal: PrimitiveLiteral::Long(value),
+<a href=#939 id=939 data-nosnippet>939</a> }
+<a href=#940 id=940 data-nosnippet>940</a> }
+<a href=#941 id=941 data-nosnippet>941</a>
+<a href=#942 id=942 data-nosnippet>942</a> <span class="doccomment">/// Creates a timestamp with timezone from [`DateTime`].
+<a href=#943 id=943 data-nosnippet>943</a> /// Example:
+<a href=#944 id=944 data-nosnippet>944</a> ///
+<a href=#945 id=945 data-nosnippet>945</a> /// ```rust
+<a href=#946 id=946 data-nosnippet>946</a> /// use chrono::{TimeZone, Utc};
+<a href=#947 id=947 data-nosnippet>947</a> /// use iceberg::spec::Datum;
+<a href=#948 id=948 data-nosnippet>948</a> /// let t = Datum::timestamptz_from_datetime(Utc.timestamp_opt(1000, 0).unwrap());
<a href=#949 id=949 data-nosnippet>949</a> ///
-<a href=#950 id=950 data-nosnippet>950</a> /// ```rust
-<a href=#951 id=951 data-nosnippet>951</a> /// use iceberg::spec::Datum;
-<a href=#952 id=952 data-nosnippet>952</a> /// let t = Datum::string("ss");
-<a href=#953 id=953 data-nosnippet>953</a> ///
-<a href=#954 id=954 data-nosnippet>954</a> /// assert_eq!(&format!("{t}"), r#""ss""#);
-<a href=#955 id=955 data-nosnippet>955</a> /// ```
-<a href=#956 id=956 data-nosnippet>956</a> </span><span class="kw">pub fn </span>string<S: ToString>(s: S) -> <span class="self">Self </span>{
-<a href=#957 id=957 data-nosnippet>957</a> <span class="self">Self </span>{
-<a href=#958 id=958 data-nosnippet>958</a> r#type: PrimitiveType::String,
-<a href=#959 id=959 data-nosnippet>959</a> literal: PrimitiveLiteral::String(s.to_string()),
-<a href=#960 id=960 data-nosnippet>960</a> }
-<a href=#961 id=961 data-nosnippet>961</a> }
-<a href=#962 id=962 data-nosnippet>962</a>
-<a href=#963 id=963 data-nosnippet>963</a> <span class="doccomment">/// Creates uuid literal.
-<a href=#964 id=964 data-nosnippet>964</a> ///
-<a href=#965 id=965 data-nosnippet>965</a> /// Example:
+<a href=#950 id=950 data-nosnippet>950</a> /// assert_eq!(&format!("{t}"), "1970-01-01 00:16:40 UTC");
+<a href=#951 id=951 data-nosnippet>951</a> /// ```
+<a href=#952 id=952 data-nosnippet>952</a> </span><span class="kw">pub fn </span>timestamptz_from_datetime<T: TimeZone>(dt: DateTime<T>) -> <span class="self">Self </span>{
+<a href=#953 id=953 data-nosnippet>953</a> <span class="self">Self</span>::timestamptz_micros(dt.with_timezone(<span class="kw-2">&</span>Utc).timestamp_micros())
+<a href=#954 id=954 data-nosnippet>954</a> }
+<a href=#955 id=955 data-nosnippet>955</a>
+<a href=#956 id=956 data-nosnippet>956</a> <span class="doccomment">/// Parse timestamp with timezone in RFC3339 format.
+<a href=#957 id=957 data-nosnippet>957</a> ///
+<a href=#958 id=958 data-nosnippet>958</a> /// See [`DateTime::from_str`].
+<a href=#959 id=959 data-nosnippet>959</a> ///
+<a href=#960 id=960 data-nosnippet>960</a> /// Example:
+<a href=#961 id=961 data-nosnippet>961</a> ///
+<a href=#962 id=962 data-nosnippet>962</a> /// ```rust
+<a href=#963 id=963 data-nosnippet>963</a> /// use chrono::{DateTime, FixedOffset, NaiveDate, NaiveDateTime, NaiveTime};
+<a href=#964 id=964 data-nosnippet>964</a> /// use iceberg::spec::{Datum, Literal};
+<a href=#965 id=965 data-nosnippet>965</a> /// let t = Datum::timestamptz_from_str("1992-03-01T01:02:03.000088+08:00").unwrap();
<a href=#966 id=966 data-nosnippet>966</a> ///
-<a href=#967 id=967 data-nosnippet>967</a> /// ```rust
-<a href=#968 id=968 data-nosnippet>968</a> /// use iceberg::spec::Datum;
-<a href=#969 id=969 data-nosnippet>969</a> /// use uuid::uuid;
-<a href=#970 id=970 data-nosnippet>970</a> /// let t = Datum::uuid(uuid!("a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8"));
-<a href=#971 id=971 data-nosnippet>971</a> ///
-<a href=#972 id=972 data-nosnippet>972</a> /// assert_eq!(&format!("{t}"), "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8");
-<a href=#973 id=973 data-nosnippet>973</a> /// ```
-<a href=#974 id=974 data-nosnippet>974</a> </span><span class="kw">pub fn </span>uuid(uuid: Uuid) -> <span class="self">Self </span>{
-<a href=#975 id=975 data-nosnippet>975</a> <span class="self">Self </span>{
-<a href=#976 id=976 data-nosnippet>976</a> r#type: PrimitiveType::Uuid,
-<a href=#977 id=977 data-nosnippet>977</a> literal: PrimitiveLiteral::UInt128(uuid.as_u128()),
-<a href=#978 id=978 data-nosnippet>978</a> }
-<a href=#979 id=979 data-nosnippet>979</a> }
-<a href=#980 id=980 data-nosnippet>980</a>
-<a href=#981 id=981 data-nosnippet>981</a> <span class="doccomment">/// Creates uuid from str. See [`Uuid::parse_str`].
-<a href=#982 id=982 data-nosnippet>982</a> ///
-<a href=#983 id=983 data-nosnippet>983</a> /// Example:
+<a href=#967 id=967 data-nosnippet>967</a> /// assert_eq!(&format!("{t}"), "1992-02-29 17:02:03.000088 UTC");
+<a href=#968 id=968 data-nosnippet>968</a> /// ```
+<a href=#969 id=969 data-nosnippet>969</a> </span><span class="kw">pub fn </span>timestamptz_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#970 id=970 data-nosnippet>970</a> <span class="kw">let </span>dt = DateTime::<Utc>::from_str(s.as_ref()).map_err(|e| {
+<a href=#971 id=971 data-nosnippet>971</a> Error::new(ErrorKind::DataInvalid, <span class="string">"Can't parse datetime."</span>).with_source(e)
+<a href=#972 id=972 data-nosnippet>972</a> })<span class="question-mark">?</span>;
+<a href=#973 id=973 data-nosnippet>973</a>
+<a href=#974 id=974 data-nosnippet>974</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::timestamptz_from_datetime(dt))
+<a href=#975 id=975 data-nosnippet>975</a> }
+<a href=#976 id=976 data-nosnippet>976</a>
+<a href=#977 id=977 data-nosnippet>977</a> <span class="doccomment">/// Creates a string literal.
+<a href=#978 id=978 data-nosnippet>978</a> ///
+<a href=#979 id=979 data-nosnippet>979</a> /// Example:
+<a href=#980 id=980 data-nosnippet>980</a> ///
+<a href=#981 id=981 data-nosnippet>981</a> /// ```rust
+<a href=#982 id=982 data-nosnippet>982</a> /// use iceberg::spec::Datum;
+<a href=#983 id=983 data-nosnippet>983</a> /// let t = Datum::string("ss");
<a href=#984 id=984 data-nosnippet>984</a> ///
-<a href=#985 id=985 data-nosnippet>985</a> /// ```rust
-<a href=#986 id=986 data-nosnippet>986</a> /// use iceberg::spec::Datum;
-<a href=#987 id=987 data-nosnippet>987</a> /// let t = Datum::uuid_from_str("a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8").unwrap();
-<a href=#988 id=988 data-nosnippet>988</a> ///
-<a href=#989 id=989 data-nosnippet>989</a> /// assert_eq!(&format!("{t}"), "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8");
-<a href=#990 id=990 data-nosnippet>990</a> /// ```
-<a href=#991 id=991 data-nosnippet>991</a> </span><span class="kw">pub fn </span>uuid_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#992 id=992 data-nosnippet>992</a> <span class="kw">let </span>uuid = Uuid::parse_str(s.as_ref()).map_err(|e| {
-<a href=#993 id=993 data-nosnippet>993</a> Error::new(
-<a href=#994 id=994 data-nosnippet>994</a> ErrorKind::DataInvalid,
-<a href=#995 id=995 data-nosnippet>995</a> <span class="macro">format!</span>(<span class="string">"Can't parse uuid from string: {}"</span>, s.as_ref()),
-<a href=#996 id=996 data-nosnippet>996</a> )
-<a href=#997 id=997 data-nosnippet>997</a> .with_source(e)
-<a href=#998 id=998 data-nosnippet>998</a> })<span class="question-mark">?</span>;
-<a href=#999 id=999 data-nosnippet>999</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::uuid(uuid))
-<a href=#1000 id=1000 data-nosnippet>1000</a> }
-<a href=#1001 id=1001 data-nosnippet>1001</a>
-<a href=#1002 id=1002 data-nosnippet>1002</a> <span class="doccomment">/// Creates a fixed literal from bytes.
-<a href=#1003 id=1003 data-nosnippet>1003</a> ///
-<a href=#1004 id=1004 data-nosnippet>1004</a> /// Example:
-<a href=#1005 id=1005 data-nosnippet>1005</a> ///
-<a href=#1006 id=1006 data-nosnippet>1006</a> /// ```rust
-<a href=#1007 id=1007 data-nosnippet>1007</a> /// use iceberg::spec::{Datum, Literal, PrimitiveLiteral};
-<a href=#1008 id=1008 data-nosnippet>1008</a> /// let t = Datum::fixed(vec![1u8, 2u8]);
-<a href=#1009 id=1009 data-nosnippet>1009</a> ///
-<a href=#1010 id=1010 data-nosnippet>1010</a> /// assert_eq!(&format!("{t}"), "0102");
-<a href=#1011 id=1011 data-nosnippet>1011</a> /// ```
-<a href=#1012 id=1012 data-nosnippet>1012</a> </span><span class="kw">pub fn </span>fixed<I: IntoIterator<Item = u8>>(input: I) -> <span class="self">Self </span>{
-<a href=#1013 id=1013 data-nosnippet>1013</a> <span class="kw">let </span>value: Vec<u8> = input.into_iter().collect();
-<a href=#1014 id=1014 data-nosnippet>1014</a> <span class="self">Self </span>{
-<a href=#1015 id=1015 data-nosnippet>1015</a> r#type: PrimitiveType::Fixed(value.len() <span class="kw">as </span>u64),
-<a href=#1016 id=1016 data-nosnippet>1016</a> literal: PrimitiveLiteral::Binary(value),
-<a href=#1017 id=1017 data-nosnippet>1017</a> }
-<a href=#1018 id=1018 data-nosnippet>1018</a> }
-<a href=#1019 id=1019 data-nosnippet>1019</a>
-<a href=#1020 id=1020 data-nosnippet>1020</a> <span class="doccomment">/// Creates a binary literal from bytes.
-<a href=#1021 id=1021 data-nosnippet>1021</a> ///
-<a href=#1022 id=1022 data-nosnippet>1022</a> /// Example:
-<a href=#1023 id=1023 data-nosnippet>1023</a> ///
-<a href=#1024 id=1024 data-nosnippet>1024</a> /// ```rust
-<a href=#1025 id=1025 data-nosnippet>1025</a> /// use iceberg::spec::Datum;
-<a href=#1026 id=1026 data-nosnippet>1026</a> /// let t = Datum::binary(vec![1u8, 100u8]);
-<a href=#1027 id=1027 data-nosnippet>1027</a> ///
-<a href=#1028 id=1028 data-nosnippet>1028</a> /// assert_eq!(&format!("{t}"), "0164");
-<a href=#1029 id=1029 data-nosnippet>1029</a> /// ```
-<a href=#1030 id=1030 data-nosnippet>1030</a> </span><span class="kw">pub fn </span>binary<I: IntoIterator<Item = u8>>(input: I) -> <span class="self">Self </span>{
-<a href=#1031 id=1031 data-nosnippet>1031</a> <span class="self">Self </span>{
-<a href=#1032 id=1032 data-nosnippet>1032</a> r#type: PrimitiveType::Binary,
-<a href=#1033 id=1033 data-nosnippet>1033</a> literal: PrimitiveLiteral::Binary(input.into_iter().collect()),
-<a href=#1034 id=1034 data-nosnippet>1034</a> }
-<a href=#1035 id=1035 data-nosnippet>1035</a> }
-<a href=#1036 id=1036 data-nosnippet>1036</a>
-<a href=#1037 id=1037 data-nosnippet>1037</a> <span class="doccomment">/// Creates decimal literal from string. See [`Decimal::from_str_exact`].
-<a href=#1038 id=1038 data-nosnippet>1038</a> ///
-<a href=#1039 id=1039 data-nosnippet>1039</a> /// Example:
+<a href=#985 id=985 data-nosnippet>985</a> /// assert_eq!(&format!("{t}"), r#""ss""#);
+<a href=#986 id=986 data-nosnippet>986</a> /// ```
+<a href=#987 id=987 data-nosnippet>987</a> </span><span class="kw">pub fn </span>string<S: ToString>(s: S) -> <span class="self">Self </span>{
+<a href=#988 id=988 data-nosnippet>988</a> <span class="self">Self </span>{
+<a href=#989 id=989 data-nosnippet>989</a> r#type: PrimitiveType::String,
+<a href=#990 id=990 data-nosnippet>990</a> literal: PrimitiveLiteral::String(s.to_string()),
+<a href=#991 id=991 data-nosnippet>991</a> }
+<a href=#992 id=992 data-nosnippet>992</a> }
+<a href=#993 id=993 data-nosnippet>993</a>
+<a href=#994 id=994 data-nosnippet>994</a> <span class="doccomment">/// Creates uuid literal.
+<a href=#995 id=995 data-nosnippet>995</a> ///
+<a href=#996 id=996 data-nosnippet>996</a> /// Example:
+<a href=#997 id=997 data-nosnippet>997</a> ///
+<a href=#998 id=998 data-nosnippet>998</a> /// ```rust
+<a href=#999 id=999 data-nosnippet>999</a> /// use iceberg::spec::Datum;
+<a href=#1000 id=1000 data-nosnippet>1000</a> /// use uuid::uuid;
+<a href=#1001 id=1001 data-nosnippet>1001</a> /// let t = Datum::uuid(uuid!("a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8"));
+<a href=#1002 id=1002 data-nosnippet>1002</a> ///
+<a href=#1003 id=1003 data-nosnippet>1003</a> /// assert_eq!(&format!("{t}"), "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8");
+<a href=#1004 id=1004 data-nosnippet>1004</a> /// ```
+<a href=#1005 id=1005 data-nosnippet>1005</a> </span><span class="kw">pub fn </span>uuid(uuid: Uuid) -> <span class="self">Self </span>{
+<a href=#1006 id=1006 data-nosnippet>1006</a> <span class="self">Self </span>{
+<a href=#1007 id=1007 data-nosnippet>1007</a> r#type: PrimitiveType::Uuid,
+<a href=#1008 id=1008 data-nosnippet>1008</a> literal: PrimitiveLiteral::UInt128(uuid.as_u128()),
+<a href=#1009 id=1009 data-nosnippet>1009</a> }
+<a href=#1010 id=1010 data-nosnippet>1010</a> }
+<a href=#1011 id=1011 data-nosnippet>1011</a>
+<a href=#1012 id=1012 data-nosnippet>1012</a> <span class="doccomment">/// Creates uuid from str. See [`Uuid::parse_str`].
+<a href=#1013 id=1013 data-nosnippet>1013</a> ///
+<a href=#1014 id=1014 data-nosnippet>1014</a> /// Example:
+<a href=#1015 id=1015 data-nosnippet>1015</a> ///
+<a href=#1016 id=1016 data-nosnippet>1016</a> /// ```rust
+<a href=#1017 id=1017 data-nosnippet>1017</a> /// use iceberg::spec::Datum;
+<a href=#1018 id=1018 data-nosnippet>1018</a> /// let t = Datum::uuid_from_str("a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8").unwrap();
+<a href=#1019 id=1019 data-nosnippet>1019</a> ///
+<a href=#1020 id=1020 data-nosnippet>1020</a> /// assert_eq!(&format!("{t}"), "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8");
+<a href=#1021 id=1021 data-nosnippet>1021</a> /// ```
+<a href=#1022 id=1022 data-nosnippet>1022</a> </span><span class="kw">pub fn </span>uuid_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#1023 id=1023 data-nosnippet>1023</a> <span class="kw">let </span>uuid = Uuid::parse_str(s.as_ref()).map_err(|e| {
+<a href=#1024 id=1024 data-nosnippet>1024</a> Error::new(
+<a href=#1025 id=1025 data-nosnippet>1025</a> ErrorKind::DataInvalid,
+<a href=#1026 id=1026 data-nosnippet>1026</a> <span class="macro">format!</span>(<span class="string">"Can't parse uuid from string: {}"</span>, s.as_ref()),
+<a href=#1027 id=1027 data-nosnippet>1027</a> )
+<a href=#1028 id=1028 data-nosnippet>1028</a> .with_source(e)
+<a href=#1029 id=1029 data-nosnippet>1029</a> })<span class="question-mark">?</span>;
+<a href=#1030 id=1030 data-nosnippet>1030</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::uuid(uuid))
+<a href=#1031 id=1031 data-nosnippet>1031</a> }
+<a href=#1032 id=1032 data-nosnippet>1032</a>
+<a href=#1033 id=1033 data-nosnippet>1033</a> <span class="doccomment">/// Creates a fixed literal from bytes.
+<a href=#1034 id=1034 data-nosnippet>1034</a> ///
+<a href=#1035 id=1035 data-nosnippet>1035</a> /// Example:
+<a href=#1036 id=1036 data-nosnippet>1036</a> ///
+<a href=#1037 id=1037 data-nosnippet>1037</a> /// ```rust
+<a href=#1038 id=1038 data-nosnippet>1038</a> /// use iceberg::spec::{Datum, Literal, PrimitiveLiteral};
+<a href=#1039 id=1039 data-nosnippet>1039</a> /// let t = Datum::fixed(vec![1u8, 2u8]);
<a href=#1040 id=1040 data-nosnippet>1040</a> ///
-<a href=#1041 id=1041 data-nosnippet>1041</a> /// ```rust
-<a href=#1042 id=1042 data-nosnippet>1042</a> /// use iceberg::spec::Datum;
-<a href=#1043 id=1043 data-nosnippet>1043</a> /// use itertools::assert_equal;
-<a href=#1044 id=1044 data-nosnippet>1044</a> /// use rust_decimal::Decimal;
-<a href=#1045 id=1045 data-nosnippet>1045</a> /// let t = Datum::decimal_from_str("123.45").unwrap();
-<a href=#1046 id=1046 data-nosnippet>1046</a> ///
-<a href=#1047 id=1047 data-nosnippet>1047</a> /// assert_eq!(&format!("{t}"), "123.45");
-<a href=#1048 id=1048 data-nosnippet>1048</a> /// ```
-<a href=#1049 id=1049 data-nosnippet>1049</a> </span><span class="kw">pub fn </span>decimal_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#1050 id=1050 data-nosnippet>1050</a> <span class="kw">let </span>decimal = Decimal::from_str_exact(s.as_ref()).map_err(|e| {
-<a href=#1051 id=1051 data-nosnippet>1051</a> Error::new(ErrorKind::DataInvalid, <span class="string">"Can't parse decimal."</span>).with_source(e)
-<a href=#1052 id=1052 data-nosnippet>1052</a> })<span class="question-mark">?</span>;
-<a href=#1053 id=1053 data-nosnippet>1053</a>
-<a href=#1054 id=1054 data-nosnippet>1054</a> <span class="self">Self</span>::decimal(decimal)
-<a href=#1055 id=1055 data-nosnippet>1055</a> }
-<a href=#1056 id=1056 data-nosnippet>1056</a>
-<a href=#1057 id=1057 data-nosnippet>1057</a> <span class="doccomment">/// Try to create a decimal literal from [`Decimal`].
+<a href=#1041 id=1041 data-nosnippet>1041</a> /// assert_eq!(&format!("{t}"), "0102");
+<a href=#1042 id=1042 data-nosnippet>1042</a> /// ```
+<a href=#1043 id=1043 data-nosnippet>1043</a> </span><span class="kw">pub fn </span>fixed<I: IntoIterator<Item = u8>>(input: I) -> <span class="self">Self </span>{
+<a href=#1044 id=1044 data-nosnippet>1044</a> <span class="kw">let </span>value: Vec<u8> = input.into_iter().collect();
+<a href=#1045 id=1045 data-nosnippet>1045</a> <span class="self">Self </span>{
+<a href=#1046 id=1046 data-nosnippet>1046</a> r#type: PrimitiveType::Fixed(value.len() <span class="kw">as </span>u64),
+<a href=#1047 id=1047 data-nosnippet>1047</a> literal: PrimitiveLiteral::Binary(value),
+<a href=#1048 id=1048 data-nosnippet>1048</a> }
+<a href=#1049 id=1049 data-nosnippet>1049</a> }
+<a href=#1050 id=1050 data-nosnippet>1050</a>
+<a href=#1051 id=1051 data-nosnippet>1051</a> <span class="doccomment">/// Creates a binary literal from bytes.
+<a href=#1052 id=1052 data-nosnippet>1052</a> ///
+<a href=#1053 id=1053 data-nosnippet>1053</a> /// Example:
+<a href=#1054 id=1054 data-nosnippet>1054</a> ///
+<a href=#1055 id=1055 data-nosnippet>1055</a> /// ```rust
+<a href=#1056 id=1056 data-nosnippet>1056</a> /// use iceberg::spec::Datum;
+<a href=#1057 id=1057 data-nosnippet>1057</a> /// let t = Datum::binary(vec![1u8, 100u8]);
<a href=#1058 id=1058 data-nosnippet>1058</a> ///
-<a href=#1059 id=1059 data-nosnippet>1059</a> /// Example:
-<a href=#1060 id=1060 data-nosnippet>1060</a> ///
-<a href=#1061 id=1061 data-nosnippet>1061</a> /// ```rust
-<a href=#1062 id=1062 data-nosnippet>1062</a> /// use iceberg::spec::Datum;
-<a href=#1063 id=1063 data-nosnippet>1063</a> /// use rust_decimal::Decimal;
-<a href=#1064 id=1064 data-nosnippet>1064</a> ///
-<a href=#1065 id=1065 data-nosnippet>1065</a> /// let t = Datum::decimal(Decimal::new(123, 2)).unwrap();
-<a href=#1066 id=1066 data-nosnippet>1066</a> ///
-<a href=#1067 id=1067 data-nosnippet>1067</a> /// assert_eq!(&format!("{t}"), "1.23");
-<a href=#1068 id=1068 data-nosnippet>1068</a> /// ```
-<a href=#1069 id=1069 data-nosnippet>1069</a> </span><span class="kw">pub fn </span>decimal(value: <span class="kw">impl </span>Into<Decimal>) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#1070 id=1070 data-nosnippet>1070</a> <span class="kw">let </span>decimal = value.into();
-<a href=#1071 id=1071 data-nosnippet>1071</a> <span class="kw">let </span>scale = decimal.scale();
-<a href=#1072 id=1072 data-nosnippet>1072</a>
-<a href=#1073 id=1073 data-nosnippet>1073</a> <span class="kw">let </span>r#type = Type::decimal(MAX_DECIMAL_PRECISION, scale)<span class="question-mark">?</span>;
-<a href=#1074 id=1074 data-nosnippet>1074</a> <span class="kw">if let </span>Type::Primitive(p) = r#type {
-<a href=#1075 id=1075 data-nosnippet>1075</a> <span class="prelude-val">Ok</span>(<span class="self">Self </span>{
-<a href=#1076 id=1076 data-nosnippet>1076</a> r#type: p,
-<a href=#1077 id=1077 data-nosnippet>1077</a> literal: PrimitiveLiteral::Int128(decimal.mantissa()),
-<a href=#1078 id=1078 data-nosnippet>1078</a> })
-<a href=#1079 id=1079 data-nosnippet>1079</a> } <span class="kw">else </span>{
-<a href=#1080 id=1080 data-nosnippet>1080</a> <span class="macro">unreachable!</span>(<span class="string">"Decimal type must be primitive."</span>)
-<a href=#1081 id=1081 data-nosnippet>1081</a> }
-<a href=#1082 id=1082 data-nosnippet>1082</a> }
-<a href=#1083 id=1083 data-nosnippet>1083</a>
-<a href=#1084 id=1084 data-nosnippet>1084</a> <span class="doccomment">/// Try to create a decimal literal from [`Decimal`] with precision.
-<a href=#1085 id=1085 data-nosnippet>1085</a> ///
-<a href=#1086 id=1086 data-nosnippet>1086</a> /// Example:
-<a href=#1087 id=1087 data-nosnippet>1087</a> ///
-<a href=#1088 id=1088 data-nosnippet>1088</a> /// ```rust
-<a href=#1089 id=1089 data-nosnippet>1089</a> /// use iceberg::spec::Datum;
-<a href=#1090 id=1090 data-nosnippet>1090</a> /// use rust_decimal::Decimal;
+<a href=#1059 id=1059 data-nosnippet>1059</a> /// assert_eq!(&format!("{t}"), "0164");
+<a href=#1060 id=1060 data-nosnippet>1060</a> /// ```
+<a href=#1061 id=1061 data-nosnippet>1061</a> </span><span class="kw">pub fn </span>binary<I: IntoIterator<Item = u8>>(input: I) -> <span class="self">Self </span>{
+<a href=#1062 id=1062 data-nosnippet>1062</a> <span class="self">Self </span>{
+<a href=#1063 id=1063 data-nosnippet>1063</a> r#type: PrimitiveType::Binary,
+<a href=#1064 id=1064 data-nosnippet>1064</a> literal: PrimitiveLiteral::Binary(input.into_iter().collect()),
+<a href=#1065 id=1065 data-nosnippet>1065</a> }
+<a href=#1066 id=1066 data-nosnippet>1066</a> }
+<a href=#1067 id=1067 data-nosnippet>1067</a>
+<a href=#1068 id=1068 data-nosnippet>1068</a> <span class="doccomment">/// Creates decimal literal from string. See [`Decimal::from_str_exact`].
+<a href=#1069 id=1069 data-nosnippet>1069</a> ///
+<a href=#1070 id=1070 data-nosnippet>1070</a> /// Example:
+<a href=#1071 id=1071 data-nosnippet>1071</a> ///
+<a href=#1072 id=1072 data-nosnippet>1072</a> /// ```rust
+<a href=#1073 id=1073 data-nosnippet>1073</a> /// use iceberg::spec::Datum;
+<a href=#1074 id=1074 data-nosnippet>1074</a> /// use itertools::assert_equal;
+<a href=#1075 id=1075 data-nosnippet>1075</a> /// use rust_decimal::Decimal;
+<a href=#1076 id=1076 data-nosnippet>1076</a> /// let t = Datum::decimal_from_str("123.45").unwrap();
+<a href=#1077 id=1077 data-nosnippet>1077</a> ///
+<a href=#1078 id=1078 data-nosnippet>1078</a> /// assert_eq!(&format!("{t}"), "123.45");
+<a href=#1079 id=1079 data-nosnippet>1079</a> /// ```
+<a href=#1080 id=1080 data-nosnippet>1080</a> </span><span class="kw">pub fn </span>decimal_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#1081 id=1081 data-nosnippet>1081</a> <span class="kw">let </span>decimal = Decimal::from_str_exact(s.as_ref()).map_err(|e| {
+<a href=#1082 id=1082 data-nosnippet>1082</a> Error::new(ErrorKind::DataInvalid, <span class="string">"Can't parse decimal."</span>).with_source(e)
+<a href=#1083 id=1083 data-nosnippet>1083</a> })<span class="question-mark">?</span>;
+<a href=#1084 id=1084 data-nosnippet>1084</a>
+<a href=#1085 id=1085 data-nosnippet>1085</a> <span class="self">Self</span>::decimal(decimal)
+<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="doccomment">/// Try to create a decimal literal from [`Decimal`].
+<a href=#1089 id=1089 data-nosnippet>1089</a> ///
+<a href=#1090 id=1090 data-nosnippet>1090</a> /// Example:
<a href=#1091 id=1091 data-nosnippet>1091</a> ///
-<a href=#1092 id=1092 data-nosnippet>1092</a> /// let t = Datum::decimal_with_precision(Decimal::new(123, 2), 30).unwrap();
-<a href=#1093 id=1093 data-nosnippet>1093</a> ///
-<a href=#1094 id=1094 data-nosnippet>1094</a> /// assert_eq!(&format!("{t}"), "1.23");
-<a href=#1095 id=1095 data-nosnippet>1095</a> /// ```
-<a href=#1096 id=1096 data-nosnippet>1096</a> </span><span class="kw">pub fn </span>decimal_with_precision(value: <span class="kw">impl </span>Into<Decimal>, precision: u32) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#1097 id=1097 data-nosnippet>1097</a> <span class="kw">let </span>decimal = value.into();
-<a href=#1098 id=1098 data-nosnippet>1098</a> <span class="kw">let </span>scale = decimal.scale();
-<a href=#1099 id=1099 data-nosnippet>1099</a>
-<a href=#1100 id=1100 data-nosnippet>1100</a> <span class="kw">let </span>available_bytes = Type::decimal_required_bytes(precision)<span class="question-mark">? </span><span class="kw">as </span>usize;
-<a href=#1101 id=1101 data-nosnippet>1101</a> <span class="kw">let </span>unscaled_value = BigInt::from(decimal.mantissa());
-<a href=#1102 id=1102 data-nosnippet>1102</a> <span class="kw">let </span>actual_bytes = unscaled_value.to_signed_bytes_be();
-<a href=#1103 id=1103 data-nosnippet>1103</a> <span class="kw">if </span>actual_bytes.len() > available_bytes {
-<a href=#1104 id=1104 data-nosnippet>1104</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
-<a href=#1105 id=1105 data-nosnippet>1105</a> ErrorKind::DataInvalid,
-<a href=#1106 id=1106 data-nosnippet>1106</a> <span class="macro">format!</span>(
-<a href=#1107 id=1107 data-nosnippet>1107</a> <span class="string">"Decimal value {} is too large for precision {}"</span>,
-<a href=#1108 id=1108 data-nosnippet>1108</a> decimal, precision
-<a href=#1109 id=1109 data-nosnippet>1109</a> ),
-<a href=#1110 id=1110 data-nosnippet>1110</a> ));
-<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> <span class="kw">let </span>r#type = Type::decimal(precision, scale)<span class="question-mark">?</span>;
-<a href=#1114 id=1114 data-nosnippet>1114</a> <span class="kw">if let </span>Type::Primitive(p) = r#type {
-<a href=#1115 id=1115 data-nosnippet>1115</a> <span class="prelude-val">Ok</span>(<span class="self">Self </span>{
-<a href=#1116 id=1116 data-nosnippet>1116</a> r#type: p,
-<a href=#1117 id=1117 data-nosnippet>1117</a> literal: PrimitiveLiteral::Int128(decimal.mantissa()),
-<a href=#1118 id=1118 data-nosnippet>1118</a> })
-<a href=#1119 id=1119 data-nosnippet>1119</a> } <span class="kw">else </span>{
-<a href=#1120 id=1120 data-nosnippet>1120</a> <span class="macro">unreachable!</span>(<span class="string">"Decimal type must be primitive."</span>)
-<a href=#1121 id=1121 data-nosnippet>1121</a> }
-<a href=#1122 id=1122 data-nosnippet>1122</a> }
-<a href=#1123 id=1123 data-nosnippet>1123</a>
-<a href=#1124 id=1124 data-nosnippet>1124</a> <span class="kw">fn </span>i64_to_i32<T: Into<i64> + PartialOrd<i64>>(val: T) -> Datum {
-<a href=#1125 id=1125 data-nosnippet>1125</a> <span class="kw">if </span>val > INT_MAX <span class="kw">as </span>i64 {
-<a href=#1126 id=1126 data-nosnippet>1126</a> Datum::new(PrimitiveType::Int, PrimitiveLiteral::AboveMax)
-<a href=#1127 id=1127 data-nosnippet>1127</a> } <span class="kw">else if </span>val < INT_MIN <span class="kw">as </span>i64 {
-<a href=#1128 id=1128 data-nosnippet>1128</a> Datum::new(PrimitiveType::Int, PrimitiveLiteral::BelowMin)
-<a href=#1129 id=1129 data-nosnippet>1129</a> } <span class="kw">else </span>{
-<a href=#1130 id=1130 data-nosnippet>1130</a> Datum::int(val.into() <span class="kw">as </span>i32)
-<a href=#1131 id=1131 data-nosnippet>1131</a> }
-<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> <span class="kw">fn </span>i128_to_i32<T: Into<i128> + PartialOrd<i128>>(val: T) -> Datum {
-<a href=#1135 id=1135 data-nosnippet>1135</a> <span class="kw">if </span>val > INT_MAX <span class="kw">as </span>i128 {
-<a href=#1136 id=1136 data-nosnippet>1136</a> Datum::new(PrimitiveType::Int, PrimitiveLiteral::AboveMax)
-<a href=#1137 id=1137 data-nosnippet>1137</a> } <span class="kw">else if </span>val < INT_MIN <span class="kw">as </span>i128 {
-<a href=#1138 id=1138 data-nosnippet>1138</a> Datum::new(PrimitiveType::Int, PrimitiveLiteral::BelowMin)
-<a href=#1139 id=1139 data-nosnippet>1139</a> } <span class="kw">else </span>{
-<a href=#1140 id=1140 data-nosnippet>1140</a> Datum::int(val.into() <span class="kw">as </span>i32)
-<a href=#1141 id=1141 data-nosnippet>1141</a> }
-<a href=#1142 id=1142 data-nosnippet>1142</a> }
+<a href=#1092 id=1092 data-nosnippet>1092</a> /// ```rust
+<a href=#1093 id=1093 data-nosnippet>1093</a> /// use iceberg::spec::Datum;
+<a href=#1094 id=1094 data-nosnippet>1094</a> /// use rust_decimal::Decimal;
+<a href=#1095 id=1095 data-nosnippet>1095</a> ///
+<a href=#1096 id=1096 data-nosnippet>1096</a> /// let t = Datum::decimal(Decimal::new(123, 2)).unwrap();
+<a href=#1097 id=1097 data-nosnippet>1097</a> ///
+<a href=#1098 id=1098 data-nosnippet>1098</a> /// assert_eq!(&format!("{t}"), "1.23");
+<a href=#1099 id=1099 data-nosnippet>1099</a> /// ```
+<a href=#1100 id=1100 data-nosnippet>1100</a> </span><span class="kw">pub fn </span>decimal(value: <span class="kw">impl </span>Into<Decimal>) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#1101 id=1101 data-nosnippet>1101</a> <span class="kw">let </span>decimal = value.into();
+<a href=#1102 id=1102 data-nosnippet>1102</a> <span class="kw">let </span>scale = decimal.scale();
+<a href=#1103 id=1103 data-nosnippet>1103</a>
+<a href=#1104 id=1104 data-nosnippet>1104</a> <span class="kw">let </span>r#type = Type::decimal(MAX_DECIMAL_PRECISION, scale)<span class="question-mark">?</span>;
+<a href=#1105 id=1105 data-nosnippet>1105</a> <span class="kw">if let </span>Type::Primitive(p) = r#type {
+<a href=#1106 id=1106 data-nosnippet>1106</a> <span class="prelude-val">Ok</span>(<span class="self">Self </span>{
+<a href=#1107 id=1107 data-nosnippet>1107</a> r#type: p,
+<a href=#1108 id=1108 data-nosnippet>1108</a> literal: PrimitiveLiteral::Int128(decimal.mantissa()),
+<a href=#1109 id=1109 data-nosnippet>1109</a> })
+<a href=#1110 id=1110 data-nosnippet>1110</a> } <span class="kw">else </span>{
+<a href=#1111 id=1111 data-nosnippet>1111</a> <span class="macro">unreachable!</span>(<span class="string">"Decimal type must be primitive."</span>)
+<a href=#1112 id=1112 data-nosnippet>1112</a> }
+<a href=#1113 id=1113 data-nosnippet>1113</a> }
+<a href=#1114 id=1114 data-nosnippet>1114</a>
+<a href=#1115 id=1115 data-nosnippet>1115</a> <span class="doccomment">/// Try to create a decimal literal from [`Decimal`] with precision.
+<a href=#1116 id=1116 data-nosnippet>1116</a> ///
+<a href=#1117 id=1117 data-nosnippet>1117</a> /// Example:
+<a href=#1118 id=1118 data-nosnippet>1118</a> ///
+<a href=#1119 id=1119 data-nosnippet>1119</a> /// ```rust
+<a href=#1120 id=1120 data-nosnippet>1120</a> /// use iceberg::spec::Datum;
+<a href=#1121 id=1121 data-nosnippet>1121</a> /// use rust_decimal::Decimal;
+<a href=#1122 id=1122 data-nosnippet>1122</a> ///
+<a href=#1123 id=1123 data-nosnippet>1123</a> /// let t = Datum::decimal_with_precision(Decimal::new(123, 2), 30).unwrap();
+<a href=#1124 id=1124 data-nosnippet>1124</a> ///
+<a href=#1125 id=1125 data-nosnippet>1125</a> /// assert_eq!(&format!("{t}"), "1.23");
+<a href=#1126 id=1126 data-nosnippet>1126</a> /// ```
+<a href=#1127 id=1127 data-nosnippet>1127</a> </span><span class="kw">pub fn </span>decimal_with_precision(value: <span class="kw">impl </span>Into<Decimal>, precision: u32) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#1128 id=1128 data-nosnippet>1128</a> <span class="kw">let </span>decimal = value.into();
+<a href=#1129 id=1129 data-nosnippet>1129</a> <span class="kw">let </span>scale = decimal.scale();
+<a href=#1130 id=1130 data-nosnippet>1130</a>
+<a href=#1131 id=1131 data-nosnippet>1131</a> <span class="kw">let </span>available_bytes = Type::decimal_required_bytes(precision)<span class="question-mark">? </span><span class="kw">as </span>usize;
+<a href=#1132 id=1132 data-nosnippet>1132</a> <span class="kw">let </span>unscaled_value = BigInt::from(decimal.mantissa());
+<a href=#1133 id=1133 data-nosnippet>1133</a> <span class="kw">let </span>actual_bytes = unscaled_value.to_signed_bytes_be();
+<a href=#1134 id=1134 data-nosnippet>1134</a> <span class="kw">if </span>actual_bytes.len() > available_bytes {
+<a href=#1135 id=1135 data-nosnippet>1135</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#1136 id=1136 data-nosnippet>1136</a> ErrorKind::DataInvalid,
+<a href=#1137 id=1137 data-nosnippet>1137</a> <span class="macro">format!</span>(
+<a href=#1138 id=1138 data-nosnippet>1138</a> <span class="string">"Decimal value {} is too large for precision {}"</span>,
+<a href=#1139 id=1139 data-nosnippet>1139</a> decimal, precision
+<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> }
<a href=#1143 id=1143 data-nosnippet>1143</a>
-<a href=#1144 id=1144 data-nosnippet>1144</a> <span class="kw">fn </span>i128_to_i64<T: Into<i128> + PartialOrd<i128>>(val: T) -> Datum {
-<a href=#1145 id=1145 data-nosnippet>1145</a> <span class="kw">if </span>val > LONG_MAX <span class="kw">as </span>i128 {
-<a href=#1146 id=1146 data-nosnippet>1146</a> Datum::new(PrimitiveType::Long, PrimitiveLiteral::AboveMax)
-<a href=#1147 id=1147 data-nosnippet>1147</a> } <span class="kw">else if </span>val < LONG_MIN <span class="kw">as </span>i128 {
-<a href=#1148 id=1148 data-nosnippet>1148</a> Datum::new(PrimitiveType::Long, PrimitiveLiteral::BelowMin)
-<a href=#1149 id=1149 data-nosnippet>1149</a> } <span class="kw">else </span>{
-<a href=#1150 id=1150 data-nosnippet>1150</a> Datum::long(val.into() <span class="kw">as </span>i64)
-<a href=#1151 id=1151 data-nosnippet>1151</a> }
-<a href=#1152 id=1152 data-nosnippet>1152</a> }
-<a href=#1153 id=1153 data-nosnippet>1153</a>
-<a href=#1154 id=1154 data-nosnippet>1154</a> <span class="kw">fn </span>string_to_i128<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><i128> {
-<a href=#1155 id=1155 data-nosnippet>1155</a> s.as_ref().parse::<i128>().map_err(|e| {
-<a href=#1156 id=1156 data-nosnippet>1156</a> Error::new(ErrorKind::DataInvalid, <span class="string">"Can't parse string to i128."</span>).with_source(e)
-<a href=#1157 id=1157 data-nosnippet>1157</a> })
-<a href=#1158 id=1158 data-nosnippet>1158</a> }
-<a href=#1159 id=1159 data-nosnippet>1159</a>
-<a href=#1160 id=1160 data-nosnippet>1160</a> <span class="doccomment">/// Convert the datum to `target_type`.
-<a href=#1161 id=1161 data-nosnippet>1161</a> </span><span class="kw">pub fn </span>to(<span class="self">self</span>, target_type: <span class="kw-2">&</span>Type) -> <span class="prelude-ty">Result</span><Datum> {
-<a href=#1162 id=1162 data-nosnippet>1162</a> <span class="kw">match </span>target_type {
-<a href=#1163 id=1163 data-nosnippet>1163</a> Type::Primitive(target_primitive_type) => {
-<a href=#1164 id=1164 data-nosnippet>1164</a> <span class="kw">match </span>(<span class="kw-2">&</span><span class="self">self</span>.literal, <span class="kw-2">&</span><span class="self">self</span>.r#type, target_primitive_type) {
-<a href=#1165 id=1165 data-nosnippet>1165</a> (PrimitiveLiteral::Int(val), <span class="kw">_</span>, PrimitiveType::Int) => <span class="prelude-val">Ok</span>(Datum::int(<span class="kw-2">*</span>val)),
-<a href=#1166 id=1166 data-nosnippet>1166</a> (PrimitiveLiteral::Int(val), <span class="kw">_</span>, PrimitiveType::Date) => <span class="prelude-val">Ok</span>(Datum::date(<span class="kw-2">*</span>val)),
-<a href=#1167 id=1167 data-nosnippet>1167</a> (PrimitiveLiteral::Int(val), <span class="kw">_</span>, PrimitiveType::Long) => <span class="prelude-val">Ok</span>(Datum::long(<span class="kw-2">*</span>val)),
-<a href=#1168 id=1168 data-nosnippet>1168</a> (PrimitiveLiteral::Long(val), <span class="kw">_</span>, PrimitiveType::Int) => {
-<a href=#1169 id=1169 data-nosnippet>1169</a> <span class="prelude-val">Ok</span>(Datum::i64_to_i32(<span class="kw-2">*</span>val))
-<a href=#1170 id=1170 data-nosnippet>1170</a> }
-<a href=#1171 id=1171 data-nosnippet>1171</a> (PrimitiveLiteral::Long(val), <span class="kw">_</span>, PrimitiveType::Timestamp) => {
-<a href=#1172 id=1172 data-nosnippet>1172</a> <span class="prelude-val">Ok</span>(Datum::timestamp_micros(<span class="kw-2">*</span>val))
-<a href=#1173 id=1173 data-nosnippet>1173</a> }
-<a href=#1174 id=1174 data-nosnippet>1174</a> (PrimitiveLiteral::Long(val), <span class="kw">_</span>, PrimitiveType::Timestamptz) => {
-<a href=#1175 id=1175 data-nosnippet>1175</a> <span class="prelude-val">Ok</span>(Datum::timestamptz_micros(<span class="kw-2">*</span>val))
-<a href=#1176 id=1176 data-nosnippet>1176</a> }
-<a href=#1177 id=1177 data-nosnippet>1177</a> <span class="comment">// Let's wait with nano's until this clears up: https://github.com/apache/iceberg/pull/11775
-<a href=#1178 id=1178 data-nosnippet>1178</a> </span>(PrimitiveLiteral::Int128(val), <span class="kw">_</span>, PrimitiveType::Long) => {
-<a href=#1179 id=1179 data-nosnippet>1179</a> <span class="prelude-val">Ok</span>(Datum::i128_to_i64(<span class="kw-2">*</span>val))
-<a href=#1180 id=1180 data-nosnippet>1180</a> }
-<a href=#1181 id=1181 data-nosnippet>1181</a>
-<a href=#1182 id=1182 data-nosnippet>1182</a> (PrimitiveLiteral::String(val), <span class="kw">_</span>, PrimitiveType::Boolean) => {
-<a href=#1183 id=1183 data-nosnippet>1183</a> Datum::bool_from_str(val)
-<a href=#1184 id=1184 data-nosnippet>1184</a> }
-<a href=#1185 id=1185 data-nosnippet>1185</a> (PrimitiveLiteral::String(val), <span class="kw">_</span>, PrimitiveType::Int) => {
-<a href=#1186 id=1186 data-nosnippet>1186</a> Datum::string_to_i128(val).map(Datum::i128_to_i32)
-<a href=#1187 id=1187 data-nosnippet>1187</a> }
-<a href=#1188 id=1188 data-nosnippet>1188</a> (PrimitiveLiteral::String(val), <span class="kw">_</span>, PrimitiveType::Long) => {
-<a href=#1189 id=1189 data-nosnippet>1189</a> Datum::string_to_i128(val).map(Datum::i128_to_i64)
-<a href=#1190 id=1190 data-nosnippet>1190</a> }
-<a href=#1191 id=1191 data-nosnippet>1191</a> (PrimitiveLiteral::String(val), <span class="kw">_</span>, PrimitiveType::Timestamp) => {
-<a href=#1192 id=1192 data-nosnippet>1192</a> Datum::timestamp_from_str(val)
-<a href=#1193 id=1193 data-nosnippet>1193</a> }
-<a href=#1194 id=1194 data-nosnippet>1194</a> (PrimitiveLiteral::String(val), <span class="kw">_</span>, PrimitiveType::Timestamptz) => {
-<a href=#1195 id=1195 data-nosnippet>1195</a> Datum::timestamptz_from_str(val)
-<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> <span class="comment">// TODO: implement more type conversions
-<a href=#1199 id=1199 data-nosnippet>1199</a> </span>(<span class="kw">_</span>, self_type, target_type) <span class="kw">if </span>self_type == target_type => <span class="prelude-val">Ok</span>(<span class="self">self</span>),
-<a href=#1200 id=1200 data-nosnippet>1200</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(Error::new(
-<a href=#1201 id=1201 data-nosnippet>1201</a> ErrorKind::DataInvalid,
-<a href=#1202 id=1202 data-nosnippet>1202</a> <span class="macro">format!</span>(
-<a href=#1203 id=1203 data-nosnippet>1203</a> <span class="string">"Can't convert datum from {} type to {} type."</span>,
-<a href=#1204 id=1204 data-nosnippet>1204</a> <span class="self">self</span>.r#type, target_primitive_type
-<a href=#1205 id=1205 data-nosnippet>1205</a> ),
-<a href=#1206 id=1206 data-nosnippet>1206</a> )),
-<a href=#1207 id=1207 data-nosnippet>1207</a> }
-<a href=#1208 id=1208 data-nosnippet>1208</a> }
-<a href=#1209 id=1209 data-nosnippet>1209</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(Error::new(
-<a href=#1210 id=1210 data-nosnippet>1210</a> ErrorKind::DataInvalid,
-<a href=#1211 id=1211 data-nosnippet>1211</a> <span class="macro">format!</span>(
-<a href=#1212 id=1212 data-nosnippet>1212</a> <span class="string">"Can't convert datum from {} type to {} type."</span>,
-<a href=#1213 id=1213 data-nosnippet>1213</a> <span class="self">self</span>.r#type, target_type
-<a href=#1214 id=1214 data-nosnippet>1214</a> ),
-<a href=#1215 id=1215 data-nosnippet>1215</a> )),
-<a href=#1216 id=1216 data-nosnippet>1216</a> }
-<a href=#1217 id=1217 data-nosnippet>1217</a> }
-<a href=#1218 id=1218 data-nosnippet>1218</a>
-<a href=#1219 id=1219 data-nosnippet>1219</a> <span class="doccomment">/// Get the primitive literal from datum.
-<a href=#1220 id=1220 data-nosnippet>1220</a> </span><span class="kw">pub fn </span>literal(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>PrimitiveLiteral {
-<a href=#1221 id=1221 data-nosnippet>1221</a> <span class="kw-2">&</span><span class="self">self</span>.literal
-<a href=#1222 id=1222 data-nosnippet>1222</a> }
-<a href=#1223 id=1223 data-nosnippet>1223</a>
-<a href=#1224 id=1224 data-nosnippet>1224</a> <span class="doccomment">/// Get the primitive type from datum.
-<a href=#1225 id=1225 data-nosnippet>1225</a> </span><span class="kw">pub fn </span>data_type(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>PrimitiveType {
-<a href=#1226 id=1226 data-nosnippet>1226</a> <span class="kw-2">&</span><span class="self">self</span>.r#type
-<a href=#1227 id=1227 data-nosnippet>1227</a> }
+<a href=#1144 id=1144 data-nosnippet>1144</a> <span class="kw">let </span>r#type = Type::decimal(precision, scale)<span class="question-mark">?</span>;
+<a href=#1145 id=1145 data-nosnippet>1145</a> <span class="kw">if let </span>Type::Primitive(p) = r#type {
+<a href=#1146 id=1146 data-nosnippet>1146</a> <span class="prelude-val">Ok</span>(<span class="self">Self </span>{
+<a href=#1147 id=1147 data-nosnippet>1147</a> r#type: p,
+<a href=#1148 id=1148 data-nosnippet>1148</a> literal: PrimitiveLiteral::Int128(decimal.mantissa()),
+<a href=#1149 id=1149 data-nosnippet>1149</a> })
+<a href=#1150 id=1150 data-nosnippet>1150</a> } <span class="kw">else </span>{
+<a href=#1151 id=1151 data-nosnippet>1151</a> <span class="macro">unreachable!</span>(<span class="string">"Decimal type must be primitive."</span>)
+<a href=#1152 id=1152 data-nosnippet>1152</a> }
+<a href=#1153 id=1153 data-nosnippet>1153</a> }
+<a href=#1154 id=1154 data-nosnippet>1154</a>
+<a href=#1155 id=1155 data-nosnippet>1155</a> <span class="kw">fn </span>i64_to_i32<T: Into<i64> + PartialOrd<i64>>(val: T) -> Datum {
+<a href=#1156 id=1156 data-nosnippet>1156</a> <span class="kw">if </span>val > INT_MAX <span class="kw">as </span>i64 {
+<a href=#1157 id=1157 data-nosnippet>1157</a> Datum::new(PrimitiveType::Int, PrimitiveLiteral::AboveMax)
+<a href=#1158 id=1158 data-nosnippet>1158</a> } <span class="kw">else if </span>val < INT_MIN <span class="kw">as </span>i64 {
+<a href=#1159 id=1159 data-nosnippet>1159</a> Datum::new(PrimitiveType::Int, PrimitiveLiteral::BelowMin)
+<a href=#1160 id=1160 data-nosnippet>1160</a> } <span class="kw">else </span>{
+<a href=#1161 id=1161 data-nosnippet>1161</a> Datum::int(val.into() <span class="kw">as </span>i32)
+<a href=#1162 id=1162 data-nosnippet>1162</a> }
+<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> <span class="kw">fn </span>i128_to_i32<T: Into<i128> + PartialOrd<i128>>(val: T) -> Datum {
+<a href=#1166 id=1166 data-nosnippet>1166</a> <span class="kw">if </span>val > INT_MAX <span class="kw">as </span>i128 {
+<a href=#1167 id=1167 data-nosnippet>1167</a> Datum::new(PrimitiveType::Int, PrimitiveLiteral::AboveMax)
+<a href=#1168 id=1168 data-nosnippet>1168</a> } <span class="kw">else if </span>val < INT_MIN <span class="kw">as </span>i128 {
+<a href=#1169 id=1169 data-nosnippet>1169</a> Datum::new(PrimitiveType::Int, PrimitiveLiteral::BelowMin)
+<a href=#1170 id=1170 data-nosnippet>1170</a> } <span class="kw">else </span>{
+<a href=#1171 id=1171 data-nosnippet>1171</a> Datum::int(val.into() <span class="kw">as </span>i32)
+<a href=#1172 id=1172 data-nosnippet>1172</a> }
+<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="kw">fn </span>i128_to_i64<T: Into<i128> + PartialOrd<i128>>(val: T) -> Datum {
+<a href=#1176 id=1176 data-nosnippet>1176</a> <span class="kw">if </span>val > LONG_MAX <span class="kw">as </span>i128 {
+<a href=#1177 id=1177 data-nosnippet>1177</a> Datum::new(PrimitiveType::Long, PrimitiveLiteral::AboveMax)
+<a href=#1178 id=1178 data-nosnippet>1178</a> } <span class="kw">else if </span>val < LONG_MIN <span class="kw">as </span>i128 {
+<a href=#1179 id=1179 data-nosnippet>1179</a> Datum::new(PrimitiveType::Long, PrimitiveLiteral::BelowMin)
+<a href=#1180 id=1180 data-nosnippet>1180</a> } <span class="kw">else </span>{
+<a href=#1181 id=1181 data-nosnippet>1181</a> Datum::long(val.into() <span class="kw">as </span>i64)
+<a href=#1182 id=1182 data-nosnippet>1182</a> }
+<a href=#1183 id=1183 data-nosnippet>1183</a> }
+<a href=#1184 id=1184 data-nosnippet>1184</a>
+<a href=#1185 id=1185 data-nosnippet>1185</a> <span class="kw">fn </span>string_to_i128<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><i128> {
+<a href=#1186 id=1186 data-nosnippet>1186</a> s.as_ref().parse::<i128>().map_err(|e| {
+<a href=#1187 id=1187 data-nosnippet>1187</a> Error::new(ErrorKind::DataInvalid, <span class="string">"Can't parse string to i128."</span>).with_source(e)
+<a href=#1188 id=1188 data-nosnippet>1188</a> })
+<a href=#1189 id=1189 data-nosnippet>1189</a> }
+<a href=#1190 id=1190 data-nosnippet>1190</a>
+<a href=#1191 id=1191 data-nosnippet>1191</a> <span class="doccomment">/// Convert the datum to `target_type`.
+<a href=#1192 id=1192 data-nosnippet>1192</a> </span><span class="kw">pub fn </span>to(<span class="self">self</span>, target_type: <span class="kw-2">&</span>Type) -> <span class="prelude-ty">Result</span><Datum> {
+<a href=#1193 id=1193 data-nosnippet>1193</a> <span class="kw">match </span>target_type {
+<a href=#1194 id=1194 data-nosnippet>1194</a> Type::Primitive(target_primitive_type) => {
+<a href=#1195 id=1195 data-nosnippet>1195</a> <span class="kw">match </span>(<span class="kw-2">&</span><span class="self">self</span>.literal, <span class="kw-2">&</span><span class="self">self</span>.r#type, target_primitive_type) {
+<a href=#1196 id=1196 data-nosnippet>1196</a> (PrimitiveLiteral::Int(val), <span class="kw">_</span>, PrimitiveType::Int) => <span class="prelude-val">Ok</span>(Datum::int(<span class="kw-2">*</span>val)),
+<a href=#1197 id=1197 data-nosnippet>1197</a> (PrimitiveLiteral::Int(val), <span class="kw">_</span>, PrimitiveType::Date) => <span class="prelude-val">Ok</span>(Datum::date(<span class="kw-2">*</span>val)),
+<a href=#1198 id=1198 data-nosnippet>1198</a> (PrimitiveLiteral::Int(val), <span class="kw">_</span>, PrimitiveType::Long) => <span class="prelude-val">Ok</span>(Datum::long(<span class="kw-2">*</span>val)),
+<a href=#1199 id=1199 data-nosnippet>1199</a> (PrimitiveLiteral::Long(val), <span class="kw">_</span>, PrimitiveType::Int) => {
+<a href=#1200 id=1200 data-nosnippet>1200</a> <span class="prelude-val">Ok</span>(Datum::i64_to_i32(<span class="kw-2">*</span>val))
+<a href=#1201 id=1201 data-nosnippet>1201</a> }
+<a href=#1202 id=1202 data-nosnippet>1202</a> (PrimitiveLiteral::Long(val), <span class="kw">_</span>, PrimitiveType::Timestamp) => {
+<a href=#1203 id=1203 data-nosnippet>1203</a> <span class="prelude-val">Ok</span>(Datum::timestamp_micros(<span class="kw-2">*</span>val))
+<a href=#1204 id=1204 data-nosnippet>1204</a> }
+<a href=#1205 id=1205 data-nosnippet>1205</a> (PrimitiveLiteral::Long(val), <span class="kw">_</span>, PrimitiveType::Timestamptz) => {
+<a href=#1206 id=1206 data-nosnippet>1206</a> <span class="prelude-val">Ok</span>(Datum::timestamptz_micros(<span class="kw-2">*</span>val))
+<a href=#1207 id=1207 data-nosnippet>1207</a> }
+<a href=#1208 id=1208 data-nosnippet>1208</a> <span class="comment">// Let's wait with nano's until this clears up: https://github.com/apache/iceberg/pull/11775
+<a href=#1209 id=1209 data-nosnippet>1209</a> </span>(PrimitiveLiteral::Int128(val), <span class="kw">_</span>, PrimitiveType::Long) => {
+<a href=#1210 id=1210 data-nosnippet>1210</a> <span class="prelude-val">Ok</span>(Datum::i128_to_i64(<span class="kw-2">*</span>val))
+<a href=#1211 id=1211 data-nosnippet>1211</a> }
+<a href=#1212 id=1212 data-nosnippet>1212</a>
+<a href=#1213 id=1213 data-nosnippet>1213</a> (PrimitiveLiteral::String(val), <span class="kw">_</span>, PrimitiveType::Boolean) => {
+<a href=#1214 id=1214 data-nosnippet>1214</a> Datum::bool_from_str(val)
+<a href=#1215 id=1215 data-nosnippet>1215</a> }
+<a href=#1216 id=1216 data-nosnippet>1216</a> (PrimitiveLiteral::String(val), <span class="kw">_</span>, PrimitiveType::Int) => {
+<a href=#1217 id=1217 data-nosnippet>1217</a> Datum::string_to_i128(val).map(Datum::i128_to_i32)
+<a href=#1218 id=1218 data-nosnippet>1218</a> }
+<a href=#1219 id=1219 data-nosnippet>1219</a> (PrimitiveLiteral::String(val), <span class="kw">_</span>, PrimitiveType::Long) => {
+<a href=#1220 id=1220 data-nosnippet>1220</a> Datum::string_to_i128(val).map(Datum::i128_to_i64)
+<a href=#1221 id=1221 data-nosnippet>1221</a> }
+<a href=#1222 id=1222 data-nosnippet>1222</a> (PrimitiveLiteral::String(val), <span class="kw">_</span>, PrimitiveType::Timestamp) => {
+<a href=#1223 id=1223 data-nosnippet>1223</a> Datum::timestamp_from_str(val)
+<a href=#1224 id=1224 data-nosnippet>1224</a> }
+<a href=#1225 id=1225 data-nosnippet>1225</a> (PrimitiveLiteral::String(val), <span class="kw">_</span>, PrimitiveType::Timestamptz) => {
+<a href=#1226 id=1226 data-nosnippet>1226</a> Datum::timestamptz_from_str(val)
+<a href=#1227 id=1227 data-nosnippet>1227</a> }
<a href=#1228 id=1228 data-nosnippet>1228</a>
-<a href=#1229 id=1229 data-nosnippet>1229</a> <span class="doccomment">/// Returns true if the Literal represents a primitive type
-<a href=#1230 id=1230 data-nosnippet>1230</a> /// that can be a NaN, and that it's value is NaN
-<a href=#1231 id=1231 data-nosnippet>1231</a> </span><span class="kw">pub fn </span>is_nan(<span class="kw-2">&</span><span class="self">self</span>) -> bool {
-<a href=#1232 id=1232 data-nosnippet>1232</a> <span class="kw">match </span><span class="self">self</span>.literal {
-<a href=#1233 id=1233 data-nosnippet>1233</a> PrimitiveLiteral::Double(val) => val.is_nan(),
-<a href=#1234 id=1234 data-nosnippet>1234</a> PrimitiveLiteral::Float(val) => val.is_nan(),
-<a href=#1235 id=1235 data-nosnippet>1235</a> <span class="kw">_ </span>=> <span class="bool-val">false</span>,
-<a href=#1236 id=1236 data-nosnippet>1236</a> }
-<a href=#1237 id=1237 data-nosnippet>1237</a> }
-<a href=#1238 id=1238 data-nosnippet>1238</a>}
-<a href=#1239 id=1239 data-nosnippet>1239</a>
-<a href=#1240 id=1240 data-nosnippet>1240</a><span class="doccomment">/// Map is a collection of key-value pairs with a key type and a value type.
-<a href=#1241 id=1241 data-nosnippet>1241</a>/// It used in Literal::Map, to make it hashable, the order of key-value pairs is stored in a separate vector
-<a href=#1242 id=1242 data-nosnippet>1242</a>/// so that we can hash the map in a deterministic way. But it also means that the order of key-value pairs is matter
-<a href=#1243 id=1243 data-nosnippet>1243</a>/// for the hash value.
-<a href=#1244 id=1244 data-nosnippet>1244</a>///
-<a href=#1245 id=1245 data-nosnippet>1245</a>/// When converting to Arrow (e.g., for Iceberg), the map should be represented using
-<a href=#1246 id=1246 data-nosnippet>1246</a>/// the default field name "key_value".
-<a href=#1247 id=1247 data-nosnippet>1247</a>///
-<a href=#1248 id=1248 data-nosnippet>1248</a>/// Example:
-<a href=#1249 id=1249 data-nosnippet>1249</a>///
-<a href=#1250 id=1250 data-nosnippet>1250</a>/// ```text
-<a href=#1251 id=1251 data-nosnippet>1251</a>/// let key_value_field = Field::new(
-<a href=#1252 id=1252 data-nosnippet>1252</a>/// DEFAULT_MAP_FIELD_NAME,
-<a href=#1253 id=1253 data-nosnippet>1253</a>/// arrow_schema::DataType::Struct(vec![
-<a href=#1254 id=1254 data-nosnippet>1254</a>/// Arc::new(key_field.clone()),
-<a href=#1255 id=1255 data-nosnippet>1255</a>/// Arc::new(value_field.clone()),
-<a href=#1256 id=1256 data-nosnippet>1256</a>/// ].into()),
-<a href=#1257 id=1257 data-nosnippet>1257</a>/// false
-<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></span><span class="attr">#[derive(Clone, Debug, PartialEq, Eq)]
-<a href=#1261 id=1261 data-nosnippet>1261</a></span><span class="kw">pub struct </span>Map {
-<a href=#1262 id=1262 data-nosnippet>1262</a> index: HashMap<Literal, usize>,
-<a href=#1263 id=1263 data-nosnippet>1263</a> pair: Vec<(Literal, <span class="prelude-ty">Option</span><Literal>)>,
-<a href=#1264 id=1264 data-nosnippet>1264</a>}
-<a href=#1265 id=1265 data-nosnippet>1265</a>
-<a href=#1266 id=1266 data-nosnippet>1266</a><span class="kw">impl </span>Map {
-<a href=#1267 id=1267 data-nosnippet>1267</a> <span class="doccomment">/// Creates a new empty map.
-<a href=#1268 id=1268 data-nosnippet>1268</a> </span><span class="kw">pub fn </span>new() -> <span class="self">Self </span>{
-<a href=#1269 id=1269 data-nosnippet>1269</a> <span class="self">Self </span>{
-<a href=#1270 id=1270 data-nosnippet>1270</a> index: HashMap::new(),
-<a href=#1271 id=1271 data-nosnippet>1271</a> pair: Vec::new(),
-<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="doccomment">/// Return the number of key-value pairs in the map.
-<a href=#1276 id=1276 data-nosnippet>1276</a> </span><span class="kw">pub fn </span>len(<span class="kw-2">&</span><span class="self">self</span>) -> usize {
-<a href=#1277 id=1277 data-nosnippet>1277</a> <span class="self">self</span>.pair.len()
-<a href=#1278 id=1278 data-nosnippet>1278</a> }
-<a href=#1279 id=1279 data-nosnippet>1279</a>
-<a href=#1280 id=1280 data-nosnippet>1280</a> <span class="doccomment">/// Returns true if the map contains no elements.
-<a href=#1281 id=1281 data-nosnippet>1281</a> </span><span class="kw">pub fn </span>is_empty(<span class="kw-2">&</span><span class="self">self</span>) -> bool {
-<a href=#1282 id=1282 data-nosnippet>1282</a> <span class="self">self</span>.pair.is_empty()
-<a href=#1283 id=1283 data-nosnippet>1283</a> }
-<a href=#1284 id=1284 data-nosnippet>1284</a>
-<a href=#1285 id=1285 data-nosnippet>1285</a> <span class="doccomment">/// Inserts a key-value pair into the map.
-<a href=#1286 id=1286 data-nosnippet>1286</a> /// If the map did not have this key present, None is returned.
-<a href=#1287 id=1287 data-nosnippet>1287</a> /// If the map did have this key present, the value is updated, and the old value is returned.
-<a href=#1288 id=1288 data-nosnippet>1288</a> </span><span class="kw">pub fn </span>insert(<span class="kw-2">&mut </span><span class="self">self</span>, key: Literal, value: <span class="prelude-ty">Option</span><Literal>) -> <span class="prelude-ty">Option</span><<span class="prelude-ty">Option</span><Literal>> {
-<a href=#1289 id=1289 data-nosnippet>1289</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(index) = <span class="self">self</span>.index.get(<span class="kw-2">&</span>key) {
-<a href=#1290 id=1290 data-nosnippet>1290</a> <span class="kw">let </span>old_value = std::mem::replace(<span class="kw-2">&mut </span><span class="self">self</span>.pair[<span class="kw-2">*</span>index].<span class="number">1</span>, value);
-<a href=#1291 id=1291 data-nosnippet>1291</a> <span class="prelude-val">Some</span>(old_value)
-<a href=#1292 id=1292 data-nosnippet>1292</a> } <span class="kw">else </span>{
-<a href=#1293 id=1293 data-nosnippet>1293</a> <span class="self">self</span>.pair.push((key.clone(), value));
-<a href=#1294 id=1294 data-nosnippet>1294</a> <span class="self">self</span>.index.insert(key, <span class="self">self</span>.pair.len() - <span class="number">1</span>);
-<a href=#1295 id=1295 data-nosnippet>1295</a> <span class="prelude-val">None
-<a href=#1296 id=1296 data-nosnippet>1296</a> </span>}
-<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="doccomment">/// Returns a reference to the value corresponding to the key.
-<a href=#1300 id=1300 data-nosnippet>1300</a> /// If the key is not present in the map, None is returned.
-<a href=#1301 id=1301 data-nosnippet>1301</a> </span><span class="kw">pub fn </span>get(<span class="kw-2">&</span><span class="self">self</span>, key: <span class="kw-2">&</span>Literal) -> <span class="prelude-ty">Option</span><<span class="kw-2">&</span><span class="prelude-ty">Option</span><Literal>> {
-<a href=#1302 id=1302 data-nosnippet>1302</a> <span class="self">self</span>.index.get(key).map(|index| <span class="kw-2">&</span><span class="self">self</span>.pair[<span class="kw-2">*</span>index].<span class="number">1</span>)
-<a href=#1303 id=1303 data-nosnippet>1303</a> }
-<a href=#1304 id=1304 data-nosnippet>1304</a>
-<a href=#1305 id=1305 data-nosnippet>1305</a> <span class="doccomment">/// The order of map is matter, so this method used to compare two maps has same key-value pairs without considering the order.
-<a href=#1306 id=1306 data-nosnippet>1306</a> </span><span class="kw">pub fn </span>has_same_content(<span class="kw-2">&</span><span class="self">self</span>, other: <span class="kw-2">&</span>Map) -> bool {
-<a href=#1307 id=1307 data-nosnippet>1307</a> <span class="kw">if </span><span class="self">self</span>.len() != other.len() {
-<a href=#1308 id=1308 data-nosnippet>1308</a> <span class="kw">return </span><span class="bool-val">false</span>;
-<a href=#1309 id=1309 data-nosnippet>1309</a> }
+<a href=#1229 id=1229 data-nosnippet>1229</a> <span class="comment">// TODO: implement more type conversions
+<a href=#1230 id=1230 data-nosnippet>1230</a> </span>(<span class="kw">_</span>, self_type, target_type) <span class="kw">if </span>self_type == target_type => <span class="prelude-val">Ok</span>(<span class="self">self</span>),
+<a href=#1231 id=1231 data-nosnippet>1231</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(Error::new(
+<a href=#1232 id=1232 data-nosnippet>1232</a> ErrorKind::DataInvalid,
+<a href=#1233 id=1233 data-nosnippet>1233</a> <span class="macro">format!</span>(
+<a href=#1234 id=1234 data-nosnippet>1234</a> <span class="string">"Can't convert datum from {} type to {} type."</span>,
+<a href=#1235 id=1235 data-nosnippet>1235</a> <span class="self">self</span>.r#type, target_primitive_type
+<a href=#1236 id=1236 data-nosnippet>1236</a> ),
+<a href=#1237 id=1237 data-nosnippet>1237</a> )),
+<a href=#1238 id=1238 data-nosnippet>1238</a> }
+<a href=#1239 id=1239 data-nosnippet>1239</a> }
+<a href=#1240 id=1240 data-nosnippet>1240</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(Error::new(
+<a href=#1241 id=1241 data-nosnippet>1241</a> ErrorKind::DataInvalid,
+<a href=#1242 id=1242 data-nosnippet>1242</a> <span class="macro">format!</span>(
+<a href=#1243 id=1243 data-nosnippet>1243</a> <span class="string">"Can't convert datum from {} type to {} type."</span>,
+<a href=#1244 id=1244 data-nosnippet>1244</a> <span class="self">self</span>.r#type, target_type
+<a href=#1245 id=1245 data-nosnippet>1245</a> ),
+<a href=#1246 id=1246 data-nosnippet>1246</a> )),
+<a href=#1247 id=1247 data-nosnippet>1247</a> }
+<a href=#1248 id=1248 data-nosnippet>1248</a> }
+<a href=#1249 id=1249 data-nosnippet>1249</a>
+<a href=#1250 id=1250 data-nosnippet>1250</a> <span class="doccomment">/// Get the primitive literal from datum.
+<a href=#1251 id=1251 data-nosnippet>1251</a> </span><span class="kw">pub fn </span>literal(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>PrimitiveLiteral {
+<a href=#1252 id=1252 data-nosnippet>1252</a> <span class="kw-2">&</span><span class="self">self</span>.literal
+<a href=#1253 id=1253 data-nosnippet>1253</a> }
+<a href=#1254 id=1254 data-nosnippet>1254</a>
+<a href=#1255 id=1255 data-nosnippet>1255</a> <span class="doccomment">/// Get the primitive type from datum.
+<a href=#1256 id=1256 data-nosnippet>1256</a> </span><span class="kw">pub fn </span>data_type(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>PrimitiveType {
+<a href=#1257 id=1257 data-nosnippet>1257</a> <span class="kw-2">&</span><span class="self">self</span>.r#type
+<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> <span class="doccomment">/// Returns true if the Literal represents a primitive type
+<a href=#1261 id=1261 data-nosnippet>1261</a> /// that can be a NaN, and that it's value is NaN
+<a href=#1262 id=1262 data-nosnippet>1262</a> </span><span class="kw">pub fn </span>is_nan(<span class="kw-2">&</span><span class="self">self</span>) -> bool {
+<a href=#1263 id=1263 data-nosnippet>1263</a> <span class="kw">match </span><span class="self">self</span>.literal {
+<a href=#1264 id=1264 data-nosnippet>1264</a> PrimitiveLiteral::Double(val) => val.is_nan(),
+<a href=#1265 id=1265 data-nosnippet>1265</a> PrimitiveLiteral::Float(val) => val.is_nan(),
+<a href=#1266 id=1266 data-nosnippet>1266</a> <span class="kw">_ </span>=> <span class="bool-val">false</span>,
+<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="doccomment">/// Map is a collection of key-value pairs with a key type and a value type.
+<a href=#1272 id=1272 data-nosnippet>1272</a>/// It used in Literal::Map, to make it hashable, the order of key-value pairs is stored in a separate vector
+<a href=#1273 id=1273 data-nosnippet>1273</a>/// so that we can hash the map in a deterministic way. But it also means that the order of key-value pairs is matter
+<a href=#1274 id=1274 data-nosnippet>1274</a>/// for the hash value.
+<a href=#1275 id=1275 data-nosnippet>1275</a>///
+<a href=#1276 id=1276 data-nosnippet>1276</a>/// When converting to Arrow (e.g., for Iceberg), the map should be represented using
+<a href=#1277 id=1277 data-nosnippet>1277</a>/// the default field name "key_value".
+<a href=#1278 id=1278 data-nosnippet>1278</a>///
+<a href=#1279 id=1279 data-nosnippet>1279</a>/// Example:
+<a href=#1280 id=1280 data-nosnippet>1280</a>///
+<a href=#1281 id=1281 data-nosnippet>1281</a>/// ```text
+<a href=#1282 id=1282 data-nosnippet>1282</a>/// let key_value_field = Field::new(
+<a href=#1283 id=1283 data-nosnippet>1283</a>/// DEFAULT_MAP_FIELD_NAME,
+<a href=#1284 id=1284 data-nosnippet>1284</a>/// arrow_schema::DataType::Struct(vec![
+<a href=#1285 id=1285 data-nosnippet>1285</a>/// Arc::new(key_field.clone()),
+<a href=#1286 id=1286 data-nosnippet>1286</a>/// Arc::new(value_field.clone()),
+<a href=#1287 id=1287 data-nosnippet>1287</a>/// ].into()),
+<a href=#1288 id=1288 data-nosnippet>1288</a>/// false
+<a href=#1289 id=1289 data-nosnippet>1289</a>/// );
+<a href=#1290 id=1290 data-nosnippet>1290</a>/// '''
+<a href=#1291 id=1291 data-nosnippet>1291</a></span><span class="attr">#[derive(Clone, Debug, PartialEq, Eq)]
+<a href=#1292 id=1292 data-nosnippet>1292</a></span><span class="kw">pub struct </span>Map {
+<a href=#1293 id=1293 data-nosnippet>1293</a> index: HashMap<Literal, usize>,
+<a href=#1294 id=1294 data-nosnippet>1294</a> pair: Vec<(Literal, <span class="prelude-ty">Option</span><Literal>)>,
+<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><span class="kw">impl </span>Map {
+<a href=#1298 id=1298 data-nosnippet>1298</a> <span class="doccomment">/// Creates a new empty map.
+<a href=#1299 id=1299 data-nosnippet>1299</a> </span><span class="kw">pub fn </span>new() -> <span class="self">Self </span>{
+<a href=#1300 id=1300 data-nosnippet>1300</a> <span class="self">Self </span>{
+<a href=#1301 id=1301 data-nosnippet>1301</a> index: HashMap::new(),
+<a href=#1302 id=1302 data-nosnippet>1302</a> pair: Vec::new(),
+<a href=#1303 id=1303 data-nosnippet>1303</a> }
+<a href=#1304 id=1304 data-nosnippet>1304</a> }
+<a href=#1305 id=1305 data-nosnippet>1305</a>
+<a href=#1306 id=1306 data-nosnippet>1306</a> <span class="doccomment">/// Return the number of key-value pairs in the map.
+<a href=#1307 id=1307 data-nosnippet>1307</a> </span><span class="kw">pub fn </span>len(<span class="kw-2">&</span><span class="self">self</span>) -> usize {
+<a href=#1308 id=1308 data-nosnippet>1308</a> <span class="self">self</span>.pair.len()
+<a href=#1309 id=1309 data-nosnippet>1309</a> }
<a href=#1310 id=1310 data-nosnippet>1310</a>
-<a href=#1311 id=1311 data-nosnippet>1311</a> <span class="kw">for </span>(key, value) <span class="kw">in </span><span class="kw-2">&</span><span class="self">self</span>.pair {
-<a href=#1312 id=1312 data-nosnippet>1312</a> <span class="kw">match </span>other.get(key) {
-<a href=#1313 id=1313 data-nosnippet>1313</a> <span class="prelude-val">Some</span>(other_value) <span class="kw">if </span>value == other_value => (),
-<a href=#1314 id=1314 data-nosnippet>1314</a> <span class="kw">_ </span>=> <span class="kw">return </span><span class="bool-val">false</span>,
-<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>
-<a href=#1318 id=1318 data-nosnippet>1318</a> <span class="bool-val">true
-<a href=#1319 id=1319 data-nosnippet>1319</a> </span>}
-<a href=#1320 id=1320 data-nosnippet>1320</a>}
-<a href=#1321 id=1321 data-nosnippet>1321</a>
-<a href=#1322 id=1322 data-nosnippet>1322</a><span class="kw">impl </span>Default <span class="kw">for </span>Map {
-<a href=#1323 id=1323 data-nosnippet>1323</a> <span class="kw">fn </span>default() -> <span class="self">Self </span>{
-<a href=#1324 id=1324 data-nosnippet>1324</a> <span class="self">Self</span>::new()
-<a href=#1325 id=1325 data-nosnippet>1325</a> }
-<a href=#1326 id=1326 data-nosnippet>1326</a>}
-<a href=#1327 id=1327 data-nosnippet>1327</a>
-<a href=#1328 id=1328 data-nosnippet>1328</a><span class="kw">impl </span>Hash <span class="kw">for </span>Map {
-<a href=#1329 id=1329 data-nosnippet>1329</a> <span class="kw">fn </span>hash<H: std::hash::Hasher>(<span class="kw-2">&</span><span class="self">self</span>, state: <span class="kw-2">&mut </span>H) {
-<a href=#1330 id=1330 data-nosnippet>1330</a> <span class="kw">for </span>(key, value) <span class="kw">in </span><span class="kw-2">&</span><span class="self">self</span>.pair {
-<a href=#1331 id=1331 data-nosnippet>1331</a> key.hash(state);
-<a href=#1332 id=1332 data-nosnippet>1332</a> value.hash(state);
-<a href=#1333 id=1333 data-nosnippet>1333</a> }
+<a href=#1311 id=1311 data-nosnippet>1311</a> <span class="doccomment">/// Returns true if the map contains no elements.
+<a href=#1312 id=1312 data-nosnippet>1312</a> </span><span class="kw">pub fn </span>is_empty(<span class="kw-2">&</span><span class="self">self</span>) -> bool {
+<a href=#1313 id=1313 data-nosnippet>1313</a> <span class="self">self</span>.pair.is_empty()
+<a href=#1314 id=1314 data-nosnippet>1314</a> }
+<a href=#1315 id=1315 data-nosnippet>1315</a>
+<a href=#1316 id=1316 data-nosnippet>1316</a> <span class="doccomment">/// Inserts a key-value pair into the map.
+<a href=#1317 id=1317 data-nosnippet>1317</a> /// If the map did not have this key present, None is returned.
+<a href=#1318 id=1318 data-nosnippet>1318</a> /// If the map did have this key present, the value is updated, and the old value is returned.
+<a href=#1319 id=1319 data-nosnippet>1319</a> </span><span class="kw">pub fn </span>insert(<span class="kw-2">&mut </span><span class="self">self</span>, key: Literal, value: <span class="prelude-ty">Option</span><Literal>) -> <span class="prelude-ty">Option</span><<span class="prelude-ty">Option</span><Literal>> {
+<a href=#1320 id=1320 data-nosnippet>1320</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(index) = <span class="self">self</span>.index.get(<span class="kw-2">&</span>key) {
+<a href=#1321 id=1321 data-nosnippet>1321</a> <span class="kw">let </span>old_value = std::mem::replace(<span class="kw-2">&mut </span><span class="self">self</span>.pair[<span class="kw-2">*</span>index].<span class="number">1</span>, value);
+<a href=#1322 id=1322 data-nosnippet>1322</a> <span class="prelude-val">Some</span>(old_value)
+<a href=#1323 id=1323 data-nosnippet>1323</a> } <span class="kw">else </span>{
+<a href=#1324 id=1324 data-nosnippet>1324</a> <span class="self">self</span>.pair.push((key.clone(), value));
+<a href=#1325 id=1325 data-nosnippet>1325</a> <span class="self">self</span>.index.insert(key, <span class="self">self</span>.pair.len() - <span class="number">1</span>);
+<a href=#1326 id=1326 data-nosnippet>1326</a> <span class="prelude-val">None
+<a href=#1327 id=1327 data-nosnippet>1327</a> </span>}
+<a href=#1328 id=1328 data-nosnippet>1328</a> }
+<a href=#1329 id=1329 data-nosnippet>1329</a>
+<a href=#1330 id=1330 data-nosnippet>1330</a> <span class="doccomment">/// Returns a reference to the value corresponding to the key.
+<a href=#1331 id=1331 data-nosnippet>1331</a> /// If the key is not present in the map, None is returned.
+<a href=#1332 id=1332 data-nosnippet>1332</a> </span><span class="kw">pub fn </span>get(<span class="kw-2">&</span><span class="self">self</span>, key: <span class="kw-2">&</span>Literal) -> <span class="prelude-ty">Option</span><<span class="kw-2">&</span><span class="prelude-ty">Option</span><Literal>> {
+<a href=#1333 id=1333 data-nosnippet>1333</a> <span class="self">self</span>.index.get(key).map(|index| <span class="kw-2">&</span><span class="self">self</span>.pair[<span class="kw-2">*</span>index].<span class="number">1</span>)
<a href=#1334 id=1334 data-nosnippet>1334</a> }
-<a href=#1335 id=1335 data-nosnippet>1335</a>}
-<a href=#1336 id=1336 data-nosnippet>1336</a>
-<a href=#1337 id=1337 data-nosnippet>1337</a><span class="kw">impl </span>FromIterator<(Literal, <span class="prelude-ty">Option</span><Literal>)> <span class="kw">for </span>Map {
-<a href=#1338 id=1338 data-nosnippet>1338</a> <span class="kw">fn </span>from_iter<T: IntoIterator<Item = (Literal, <span class="prelude-ty">Option</span><Literal>)>>(iter: T) -> <span class="self">Self </span>{
-<a href=#1339 id=1339 data-nosnippet>1339</a> <span class="kw">let </span><span class="kw-2">mut </span>map = Map::new();
-<a href=#1340 id=1340 data-nosnippet>1340</a> <span class="kw">for </span>(key, value) <span class="kw">in </span>iter {
-<a href=#1341 id=1341 data-nosnippet>1341</a> map.insert(key, value);
-<a href=#1342 id=1342 data-nosnippet>1342</a> }
-<a href=#1343 id=1343 data-nosnippet>1343</a> map
-<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>
-<a href=#1347 id=1347 data-nosnippet>1347</a><span class="kw">impl </span>IntoIterator <span class="kw">for </span>Map {
-<a href=#1348 id=1348 data-nosnippet>1348</a> <span class="kw">type </span>Item = (Literal, <span class="prelude-ty">Option</span><Literal>);
-<a href=#1349 id=1349 data-nosnippet>1349</a> <span class="kw">type </span>IntoIter = std::vec::IntoIter<<span class="self">Self</span>::Item>;
-<a href=#1350 id=1350 data-nosnippet>1350</a>
-<a href=#1351 id=1351 data-nosnippet>1351</a> <span class="kw">fn </span>into_iter(<span class="self">self</span>) -> <span class="self">Self</span>::IntoIter {
-<a href=#1352 id=1352 data-nosnippet>1352</a> <span class="self">self</span>.pair.into_iter()
-<a href=#1353 id=1353 data-nosnippet>1353</a> }
-<a href=#1354 id=1354 data-nosnippet>1354</a>}
-<a href=#1355 id=1355 data-nosnippet>1355</a>
-<a href=#1356 id=1356 data-nosnippet>1356</a><span class="kw">impl</span><<span class="kw">const </span>N: usize> From<[(Literal, <span class="prelude-ty">Option</span><Literal>); N]> <span class="kw">for </span>Map {
-<a href=#1357 id=1357 data-nosnippet>1357</a> <span class="kw">fn </span>from(value: [(Literal, <span class="prelude-ty">Option</span><Literal>); N]) -> <span class="self">Self </span>{
-<a href=#1358 id=1358 data-nosnippet>1358</a> value.iter().cloned().collect()
-<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>
-<a href=#1362 id=1362 data-nosnippet>1362</a><span class="doccomment">/// Values present in iceberg type
-<a href=#1363 id=1363 data-nosnippet>1363</a></span><span class="attr">#[derive(Clone, Debug, PartialEq, Eq, Hash)]
-<a href=#1364 id=1364 data-nosnippet>1364</a></span><span class="kw">pub enum </span>Literal {
-<a href=#1365 id=1365 data-nosnippet>1365</a> <span class="doccomment">/// A primitive value
-<a href=#1366 id=1366 data-nosnippet>1366</a> </span>Primitive(PrimitiveLiteral),
-<a href=#1367 id=1367 data-nosnippet>1367</a> <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=#1368 id=1368 data-nosnippet>1368</a> /// Each field can be either optional or required, meaning that values can (or cannot) be null. Fields may be any type.
-<a href=#1369 id=1369 data-nosnippet>1369</a> /// Fields may have an optional comment or doc string. Fields can have default values.
-<a href=#1370 id=1370 data-nosnippet>1370</a> </span>Struct(Struct),
-<a href=#1371 id=1371 data-nosnippet>1371</a> <span class="doccomment">/// A list is a collection of values with some element type.
-<a href=#1372 id=1372 data-nosnippet>1372</a> /// The element field has an integer id that is unique in the table schema.
-<a href=#1373 id=1373 data-nosnippet>1373</a> /// Elements can be either optional or required. Element types may be any type.
-<a href=#1374 id=1374 data-nosnippet>1374</a> </span>List(Vec<<span class="prelude-ty">Option</span><Literal>>),
-<a href=#1375 id=1375 data-nosnippet>1375</a> <span class="doccomment">/// A map is a collection of key-value pairs with a key type and a value type.
-<a href=#1376 id=1376 data-nosnippet>1376</a> /// Both the key field and value field each have an integer id that is unique in the table schema.
-<a href=#1377 id=1377 data-nosnippet>1377</a> /// 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.
-<a href=#1378 id=1378 data-nosnippet>1378</a> </span>Map(Map),
-<a href=#1379 id=1379 data-nosnippet>1379</a>}
-<a href=#1380 id=1380 data-nosnippet>1380</a>
-<a href=#1381 id=1381 data-nosnippet>1381</a><span class="kw">impl </span>Literal {
-<a href=#1382 id=1382 data-nosnippet>1382</a> <span class="doccomment">/// Creates a boolean value.
-<a href=#1383 id=1383 data-nosnippet>1383</a> ///
-<a href=#1384 id=1384 data-nosnippet>1384</a> /// Example:
-<a href=#1385 id=1385 data-nosnippet>1385</a> /// ```rust
-<a href=#1386 id=1386 data-nosnippet>1386</a> /// use iceberg::spec::{Literal, PrimitiveLiteral};
-<a href=#1387 id=1387 data-nosnippet>1387</a> /// let t = Literal::bool(true);
-<a href=#1388 id=1388 data-nosnippet>1388</a> ///
-<a href=#1389 id=1389 data-nosnippet>1389</a> /// assert_eq!(Literal::Primitive(PrimitiveLiteral::Boolean(true)), t);
-<a href=#1390 id=1390 data-nosnippet>1390</a> /// ```
-<a href=#1391 id=1391 data-nosnippet>1391</a> </span><span class="kw">pub fn </span>bool<T: Into<bool>>(t: T) -> <span class="self">Self </span>{
-<a href=#1392 id=1392 data-nosnippet>1392</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Boolean(t.into()))
-<a href=#1393 id=1393 data-nosnippet>1393</a> }
-<a href=#1394 id=1394 data-nosnippet>1394</a>
-<a href=#1395 id=1395 data-nosnippet>1395</a> <span class="doccomment">/// Creates a boolean value from string.
-<a href=#1396 id=1396 data-nosnippet>1396</a> /// See [Parse bool from str](https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromStr-for-bool) for reference.
-<a href=#1397 id=1397 data-nosnippet>1397</a> ///
-<a href=#1398 id=1398 data-nosnippet>1398</a> /// Example:
-<a href=#1399 id=1399 data-nosnippet>1399</a> /// ```rust
-<a href=#1400 id=1400 data-nosnippet>1400</a> /// use iceberg::spec::{Literal, PrimitiveLiteral};
-<a href=#1401 id=1401 data-nosnippet>1401</a> /// let t = Literal::bool_from_str("false").unwrap();
-<a href=#1402 id=1402 data-nosnippet>1402</a> ///
-<a href=#1403 id=1403 data-nosnippet>1403</a> /// assert_eq!(Literal::Primitive(PrimitiveLiteral::Boolean(false)), t);
-<a href=#1404 id=1404 data-nosnippet>1404</a> /// ```
-<a href=#1405 id=1405 data-nosnippet>1405</a> </span><span class="kw">pub fn </span>bool_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#1406 id=1406 data-nosnippet>1406</a> <span class="kw">let </span>v = s.as_ref().parse::<bool>().map_err(|e| {
-<a href=#1407 id=1407 data-nosnippet>1407</a> Error::new(ErrorKind::DataInvalid, <span class="string">"Can't parse string to bool."</span>).with_source(e)
-<a href=#1408 id=1408 data-nosnippet>1408</a> })<span class="question-mark">?</span>;
-<a href=#1409 id=1409 data-nosnippet>1409</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::Primitive(PrimitiveLiteral::Boolean(v)))
-<a href=#1410 id=1410 data-nosnippet>1410</a> }
+<a href=#1335 id=1335 data-nosnippet>1335</a>
+<a href=#1336 id=1336 data-nosnippet>1336</a> <span class="doccomment">/// The order of map is matter, so this method used to compare two maps has same key-value pairs without considering the order.
+<a href=#1337 id=1337 data-nosnippet>1337</a> </span><span class="kw">pub fn </span>has_same_content(<span class="kw-2">&</span><span class="self">self</span>, other: <span class="kw-2">&</span>Map) -> bool {
+<a href=#1338 id=1338 data-nosnippet>1338</a> <span class="kw">if </span><span class="self">self</span>.len() != other.len() {
+<a href=#1339 id=1339 data-nosnippet>1339</a> <span class="kw">return </span><span class="bool-val">false</span>;
+<a href=#1340 id=1340 data-nosnippet>1340</a> }
+<a href=#1341 id=1341 data-nosnippet>1341</a>
+<a href=#1342 id=1342 data-nosnippet>1342</a> <span class="kw">for </span>(key, value) <span class="kw">in </span><span class="kw-2">&</span><span class="self">self</span>.pair {
+<a href=#1343 id=1343 data-nosnippet>1343</a> <span class="kw">match </span>other.get(key) {
+<a href=#1344 id=1344 data-nosnippet>1344</a> <span class="prelude-val">Some</span>(other_value) <span class="kw">if </span>value == other_value => (),
+<a href=#1345 id=1345 data-nosnippet>1345</a> <span class="kw">_ </span>=> <span class="kw">return </span><span class="bool-val">false</span>,
+<a href=#1346 id=1346 data-nosnippet>1346</a> }
+<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> <span class="bool-val">true
+<a href=#1350 id=1350 data-nosnippet>1350</a> </span>}
+<a href=#1351 id=1351 data-nosnippet>1351</a>}
+<a href=#1352 id=1352 data-nosnippet>1352</a>
+<a href=#1353 id=1353 data-nosnippet>1353</a><span class="kw">impl </span>Default <span class="kw">for </span>Map {
+<a href=#1354 id=1354 data-nosnippet>1354</a> <span class="kw">fn </span>default() -> <span class="self">Self </span>{
+<a href=#1355 id=1355 data-nosnippet>1355</a> <span class="self">Self</span>::new()
+<a href=#1356 id=1356 data-nosnippet>1356</a> }
+<a href=#1357 id=1357 data-nosnippet>1357</a>}
+<a href=#1358 id=1358 data-nosnippet>1358</a>
+<a href=#1359 id=1359 data-nosnippet>1359</a><span class="kw">impl </span>Hash <span class="kw">for </span>Map {
+<a href=#1360 id=1360 data-nosnippet>1360</a> <span class="kw">fn </span>hash<H: std::hash::Hasher>(<span class="kw-2">&</span><span class="self">self</span>, state: <span class="kw-2">&mut </span>H) {
+<a href=#1361 id=1361 data-nosnippet>1361</a> <span class="kw">for </span>(key, value) <span class="kw">in </span><span class="kw-2">&</span><span class="self">self</span>.pair {
+<a href=#1362 id=1362 data-nosnippet>1362</a> key.hash(state);
+<a href=#1363 id=1363 data-nosnippet>1363</a> value.hash(state);
+<a href=#1364 id=1364 data-nosnippet>1364</a> }
+<a href=#1365 id=1365 data-nosnippet>1365</a> }
+<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 class="kw">impl </span>FromIterator<(Literal, <span class="prelude-ty">Option</span><Literal>)> <span class="kw">for </span>Map {
+<a href=#1369 id=1369 data-nosnippet>1369</a> <span class="kw">fn </span>from_iter<T: IntoIterator<Item = (Literal, <span class="prelude-ty">Option</span><Literal>)>>(iter: T) -> <span class="self">Self </span>{
+<a href=#1370 id=1370 data-nosnippet>1370</a> <span class="kw">let </span><span class="kw-2">mut </span>map = Map::new();
+<a href=#1371 id=1371 data-nosnippet>1371</a> <span class="kw">for </span>(key, value) <span class="kw">in </span>iter {
+<a href=#1372 id=1372 data-nosnippet>1372</a> map.insert(key, value);
+<a href=#1373 id=1373 data-nosnippet>1373</a> }
+<a href=#1374 id=1374 data-nosnippet>1374</a> map
+<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>
+<a href=#1378 id=1378 data-nosnippet>1378</a><span class="kw">impl </span>IntoIterator <span class="kw">for </span>Map {
+<a href=#1379 id=1379 data-nosnippet>1379</a> <span class="kw">type </span>Item = (Literal, <span class="prelude-ty">Option</span><Literal>);
+<a href=#1380 id=1380 data-nosnippet>1380</a> <span class="kw">type </span>IntoIter = std::vec::IntoIter<<span class="self">Self</span>::Item>;
+<a href=#1381 id=1381 data-nosnippet>1381</a>
+<a href=#1382 id=1382 data-nosnippet>1382</a> <span class="kw">fn </span>into_iter(<span class="self">self</span>) -> <span class="self">Self</span>::IntoIter {
+<a href=#1383 id=1383 data-nosnippet>1383</a> <span class="self">self</span>.pair.into_iter()
+<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>
+<a href=#1387 id=1387 data-nosnippet>1387</a><span class="kw">impl</span><<span class="kw">const </span>N: usize> From<[(Literal, <span class="prelude-ty">Option</span><Literal>); N]> <span class="kw">for </span>Map {
+<a href=#1388 id=1388 data-nosnippet>1388</a> <span class="kw">fn </span>from(value: [(Literal, <span class="prelude-ty">Option</span><Literal>); N]) -> <span class="self">Self </span>{
+<a href=#1389 id=1389 data-nosnippet>1389</a> value.iter().cloned().collect()
+<a href=#1390 id=1390 data-nosnippet>1390</a> }
+<a href=#1391 id=1391 data-nosnippet>1391</a>}
+<a href=#1392 id=1392 data-nosnippet>1392</a>
+<a href=#1393 id=1393 data-nosnippet>1393</a><span class="doccomment">/// Values present in iceberg type
+<a href=#1394 id=1394 data-nosnippet>1394</a></span><span class="attr">#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+<a href=#1395 id=1395 data-nosnippet>1395</a></span><span class="kw">pub enum </span>Literal {
+<a href=#1396 id=1396 data-nosnippet>1396</a> <span class="doccomment">/// A primitive value
+<a href=#1397 id=1397 data-nosnippet>1397</a> </span>Primitive(PrimitiveLiteral),
+<a href=#1398 id=1398 data-nosnippet>1398</a> <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=#1399 id=1399 data-nosnippet>1399</a> /// Each field can be either optional or required, meaning that values can (or cannot) be null. Fields may be any type.
+<a href=#1400 id=1400 data-nosnippet>1400</a> /// Fields may have an optional comment or doc string. Fields can have default values.
+<a href=#1401 id=1401 data-nosnippet>1401</a> </span>Struct(Struct),
+<a href=#1402 id=1402 data-nosnippet>1402</a> <span class="doccomment">/// A list is a collection of values with some element type.
+<a href=#1403 id=1403 data-nosnippet>1403</a> /// The element field has an integer id that is unique in the table schema.
+<a href=#1404 id=1404 data-nosnippet>1404</a> /// Elements can be either optional or required. Element types may be any type.
+<a href=#1405 id=1405 data-nosnippet>1405</a> </span>List(Vec<<span class="prelude-ty">Option</span><Literal>>),
+<a href=#1406 id=1406 data-nosnippet>1406</a> <span class="doccomment">/// A map is a collection of key-value pairs with a key type and a value type.
+<a href=#1407 id=1407 data-nosnippet>1407</a> /// Both the key field and value field each have an integer id that is unique in the table schema.
+<a href=#1408 id=1408 data-nosnippet>1408</a> /// 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.
+<a href=#1409 id=1409 data-nosnippet>1409</a> </span>Map(Map),
+<a href=#1410 id=1410 data-nosnippet>1410</a>}
<a href=#1411 id=1411 data-nosnippet>1411</a>
-<a href=#1412 id=1412 data-nosnippet>1412</a> <span class="doccomment">/// Creates an 32bit integer.
-<a href=#1413 id=1413 data-nosnippet>1413</a> ///
-<a href=#1414 id=1414 data-nosnippet>1414</a> /// Example:
-<a href=#1415 id=1415 data-nosnippet>1415</a> /// ```rust
-<a href=#1416 id=1416 data-nosnippet>1416</a> /// use iceberg::spec::{Literal, PrimitiveLiteral};
-<a href=#1417 id=1417 data-nosnippet>1417</a> /// let t = Literal::int(23i8);
-<a href=#1418 id=1418 data-nosnippet>1418</a> ///
-<a href=#1419 id=1419 data-nosnippet>1419</a> /// assert_eq!(Literal::Primitive(PrimitiveLiteral::Int(23)), t);
-<a href=#1420 id=1420 data-nosnippet>1420</a> /// ```
-<a href=#1421 id=1421 data-nosnippet>1421</a> </span><span class="kw">pub fn </span>int<T: Into<i32>>(t: T) -> <span class="self">Self </span>{
-<a href=#1422 id=1422 data-nosnippet>1422</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Int(t.into()))
-<a href=#1423 id=1423 data-nosnippet>1423</a> }
-<a href=#1424 id=1424 data-nosnippet>1424</a>
-<a href=#1425 id=1425 data-nosnippet>1425</a> <span class="doccomment">/// Creates an 64bit integer.
-<a href=#1426 id=1426 data-nosnippet>1426</a> ///
-<a href=#1427 id=1427 data-nosnippet>1427</a> /// Example:
-<a href=#1428 id=1428 data-nosnippet>1428</a> /// ```rust
-<a href=#1429 id=1429 data-nosnippet>1429</a> /// use iceberg::spec::{Literal, PrimitiveLiteral};
-<a href=#1430 id=1430 data-nosnippet>1430</a> /// let t = Literal::long(24i8);
-<a href=#1431 id=1431 data-nosnippet>1431</a> ///
-<a href=#1432 id=1432 data-nosnippet>1432</a> /// assert_eq!(Literal::Primitive(PrimitiveLiteral::Long(24)), t);
-<a href=#1433 id=1433 data-nosnippet>1433</a> /// ```
-<a href=#1434 id=1434 data-nosnippet>1434</a> </span><span class="kw">pub fn </span>long<T: Into<i64>>(t: T) -> <span class="self">Self </span>{
-<a href=#1435 id=1435 data-nosnippet>1435</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Long(t.into()))
-<a href=#1436 id=1436 data-nosnippet>1436</a> }
-<a href=#1437 id=1437 data-nosnippet>1437</a>
-<a href=#1438 id=1438 data-nosnippet>1438</a> <span class="doccomment">/// Creates an 32bit floating point number.
-<a href=#1439 id=1439 data-nosnippet>1439</a> ///
-<a href=#1440 id=1440 data-nosnippet>1440</a> /// Example:
-<a href=#1441 id=1441 data-nosnippet>1441</a> /// ```rust
-<a href=#1442 id=1442 data-nosnippet>1442</a> /// use iceberg::spec::{Literal, PrimitiveLiteral};
-<a href=#1443 id=1443 data-nosnippet>1443</a> /// use ordered_float::OrderedFloat;
-<a href=#1444 id=1444 data-nosnippet>1444</a> /// let t = Literal::float(32.1f32);
-<a href=#1445 id=1445 data-nosnippet>1445</a> ///
-<a href=#1446 id=1446 data-nosnippet>1446</a> /// assert_eq!(
-<a href=#1447 id=1447 data-nosnippet>1447</a> /// Literal::Primitive(PrimitiveLiteral::Float(OrderedFloat(32.1))),
-<a href=#1448 id=1448 data-nosnippet>1448</a> /// t
-<a href=#1449 id=1449 data-nosnippet>1449</a> /// );
-<a href=#1450 id=1450 data-nosnippet>1450</a> /// ```
-<a href=#1451 id=1451 data-nosnippet>1451</a> </span><span class="kw">pub fn </span>float<T: Into<f32>>(t: T) -> <span class="self">Self </span>{
-<a href=#1452 id=1452 data-nosnippet>1452</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Float(OrderedFloat(t.into())))
-<a href=#1453 id=1453 data-nosnippet>1453</a> }
-<a href=#1454 id=1454 data-nosnippet>1454</a>
-<a href=#1455 id=1455 data-nosnippet>1455</a> <span class="doccomment">/// Creates an 32bit floating point number.
-<a href=#1456 id=1456 data-nosnippet>1456</a> ///
-<a href=#1457 id=1457 data-nosnippet>1457</a> /// Example:
-<a href=#1458 id=1458 data-nosnippet>1458</a> /// ```rust
-<a href=#1459 id=1459 data-nosnippet>1459</a> /// use iceberg::spec::{Literal, PrimitiveLiteral};
-<a href=#1460 id=1460 data-nosnippet>1460</a> /// use ordered_float::OrderedFloat;
-<a href=#1461 id=1461 data-nosnippet>1461</a> /// let t = Literal::double(32.1f64);
+<a href=#1412 id=1412 data-nosnippet>1412</a><span class="kw">impl </span>Literal {
+<a href=#1413 id=1413 data-nosnippet>1413</a> <span class="doccomment">/// Creates a boolean value.
+<a href=#1414 id=1414 data-nosnippet>1414</a> ///
+<a href=#1415 id=1415 data-nosnippet>1415</a> /// Example:
+<a href=#1416 id=1416 data-nosnippet>1416</a> /// ```rust
+<a href=#1417 id=1417 data-nosnippet>1417</a> /// use iceberg::spec::{Literal, PrimitiveLiteral};
+<a href=#1418 id=1418 data-nosnippet>1418</a> /// let t = Literal::bool(true);
+<a href=#1419 id=1419 data-nosnippet>1419</a> ///
+<a href=#1420 id=1420 data-nosnippet>1420</a> /// assert_eq!(Literal::Primitive(PrimitiveLiteral::Boolean(true)), t);
+<a href=#1421 id=1421 data-nosnippet>1421</a> /// ```
+<a href=#1422 id=1422 data-nosnippet>1422</a> </span><span class="kw">pub fn </span>bool<T: Into<bool>>(t: T) -> <span class="self">Self </span>{
+<a href=#1423 id=1423 data-nosnippet>1423</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Boolean(t.into()))
+<a href=#1424 id=1424 data-nosnippet>1424</a> }
+<a href=#1425 id=1425 data-nosnippet>1425</a>
+<a href=#1426 id=1426 data-nosnippet>1426</a> <span class="doccomment">/// Creates a boolean value from string.
+<a href=#1427 id=1427 data-nosnippet>1427</a> /// See [Parse bool from str](https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-FromStr-for-bool) for reference.
+<a href=#1428 id=1428 data-nosnippet>1428</a> ///
+<a href=#1429 id=1429 data-nosnippet>1429</a> /// Example:
+<a href=#1430 id=1430 data-nosnippet>1430</a> /// ```rust
+<a href=#1431 id=1431 data-nosnippet>1431</a> /// use iceberg::spec::{Literal, PrimitiveLiteral};
+<a href=#1432 id=1432 data-nosnippet>1432</a> /// let t = Literal::bool_from_str("false").unwrap();
+<a href=#1433 id=1433 data-nosnippet>1433</a> ///
+<a href=#1434 id=1434 data-nosnippet>1434</a> /// assert_eq!(Literal::Primitive(PrimitiveLiteral::Boolean(false)), t);
+<a href=#1435 id=1435 data-nosnippet>1435</a> /// ```
+<a href=#1436 id=1436 data-nosnippet>1436</a> </span><span class="kw">pub fn </span>bool_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#1437 id=1437 data-nosnippet>1437</a> <span class="kw">let </span>v = s.as_ref().parse::<bool>().map_err(|e| {
+<a href=#1438 id=1438 data-nosnippet>1438</a> Error::new(ErrorKind::DataInvalid, <span class="string">"Can't parse string to bool."</span>).with_source(e)
+<a href=#1439 id=1439 data-nosnippet>1439</a> })<span class="question-mark">?</span>;
+<a href=#1440 id=1440 data-nosnippet>1440</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::Primitive(PrimitiveLiteral::Boolean(v)))
+<a href=#1441 id=1441 data-nosnippet>1441</a> }
+<a href=#1442 id=1442 data-nosnippet>1442</a>
+<a href=#1443 id=1443 data-nosnippet>1443</a> <span class="doccomment">/// Creates an 32bit integer.
+<a href=#1444 id=1444 data-nosnippet>1444</a> ///
+<a href=#1445 id=1445 data-nosnippet>1445</a> /// Example:
+<a href=#1446 id=1446 data-nosnippet>1446</a> /// ```rust
+<a href=#1447 id=1447 data-nosnippet>1447</a> /// use iceberg::spec::{Literal, PrimitiveLiteral};
+<a href=#1448 id=1448 data-nosnippet>1448</a> /// let t = Literal::int(23i8);
+<a href=#1449 id=1449 data-nosnippet>1449</a> ///
+<a href=#1450 id=1450 data-nosnippet>1450</a> /// assert_eq!(Literal::Primitive(PrimitiveLiteral::Int(23)), t);
+<a href=#1451 id=1451 data-nosnippet>1451</a> /// ```
+<a href=#1452 id=1452 data-nosnippet>1452</a> </span><span class="kw">pub fn </span>int<T: Into<i32>>(t: T) -> <span class="self">Self </span>{
+<a href=#1453 id=1453 data-nosnippet>1453</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Int(t.into()))
+<a href=#1454 id=1454 data-nosnippet>1454</a> }
+<a href=#1455 id=1455 data-nosnippet>1455</a>
+<a href=#1456 id=1456 data-nosnippet>1456</a> <span class="doccomment">/// Creates an 64bit integer.
+<a href=#1457 id=1457 data-nosnippet>1457</a> ///
+<a href=#1458 id=1458 data-nosnippet>1458</a> /// Example:
+<a href=#1459 id=1459 data-nosnippet>1459</a> /// ```rust
+<a href=#1460 id=1460 data-nosnippet>1460</a> /// use iceberg::spec::{Literal, PrimitiveLiteral};
+<a href=#1461 id=1461 data-nosnippet>1461</a> /// let t = Literal::long(24i8);
<a href=#1462 id=1462 data-nosnippet>1462</a> ///
-<a href=#1463 id=1463 data-nosnippet>1463</a> /// assert_eq!(
-<a href=#1464 id=1464 data-nosnippet>1464</a> /// Literal::Primitive(PrimitiveLiteral::Double(OrderedFloat(32.1))),
-<a href=#1465 id=1465 data-nosnippet>1465</a> /// t
-<a href=#1466 id=1466 data-nosnippet>1466</a> /// );
-<a href=#1467 id=1467 data-nosnippet>1467</a> /// ```
-<a href=#1468 id=1468 data-nosnippet>1468</a> </span><span class="kw">pub fn </span>double<T: Into<f64>>(t: T) -> <span class="self">Self </span>{
-<a href=#1469 id=1469 data-nosnippet>1469</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Double(OrderedFloat(t.into())))
-<a href=#1470 id=1470 data-nosnippet>1470</a> }
-<a href=#1471 id=1471 data-nosnippet>1471</a>
-<a href=#1472 id=1472 data-nosnippet>1472</a> <span class="doccomment">/// Creates date literal from number of days from unix epoch directly.
-<a href=#1473 id=1473 data-nosnippet>1473</a> </span><span class="kw">pub fn </span>date(days: i32) -> <span class="self">Self </span>{
-<a href=#1474 id=1474 data-nosnippet>1474</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Int(days))
-<a href=#1475 id=1475 data-nosnippet>1475</a> }
-<a href=#1476 id=1476 data-nosnippet>1476</a>
-<a href=#1477 id=1477 data-nosnippet>1477</a> <span class="doccomment">/// Creates a date in `%Y-%m-%d` format, assume in utc timezone.
-<a href=#1478 id=1478 data-nosnippet>1478</a> ///
-<a href=#1479 id=1479 data-nosnippet>1479</a> /// See [`NaiveDate::from_str`].
-<a href=#1480 id=1480 data-nosnippet>1480</a> ///
-<a href=#1481 id=1481 data-nosnippet>1481</a> /// Example
-<a href=#1482 id=1482 data-nosnippet>1482</a> /// ```rust
-<a href=#1483 id=1483 data-nosnippet>1483</a> /// use iceberg::spec::Literal;
-<a href=#1484 id=1484 data-nosnippet>1484</a> /// let t = Literal::date_from_str("1970-01-03").unwrap();
-<a href=#1485 id=1485 data-nosnippet>1485</a> ///
-<a href=#1486 id=1486 data-nosnippet>1486</a> /// assert_eq!(Literal::date(2), t);
-<a href=#1487 id=1487 data-nosnippet>1487</a> /// ```
-<a href=#1488 id=1488 data-nosnippet>1488</a> </span><span class="kw">pub fn </span>date_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#1489 id=1489 data-nosnippet>1489</a> <span class="kw">let </span>t = s.as_ref().parse::<NaiveDate>().map_err(|e| {
-<a href=#1490 id=1490 data-nosnippet>1490</a> Error::new(
-<a href=#1491 id=1491 data-nosnippet>1491</a> ErrorKind::DataInvalid,
-<a href=#1492 id=1492 data-nosnippet>1492</a> <span class="macro">format!</span>(<span class="string">"Can't parse date from string: {}"</span>, s.as_ref()),
-<a href=#1493 id=1493 data-nosnippet>1493</a> )
-<a href=#1494 id=1494 data-nosnippet>1494</a> .with_source(e)
-<a href=#1495 id=1495 data-nosnippet>1495</a> })<span class="question-mark">?</span>;
-<a href=#1496 id=1496 data-nosnippet>1496</a>
-<a href=#1497 id=1497 data-nosnippet>1497</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::date(date_from_naive_date(t)))
-<a href=#1498 id=1498 data-nosnippet>1498</a> }
-<a href=#1499 id=1499 data-nosnippet>1499</a>
-<a href=#1500 id=1500 data-nosnippet>1500</a> <span class="doccomment">/// Create a date from calendar date (year, month and day).
-<a href=#1501 id=1501 data-nosnippet>1501</a> ///
-<a href=#1502 id=1502 data-nosnippet>1502</a> /// See [`NaiveDate::from_ymd_opt`].
-<a href=#1503 id=1503 data-nosnippet>1503</a> ///
-<a href=#1504 id=1504 data-nosnippet>1504</a> /// Example:
-<a href=#1505 id=1505 data-nosnippet>1505</a> ///
-<a href=#1506 id=1506 data-nosnippet>1506</a> ///```rust
-<a href=#1507 id=1507 data-nosnippet>1507</a> /// use iceberg::spec::Literal;
-<a href=#1508 id=1508 data-nosnippet>1508</a> /// let t = Literal::date_from_ymd(1970, 1, 5).unwrap();
+<a href=#1463 id=1463 data-nosnippet>1463</a> /// assert_eq!(Literal::Primitive(PrimitiveLiteral::Long(24)), t);
+<a href=#1464 id=1464 data-nosnippet>1464</a> /// ```
+<a href=#1465 id=1465 data-nosnippet>1465</a> </span><span class="kw">pub fn </span>long<T: Into<i64>>(t: T) -> <span class="self">Self </span>{
+<a href=#1466 id=1466 data-nosnippet>1466</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Long(t.into()))
+<a href=#1467 id=1467 data-nosnippet>1467</a> }
+<a href=#1468 id=1468 data-nosnippet>1468</a>
+<a href=#1469 id=1469 data-nosnippet>1469</a> <span class="doccomment">/// Creates an 32bit floating point number.
+<a href=#1470 id=1470 data-nosnippet>1470</a> ///
+<a href=#1471 id=1471 data-nosnippet>1471</a> /// Example:
+<a href=#1472 id=1472 data-nosnippet>1472</a> /// ```rust
+<a href=#1473 id=1473 data-nosnippet>1473</a> /// use iceberg::spec::{Literal, PrimitiveLiteral};
+<a href=#1474 id=1474 data-nosnippet>1474</a> /// use ordered_float::OrderedFloat;
+<a href=#1475 id=1475 data-nosnippet>1475</a> /// let t = Literal::float(32.1f32);
+<a href=#1476 id=1476 data-nosnippet>1476</a> ///
+<a href=#1477 id=1477 data-nosnippet>1477</a> /// assert_eq!(
+<a href=#1478 id=1478 data-nosnippet>1478</a> /// Literal::Primitive(PrimitiveLiteral::Float(OrderedFloat(32.1))),
+<a href=#1479 id=1479 data-nosnippet>1479</a> /// t
+<a href=#1480 id=1480 data-nosnippet>1480</a> /// );
+<a href=#1481 id=1481 data-nosnippet>1481</a> /// ```
+<a href=#1482 id=1482 data-nosnippet>1482</a> </span><span class="kw">pub fn </span>float<T: Into<f32>>(t: T) -> <span class="self">Self </span>{
+<a href=#1483 id=1483 data-nosnippet>1483</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Float(OrderedFloat(t.into())))
+<a href=#1484 id=1484 data-nosnippet>1484</a> }
+<a href=#1485 id=1485 data-nosnippet>1485</a>
+<a href=#1486 id=1486 data-nosnippet>1486</a> <span class="doccomment">/// Creates an 32bit floating point number.
+<a href=#1487 id=1487 data-nosnippet>1487</a> ///
+<a href=#1488 id=1488 data-nosnippet>1488</a> /// Example:
+<a href=#1489 id=1489 data-nosnippet>1489</a> /// ```rust
+<a href=#1490 id=1490 data-nosnippet>1490</a> /// use iceberg::spec::{Literal, PrimitiveLiteral};
+<a href=#1491 id=1491 data-nosnippet>1491</a> /// use ordered_float::OrderedFloat;
+<a href=#1492 id=1492 data-nosnippet>1492</a> /// let t = Literal::double(32.1f64);
+<a href=#1493 id=1493 data-nosnippet>1493</a> ///
+<a href=#1494 id=1494 data-nosnippet>1494</a> /// assert_eq!(
+<a href=#1495 id=1495 data-nosnippet>1495</a> /// Literal::Primitive(PrimitiveLiteral::Double(OrderedFloat(32.1))),
+<a href=#1496 id=1496 data-nosnippet>1496</a> /// t
+<a href=#1497 id=1497 data-nosnippet>1497</a> /// );
+<a href=#1498 id=1498 data-nosnippet>1498</a> /// ```
+<a href=#1499 id=1499 data-nosnippet>1499</a> </span><span class="kw">pub fn </span>double<T: Into<f64>>(t: T) -> <span class="self">Self </span>{
+<a href=#1500 id=1500 data-nosnippet>1500</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Double(OrderedFloat(t.into())))
+<a href=#1501 id=1501 data-nosnippet>1501</a> }
+<a href=#1502 id=1502 data-nosnippet>1502</a>
+<a href=#1503 id=1503 data-nosnippet>1503</a> <span class="doccomment">/// Creates date literal from number of days from unix epoch directly.
+<a href=#1504 id=1504 data-nosnippet>1504</a> </span><span class="kw">pub fn </span>date(days: i32) -> <span class="self">Self </span>{
+<a href=#1505 id=1505 data-nosnippet>1505</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Int(days))
+<a href=#1506 id=1506 data-nosnippet>1506</a> }
+<a href=#1507 id=1507 data-nosnippet>1507</a>
+<a href=#1508 id=1508 data-nosnippet>1508</a> <span class="doccomment">/// Creates a date in `%Y-%m-%d` format, assume in utc timezone.
<a href=#1509 id=1509 data-nosnippet>1509</a> ///
-<a href=#1510 id=1510 data-nosnippet>1510</a> /// assert_eq!(Literal::date(4), t);
-<a href=#1511 id=1511 data-nosnippet>1511</a> /// ```
-<a href=#1512 id=1512 data-nosnippet>1512</a> </span><span class="kw">pub fn </span>date_from_ymd(year: i32, month: u32, day: u32) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#1513 id=1513 data-nosnippet>1513</a> <span class="kw">let </span>t = NaiveDate::from_ymd_opt(year, month, day).ok_or_else(|| {
-<a href=#1514 id=1514 data-nosnippet>1514</a> Error::new(
-<a href=#1515 id=1515 data-nosnippet>1515</a> ErrorKind::DataInvalid,
-<a href=#1516 id=1516 data-nosnippet>1516</a> <span class="macro">format!</span>(<span class="string">"Can't create date from year: {year}, month: {month}, day: {day}"</span>),
-<a href=#1517 id=1517 data-nosnippet>1517</a> )
-<a href=#1518 id=1518 data-nosnippet>1518</a> })<span class="question-mark">?</span>;
-<a href=#1519 id=1519 data-nosnippet>1519</a>
-<a href=#1520 id=1520 data-nosnippet>1520</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::date(date_from_naive_date(t)))
-<a href=#1521 id=1521 data-nosnippet>1521</a> }
-<a href=#1522 id=1522 data-nosnippet>1522</a>
-<a href=#1523 id=1523 data-nosnippet>1523</a> <span class="doccomment">/// Creates time in microseconds directly
-<a href=#1524 id=1524 data-nosnippet>1524</a> </span><span class="kw">pub fn </span>time(value: i64) -> <span class="self">Self </span>{
-<a href=#1525 id=1525 data-nosnippet>1525</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Long(value))
-<a href=#1526 id=1526 data-nosnippet>1526</a> }
+<a href=#1510 id=1510 data-nosnippet>1510</a> /// See [`NaiveDate::from_str`].
+<a href=#1511 id=1511 data-nosnippet>1511</a> ///
+<a href=#1512 id=1512 data-nosnippet>1512</a> /// Example
+<a href=#1513 id=1513 data-nosnippet>1513</a> /// ```rust
+<a href=#1514 id=1514 data-nosnippet>1514</a> /// use iceberg::spec::Literal;
+<a href=#1515 id=1515 data-nosnippet>1515</a> /// let t = Literal::date_from_str("1970-01-03").unwrap();
+<a href=#1516 id=1516 data-nosnippet>1516</a> ///
+<a href=#1517 id=1517 data-nosnippet>1517</a> /// assert_eq!(Literal::date(2), t);
+<a href=#1518 id=1518 data-nosnippet>1518</a> /// ```
+<a href=#1519 id=1519 data-nosnippet>1519</a> </span><span class="kw">pub fn </span>date_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#1520 id=1520 data-nosnippet>1520</a> <span class="kw">let </span>t = s.as_ref().parse::<NaiveDate>().map_err(|e| {
+<a href=#1521 id=1521 data-nosnippet>1521</a> Error::new(
+<a href=#1522 id=1522 data-nosnippet>1522</a> ErrorKind::DataInvalid,
+<a href=#1523 id=1523 data-nosnippet>1523</a> <span class="macro">format!</span>(<span class="string">"Can't parse date from string: {}"</span>, s.as_ref()),
+<a href=#1524 id=1524 data-nosnippet>1524</a> )
+<a href=#1525 id=1525 data-nosnippet>1525</a> .with_source(e)
+<a href=#1526 id=1526 data-nosnippet>1526</a> })<span class="question-mark">?</span>;
<a href=#1527 id=1527 data-nosnippet>1527</a>
-<a href=#1528 id=1528 data-nosnippet>1528</a> <span class="doccomment">/// Creates time literal from [`chrono::NaiveTime`].
-<a href=#1529 id=1529 data-nosnippet>1529</a> </span><span class="kw">fn </span>time_from_naive_time(t: NaiveTime) -> <span class="self">Self </span>{
-<a href=#1530 id=1530 data-nosnippet>1530</a> <span class="kw">let </span>duration = t - unix_epoch().time();
-<a href=#1531 id=1531 data-nosnippet>1531</a> <span class="comment">// It's safe to unwrap here since less than 24 hours will never overflow.
-<a href=#1532 id=1532 data-nosnippet>1532</a> </span><span class="kw">let </span>micro_secs = duration.num_microseconds().unwrap();
-<a href=#1533 id=1533 data-nosnippet>1533</a>
-<a href=#1534 id=1534 data-nosnippet>1534</a> Literal::time(micro_secs)
-<a href=#1535 id=1535 data-nosnippet>1535</a> }
-<a href=#1536 id=1536 data-nosnippet>1536</a>
-<a href=#1537 id=1537 data-nosnippet>1537</a> <span class="doccomment">/// Creates time in microseconds in `%H:%M:%S:.f` format.
-<a href=#1538 id=1538 data-nosnippet>1538</a> ///
-<a href=#1539 id=1539 data-nosnippet>1539</a> /// See [`NaiveTime::from_str`] for details.
+<a href=#1528 id=1528 data-nosnippet>1528</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::date(date_from_naive_date(t)))
+<a href=#1529 id=1529 data-nosnippet>1529</a> }
+<a href=#1530 id=1530 data-nosnippet>1530</a>
+<a href=#1531 id=1531 data-nosnippet>1531</a> <span class="doccomment">/// Create a date from calendar date (year, month and day).
+<a href=#1532 id=1532 data-nosnippet>1532</a> ///
+<a href=#1533 id=1533 data-nosnippet>1533</a> /// See [`NaiveDate::from_ymd_opt`].
+<a href=#1534 id=1534 data-nosnippet>1534</a> ///
+<a href=#1535 id=1535 data-nosnippet>1535</a> /// Example:
+<a href=#1536 id=1536 data-nosnippet>1536</a> ///
+<a href=#1537 id=1537 data-nosnippet>1537</a> ///```rust
+<a href=#1538 id=1538 data-nosnippet>1538</a> /// use iceberg::spec::Literal;
+<a href=#1539 id=1539 data-nosnippet>1539</a> /// let t = Literal::date_from_ymd(1970, 1, 5).unwrap();
<a href=#1540 id=1540 data-nosnippet>1540</a> ///
-<a href=#1541 id=1541 data-nosnippet>1541</a> /// Example:
-<a href=#1542 id=1542 data-nosnippet>1542</a> /// ```rust
-<a href=#1543 id=1543 data-nosnippet>1543</a> /// use iceberg::spec::Literal;
-<a href=#1544 id=1544 data-nosnippet>1544</a> /// let t = Literal::time_from_str("01:02:01.888999777").unwrap();
-<a href=#1545 id=1545 data-nosnippet>1545</a> ///
-<a href=#1546 id=1546 data-nosnippet>1546</a> /// let micro_secs = {
-<a href=#1547 id=1547 data-nosnippet>1547</a> /// 1 * 3600 * 1_000_000 + // 1 hour
-<a href=#1548 id=1548 data-nosnippet>1548</a> /// 2 * 60 * 1_000_000 + // 2 minutes
-<a href=#1549 id=1549 data-nosnippet>1549</a> /// 1 * 1_000_000 + // 1 second
-<a href=#1550 id=1550 data-nosnippet>1550</a> /// 888999 // microseconds
-<a href=#1551 id=1551 data-nosnippet>1551</a> /// };
-<a href=#1552 id=1552 data-nosnippet>1552</a> /// assert_eq!(Literal::time(micro_secs), t);
-<a href=#1553 id=1553 data-nosnippet>1553</a> /// ```
-<a href=#1554 id=1554 data-nosnippet>1554</a> </span><span class="kw">pub fn </span>time_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#1555 id=1555 data-nosnippet>1555</a> <span class="kw">let </span>t = s.as_ref().parse::<NaiveTime>().map_err(|e| {
-<a href=#1556 id=1556 data-nosnippet>1556</a> Error::new(
-<a href=#1557 id=1557 data-nosnippet>1557</a> ErrorKind::DataInvalid,
-<a href=#1558 id=1558 data-nosnippet>1558</a> <span class="macro">format!</span>(<span class="string">"Can't parse time from string: {}"</span>, s.as_ref()),
-<a href=#1559 id=1559 data-nosnippet>1559</a> )
-<a href=#1560 id=1560 data-nosnippet>1560</a> .with_source(e)
-<a href=#1561 id=1561 data-nosnippet>1561</a> })<span class="question-mark">?</span>;
-<a href=#1562 id=1562 data-nosnippet>1562</a>
-<a href=#1563 id=1563 data-nosnippet>1563</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::time_from_naive_time(t))
-<a href=#1564 id=1564 data-nosnippet>1564</a> }
-<a href=#1565 id=1565 data-nosnippet>1565</a>
-<a href=#1566 id=1566 data-nosnippet>1566</a> <span class="doccomment">/// Creates time literal from hour, minute, second, and microseconds.
-<a href=#1567 id=1567 data-nosnippet>1567</a> ///
-<a href=#1568 id=1568 data-nosnippet>1568</a> /// See [`NaiveTime::from_hms_micro_opt`].
+<a href=#1541 id=1541 data-nosnippet>1541</a> /// assert_eq!(Literal::date(4), t);
+<a href=#1542 id=1542 data-nosnippet>1542</a> /// ```
+<a href=#1543 id=1543 data-nosnippet>1543</a> </span><span class="kw">pub fn </span>date_from_ymd(year: i32, month: u32, day: u32) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#1544 id=1544 data-nosnippet>1544</a> <span class="kw">let </span>t = NaiveDate::from_ymd_opt(year, month, day).ok_or_else(|| {
+<a href=#1545 id=1545 data-nosnippet>1545</a> Error::new(
+<a href=#1546 id=1546 data-nosnippet>1546</a> ErrorKind::DataInvalid,
+<a href=#1547 id=1547 data-nosnippet>1547</a> <span class="macro">format!</span>(<span class="string">"Can't create date from year: {year}, month: {month}, day: {day}"</span>),
+<a href=#1548 id=1548 data-nosnippet>1548</a> )
+<a href=#1549 id=1549 data-nosnippet>1549</a> })<span class="question-mark">?</span>;
+<a href=#1550 id=1550 data-nosnippet>1550</a>
+<a href=#1551 id=1551 data-nosnippet>1551</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::date(date_from_naive_date(t)))
+<a href=#1552 id=1552 data-nosnippet>1552</a> }
+<a href=#1553 id=1553 data-nosnippet>1553</a>
+<a href=#1554 id=1554 data-nosnippet>1554</a> <span class="doccomment">/// Creates time in microseconds directly
+<a href=#1555 id=1555 data-nosnippet>1555</a> </span><span class="kw">pub fn </span>time(value: i64) -> <span class="self">Self </span>{
+<a href=#1556 id=1556 data-nosnippet>1556</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Long(value))
+<a href=#1557 id=1557 data-nosnippet>1557</a> }
+<a href=#1558 id=1558 data-nosnippet>1558</a>
+<a href=#1559 id=1559 data-nosnippet>1559</a> <span class="doccomment">/// Creates time literal from [`chrono::NaiveTime`].
+<a href=#1560 id=1560 data-nosnippet>1560</a> </span><span class="kw">fn </span>time_from_naive_time(t: NaiveTime) -> <span class="self">Self </span>{
+<a href=#1561 id=1561 data-nosnippet>1561</a> <span class="kw">let </span>duration = t - unix_epoch().time();
+<a href=#1562 id=1562 data-nosnippet>1562</a> <span class="comment">// It's safe to unwrap here since less than 24 hours will never overflow.
+<a href=#1563 id=1563 data-nosnippet>1563</a> </span><span class="kw">let </span>micro_secs = duration.num_microseconds().unwrap();
+<a href=#1564 id=1564 data-nosnippet>1564</a>
+<a href=#1565 id=1565 data-nosnippet>1565</a> Literal::time(micro_secs)
+<a href=#1566 id=1566 data-nosnippet>1566</a> }
+<a href=#1567 id=1567 data-nosnippet>1567</a>
+<a href=#1568 id=1568 data-nosnippet>1568</a> <span class="doccomment">/// Creates time in microseconds in `%H:%M:%S:.f` format.
<a href=#1569 id=1569 data-nosnippet>1569</a> ///
-<a href=#1570 id=1570 data-nosnippet>1570</a> /// Example:
-<a href=#1571 id=1571 data-nosnippet>1571</a> /// ```rust
-<a href=#1572 id=1572 data-nosnippet>1572</a> /// use iceberg::spec::Literal;
-<a href=#1573 id=1573 data-nosnippet>1573</a> /// let t = Literal::time_from_hms_micro(22, 15, 33, 111).unwrap();
-<a href=#1574 id=1574 data-nosnippet>1574</a> ///
-<a href=#1575 id=1575 data-nosnippet>1575</a> /// assert_eq!(Literal::time_from_str("22:15:33.000111").unwrap(), t);
-<a href=#1576 id=1576 data-nosnippet>1576</a> /// ```
-<a href=#1577 id=1577 data-nosnippet>1577</a> </span><span class="kw">pub fn </span>time_from_hms_micro(hour: u32, min: u32, sec: u32, micro: u32) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#1578 id=1578 data-nosnippet>1578</a> <span class="kw">let </span>t = NaiveTime::from_hms_micro_opt(hour, min, sec, micro)
-<a href=#1579 id=1579 data-nosnippet>1579</a> .ok_or_else(|| Error::new(
-<a href=#1580 id=1580 data-nosnippet>1580</a> ErrorKind::DataInvalid,
-<a href=#1581 id=1581 data-nosnippet>1581</a> <span class="macro">format!</span>(<span class="string">"Can't create time from hour: {hour}, min: {min}, second: {sec}, microsecond: {micro}"</span>),
-<a href=#1582 id=1582 data-nosnippet>1582</a> ))<span class="question-mark">?</span>;
-<a href=#1583 id=1583 data-nosnippet>1583</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::time_from_naive_time(t))
-<a href=#1584 id=1584 data-nosnippet>1584</a> }
-<a href=#1585 id=1585 data-nosnippet>1585</a>
-<a href=#1586 id=1586 data-nosnippet>1586</a> <span class="doccomment">/// Creates a timestamp from unix epoch in microseconds.
-<a href=#1587 id=1587 data-nosnippet>1587</a> </span><span class="kw">pub fn </span>timestamp(value: i64) -> <span class="self">Self </span>{
-<a href=#1588 id=1588 data-nosnippet>1588</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Long(value))
-<a href=#1589 id=1589 data-nosnippet>1589</a> }
-<a href=#1590 id=1590 data-nosnippet>1590</a>
-<a href=#1591 id=1591 data-nosnippet>1591</a> <span class="doccomment">/// Creates a timestamp with timezone from unix epoch in microseconds.
-<a href=#1592 id=1592 data-nosnippet>1592</a> </span><span class="kw">pub fn </span>timestamptz(value: i64) -> <span class="self">Self </span>{
-<a href=#1593 id=1593 data-nosnippet>1593</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Long(value))
-<a href=#1594 id=1594 data-nosnippet>1594</a> }
-<a href=#1595 id=1595 data-nosnippet>1595</a>
-<a href=#1596 id=1596 data-nosnippet>1596</a> <span class="doccomment">/// Creates a timestamp from unix epoch in nanoseconds.
-<a href=#1597 id=1597 data-nosnippet>1597</a> </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>timestamp_nano(value: i64) -> <span class="self">Self </span>{
-<a href=#1598 id=1598 data-nosnippet>1598</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Long(value))
-<a href=#1599 id=1599 data-nosnippet>1599</a> }
-<a href=#1600 id=1600 data-nosnippet>1600</a>
-<a href=#1601 id=1601 data-nosnippet>1601</a> <span class="doccomment">/// Creates a timestamp with timezone from unix epoch in nanoseconds.
-<a href=#1602 id=1602 data-nosnippet>1602</a> </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>timestamptz_nano(value: i64) -> <span class="self">Self </span>{
-<a href=#1603 id=1603 data-nosnippet>1603</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Long(value))
-<a href=#1604 id=1604 data-nosnippet>1604</a> }
-<a href=#1605 id=1605 data-nosnippet>1605</a>
-<a href=#1606 id=1606 data-nosnippet>1606</a> <span class="doccomment">/// Creates a timestamp from [`DateTime`].
-<a href=#1607 id=1607 data-nosnippet>1607</a> </span><span class="kw">pub fn </span>timestamp_from_datetime<T: TimeZone>(dt: DateTime<T>) -> <span class="self">Self </span>{
-<a href=#1608 id=1608 data-nosnippet>1608</a> <span class="self">Self</span>::timestamp(dt.with_timezone(<span class="kw-2">&</span>Utc).timestamp_micros())
-<a href=#1609 id=1609 data-nosnippet>1609</a> }
-<a href=#1610 id=1610 data-nosnippet>1610</a>
-<a href=#1611 id=1611 data-nosnippet>1611</a> <span class="doccomment">/// Creates a timestamp with timezone from [`DateTime`].
-<a href=#1612 id=1612 data-nosnippet>1612</a> </span><span class="kw">pub fn </span>timestamptz_from_datetime<T: TimeZone>(dt: DateTime<T>) -> <span class="self">Self </span>{
-<a href=#1613 id=1613 data-nosnippet>1613</a> <span class="self">Self</span>::timestamptz(dt.with_timezone(<span class="kw-2">&</span>Utc).timestamp_micros())
-<a href=#1614 id=1614 data-nosnippet>1614</a> }
-<a href=#1615 id=1615 data-nosnippet>1615</a>
-<a href=#1616 id=1616 data-nosnippet>1616</a> <span class="doccomment">/// Parse a timestamp in RFC3339 format.
-<a href=#1617 id=1617 data-nosnippet>1617</a> ///
-<a href=#1618 id=1618 data-nosnippet>1618</a> /// See [`DateTime<Utc>::from_str`].
-<a href=#1619 id=1619 data-nosnippet>1619</a> ///
-<a href=#1620 id=1620 data-nosnippet>1620</a> /// Example:
-<a href=#1621 id=1621 data-nosnippet>1621</a> ///
-<a href=#1622 id=1622 data-nosnippet>1622</a> /// ```rust
-<a href=#1623 id=1623 data-nosnippet>1623</a> /// use chrono::{DateTime, FixedOffset, NaiveDate, NaiveDateTime, NaiveTime};
-<a href=#1624 id=1624 data-nosnippet>1624</a> /// use iceberg::spec::Literal;
-<a href=#1625 id=1625 data-nosnippet>1625</a> /// let t = Literal::timestamp_from_str("2012-12-12 12:12:12.8899-04:00").unwrap();
-<a href=#1626 id=1626 data-nosnippet>1626</a> ///
-<a href=#1627 id=1627 data-nosnippet>1627</a> /// let t2 = {
-<a href=#1628 id=1628 data-nosnippet>1628</a> /// let date = NaiveDate::from_ymd_opt(2012, 12, 12).unwrap();
-<a href=#1629 id=1629 data-nosnippet>1629</a> /// let time = NaiveTime::from_hms_micro_opt(12, 12, 12, 889900).unwrap();
-<a href=#1630 id=1630 data-nosnippet>1630</a> /// let dt = NaiveDateTime::new(date, time);
-<a href=#1631 id=1631 data-nosnippet>1631</a> /// Literal::timestamp_from_datetime(DateTime::<FixedOffset>::from_local(
-<a href=#1632 id=1632 data-nosnippet>1632</a> /// dt,
-<a href=#1633 id=1633 data-nosnippet>1633</a> /// FixedOffset::west_opt(4 * 3600).unwrap(),
-<a href=#1634 id=1634 data-nosnippet>1634</a> /// ))
-<a href=#1635 id=1635 data-nosnippet>1635</a> /// };
-<a href=#1636 id=1636 data-nosnippet>1636</a> ///
-<a href=#1637 id=1637 data-nosnippet>1637</a> /// assert_eq!(t, t2);
-<a href=#1638 id=1638 data-nosnippet>1638</a> /// ```
-<a href=#1639 id=1639 data-nosnippet>1639</a> </span><span class="kw">pub fn </span>timestamp_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#1640 id=1640 data-nosnippet>1640</a> <span class="kw">let </span>dt = DateTime::<Utc>::from_str(s.as_ref()).map_err(|e| {
-<a href=#1641 id=1641 data-nosnippet>1641</a> Error::new(ErrorKind::DataInvalid, <span class="string">"Can't parse datetime."</span>).with_source(e)
-<a href=#1642 id=1642 data-nosnippet>1642</a> })<span class="question-mark">?</span>;
-<a href=#1643 id=1643 data-nosnippet>1643</a>
-<a href=#1644 id=1644 data-nosnippet>1644</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::timestamp_from_datetime(dt))
+<a href=#1570 id=1570 data-nosnippet>1570</a> /// See [`NaiveTime::from_str`] for details.
+<a href=#1571 id=1571 data-nosnippet>1571</a> ///
+<a href=#1572 id=1572 data-nosnippet>1572</a> /// Example:
+<a href=#1573 id=1573 data-nosnippet>1573</a> /// ```rust
+<a href=#1574 id=1574 data-nosnippet>1574</a> /// use iceberg::spec::Literal;
+<a href=#1575 id=1575 data-nosnippet>1575</a> /// let t = Literal::time_from_str("01:02:01.888999777").unwrap();
+<a href=#1576 id=1576 data-nosnippet>1576</a> ///
+<a href=#1577 id=1577 data-nosnippet>1577</a> /// let micro_secs = {
+<a href=#1578 id=1578 data-nosnippet>1578</a> /// 1 * 3600 * 1_000_000 + // 1 hour
+<a href=#1579 id=1579 data-nosnippet>1579</a> /// 2 * 60 * 1_000_000 + // 2 minutes
+<a href=#1580 id=1580 data-nosnippet>1580</a> /// 1 * 1_000_000 + // 1 second
+<a href=#1581 id=1581 data-nosnippet>1581</a> /// 888999 // microseconds
+<a href=#1582 id=1582 data-nosnippet>1582</a> /// };
+<a href=#1583 id=1583 data-nosnippet>1583</a> /// assert_eq!(Literal::time(micro_secs), t);
+<a href=#1584 id=1584 data-nosnippet>1584</a> /// ```
+<a href=#1585 id=1585 data-nosnippet>1585</a> </span><span class="kw">pub fn </span>time_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#1586 id=1586 data-nosnippet>1586</a> <span class="kw">let </span>t = s.as_ref().parse::<NaiveTime>().map_err(|e| {
+<a href=#1587 id=1587 data-nosnippet>1587</a> Error::new(
+<a href=#1588 id=1588 data-nosnippet>1588</a> ErrorKind::DataInvalid,
+<a href=#1589 id=1589 data-nosnippet>1589</a> <span class="macro">format!</span>(<span class="string">"Can't parse time from string: {}"</span>, s.as_ref()),
+<a href=#1590 id=1590 data-nosnippet>1590</a> )
+<a href=#1591 id=1591 data-nosnippet>1591</a> .with_source(e)
+<a href=#1592 id=1592 data-nosnippet>1592</a> })<span class="question-mark">?</span>;
+<a href=#1593 id=1593 data-nosnippet>1593</a>
+<a href=#1594 id=1594 data-nosnippet>1594</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::time_from_naive_time(t))
+<a href=#1595 id=1595 data-nosnippet>1595</a> }
+<a href=#1596 id=1596 data-nosnippet>1596</a>
+<a href=#1597 id=1597 data-nosnippet>1597</a> <span class="doccomment">/// Creates time literal from hour, minute, second, and microseconds.
+<a href=#1598 id=1598 data-nosnippet>1598</a> ///
+<a href=#1599 id=1599 data-nosnippet>1599</a> /// See [`NaiveTime::from_hms_micro_opt`].
+<a href=#1600 id=1600 data-nosnippet>1600</a> ///
+<a href=#1601 id=1601 data-nosnippet>1601</a> /// Example:
+<a href=#1602 id=1602 data-nosnippet>1602</a> /// ```rust
+<a href=#1603 id=1603 data-nosnippet>1603</a> /// use iceberg::spec::Literal;
+<a href=#1604 id=1604 data-nosnippet>1604</a> /// let t = Literal::time_from_hms_micro(22, 15, 33, 111).unwrap();
+<a href=#1605 id=1605 data-nosnippet>1605</a> ///
+<a href=#1606 id=1606 data-nosnippet>1606</a> /// assert_eq!(Literal::time_from_str("22:15:33.000111").unwrap(), t);
+<a href=#1607 id=1607 data-nosnippet>1607</a> /// ```
+<a href=#1608 id=1608 data-nosnippet>1608</a> </span><span class="kw">pub fn </span>time_from_hms_micro(hour: u32, min: u32, sec: u32, micro: u32) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#1609 id=1609 data-nosnippet>1609</a> <span class="kw">let </span>t = NaiveTime::from_hms_micro_opt(hour, min, sec, micro)
+<a href=#1610 id=1610 data-nosnippet>1610</a> .ok_or_else(|| Error::new(
+<a href=#1611 id=1611 data-nosnippet>1611</a> ErrorKind::DataInvalid,
+<a href=#1612 id=1612 data-nosnippet>1612</a> <span class="macro">format!</span>(<span class="string">"Can't create time from hour: {hour}, min: {min}, second: {sec}, microsecond: {micro}"</span>),
+<a href=#1613 id=1613 data-nosnippet>1613</a> ))<span class="question-mark">?</span>;
+<a href=#1614 id=1614 data-nosnippet>1614</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::time_from_naive_time(t))
+<a href=#1615 id=1615 data-nosnippet>1615</a> }
+<a href=#1616 id=1616 data-nosnippet>1616</a>
+<a href=#1617 id=1617 data-nosnippet>1617</a> <span class="doccomment">/// Creates a timestamp from unix epoch in microseconds.
+<a href=#1618 id=1618 data-nosnippet>1618</a> </span><span class="kw">pub fn </span>timestamp(value: i64) -> <span class="self">Self </span>{
+<a href=#1619 id=1619 data-nosnippet>1619</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Long(value))
+<a href=#1620 id=1620 data-nosnippet>1620</a> }
+<a href=#1621 id=1621 data-nosnippet>1621</a>
+<a href=#1622 id=1622 data-nosnippet>1622</a> <span class="doccomment">/// Creates a timestamp with timezone from unix epoch in microseconds.
+<a href=#1623 id=1623 data-nosnippet>1623</a> </span><span class="kw">pub fn </span>timestamptz(value: i64) -> <span class="self">Self </span>{
+<a href=#1624 id=1624 data-nosnippet>1624</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Long(value))
+<a href=#1625 id=1625 data-nosnippet>1625</a> }
+<a href=#1626 id=1626 data-nosnippet>1626</a>
+<a href=#1627 id=1627 data-nosnippet>1627</a> <span class="doccomment">/// Creates a timestamp from unix epoch in nanoseconds.
+<a href=#1628 id=1628 data-nosnippet>1628</a> </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>timestamp_nano(value: i64) -> <span class="self">Self </span>{
+<a href=#1629 id=1629 data-nosnippet>1629</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Long(value))
+<a href=#1630 id=1630 data-nosnippet>1630</a> }
+<a href=#1631 id=1631 data-nosnippet>1631</a>
+<a href=#1632 id=1632 data-nosnippet>1632</a> <span class="doccomment">/// Creates a timestamp with timezone from unix epoch in nanoseconds.
+<a href=#1633 id=1633 data-nosnippet>1633</a> </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>timestamptz_nano(value: i64) -> <span class="self">Self </span>{
+<a href=#1634 id=1634 data-nosnippet>1634</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Long(value))
+<a href=#1635 id=1635 data-nosnippet>1635</a> }
+<a href=#1636 id=1636 data-nosnippet>1636</a>
+<a href=#1637 id=1637 data-nosnippet>1637</a> <span class="doccomment">/// Creates a timestamp from [`DateTime`].
+<a href=#1638 id=1638 data-nosnippet>1638</a> </span><span class="kw">pub fn </span>timestamp_from_datetime<T: TimeZone>(dt: DateTime<T>) -> <span class="self">Self </span>{
+<a href=#1639 id=1639 data-nosnippet>1639</a> <span class="self">Self</span>::timestamp(dt.with_timezone(<span class="kw-2">&</span>Utc).timestamp_micros())
+<a href=#1640 id=1640 data-nosnippet>1640</a> }
+<a href=#1641 id=1641 data-nosnippet>1641</a>
+<a href=#1642 id=1642 data-nosnippet>1642</a> <span class="doccomment">/// Creates a timestamp with timezone from [`DateTime`].
+<a href=#1643 id=1643 data-nosnippet>1643</a> </span><span class="kw">pub fn </span>timestamptz_from_datetime<T: TimeZone>(dt: DateTime<T>) -> <span class="self">Self </span>{
+<a href=#1644 id=1644 data-nosnippet>1644</a> <span class="self">Self</span>::timestamptz(dt.with_timezone(<span class="kw-2">&</span>Utc).timestamp_micros())
<a href=#1645 id=1645 data-nosnippet>1645</a> }
<a href=#1646 id=1646 data-nosnippet>1646</a>
-<a href=#1647 id=1647 data-nosnippet>1647</a> <span class="doccomment">/// Similar to [`Literal::timestamp_from_str`], but return timestamp with timezone literal.
-<a href=#1648 id=1648 data-nosnippet>1648</a> </span><span class="kw">pub fn </span>timestamptz_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#1649 id=1649 data-nosnippet>1649</a> <span class="kw">let </span>dt = DateTime::<Utc>::from_str(s.as_ref()).map_err(|e| {
-<a href=#1650 id=1650 data-nosnippet>1650</a> Error::new(ErrorKind::DataInvalid, <span class="string">"Can't parse datetime."</span>).with_source(e)
-<a href=#1651 id=1651 data-nosnippet>1651</a> })<span class="question-mark">?</span>;
-<a href=#1652 id=1652 data-nosnippet>1652</a>
-<a href=#1653 id=1653 data-nosnippet>1653</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::timestamptz_from_datetime(dt))
-<a href=#1654 id=1654 data-nosnippet>1654</a> }
-<a href=#1655 id=1655 data-nosnippet>1655</a>
-<a href=#1656 id=1656 data-nosnippet>1656</a> <span class="doccomment">/// Creates a string literal.
-<a href=#1657 id=1657 data-nosnippet>1657</a> </span><span class="kw">pub fn </span>string<S: ToString>(s: S) -> <span class="self">Self </span>{
-<a href=#1658 id=1658 data-nosnippet>1658</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::String(s.to_string()))
-<a href=#1659 id=1659 data-nosnippet>1659</a> }
-<a href=#1660 id=1660 data-nosnippet>1660</a>
-<a href=#1661 id=1661 data-nosnippet>1661</a> <span class="doccomment">/// Creates uuid literal.
-<a href=#1662 id=1662 data-nosnippet>1662</a> </span><span class="kw">pub fn </span>uuid(uuid: Uuid) -> <span class="self">Self </span>{
-<a href=#1663 id=1663 data-nosnippet>1663</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::UInt128(uuid.as_u128()))
-<a href=#1664 id=1664 data-nosnippet>1664</a> }
-<a href=#1665 id=1665 data-nosnippet>1665</a>
-<a href=#1666 id=1666 data-nosnippet>1666</a> <span class="doccomment">/// Creates uuid from str. See [`Uuid::parse_str`].
+<a href=#1647 id=1647 data-nosnippet>1647</a> <span class="doccomment">/// Parse a timestamp in RFC3339 format.
+<a href=#1648 id=1648 data-nosnippet>1648</a> ///
+<a href=#1649 id=1649 data-nosnippet>1649</a> /// See [`DateTime<Utc>::from_str`].
+<a href=#1650 id=1650 data-nosnippet>1650</a> ///
+<a href=#1651 id=1651 data-nosnippet>1651</a> /// Example:
+<a href=#1652 id=1652 data-nosnippet>1652</a> ///
+<a href=#1653 id=1653 data-nosnippet>1653</a> /// ```rust
+<a href=#1654 id=1654 data-nosnippet>1654</a> /// use chrono::{DateTime, FixedOffset, NaiveDate, NaiveDateTime, NaiveTime};
+<a href=#1655 id=1655 data-nosnippet>1655</a> /// use iceberg::spec::Literal;
+<a href=#1656 id=1656 data-nosnippet>1656</a> /// let t = Literal::timestamp_from_str("2012-12-12 12:12:12.8899-04:00").unwrap();
+<a href=#1657 id=1657 data-nosnippet>1657</a> ///
+<a href=#1658 id=1658 data-nosnippet>1658</a> /// let t2 = {
+<a href=#1659 id=1659 data-nosnippet>1659</a> /// let date = NaiveDate::from_ymd_opt(2012, 12, 12).unwrap();
+<a href=#1660 id=1660 data-nosnippet>1660</a> /// let time = NaiveTime::from_hms_micro_opt(12, 12, 12, 889900).unwrap();
+<a href=#1661 id=1661 data-nosnippet>1661</a> /// let dt = NaiveDateTime::new(date, time);
+<a href=#1662 id=1662 data-nosnippet>1662</a> /// Literal::timestamp_from_datetime(DateTime::<FixedOffset>::from_local(
+<a href=#1663 id=1663 data-nosnippet>1663</a> /// dt,
+<a href=#1664 id=1664 data-nosnippet>1664</a> /// FixedOffset::west_opt(4 * 3600).unwrap(),
+<a href=#1665 id=1665 data-nosnippet>1665</a> /// ))
+<a href=#1666 id=1666 data-nosnippet>1666</a> /// };
<a href=#1667 id=1667 data-nosnippet>1667</a> ///
-<a href=#1668 id=1668 data-nosnippet>1668</a> /// Example:
-<a href=#1669 id=1669 data-nosnippet>1669</a> ///
-<a href=#1670 id=1670 data-nosnippet>1670</a> /// ```rust
-<a href=#1671 id=1671 data-nosnippet>1671</a> /// use iceberg::spec::Literal;
-<a href=#1672 id=1672 data-nosnippet>1672</a> /// use uuid::Uuid;
-<a href=#1673 id=1673 data-nosnippet>1673</a> /// let t1 = Literal::uuid_from_str("a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8").unwrap();
-<a href=#1674 id=1674 data-nosnippet>1674</a> /// let t2 = Literal::uuid(Uuid::from_u128_le(0xd8d7d6d5d4d3d2d1c2c1b2b1a4a3a2a1));
-<a href=#1675 id=1675 data-nosnippet>1675</a> ///
-<a href=#1676 id=1676 data-nosnippet>1676</a> /// assert_eq!(t1, t2);
-<a href=#1677 id=1677 data-nosnippet>1677</a> /// ```
-<a href=#1678 id=1678 data-nosnippet>1678</a> </span><span class="kw">pub fn </span>uuid_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#1679 id=1679 data-nosnippet>1679</a> <span class="kw">let </span>uuid = Uuid::parse_str(s.as_ref()).map_err(|e| {
-<a href=#1680 id=1680 data-nosnippet>1680</a> Error::new(
-<a href=#1681 id=1681 data-nosnippet>1681</a> ErrorKind::DataInvalid,
-<a href=#1682 id=1682 data-nosnippet>1682</a> <span class="macro">format!</span>(<span class="string">"Can't parse uuid from string: {}"</span>, s.as_ref()),
-<a href=#1683 id=1683 data-nosnippet>1683</a> )
-<a href=#1684 id=1684 data-nosnippet>1684</a> .with_source(e)
-<a href=#1685 id=1685 data-nosnippet>1685</a> })<span class="question-mark">?</span>;
-<a href=#1686 id=1686 data-nosnippet>1686</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::uuid(uuid))
-<a href=#1687 id=1687 data-nosnippet>1687</a> }
-<a href=#1688 id=1688 data-nosnippet>1688</a>
-<a href=#1689 id=1689 data-nosnippet>1689</a> <span class="doccomment">/// Creates a fixed literal from bytes.
-<a href=#1690 id=1690 data-nosnippet>1690</a> ///
-<a href=#1691 id=1691 data-nosnippet>1691</a> /// Example:
-<a href=#1692 id=1692 data-nosnippet>1692</a> ///
-<a href=#1693 id=1693 data-nosnippet>1693</a> /// ```rust
-<a href=#1694 id=1694 data-nosnippet>1694</a> /// use iceberg::spec::{Literal, PrimitiveLiteral};
-<a href=#1695 id=1695 data-nosnippet>1695</a> /// let t1 = Literal::fixed(vec![1u8, 2u8]);
-<a href=#1696 id=1696 data-nosnippet>1696</a> /// let t2 = Literal::Primitive(PrimitiveLiteral::Binary(vec![1u8, 2u8]));
-<a href=#1697 id=1697 data-nosnippet>1697</a> ///
-<a href=#1698 id=1698 data-nosnippet>1698</a> /// assert_eq!(t1, t2);
-<a href=#1699 id=1699 data-nosnippet>1699</a> /// ```
-<a href=#1700 id=1700 data-nosnippet>1700</a> </span><span class="kw">pub fn </span>fixed<I: IntoIterator<Item = u8>>(input: I) -> <span class="self">Self </span>{
-<a href=#1701 id=1701 data-nosnippet>1701</a> Literal::Primitive(PrimitiveLiteral::Binary(input.into_iter().collect()))
-<a href=#1702 id=1702 data-nosnippet>1702</a> }
-<a href=#1703 id=1703 data-nosnippet>1703</a>
-<a href=#1704 id=1704 data-nosnippet>1704</a> <span class="doccomment">/// Creates a binary literal from bytes.
-<a href=#1705 id=1705 data-nosnippet>1705</a> ///
-<a href=#1706 id=1706 data-nosnippet>1706</a> /// Example:
-<a href=#1707 id=1707 data-nosnippet>1707</a> ///
-<a href=#1708 id=1708 data-nosnippet>1708</a> /// ```rust
-<a href=#1709 id=1709 data-nosnippet>1709</a> /// use iceberg::spec::{Literal, PrimitiveLiteral};
-<a href=#1710 id=1710 data-nosnippet>1710</a> /// let t1 = Literal::binary(vec![1u8, 2u8]);
-<a href=#1711 id=1711 data-nosnippet>1711</a> /// let t2 = Literal::Primitive(PrimitiveLiteral::Binary(vec![1u8, 2u8]));
-<a href=#1712 id=1712 data-nosnippet>1712</a> ///
-<a href=#1713 id=1713 data-nosnippet>1713</a> /// assert_eq!(t1, t2);
-<a href=#1714 id=1714 data-nosnippet>1714</a> /// ```
-<a href=#1715 id=1715 data-nosnippet>1715</a> </span><span class="kw">pub fn </span>binary<I: IntoIterator<Item = u8>>(input: I) -> <span class="self">Self </span>{
-<a href=#1716 id=1716 data-nosnippet>1716</a> Literal::Primitive(PrimitiveLiteral::Binary(input.into_iter().collect()))
-<a href=#1717 id=1717 data-nosnippet>1717</a> }
-<a href=#1718 id=1718 data-nosnippet>1718</a>
-<a href=#1719 id=1719 data-nosnippet>1719</a> <span class="doccomment">/// Creates a decimal literal.
-<a href=#1720 id=1720 data-nosnippet>1720</a> </span><span class="kw">pub fn </span>decimal(decimal: i128) -> <span class="self">Self </span>{
-<a href=#1721 id=1721 data-nosnippet>1721</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Int128(decimal))
-<a href=#1722 id=1722 data-nosnippet>1722</a> }
-<a href=#1723 id=1723 data-nosnippet>1723</a>
-<a href=#1724 id=1724 data-nosnippet>1724</a> <span class="doccomment">/// Creates decimal literal from string. See [`Decimal::from_str_exact`].
-<a href=#1725 id=1725 data-nosnippet>1725</a> ///
-<a href=#1726 id=1726 data-nosnippet>1726</a> /// Example:
-<a href=#1727 id=1727 data-nosnippet>1727</a> ///
-<a href=#1728 id=1728 data-nosnippet>1728</a> /// ```rust
-<a href=#1729 id=1729 data-nosnippet>1729</a> /// use iceberg::spec::Literal;
-<a href=#1730 id=1730 data-nosnippet>1730</a> /// use rust_decimal::Decimal;
-<a href=#1731 id=1731 data-nosnippet>1731</a> /// let t1 = Literal::decimal(12345);
-<a href=#1732 id=1732 data-nosnippet>1732</a> /// let t2 = Literal::decimal_from_str("123.45").unwrap();
-<a href=#1733 id=1733 data-nosnippet>1733</a> ///
-<a href=#1734 id=1734 data-nosnippet>1734</a> /// assert_eq!(t1, t2);
-<a href=#1735 id=1735 data-nosnippet>1735</a> /// ```
-<a href=#1736 id=1736 data-nosnippet>1736</a> </span><span class="kw">pub fn </span>decimal_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
-<a href=#1737 id=1737 data-nosnippet>1737</a> <span class="kw">let </span>decimal = Decimal::from_str_exact(s.as_ref()).map_err(|e| {
-<a href=#1738 id=1738 data-nosnippet>1738</a> Error::new(ErrorKind::DataInvalid, <span class="string">"Can't parse decimal."</span>).with_source(e)
-<a href=#1739 id=1739 data-nosnippet>1739</a> })<span class="question-mark">?</span>;
-<a href=#1740 id=1740 data-nosnippet>1740</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::decimal(decimal.mantissa()))
-<a href=#1741 id=1741 data-nosnippet>1741</a> }
-<a href=#1742 id=1742 data-nosnippet>1742</a>
-<a href=#1743 id=1743 data-nosnippet>1743</a> <span class="doccomment">/// Attempts to convert the Literal to a PrimitiveLiteral
-<a href=#1744 id=1744 data-nosnippet>1744</a> </span><span class="kw">pub fn </span>as_primitive_literal(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="prelude-ty">Option</span><PrimitiveLiteral> {
-<a href=#1745 id=1745 data-nosnippet>1745</a> <span class="kw">match </span><span class="self">self </span>{
-<a href=#1746 id=1746 data-nosnippet>1746</a> Literal::Primitive(primitive) => <span class="prelude-val">Some</span>(primitive.clone()),
-<a href=#1747 id=1747 data-nosnippet>1747</a> <span class="kw">_ </span>=> <span class="prelude-val">None</span>,
-<a href=#1748 id=1748 data-nosnippet>1748</a> }
-<a href=#1749 id=1749 data-nosnippet>1749</a> }
-<a href=#1750 id=1750 data-nosnippet>1750</a>}
-<a href=#1751 id=1751 data-nosnippet>1751</a>
-<a href=#1752 id=1752 data-nosnippet>1752</a><span class="doccomment">/// The partition struct stores the tuple of partition values for each file.
-<a href=#1753 id=1753 data-nosnippet>1753</a>/// Its type is derived from the partition fields of the partition spec used to write the manifest file.
-<a href=#1754 id=1754 data-nosnippet>1754</a>/// In v2, the partition struct’s field ids must match the ids from the partition spec.
-<a href=#1755 id=1755 data-nosnippet>1755</a></span><span class="attr">#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-<a href=#1756 id=1756 data-nosnippet>1756</a></span><span class="kw">pub struct </span>Struct {
-<a href=#1757 id=1757 data-nosnippet>1757</a> <span class="doccomment">/// Vector to store the field values
-<a href=#1758 id=1758 data-nosnippet>1758</a> </span>fields: Vec<<span class="prelude-ty">Option</span><Literal>>,
-<a href=#1759 id=1759 data-nosnippet>1759</a>}
-<a href=#1760 id=1760 data-nosnippet>1760</a>
-<a href=#1761 id=1761 data-nosnippet>1761</a><span class="kw">impl </span>Struct {
-<a href=#1762 id=1762 data-nosnippet>1762</a> <span class="doccomment">/// Create a empty struct.
-<a href=#1763 id=1763 data-nosnippet>1763</a> </span><span class="kw">pub fn </span>empty() -> <span class="self">Self </span>{
-<a href=#1764 id=1764 data-nosnippet>1764</a> <span class="self">Self </span>{ fields: Vec::new() }
-<a href=#1765 id=1765 data-nosnippet>1765</a> }
-<a href=#1766 id=1766 data-nosnippet>1766</a>
-<a href=#1767 id=1767 data-nosnippet>1767</a> <span class="doccomment">/// Create a iterator to read the field in order of field_value.
-<a href=#1768 id=1768 data-nosnippet>1768</a> </span><span class="kw">pub fn </span>iter(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw">impl </span>ExactSizeIterator<Item = <span class="prelude-ty">Option</span><<span class="kw-2">&</span>Literal>> {
-<a href=#1769 id=1769 data-nosnippet>1769</a> <span class="self">self</span>.fields.iter().map(|field| field.as_ref())
-<a href=#1770 id=1770 data-nosnippet>1770</a> }
-<a href=#1771 id=1771 data-nosnippet>1771</a>
-<a href=#1772 id=1772 data-nosnippet>1772</a> <span class="doccomment">/// returns true if the field at position `index` is null
-<a href=#1773 id=1773 data-nosnippet>1773</a> </span><span class="kw">pub fn </span>is_null_at_index(<span class="kw-2">&</span><span class="self">self</span>, index: usize) -> bool {
-<a href=#1774 id=1774 data-nosnippet>1774</a> <span class="self">self</span>.fields[index].is_none()
-<a href=#1775 id=1775 data-nosnippet>1775</a> }
-<a href=#1776 id=1776 data-nosnippet>1776</a>
-<a href=#1777 id=1777 data-nosnippet>1777</a> <span class="doccomment">/// Return fields in the struct.
-<a href=#1778 id=1778 data-nosnippet>1778</a> </span><span class="kw">pub fn </span>fields(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>[<span class="prelude-ty">Option</span><Literal>] {
-<a href=#1779 id=1779 data-nosnippet>1779</a> <span class="kw-2">&</span><span class="self">self</span>.fields
+<a href=#1668 id=1668 data-nosnippet>1668</a> /// assert_eq!(t, t2);
+<a href=#1669 id=1669 data-nosnippet>1669</a> /// ```
+<a href=#1670 id=1670 data-nosnippet>1670</a> </span><span class="kw">pub fn </span>timestamp_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#1671 id=1671 data-nosnippet>1671</a> <span class="kw">let </span>dt = DateTime::<Utc>::from_str(s.as_ref()).map_err(|e| {
+<a href=#1672 id=1672 data-nosnippet>1672</a> Error::new(ErrorKind::DataInvalid, <span class="string">"Can't parse datetime."</span>).with_source(e)
+<a href=#1673 id=1673 data-nosnippet>1673</a> })<span class="question-mark">?</span>;
+<a href=#1674 id=1674 data-nosnippet>1674</a>
+<a href=#1675 id=1675 data-nosnippet>1675</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::timestamp_from_datetime(dt))
+<a href=#1676 id=1676 data-nosnippet>1676</a> }
+<a href=#1677 id=1677 data-nosnippet>1677</a>
+<a href=#1678 id=1678 data-nosnippet>1678</a> <span class="doccomment">/// Similar to [`Literal::timestamp_from_str`], but return timestamp with timezone literal.
+<a href=#1679 id=1679 data-nosnippet>1679</a> </span><span class="kw">pub fn </span>timestamptz_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#1680 id=1680 data-nosnippet>1680</a> <span class="kw">let </span>dt = DateTime::<Utc>::from_str(s.as_ref()).map_err(|e| {
+<a href=#1681 id=1681 data-nosnippet>1681</a> Error::new(ErrorKind::DataInvalid, <span class="string">"Can't parse datetime."</span>).with_source(e)
+<a href=#1682 id=1682 data-nosnippet>1682</a> })<span class="question-mark">?</span>;
+<a href=#1683 id=1683 data-nosnippet>1683</a>
+<a href=#1684 id=1684 data-nosnippet>1684</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::timestamptz_from_datetime(dt))
+<a href=#1685 id=1685 data-nosnippet>1685</a> }
+<a href=#1686 id=1686 data-nosnippet>1686</a>
+<a href=#1687 id=1687 data-nosnippet>1687</a> <span class="doccomment">/// Creates a string literal.
+<a href=#1688 id=1688 data-nosnippet>1688</a> </span><span class="kw">pub fn </span>string<S: ToString>(s: S) -> <span class="self">Self </span>{
+<a href=#1689 id=1689 data-nosnippet>1689</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::String(s.to_string()))
+<a href=#1690 id=1690 data-nosnippet>1690</a> }
+<a href=#1691 id=1691 data-nosnippet>1691</a>
+<a href=#1692 id=1692 data-nosnippet>1692</a> <span class="doccomment">/// Creates uuid literal.
+<a href=#1693 id=1693 data-nosnippet>1693</a> </span><span class="kw">pub fn </span>uuid(uuid: Uuid) -> <span class="self">Self </span>{
+<a href=#1694 id=1694 data-nosnippet>1694</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::UInt128(uuid.as_u128()))
+<a href=#1695 id=1695 data-nosnippet>1695</a> }
+<a href=#1696 id=1696 data-nosnippet>1696</a>
+<a href=#1697 id=1697 data-nosnippet>1697</a> <span class="doccomment">/// Creates uuid from str. See [`Uuid::parse_str`].
+<a href=#1698 id=1698 data-nosnippet>1698</a> ///
+<a href=#1699 id=1699 data-nosnippet>1699</a> /// Example:
+<a href=#1700 id=1700 data-nosnippet>1700</a> ///
+<a href=#1701 id=1701 data-nosnippet>1701</a> /// ```rust
+<a href=#1702 id=1702 data-nosnippet>1702</a> /// use iceberg::spec::Literal;
+<a href=#1703 id=1703 data-nosnippet>1703</a> /// use uuid::Uuid;
+<a href=#1704 id=1704 data-nosnippet>1704</a> /// let t1 = Literal::uuid_from_str("a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8").unwrap();
+<a href=#1705 id=1705 data-nosnippet>1705</a> /// let t2 = Literal::uuid(Uuid::from_u128_le(0xd8d7d6d5d4d3d2d1c2c1b2b1a4a3a2a1));
+<a href=#1706 id=1706 data-nosnippet>1706</a> ///
+<a href=#1707 id=1707 data-nosnippet>1707</a> /// assert_eq!(t1, t2);
+<a href=#1708 id=1708 data-nosnippet>1708</a> /// ```
+<a href=#1709 id=1709 data-nosnippet>1709</a> </span><span class="kw">pub fn </span>uuid_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#1710 id=1710 data-nosnippet>1710</a> <span class="kw">let </span>uuid = Uuid::parse_str(s.as_ref()).map_err(|e| {
+<a href=#1711 id=1711 data-nosnippet>1711</a> Error::new(
+<a href=#1712 id=1712 data-nosnippet>1712</a> ErrorKind::DataInvalid,
+<a href=#1713 id=1713 data-nosnippet>1713</a> <span class="macro">format!</span>(<span class="string">"Can't parse uuid from string: {}"</span>, s.as_ref()),
+<a href=#1714 id=1714 data-nosnippet>1714</a> )
+<a href=#1715 id=1715 data-nosnippet>1715</a> .with_source(e)
+<a href=#1716 id=1716 data-nosnippet>1716</a> })<span class="question-mark">?</span>;
+<a href=#1717 id=1717 data-nosnippet>1717</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::uuid(uuid))
+<a href=#1718 id=1718 data-nosnippet>1718</a> }
+<a href=#1719 id=1719 data-nosnippet>1719</a>
+<a href=#1720 id=1720 data-nosnippet>1720</a> <span class="doccomment">/// Creates a fixed literal from bytes.
+<a href=#1721 id=1721 data-nosnippet>1721</a> ///
+<a href=#1722 id=1722 data-nosnippet>1722</a> /// Example:
+<a href=#1723 id=1723 data-nosnippet>1723</a> ///
+<a href=#1724 id=1724 data-nosnippet>1724</a> /// ```rust
+<a href=#1725 id=1725 data-nosnippet>1725</a> /// use iceberg::spec::{Literal, PrimitiveLiteral};
+<a href=#1726 id=1726 data-nosnippet>1726</a> /// let t1 = Literal::fixed(vec![1u8, 2u8]);
+<a href=#1727 id=1727 data-nosnippet>1727</a> /// let t2 = Literal::Primitive(PrimitiveLiteral::Binary(vec![1u8, 2u8]));
+<a href=#1728 id=1728 data-nosnippet>1728</a> ///
+<a href=#1729 id=1729 data-nosnippet>1729</a> /// assert_eq!(t1, t2);
+<a href=#1730 id=1730 data-nosnippet>1730</a> /// ```
+<a href=#1731 id=1731 data-nosnippet>1731</a> </span><span class="kw">pub fn </span>fixed<I: IntoIterator<Item = u8>>(input: I) -> <span class="self">Self </span>{
+<a href=#1732 id=1732 data-nosnippet>1732</a> Literal::Primitive(PrimitiveLiteral::Binary(input.into_iter().collect()))
+<a href=#1733 id=1733 data-nosnippet>1733</a> }
+<a href=#1734 id=1734 data-nosnippet>1734</a>
+<a href=#1735 id=1735 data-nosnippet>1735</a> <span class="doccomment">/// Creates a binary literal from bytes.
+<a href=#1736 id=1736 data-nosnippet>1736</a> ///
+<a href=#1737 id=1737 data-nosnippet>1737</a> /// Example:
+<a href=#1738 id=1738 data-nosnippet>1738</a> ///
+<a href=#1739 id=1739 data-nosnippet>1739</a> /// ```rust
+<a href=#1740 id=1740 data-nosnippet>1740</a> /// use iceberg::spec::{Literal, PrimitiveLiteral};
+<a href=#1741 id=1741 data-nosnippet>1741</a> /// let t1 = Literal::binary(vec![1u8, 2u8]);
+<a href=#1742 id=1742 data-nosnippet>1742</a> /// let t2 = Literal::Primitive(PrimitiveLiteral::Binary(vec![1u8, 2u8]));
+<a href=#1743 id=1743 data-nosnippet>1743</a> ///
+<a href=#1744 id=1744 data-nosnippet>1744</a> /// assert_eq!(t1, t2);
+<a href=#1745 id=1745 data-nosnippet>1745</a> /// ```
+<a href=#1746 id=1746 data-nosnippet>1746</a> </span><span class="kw">pub fn </span>binary<I: IntoIterator<Item = u8>>(input: I) -> <span class="self">Self </span>{
+<a href=#1747 id=1747 data-nosnippet>1747</a> Literal::Primitive(PrimitiveLiteral::Binary(input.into_iter().collect()))
+<a href=#1748 id=1748 data-nosnippet>1748</a> }
+<a href=#1749 id=1749 data-nosnippet>1749</a>
+<a href=#1750 id=1750 data-nosnippet>1750</a> <span class="doccomment">/// Creates a decimal literal.
+<a href=#1751 id=1751 data-nosnippet>1751</a> </span><span class="kw">pub fn </span>decimal(decimal: i128) -> <span class="self">Self </span>{
+<a href=#1752 id=1752 data-nosnippet>1752</a> <span class="self">Self</span>::Primitive(PrimitiveLiteral::Int128(decimal))
+<a href=#1753 id=1753 data-nosnippet>1753</a> }
+<a href=#1754 id=1754 data-nosnippet>1754</a>
+<a href=#1755 id=1755 data-nosnippet>1755</a> <span class="doccomment">/// Creates decimal literal from string. See [`Decimal::from_str_exact`].
+<a href=#1756 id=1756 data-nosnippet>1756</a> ///
+<a href=#1757 id=1757 data-nosnippet>1757</a> /// Example:
+<a href=#1758 id=1758 data-nosnippet>1758</a> ///
+<a href=#1759 id=1759 data-nosnippet>1759</a> /// ```rust
+<a href=#1760 id=1760 data-nosnippet>1760</a> /// use iceberg::spec::Literal;
+<a href=#1761 id=1761 data-nosnippet>1761</a> /// use rust_decimal::Decimal;
+<a href=#1762 id=1762 data-nosnippet>1762</a> /// let t1 = Literal::decimal(12345);
+<a href=#1763 id=1763 data-nosnippet>1763</a> /// let t2 = Literal::decimal_from_str("123.45").unwrap();
+<a href=#1764 id=1764 data-nosnippet>1764</a> ///
+<a href=#1765 id=1765 data-nosnippet>1765</a> /// assert_eq!(t1, t2);
+<a href=#1766 id=1766 data-nosnippet>1766</a> /// ```
+<a href=#1767 id=1767 data-nosnippet>1767</a> </span><span class="kw">pub fn </span>decimal_from_str<S: AsRef<str>>(s: S) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>> {
+<a href=#1768 id=1768 data-nosnippet>1768</a> <span class="kw">let </span>decimal = Decimal::from_str_exact(s.as_ref()).map_err(|e| {
+<a href=#1769 id=1769 data-nosnippet>1769</a> Error::new(ErrorKind::DataInvalid, <span class="string">"Can't parse decimal."</span>).with_source(e)
+<a href=#1770 id=1770 data-nosnippet>1770</a> })<span class="question-mark">?</span>;
+<a href=#1771 id=1771 data-nosnippet>1771</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>::decimal(decimal.mantissa()))
+<a href=#1772 id=1772 data-nosnippet>1772</a> }
+<a href=#1773 id=1773 data-nosnippet>1773</a>
+<a href=#1774 id=1774 data-nosnippet>1774</a> <span class="doccomment">/// Attempts to convert the Literal to a PrimitiveLiteral
+<a href=#1775 id=1775 data-nosnippet>1775</a> </span><span class="kw">pub fn </span>as_primitive_literal(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="prelude-ty">Option</span><PrimitiveLiteral> {
+<a href=#1776 id=1776 data-nosnippet>1776</a> <span class="kw">match </span><span class="self">self </span>{
+<a href=#1777 id=1777 data-nosnippet>1777</a> Literal::Primitive(primitive) => <span class="prelude-val">Some</span>(primitive.clone()),
+<a href=#1778 id=1778 data-nosnippet>1778</a> <span class="kw">_ </span>=> <span class="prelude-val">None</span>,
+<a href=#1779 id=1779 data-nosnippet>1779</a> }
<a href=#1780 id=1780 data-nosnippet>1780</a> }
<a href=#1781 id=1781 data-nosnippet>1781</a>}
<a href=#1782 id=1782 data-nosnippet>1782</a>
-<a href=#1783 id=1783 data-nosnippet>1783</a><span class="kw">impl </span>Index<usize> <span class="kw">for </span>Struct {
-<a href=#1784 id=1784 data-nosnippet>1784</a> <span class="kw">type </span>Output = <span class="prelude-ty">Option</span><Literal>;
-<a href=#1785 id=1785 data-nosnippet>1785</a>
-<a href=#1786 id=1786 data-nosnippet>1786</a> <span class="kw">fn </span>index(<span class="kw-2">&</span><span class="self">self</span>, idx: usize) -> <span class="kw-2">&</span><span class="self">Self</span>::Output {
-<a href=#1787 id=1787 data-nosnippet>1787</a> <span class="kw-2">&</span><span class="self">self</span>.fields[idx]
-<a href=#1788 id=1788 data-nosnippet>1788</a> }
-<a href=#1789 id=1789 data-nosnippet>1789</a>}
-<a href=#1790 id=1790 data-nosnippet>1790</a>
-<a href=#1791 id=1791 data-nosnippet>1791</a><span class="kw">impl </span>IntoIterator <span class="kw">for </span>Struct {
-<a href=#1792 id=1792 data-nosnippet>1792</a> <span class="kw">type </span>Item = <span class="prelude-ty">Option</span><Literal>;
-<a href=#1793 id=1793 data-nosnippet>1793</a>
-<a href=#1794 id=1794 data-nosnippet>1794</a> <span class="kw">type </span>IntoIter = std::vec::IntoIter<<span class="prelude-ty">Option</span><Literal>>;
-<a href=#1795 id=1795 data-nosnippet>1795</a>
-<a href=#1796 id=1796 data-nosnippet>1796</a> <span class="kw">fn </span>into_iter(<span class="self">self</span>) -> <span class="self">Self</span>::IntoIter {
-<a href=#1797 id=1797 data-nosnippet>1797</a> <span class="self">self</span>.fields.into_iter()
-<a href=#1798 id=1798 data-nosnippet>1798</a> }
-<a href=#1799 id=1799 data-nosnippet>1799</a>}
-<a href=#1800 id=1800 data-nosnippet>1800</a>
-<a href=#1801 id=1801 data-nosnippet>1801</a><span class="kw">impl </span>FromIterator<<span class="prelude-ty">Option</span><Literal>> <span class="kw">for </span>Struct {
-<a href=#1802 id=1802 data-nosnippet>1802</a> <span class="kw">fn </span>from_iter<I: IntoIterator<Item = <span class="prelude-ty">Option</span><Literal>>>(iter: I) -> <span class="self">Self </span>{
-<a href=#1803 id=1803 data-nosnippet>1803</a> Struct {
-<a href=#1804 id=1804 data-nosnippet>1804</a> fields: iter.into_iter().collect(),
-<a href=#1805 id=1805 data-nosnippet>1805</a> }
+<a href=#1783 id=1783 data-nosnippet>1783</a><span class="doccomment">/// The partition struct stores the tuple of partition values for each file.
+<a href=#1784 id=1784 data-nosnippet>1784</a>/// Its type is derived from the partition fields of the partition spec used to write the manifest file.
+<a href=#1785 id=1785 data-nosnippet>1785</a>/// In v2, the partition struct’s field ids must match the ids from the partition spec.
+<a href=#1786 id=1786 data-nosnippet>1786</a></span><span class="attr">#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+<a href=#1787 id=1787 data-nosnippet>1787</a></span><span class="kw">pub struct </span>Struct {
+<a href=#1788 id=1788 data-nosnippet>1788</a> <span class="doccomment">/// Vector to store the field values
+<a href=#1789 id=1789 data-nosnippet>1789</a> </span>fields: Vec<<span class="prelude-ty">Option</span><Literal>>,
+<a href=#1790 id=1790 data-nosnippet>1790</a>}
+<a href=#1791 id=1791 data-nosnippet>1791</a>
+<a href=#1792 id=1792 data-nosnippet>1792</a><span class="kw">impl </span>Struct {
+<a href=#1793 id=1793 data-nosnippet>1793</a> <span class="doccomment">/// Create a empty struct.
+<a href=#1794 id=1794 data-nosnippet>1794</a> </span><span class="kw">pub fn </span>empty() -> <span class="self">Self </span>{
+<a href=#1795 id=1795 data-nosnippet>1795</a> <span class="self">Self </span>{ fields: Vec::new() }
+<a href=#1796 id=1796 data-nosnippet>1796</a> }
+<a href=#1797 id=1797 data-nosnippet>1797</a>
+<a href=#1798 id=1798 data-nosnippet>1798</a> <span class="doccomment">/// Create a iterator to read the field in order of field_value.
+<a href=#1799 id=1799 data-nosnippet>1799</a> </span><span class="kw">pub fn </span>iter(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw">impl </span>ExactSizeIterator<Item = <span class="prelude-ty">Option</span><<span class="kw-2">&</span>Literal>> {
+<a href=#1800 id=1800 data-nosnippet>1800</a> <span class="self">self</span>.fields.iter().map(|field| field.as_ref())
+<a href=#1801 id=1801 data-nosnippet>1801</a> }
+<a href=#1802 id=1802 data-nosnippet>1802</a>
+<a href=#1803 id=1803 data-nosnippet>1803</a> <span class="doccomment">/// returns true if the field at position `index` is null
+<a href=#1804 id=1804 data-nosnippet>1804</a> </span><span class="kw">pub fn </span>is_null_at_index(<span class="kw-2">&</span><span class="self">self</span>, index: usize) -> bool {
+<a href=#1805 id=1805 data-nosnippet>1805</a> <span class="self">self</span>.fields[index].is_none()
<a href=#1806 id=1806 data-nosnippet>1806</a> }
-<a href=#1807 id=1807 data-nosnippet>1807</a>}
-<a href=#1808 id=1808 data-nosnippet>1808</a>
-<a href=#1809 id=1809 data-nosnippet>1809</a><span class="kw">impl </span>Literal {
-<a href=#1810 id=1810 data-nosnippet>1810</a> <span class="doccomment">/// Create iceberg value from a json value
-<a href=#1811 id=1811 data-nosnippet>1811</a> ///
-<a href=#1812 id=1812 data-nosnippet>1812</a> /// See [this spec](https://iceberg.apache.org/spec/#json-single-value-serialization) for reference.
-<a href=#1813 id=1813 data-nosnippet>1813</a> </span><span class="kw">pub fn </span>try_from_json(value: JsonValue, data_type: <span class="kw-2">&</span>Type) -> <span class="prelude-ty">Result</span><<span class="prelude-ty">Option</span><<span class="self">Self</span>>> {
-<a href=#1814 id=1814 data-nosnippet>1814</a> <span class="kw">match </span>data_type {
-<a href=#1815 id=1815 data-nosnippet>1815</a> Type::Primitive(primitive) => <span class="kw">match </span>(primitive, value) {
-<a href=#1816 id=1816 data-nosnippet>1816</a> (PrimitiveType::Boolean, JsonValue::Bool(bool)) => {
-<a href=#1817 id=1817 data-nosnippet>1817</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Boolean(bool))))
-<a href=#1818 id=1818 data-nosnippet>1818</a> }
-<a href=#1819 id=1819 data-nosnippet>1819</a> (PrimitiveType::Int, JsonValue::Number(number)) => {
-<a href=#1820 id=1820 data-nosnippet>1820</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(
-<a href=#1821 id=1821 data-nosnippet>1821</a> number
-<a href=#1822 id=1822 data-nosnippet>1822</a> .as_i64()
-<a href=#1823 id=1823 data-nosnippet>1823</a> .ok_or(Error::new(
-<a href=#1824 id=1824 data-nosnippet>1824</a> <span class="kw">crate</span>::ErrorKind::DataInvalid,
-<a href=#1825 id=1825 data-nosnippet>1825</a> <span class="string">"Failed to convert json number to int"</span>,
-<a href=#1826 id=1826 data-nosnippet>1826</a> ))<span class="question-mark">?
-<a href=#1827 id=1827 data-nosnippet>1827</a> </span>.try_into()<span class="question-mark">?</span>,
-<a href=#1828 id=1828 data-nosnippet>1828</a> ))))
-<a href=#1829 id=1829 data-nosnippet>1829</a> }
-<a href=#1830 id=1830 data-nosnippet>1830</a> (PrimitiveType::Long, JsonValue::Number(number)) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(
-<a href=#1831 id=1831 data-nosnippet>1831</a> PrimitiveLiteral::Long(number.as_i64().ok_or(Error::new(
-<a href=#1832 id=1832 data-nosnippet>1832</a> <span class="kw">crate</span>::ErrorKind::DataInvalid,
-<a href=#1833 id=1833 data-nosnippet>1833</a> <span class="string">"Failed to convert json number to long"</span>,
-<a href=#1834 id=1834 data-nosnippet>1834</a> ))<span class="question-mark">?</span>),
-<a href=#1835 id=1835 data-nosnippet>1835</a> ))),
-<a href=#1836 id=1836 data-nosnippet>1836</a> (PrimitiveType::Float, JsonValue::Number(number)) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(
-<a href=#1837 id=1837 data-nosnippet>1837</a> PrimitiveLiteral::Float(OrderedFloat(number.as_f64().ok_or(Error::new(
-<a href=#1838 id=1838 data-nosnippet>1838</a> <span class="kw">crate</span>::ErrorKind::DataInvalid,
-<a href=#1839 id=1839 data-nosnippet>1839</a> <span class="string">"Failed to convert json number to float"</span>,
-<a href=#1840 id=1840 data-nosnippet>1840</a> ))<span class="question-mark">? </span><span class="kw">as </span>f32)),
-<a href=#1841 id=1841 data-nosnippet>1841</a> ))),
-<a href=#1842 id=1842 data-nosnippet>1842</a> (PrimitiveType::Double, JsonValue::Number(number)) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(
-<a href=#1843 id=1843 data-nosnippet>1843</a> PrimitiveLiteral::Double(OrderedFloat(number.as_f64().ok_or(Error::new(
-<a href=#1844 id=1844 data-nosnippet>1844</a> <span class="kw">crate</span>::ErrorKind::DataInvalid,
-<a href=#1845 id=1845 data-nosnippet>1845</a> <span class="string">"Failed to convert json number to double"</span>,
-<a href=#1846 id=1846 data-nosnippet>1846</a> ))<span class="question-mark">?</span>)),
-<a href=#1847 id=1847 data-nosnippet>1847</a> ))),
-<a href=#1848 id=1848 data-nosnippet>1848</a> (PrimitiveType::Date, JsonValue::String(s)) => {
-<a href=#1849 id=1849 data-nosnippet>1849</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(
-<a href=#1850 id=1850 data-nosnippet>1850</a> date::date_to_days(<span class="kw-2">&</span>NaiveDate::parse_from_str(<span class="kw-2">&</span>s, <span class="string">"%Y-%m-%d"</span>)<span class="question-mark">?</span>),
-<a href=#1851 id=1851 data-nosnippet>1851</a> ))))
-<a href=#1852 id=1852 data-nosnippet>1852</a> }
-<a href=#1853 id=1853 data-nosnippet>1853</a> (PrimitiveType::Time, JsonValue::String(s)) => {
-<a href=#1854 id=1854 data-nosnippet>1854</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(
-<a href=#1855 id=1855 data-nosnippet>1855</a> time::time_to_microseconds(<span class="kw-2">&</span>NaiveTime::parse_from_str(<span class="kw-2">&</span>s, <span class="string">"%H:%M:%S%.f"</span>)<span class="question-mark">?</span>),
-<a href=#1856 id=1856 data-nosnippet>1856</a> ))))
-<a href=#1857 id=1857 data-nosnippet>1857</a> }
-<a href=#1858 id=1858 data-nosnippet>1858</a> (PrimitiveType::Timestamp, JsonValue::String(s)) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(
-<a href=#1859 id=1859 data-nosnippet>1859</a> PrimitiveLiteral::Long(timestamp::datetime_to_microseconds(
-<a href=#1860 id=1860 data-nosnippet>1860</a> <span class="kw-2">&</span>NaiveDateTime::parse_from_str(<span class="kw-2">&</span>s, <span class="string">"%Y-%m-%dT%H:%M:%S%.f"</span>)<span class="question-mark">?</span>,
-<a href=#1861 id=1861 data-nosnippet>1861</a> )),
-<a href=#1862 id=1862 data-nosnippet>1862</a> ))),
-<a href=#1863 id=1863 data-nosnippet>1863</a> (PrimitiveType::Timestamptz, JsonValue::String(s)) => {
-<a href=#1864 id=1864 data-nosnippet>1864</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(
-<a href=#1865 id=1865 data-nosnippet>1865</a> timestamptz::datetimetz_to_microseconds(<span class="kw-2">&</span>Utc.from_utc_datetime(
-<a href=#1866 id=1866 data-nosnippet>1866</a> <span class="kw-2">&</span>NaiveDateTime::parse_from_str(<span class="kw-2">&</span>s, <span class="string">"%Y-%m-%dT%H:%M:%S%.f+00:00"</span>)<span class="question-mark">?</span>,
-<a href=#1867 id=1867 data-nosnippet>1867</a> )),
-<a href=#1868 id=1868 data-nosnippet>1868</a> ))))
-<a href=#1869 id=1869 data-nosnippet>1869</a> }
-<a href=#1870 id=1870 data-nosnippet>1870</a> (PrimitiveType::String, JsonValue::String(s)) => {
-<a href=#1871 id=1871 data-nosnippet>1871</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::String(s))))
-<a href=#1872 id=1872 data-nosnippet>1872</a> }
-<a href=#1873 id=1873 data-nosnippet>1873</a> (PrimitiveType::Uuid, JsonValue::String(s)) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(
-<a href=#1874 id=1874 data-nosnippet>1874</a> PrimitiveLiteral::UInt128(Uuid::parse_str(<span class="kw-2">&</span>s)<span class="question-mark">?</span>.as_u128()),
-<a href=#1875 id=1875 data-nosnippet>1875</a> ))),
-<a href=#1876 id=1876 data-nosnippet>1876</a> (PrimitiveType::Fixed(<span class="kw">_</span>), JsonValue::String(<span class="kw">_</span>)) => <span class="macro">todo!</span>(),
-<a href=#1877 id=1877 data-nosnippet>1877</a> (PrimitiveType::Binary, JsonValue::String(<span class="kw">_</span>)) => <span class="macro">todo!</span>(),
-<a href=#1878 id=1878 data-nosnippet>1878</a> (
-<a href=#1879 id=1879 data-nosnippet>1879</a> PrimitiveType::Decimal {
-<a href=#1880 id=1880 data-nosnippet>1880</a> precision: <span class="kw">_</span>,
-<a href=#1881 id=1881 data-nosnippet>1881</a> scale,
-<a href=#1882 id=1882 data-nosnippet>1882</a> },
-<a href=#1883 id=1883 data-nosnippet>1883</a> JsonValue::String(s),
-<a href=#1884 id=1884 data-nosnippet>1884</a> ) => {
-<a href=#1885 id=1885 data-nosnippet>1885</a> <span class="kw">let </span><span class="kw-2">mut </span>decimal = Decimal::from_str_exact(<span class="kw-2">&</span>s)<span class="question-mark">?</span>;
-<a href=#1886 id=1886 data-nosnippet>1886</a> decimal.rescale(<span class="kw-2">*</span>scale);
-<a href=#1887 id=1887 data-nosnippet>1887</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int128(
-<a href=#1888 id=1888 data-nosnippet>1888</a> decimal.mantissa(),
-<a href=#1889 id=1889 data-nosnippet>1889</a> ))))
-<a href=#1890 id=1890 data-nosnippet>1890</a> }
-<a href=#1891 id=1891 data-nosnippet>1891</a> (<span class="kw">_</span>, JsonValue::Null) => <span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>),
-<a href=#1892 id=1892 data-nosnippet>1892</a> (i, j) => <span class="prelude-val">Err</span>(Error::new(
-<a href=#1893 id=1893 data-nosnippet>1893</a> <span class="kw">crate</span>::ErrorKind::DataInvalid,
-<a href=#1894 id=1894 data-nosnippet>1894</a> <span class="macro">format!</span>(
-<a href=#1895 id=1895 data-nosnippet>1895</a> <span class="string">"The json value {} doesn't fit to the iceberg type {}."</span>,
-<a href=#1896 id=1896 data-nosnippet>1896</a> j, i
-<a href=#1897 id=1897 data-nosnippet>1897</a> ),
-<a href=#1898 id=1898 data-nosnippet>1898</a> )),
-<a href=#1899 id=1899 data-nosnippet>1899</a> },
-<a href=#1900 id=1900 data-nosnippet>1900</a> Type::Struct(schema) => {
-<a href=#1901 id=1901 data-nosnippet>1901</a> <span class="kw">if let </span>JsonValue::Object(<span class="kw-2">mut </span>object) = value {
-<a href=#1902 id=1902 data-nosnippet>1902</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Struct(Struct::from_iter(
-<a href=#1903 id=1903 data-nosnippet>1903</a> schema.fields().iter().map(|field| {
-<a href=#1904 id=1904 data-nosnippet>1904</a> object.remove(<span class="kw-2">&</span>field.id.to_string()).and_then(|value| {
-<a href=#1905 id=1905 data-nosnippet>1905</a> Literal::try_from_json(value, <span class="kw-2">&</span>field.field_type)
-<a href=#1906 id=1906 data-nosnippet>1906</a> .and_then(|value| {
-<a href=#1907 id=1907 data-nosnippet>1907</a> value.ok_or(Error::new(
-<a href=#1908 id=1908 data-nosnippet>1908</a> ErrorKind::DataInvalid,
-<a href=#1909 id=1909 data-nosnippet>1909</a> <span class="string">"Key of map cannot be null"</span>,
-<a href=#1910 id=1910 data-nosnippet>1910</a> ))
-<a href=#1911 id=1911 data-nosnippet>1911</a> })
-<a href=#1912 id=1912 data-nosnippet>1912</a> .ok()
-<a href=#1913 id=1913 data-nosnippet>1913</a> })
-<a href=#1914 id=1914 data-nosnippet>1914</a> }),
-<a href=#1915 id=1915 data-nosnippet>1915</a> ))))
-<a href=#1916 id=1916 data-nosnippet>1916</a> } <span class="kw">else </span>{
-<a href=#1917 id=1917 data-nosnippet>1917</a> <span class="prelude-val">Err</span>(Error::new(
-<a href=#1918 id=1918 data-nosnippet>1918</a> <span class="kw">crate</span>::ErrorKind::DataInvalid,
-<a href=#1919 id=1919 data-nosnippet>1919</a> <span class="string">"The json value for a struct type must be an object."</span>,
-<a href=#1920 id=1920 data-nosnippet>1920</a> ))
+<a href=#1807 id=1807 data-nosnippet>1807</a>
+<a href=#1808 id=1808 data-nosnippet>1808</a> <span class="doccomment">/// Return fields in the struct.
+<a href=#1809 id=1809 data-nosnippet>1809</a> </span><span class="kw">pub fn </span>fields(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="kw-2">&</span>[<span class="prelude-ty">Option</span><Literal>] {
+<a href=#1810 id=1810 data-nosnippet>1810</a> <span class="kw-2">&</span><span class="self">self</span>.fields
+<a href=#1811 id=1811 data-nosnippet>1811</a> }
+<a href=#1812 id=1812 data-nosnippet>1812</a>}
+<a href=#1813 id=1813 data-nosnippet>1813</a>
+<a href=#1814 id=1814 data-nosnippet>1814</a><span class="kw">impl </span>Index<usize> <span class="kw">for </span>Struct {
+<a href=#1815 id=1815 data-nosnippet>1815</a> <span class="kw">type </span>Output = <span class="prelude-ty">Option</span><Literal>;
+<a href=#1816 id=1816 data-nosnippet>1816</a>
+<a href=#1817 id=1817 data-nosnippet>1817</a> <span class="kw">fn </span>index(<span class="kw-2">&</span><span class="self">self</span>, idx: usize) -> <span class="kw-2">&</span><span class="self">Self</span>::Output {
+<a href=#1818 id=1818 data-nosnippet>1818</a> <span class="kw-2">&</span><span class="self">self</span>.fields[idx]
+<a href=#1819 id=1819 data-nosnippet>1819</a> }
+<a href=#1820 id=1820 data-nosnippet>1820</a>}
+<a href=#1821 id=1821 data-nosnippet>1821</a>
+<a href=#1822 id=1822 data-nosnippet>1822</a><span class="kw">impl </span>IntoIterator <span class="kw">for </span>Struct {
+<a href=#1823 id=1823 data-nosnippet>1823</a> <span class="kw">type </span>Item = <span class="prelude-ty">Option</span><Literal>;
+<a href=#1824 id=1824 data-nosnippet>1824</a>
+<a href=#1825 id=1825 data-nosnippet>1825</a> <span class="kw">type </span>IntoIter = std::vec::IntoIter<<span class="prelude-ty">Option</span><Literal>>;
+<a href=#1826 id=1826 data-nosnippet>1826</a>
+<a href=#1827 id=1827 data-nosnippet>1827</a> <span class="kw">fn </span>into_iter(<span class="self">self</span>) -> <span class="self">Self</span>::IntoIter {
+<a href=#1828 id=1828 data-nosnippet>1828</a> <span class="self">self</span>.fields.into_iter()
+<a href=#1829 id=1829 data-nosnippet>1829</a> }
+<a href=#1830 id=1830 data-nosnippet>1830</a>}
+<a href=#1831 id=1831 data-nosnippet>1831</a>
+<a href=#1832 id=1832 data-nosnippet>1832</a><span class="kw">impl </span>FromIterator<<span class="prelude-ty">Option</span><Literal>> <span class="kw">for </span>Struct {
+<a href=#1833 id=1833 data-nosnippet>1833</a> <span class="kw">fn </span>from_iter<I: IntoIterator<Item = <span class="prelude-ty">Option</span><Literal>>>(iter: I) -> <span class="self">Self </span>{
+<a href=#1834 id=1834 data-nosnippet>1834</a> Struct {
+<a href=#1835 id=1835 data-nosnippet>1835</a> fields: iter.into_iter().collect(),
+<a href=#1836 id=1836 data-nosnippet>1836</a> }
+<a href=#1837 id=1837 data-nosnippet>1837</a> }
+<a href=#1838 id=1838 data-nosnippet>1838</a>}
+<a href=#1839 id=1839 data-nosnippet>1839</a>
+<a href=#1840 id=1840 data-nosnippet>1840</a><span class="kw">impl </span>Literal {
+<a href=#1841 id=1841 data-nosnippet>1841</a> <span class="doccomment">/// Create iceberg value from a json value
+<a href=#1842 id=1842 data-nosnippet>1842</a> ///
+<a href=#1843 id=1843 data-nosnippet>1843</a> /// See [this spec](https://iceberg.apache.org/spec/#json-single-value-serialization) for reference.
+<a href=#1844 id=1844 data-nosnippet>1844</a> </span><span class="kw">pub fn </span>try_from_json(value: JsonValue, data_type: <span class="kw-2">&</span>Type) -> <span class="prelude-ty">Result</span><<span class="prelude-ty">Option</span><<span class="self">Self</span>>> {
+<a href=#1845 id=1845 data-nosnippet>1845</a> <span class="kw">match </span>data_type {
+<a href=#1846 id=1846 data-nosnippet>1846</a> Type::Primitive(primitive) => <span class="kw">match </span>(primitive, value) {
+<a href=#1847 id=1847 data-nosnippet>1847</a> (PrimitiveType::Boolean, JsonValue::Bool(bool)) => {
+<a href=#1848 id=1848 data-nosnippet>1848</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Boolean(bool))))
+<a href=#1849 id=1849 data-nosnippet>1849</a> }
+<a href=#1850 id=1850 data-nosnippet>1850</a> (PrimitiveType::Int, JsonValue::Number(number)) => {
+<a href=#1851 id=1851 data-nosnippet>1851</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(
+<a href=#1852 id=1852 data-nosnippet>1852</a> number
+<a href=#1853 id=1853 data-nosnippet>1853</a> .as_i64()
+<a href=#1854 id=1854 data-nosnippet>1854</a> .ok_or(Error::new(
+<a href=#1855 id=1855 data-nosnippet>1855</a> <span class="kw">crate</span>::ErrorKind::DataInvalid,
+<a href=#1856 id=1856 data-nosnippet>1856</a> <span class="string">"Failed to convert json number to int"</span>,
+<a href=#1857 id=1857 data-nosnippet>1857</a> ))<span class="question-mark">?
+<a href=#1858 id=1858 data-nosnippet>1858</a> </span>.try_into()<span class="question-mark">?</span>,
+<a href=#1859 id=1859 data-nosnippet>1859</a> ))))
+<a href=#1860 id=1860 data-nosnippet>1860</a> }
+<a href=#1861 id=1861 data-nosnippet>1861</a> (PrimitiveType::Long, JsonValue::Number(number)) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(
+<a href=#1862 id=1862 data-nosnippet>1862</a> PrimitiveLiteral::Long(number.as_i64().ok_or(Error::new(
+<a href=#1863 id=1863 data-nosnippet>1863</a> <span class="kw">crate</span>::ErrorKind::DataInvalid,
+<a href=#1864 id=1864 data-nosnippet>1864</a> <span class="string">"Failed to convert json number to long"</span>,
+<a href=#1865 id=1865 data-nosnippet>1865</a> ))<span class="question-mark">?</span>),
+<a href=#1866 id=1866 data-nosnippet>1866</a> ))),
+<a href=#1867 id=1867 data-nosnippet>1867</a> (PrimitiveType::Float, JsonValue::Number(number)) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(
+<a href=#1868 id=1868 data-nosnippet>1868</a> PrimitiveLiteral::Float(OrderedFloat(number.as_f64().ok_or(Error::new(
+<a href=#1869 id=1869 data-nosnippet>1869</a> <span class="kw">crate</span>::ErrorKind::DataInvalid,
+<a href=#1870 id=1870 data-nosnippet>1870</a> <span class="string">"Failed to convert json number to float"</span>,
+<a href=#1871 id=1871 data-nosnippet>1871</a> ))<span class="question-mark">? </span><span class="kw">as </span>f32)),
+<a href=#1872 id=1872 data-nosnippet>1872</a> ))),
+<a href=#1873 id=1873 data-nosnippet>1873</a> (PrimitiveType::Double, JsonValue::Number(number)) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(
+<a href=#1874 id=1874 data-nosnippet>1874</a> PrimitiveLiteral::Double(OrderedFloat(number.as_f64().ok_or(Error::new(
+<a href=#1875 id=1875 data-nosnippet>1875</a> <span class="kw">crate</span>::ErrorKind::DataInvalid,
+<a href=#1876 id=1876 data-nosnippet>1876</a> <span class="string">"Failed to convert json number to double"</span>,
+<a href=#1877 id=1877 data-nosnippet>1877</a> ))<span class="question-mark">?</span>)),
+<a href=#1878 id=1878 data-nosnippet>1878</a> ))),
+<a href=#1879 id=1879 data-nosnippet>1879</a> (PrimitiveType::Date, JsonValue::String(s)) => {
+<a href=#1880 id=1880 data-nosnippet>1880</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(
+<a href=#1881 id=1881 data-nosnippet>1881</a> date::date_to_days(<span class="kw-2">&</span>NaiveDate::parse_from_str(<span class="kw-2">&</span>s, <span class="string">"%Y-%m-%d"</span>)<span class="question-mark">?</span>),
+<a href=#1882 id=1882 data-nosnippet>1882</a> ))))
+<a href=#1883 id=1883 data-nosnippet>1883</a> }
+<a href=#1884 id=1884 data-nosnippet>1884</a> (PrimitiveType::Time, JsonValue::String(s)) => {
+<a href=#1885 id=1885 data-nosnippet>1885</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(
+<a href=#1886 id=1886 data-nosnippet>1886</a> time::time_to_microseconds(<span class="kw-2">&</span>NaiveTime::parse_from_str(<span class="kw-2">&</span>s, <span class="string">"%H:%M:%S%.f"</span>)<span class="question-mark">?</span>),
+<a href=#1887 id=1887 data-nosnippet>1887</a> ))))
+<a href=#1888 id=1888 data-nosnippet>1888</a> }
+<a href=#1889 id=1889 data-nosnippet>1889</a> (PrimitiveType::Timestamp, JsonValue::String(s)) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(
+<a href=#1890 id=1890 data-nosnippet>1890</a> PrimitiveLiteral::Long(timestamp::datetime_to_microseconds(
+<a href=#1891 id=1891 data-nosnippet>1891</a> <span class="kw-2">&</span>NaiveDateTime::parse_from_str(<span class="kw-2">&</span>s, <span class="string">"%Y-%m-%dT%H:%M:%S%.f"</span>)<span class="question-mark">?</span>,
+<a href=#1892 id=1892 data-nosnippet>1892</a> )),
+<a href=#1893 id=1893 data-nosnippet>1893</a> ))),
+<a href=#1894 id=1894 data-nosnippet>1894</a> (PrimitiveType::Timestamptz, JsonValue::String(s)) => {
+<a href=#1895 id=1895 data-nosnippet>1895</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(
+<a href=#1896 id=1896 data-nosnippet>1896</a> timestamptz::datetimetz_to_microseconds(<span class="kw-2">&</span>Utc.from_utc_datetime(
+<a href=#1897 id=1897 data-nosnippet>1897</a> <span class="kw-2">&</span>NaiveDateTime::parse_from_str(<span class="kw-2">&</span>s, <span class="string">"%Y-%m-%dT%H:%M:%S%.f+00:00"</span>)<span class="question-mark">?</span>,
+<a href=#1898 id=1898 data-nosnippet>1898</a> )),
+<a href=#1899 id=1899 data-nosnippet>1899</a> ))))
+<a href=#1900 id=1900 data-nosnippet>1900</a> }
+<a href=#1901 id=1901 data-nosnippet>1901</a> (PrimitiveType::String, JsonValue::String(s)) => {
+<a href=#1902 id=1902 data-nosnippet>1902</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::String(s))))
+<a href=#1903 id=1903 data-nosnippet>1903</a> }
+<a href=#1904 id=1904 data-nosnippet>1904</a> (PrimitiveType::Uuid, JsonValue::String(s)) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(
+<a href=#1905 id=1905 data-nosnippet>1905</a> PrimitiveLiteral::UInt128(Uuid::parse_str(<span class="kw-2">&</span>s)<span class="question-mark">?</span>.as_u128()),
+<a href=#1906 id=1906 data-nosnippet>1906</a> ))),
+<a href=#1907 id=1907 data-nosnippet>1907</a> (PrimitiveType::Fixed(<span class="kw">_</span>), JsonValue::String(<span class="kw">_</span>)) => <span class="macro">todo!</span>(),
+<a href=#1908 id=1908 data-nosnippet>1908</a> (PrimitiveType::Binary, JsonValue::String(<span class="kw">_</span>)) => <span class="macro">todo!</span>(),
+<a href=#1909 id=1909 data-nosnippet>1909</a> (
+<a href=#1910 id=1910 data-nosnippet>1910</a> PrimitiveType::Decimal {
+<a href=#1911 id=1911 data-nosnippet>1911</a> precision: <span class="kw">_</span>,
+<a href=#1912 id=1912 data-nosnippet>1912</a> scale,
+<a href=#1913 id=1913 data-nosnippet>1913</a> },
+<a href=#1914 id=1914 data-nosnippet>1914</a> JsonValue::String(s),
+<a href=#1915 id=1915 data-nosnippet>1915</a> ) => {
+<a href=#1916 id=1916 data-nosnippet>1916</a> <span class="kw">let </span><span class="kw-2">mut </span>decimal = Decimal::from_str_exact(<span class="kw-2">&</span>s)<span class="question-mark">?</span>;
+<a href=#1917 id=1917 data-nosnippet>1917</a> decimal.rescale(<span class="kw-2">*</span>scale);
+<a href=#1918 id=1918 data-nosnippet>1918</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int128(
+<a href=#1919 id=1919 data-nosnippet>1919</a> decimal.mantissa(),
+<a href=#1920 id=1920 data-nosnippet>1920</a> ))))
<a href=#1921 id=1921 data-nosnippet>1921</a> }
-<a href=#1922 id=1922 data-nosnippet>1922</a> }
-<a href=#1923 id=1923 data-nosnippet>1923</a> Type::List(list) => {
-<a href=#1924 id=1924 data-nosnippet>1924</a> <span class="kw">if let </span>JsonValue::Array(array) = value {
-<a href=#1925 id=1925 data-nosnippet>1925</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::List(
-<a href=#1926 id=1926 data-nosnippet>1926</a> array
-<a href=#1927 id=1927 data-nosnippet>1927</a> .into_iter()
-<a href=#1928 id=1928 data-nosnippet>1928</a> .map(|value| {
-<a href=#1929 id=1929 data-nosnippet>1929</a> Literal::try_from_json(value, <span class="kw-2">&</span>list.element_field.field_type)
-<a href=#1930 id=1930 data-nosnippet>1930</a> })
-<a href=#1931 id=1931 data-nosnippet>1931</a> .collect::<<span class="prelude-ty">Result</span><Vec<<span class="kw">_</span>>>>()<span class="question-mark">?</span>,
-<a href=#1932 id=1932 data-nosnippet>1932</a> )))
-<a href=#1933 id=1933 data-nosnippet>1933</a> } <span class="kw">else </span>{
-<a href=#1934 id=1934 data-nosnippet>1934</a> <span class="prelude-val">Err</span>(Error::new(
-<a href=#1935 id=1935 data-nosnippet>1935</a> <span class="kw">crate</span>::ErrorKind::DataInvalid,
-<a href=#1936 id=1936 data-nosnippet>1936</a> <span class="string">"The json value for a list type must be an array."</span>,
-<a href=#1937 id=1937 data-nosnippet>1937</a> ))
-<a href=#1938 id=1938 data-nosnippet>1938</a> }
-<a href=#1939 id=1939 data-nosnippet>1939</a> }
-<a href=#1940 id=1940 data-nosnippet>1940</a> Type::Map(map) => {
-<a href=#1941 id=1941 data-nosnippet>1941</a> <span class="kw">if let </span>JsonValue::Object(<span class="kw-2">mut </span>object) = value {
-<a href=#1942 id=1942 data-nosnippet>1942</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=#1943 id=1943 data-nosnippet>1943</a> (object.remove(<span class="string">"keys"</span>), object.remove(<span class="string">"values"</span>))
-<a href=#1944 id=1944 data-nosnippet>1944</a> {
-<a href=#1945 id=1945 data-nosnippet>1945</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Map(Map::from_iter(
-<a href=#1946 id=1946 data-nosnippet>1946</a> keys.into_iter()
-<a href=#1947 id=1947 data-nosnippet>1947</a> .zip(values.into_iter())
-<a href=#1948 id=1948 data-nosnippet>1948</a> .map(|(key, value)| {
-<a href=#1949 id=1949 data-nosnippet>1949</a> <span class="prelude-val">Ok</span>((
-<a href=#1950 id=1950 data-nosnippet>1950</a> Literal::try_from_json(key, <span class="kw-2">&</span>map.key_field.field_type)
-<a href=#1951 id=1951 data-nosnippet>1951</a> .and_then(|value| {
-<a href=#1952 id=1952 data-nosnippet>1952</a> value.ok_or(Error::new(
-<a href=#1953 id=1953 data-nosnippet>1953</a> ErrorKind::DataInvalid,
-<a href=#1954 id=1954 data-nosnippet>1954</a> <span class="string">"Key of map cannot be null"</span>,
-<a href=#1955 id=1955 data-nosnippet>1955</a> ))
-<a href=#1956 id=1956 data-nosnippet>1956</a> })<span class="question-mark">?</span>,
-<a href=#1957 id=1957 data-nosnippet>1957</a> Literal::try_from_json(value, <span class="kw-2">&</span>map.value_field.field_type)<span class="question-mark">?</span>,
-<a href=#1958 id=1958 data-nosnippet>1958</a> ))
-<a href=#1959 id=1959 data-nosnippet>1959</a> })
-<a href=#1960 id=1960 data-nosnippet>1960</a> .collect::<<span class="prelude-ty">Result</span><Vec<<span class="kw">_</span>>>>()<span class="question-mark">?</span>,
-<a href=#1961 id=1961 data-nosnippet>1961</a> ))))
-<a href=#1962 id=1962 data-nosnippet>1962</a> } <span class="kw">else </span>{
-<a href=#1963 id=1963 data-nosnippet>1963</a> <span class="prelude-val">Err</span>(Error::new(
-<a href=#1964 id=1964 data-nosnippet>1964</a> <span class="kw">crate</span>::ErrorKind::DataInvalid,
-<a href=#1965 id=1965 data-nosnippet>1965</a> <span class="string">"The json value for a list type must be an array."</span>,
-<a href=#1966 id=1966 data-nosnippet>1966</a> ))
-<a href=#1967 id=1967 data-nosnippet>1967</a> }
-<a href=#1968 id=1968 data-nosnippet>1968</a> } <span class="kw">else </span>{
-<a href=#1969 id=1969 data-nosnippet>1969</a> <span class="prelude-val">Err</span>(Error::new(
-<a href=#1970 id=1970 data-nosnippet>1970</a> <span class="kw">crate</span>::ErrorKind::DataInvalid,
-<a href=#1971 id=1971 data-nosnippet>1971</a> <span class="string">"The json value for a list type must be an array."</span>,
-<a href=#1972 id=1972 data-nosnippet>1972</a> ))
-<a href=#1973 id=1973 data-nosnippet>1973</a> }
-<a href=#1974 id=1974 data-nosnippet>1974</a> }
-<a href=#1975 id=1975 data-nosnippet>1975</a> }
-<a href=#1976 id=1976 data-nosnippet>1976</a> }
-<a href=#1977 id=1977 data-nosnippet>1977</a>
-<a href=#1978 id=1978 data-nosnippet>1978</a> <span class="doccomment">/// Converting iceberg value to json value.
-<a href=#1979 id=1979 data-nosnippet>1979</a> ///
-<a href=#1980 id=1980 data-nosnippet>1980</a> /// See [this spec](https://iceberg.apache.org/spec/#json-single-value-serialization) for reference.
-<a href=#1981 id=1981 data-nosnippet>1981</a> </span><span class="kw">pub fn </span>try_into_json(<span class="self">self</span>, r#type: <span class="kw-2">&</span>Type) -> <span class="prelude-ty">Result</span><JsonValue> {
-<a href=#1982 id=1982 data-nosnippet>1982</a> <span class="kw">match </span>(<span class="self">self</span>, r#type) {
-<a href=#1983 id=1983 data-nosnippet>1983</a> (Literal::Primitive(prim), Type::Primitive(prim_type)) => <span class="kw">match </span>(prim_type, prim) {
-<a href=#1984 id=1984 data-nosnippet>1984</a> (PrimitiveType::Boolean, PrimitiveLiteral::Boolean(val)) => {
-<a href=#1985 id=1985 data-nosnippet>1985</a> <span class="prelude-val">Ok</span>(JsonValue::Bool(val))
-<a href=#1986 id=1986 data-nosnippet>1986</a> }
-<a href=#1987 id=1987 data-nosnippet>1987</a> (PrimitiveType::Int, PrimitiveLiteral::Int(val)) => {
-<a href=#1988 id=1988 data-nosnippet>1988</a> <span class="prelude-val">Ok</span>(JsonValue::Number((val).into()))
-<a href=#1989 id=1989 data-nosnippet>1989</a> }
-<a href=#1990 id=1990 data-nosnippet>1990</a> (PrimitiveType::Long, PrimitiveLiteral::Long(val)) => {
-<a href=#1991 id=1991 data-nosnippet>1991</a> <span class="prelude-val">Ok</span>(JsonValue::Number((val).into()))
-<a href=#1992 id=1992 data-nosnippet>1992</a> }
-<a href=#1993 id=1993 data-nosnippet>1993</a> (PrimitiveType::Float, PrimitiveLiteral::Float(val)) => {
-<a href=#1994 id=1994 data-nosnippet>1994</a> <span class="kw">match </span>Number::from_f64(val.<span class="number">0 </span><span class="kw">as </span>f64) {
-<a href=#1995 id=1995 data-nosnippet>1995</a> <span class="prelude-val">Some</span>(number) => <span class="prelude-val">Ok</span>(JsonValue::Number(number)),
-<a href=#1996 id=1996 data-nosnippet>1996</a> <span class="prelude-val">None </span>=> <span class="prelude-val">Ok</span>(JsonValue::Null),
-<a href=#1997 id=1997 data-nosnippet>1997</a> }
-<a href=#1998 id=1998 data-nosnippet>1998</a> }
-<a href=#1999 id=1999 data-nosnippet>1999</a> (PrimitiveType::Double, PrimitiveLiteral::Double(val)) => {
-<a href=#2000 id=2000 data-nosnippet>2000</a> <span class="kw">match </span>Number::from_f64(val.<span class="number">0</span>) {
-<a href=#2001 id=2001 data-nosnippet>2001</a> <span class="prelude-val">Some</span>(number) => <span class="prelude-val">Ok</span>(JsonValue::Number(number)),
-<a href=#2002 id=2002 data-nosnippet>2002</a> <span class="prelude-val">None </span>=> <span class="prelude-val">Ok</span>(JsonValue::Null),
-<a href=#2003 id=2003 data-nosnippet>2003</a> }
+<a href=#1922 id=1922 data-nosnippet>1922</a> (<span class="kw">_</span>, JsonValue::Null) => <span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>),
+<a href=#1923 id=1923 data-nosnippet>1923</a> (i, j) => <span class="prelude-val">Err</span>(Error::new(
+<a href=#1924 id=1924 data-nosnippet>1924</a> <span class="kw">crate</span>::ErrorKind::DataInvalid,
+<a href=#1925 id=1925 data-nosnippet>1925</a> <span class="macro">format!</span>(
+<a href=#1926 id=1926 data-nosnippet>1926</a> <span class="string">"The json value {} doesn't fit to the iceberg type {}."</span>,
+<a href=#1927 id=1927 data-nosnippet>1927</a> j, i
+<a href=#1928 id=1928 data-nosnippet>1928</a> ),
+<a href=#1929 id=1929 data-nosnippet>1929</a> )),
+<a href=#1930 id=1930 data-nosnippet>1930</a> },
+<a href=#1931 id=1931 data-nosnippet>1931</a> Type::Struct(schema) => {
+<a href=#1932 id=1932 data-nosnippet>1932</a> <span class="kw">if let </span>JsonValue::Object(<span class="kw-2">mut </span>object) = value {
+<a href=#1933 id=1933 data-nosnippet>1933</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Struct(Struct::from_iter(
+<a href=#1934 id=1934 data-nosnippet>1934</a> schema.fields().iter().map(|field| {
+<a href=#1935 id=1935 data-nosnippet>1935</a> object.remove(<span class="kw-2">&</span>field.id.to_string()).and_then(|value| {
+<a href=#1936 id=1936 data-nosnippet>1936</a> Literal::try_from_json(value, <span class="kw-2">&</span>field.field_type)
+<a href=#1937 id=1937 data-nosnippet>1937</a> .and_then(|value| {
+<a href=#1938 id=1938 data-nosnippet>1938</a> value.ok_or(Error::new(
+<a href=#1939 id=1939 data-nosnippet>1939</a> ErrorKind::DataInvalid,
+<a href=#1940 id=1940 data-nosnippet>1940</a> <span class="string">"Key of map cannot be null"</span>,
+<a href=#1941 id=1941 data-nosnippet>1941</a> ))
+<a href=#1942 id=1942 data-nosnippet>1942</a> })
+<a href=#1943 id=1943 data-nosnippet>1943</a> .ok()
+<a href=#1944 id=1944 data-nosnippet>1944</a> })
+<a href=#1945 id=1945 data-nosnippet>1945</a> }),
+<a href=#1946 id=1946 data-nosnippet>1946</a> ))))
+<a href=#1947 id=1947 data-nosnippet>1947</a> } <span class="kw">else </span>{
+<a href=#1948 id=1948 data-nosnippet>1948</a> <span class="prelude-val">Err</span>(Error::new(
+<a href=#1949 id=1949 data-nosnippet>1949</a> <span class="kw">crate</span>::ErrorKind::DataInvalid,
+<a href=#1950 id=1950 data-nosnippet>1950</a> <span class="string">"The json value for a struct type must be an object."</span>,
+<a href=#1951 id=1951 data-nosnippet>1951</a> ))
+<a href=#1952 id=1952 data-nosnippet>1952</a> }
+<a href=#1953 id=1953 data-nosnippet>1953</a> }
+<a href=#1954 id=1954 data-nosnippet>1954</a> Type::List(list) => {
+<a href=#1955 id=1955 data-nosnippet>1955</a> <span class="kw">if let </span>JsonValue::Array(array) = value {
+<a href=#1956 id=1956 data-nosnippet>1956</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::List(
+<a href=#1957 id=1957 data-nosnippet>1957</a> array
+<a href=#1958 id=1958 data-nosnippet>1958</a> .into_iter()
+<a href=#1959 id=1959 data-nosnippet>1959</a> .map(|value| {
+<a href=#1960 id=1960 data-nosnippet>1960</a> Literal::try_from_json(value, <span class="kw-2">&</span>list.element_field.field_type)
+<a href=#1961 id=1961 data-nosnippet>1961</a> })
+<a href=#1962 id=1962 data-nosnippet>1962</a> .collect::<<span class="prelude-ty">Result</span><Vec<<span class="kw">_</span>>>>()<span class="question-mark">?</span>,
+<a href=#1963 id=1963 data-nosnippet>1963</a> )))
+<a href=#1964 id=1964 data-nosnippet>1964</a> } <span class="kw">else </span>{
+<a href=#1965 id=1965 data-nosnippet>1965</a> <span class="prelude-val">Err</span>(Error::new(
+<a href=#1966 id=1966 data-nosnippet>1966</a> <span class="kw">crate</span>::ErrorKind::DataInvalid,
+<a href=#1967 id=1967 data-nosnippet>1967</a> <span class="string">"The json value for a list type must be an array."</span>,
+<a href=#1968 id=1968 data-nosnippet>1968</a> ))
+<a href=#1969 id=1969 data-nosnippet>1969</a> }
+<a href=#1970 id=1970 data-nosnippet>1970</a> }
+<a href=#1971 id=1971 data-nosnippet>1971</a> Type::Map(map) => {
+<a href=#1972 id=1972 data-nosnippet>1972</a> <span class="kw">if let </span>JsonValue::Object(<span class="kw-2">mut </span>object) = value {
+<a href=#1973 id=1973 data-nosnippet>1973</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=#1974 id=1974 data-nosnippet>1974</a> (object.remove(<span class="string">"keys"</span>), object.remove(<span class="string">"values"</span>))
+<a href=#1975 id=1975 data-nosnippet>1975</a> {
+<a href=#1976 id=1976 data-nosnippet>1976</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Map(Map::from_iter(
+<a href=#1977 id=1977 data-nosnippet>1977</a> keys.into_iter()
+<a href=#1978 id=1978 data-nosnippet>1978</a> .zip(values.into_iter())
+<a href=#1979 id=1979 data-nosnippet>1979</a> .map(|(key, value)| {
+<a href=#1980 id=1980 data-nosnippet>1980</a> <span class="prelude-val">Ok</span>((
+<a href=#1981 id=1981 data-nosnippet>1981</a> Literal::try_from_json(key, <span class="kw-2">&</span>map.key_field.field_type)
+<a href=#1982 id=1982 data-nosnippet>1982</a> .and_then(|value| {
+<a href=#1983 id=1983 data-nosnippet>1983</a> value.ok_or(Error::new(
+<a href=#1984 id=1984 data-nosnippet>1984</a> ErrorKind::DataInvalid,
+<a href=#1985 id=1985 data-nosnippet>1985</a> <span class="string">"Key of map cannot be null"</span>,
+<a href=#1986 id=1986 data-nosnippet>1986</a> ))
+<a href=#1987 id=1987 data-nosnippet>1987</a> })<span class="question-mark">?</span>,
+<a href=#1988 id=1988 data-nosnippet>1988</a> Literal::try_from_json(value, <span class="kw-2">&</span>map.value_field.field_type)<span class="question-mark">?</span>,
+<a href=#1989 id=1989 data-nosnippet>1989</a> ))
+<a href=#1990 id=1990 data-nosnippet>1990</a> })
+<a href=#1991 id=1991 data-nosnippet>1991</a> .collect::<<span class="prelude-ty">Result</span><Vec<<span class="kw">_</span>>>>()<span class="question-mark">?</span>,
+<a href=#1992 id=1992 data-nosnippet>1992</a> ))))
+<a href=#1993 id=1993 data-nosnippet>1993</a> } <span class="kw">else </span>{
+<a href=#1994 id=1994 data-nosnippet>1994</a> <span class="prelude-val">Err</span>(Error::new(
+<a href=#1995 id=1995 data-nosnippet>1995</a> <span class="kw">crate</span>::ErrorKind::DataInvalid,
+<a href=#1996 id=1996 data-nosnippet>1996</a> <span class="string">"The json value for a list type must be an array."</span>,
+<a href=#1997 id=1997 data-nosnippet>1997</a> ))
+<a href=#1998 id=1998 data-nosnippet>1998</a> }
+<a href=#1999 id=1999 data-nosnippet>1999</a> } <span class="kw">else </span>{
+<a href=#2000 id=2000 data-nosnippet>2000</a> <span class="prelude-val">Err</span>(Error::new(
+<a href=#2001 id=2001 data-nosnippet>2001</a> <span class="kw">crate</span>::ErrorKind::DataInvalid,
+<a href=#2002 id=2002 data-nosnippet>2002</a> <span class="string">"The json value for a list type must be an array."</span>,
+<a href=#2003 id=2003 data-nosnippet>2003</a> ))
<a href=#2004 id=2004 data-nosnippet>2004</a> }
-<a href=#2005 id=2005 data-nosnippet>2005</a> (PrimitiveType::Date, PrimitiveLiteral::Int(val)) => {
-<a href=#2006 id=2006 data-nosnippet>2006</a> <span class="prelude-val">Ok</span>(JsonValue::String(date::days_to_date(val).to_string()))
-<a href=#2007 id=2007 data-nosnippet>2007</a> }
-<a href=#2008 id=2008 data-nosnippet>2008</a> (PrimitiveType::Time, PrimitiveLiteral::Long(val)) => <span class="prelude-val">Ok</span>(JsonValue::String(
-<a href=#2009 id=2009 data-nosnippet>2009</a> time::microseconds_to_time(val).to_string(),
-<a href=#2010 id=2010 data-nosnippet>2010</a> )),
-<a href=#2011 id=2011 data-nosnippet>2011</a> (PrimitiveType::Timestamp, PrimitiveLiteral::Long(val)) => <span class="prelude-val">Ok</span>(JsonValue::String(
-<a href=#2012 id=2012 data-nosnippet>2012</a> timestamp::microseconds_to_datetime(val)
-<a href=#2013 id=2013 data-nosnippet>2013</a> .format(<span class="string">"%Y-%m-%dT%H:%M:%S%.f"</span>)
-<a href=#2014 id=2014 data-nosnippet>2014</a> .to_string(),
-<a href=#2015 id=2015 data-nosnippet>2015</a> )),
-<a href=#2016 id=2016 data-nosnippet>2016</a> (PrimitiveType::Timestamptz, PrimitiveLiteral::Long(val)) => <span class="prelude-val">Ok</span>(JsonValue::String(
-<a href=#2017 id=2017 data-nosnippet>2017</a> timestamptz::microseconds_to_datetimetz(val)
-<a href=#2018 id=2018 data-nosnippet>2018</a> .format(<span class="string">"%Y-%m-%dT%H:%M:%S%.f+00:00"</span>)
-<a href=#2019 id=2019 data-nosnippet>2019</a> .to_string(),
-<a href=#2020 id=2020 data-nosnippet>2020</a> )),
-<a href=#2021 id=2021 data-nosnippet>2021</a> (PrimitiveType::TimestampNs, PrimitiveLiteral::Long(val)) => <span class="prelude-val">Ok</span>(JsonValue::String(
-<a href=#2022 id=2022 data-nosnippet>2022</a> timestamp::nanoseconds_to_datetime(val)
-<a href=#2023 id=2023 data-nosnippet>2023</a> .format(<span class="string">"%Y-%m-%dT%H:%M:%S%.f"</span>)
-<a href=#2024 id=2024 data-nosnippet>2024</a> .to_string(),
-<a href=#2025 id=2025 data-nosnippet>2025</a> )),
-<a href=#2026 id=2026 data-nosnippet>2026</a> (PrimitiveType::TimestamptzNs, PrimitiveLiteral::Long(val)) => {
-<a href=#2027 id=2027 data-nosnippet>2027</a> <span class="prelude-val">Ok</span>(JsonValue::String(
-<a href=#2028 id=2028 data-nosnippet>2028</a> timestamptz::nanoseconds_to_datetimetz(val)
-<a href=#2029 id=2029 data-nosnippet>2029</a> .format(<span class="string">"%Y-%m-%dT%H:%M:%S%.f+00:00"</span>)
-<a href=#2030 id=2030 data-nosnippet>2030</a> .to_string(),
-<a href=#2031 id=2031 data-nosnippet>2031</a> ))
-<a href=#2032 id=2032 data-nosnippet>2032</a> }
-<a href=#2033 id=2033 data-nosnippet>2033</a> (PrimitiveType::String, PrimitiveLiteral::String(val)) => {
-<a href=#2034 id=2034 data-nosnippet>2034</a> <span class="prelude-val">Ok</span>(JsonValue::String(val.clone()))
+<a href=#2005 id=2005 data-nosnippet>2005</a> }
+<a href=#2006 id=2006 data-nosnippet>2006</a> }
+<a href=#2007 id=2007 data-nosnippet>2007</a> }
+<a href=#2008 id=2008 data-nosnippet>2008</a>
+<a href=#2009 id=2009 data-nosnippet>2009</a> <span class="doccomment">/// Converting iceberg value to json value.
+<a href=#2010 id=2010 data-nosnippet>2010</a> ///
+<a href=#2011 id=2011 data-nosnippet>2011</a> /// See [this spec](https://iceberg.apache.org/spec/#json-single-value-serialization) for reference.
+<a href=#2012 id=2012 data-nosnippet>2012</a> </span><span class="kw">pub fn </span>try_into_json(<span class="self">self</span>, r#type: <span class="kw-2">&</span>Type) -> <span class="prelude-ty">Result</span><JsonValue> {
+<a href=#2013 id=2013 data-nosnippet>2013</a> <span class="kw">match </span>(<span class="self">self</span>, r#type) {
+<a href=#2014 id=2014 data-nosnippet>2014</a> (Literal::Primitive(prim), Type::Primitive(prim_type)) => <span class="kw">match </span>(prim_type, prim) {
+<a href=#2015 id=2015 data-nosnippet>2015</a> (PrimitiveType::Boolean, PrimitiveLiteral::Boolean(val)) => {
+<a href=#2016 id=2016 data-nosnippet>2016</a> <span class="prelude-val">Ok</span>(JsonValue::Bool(val))
+<a href=#2017 id=2017 data-nosnippet>2017</a> }
+<a href=#2018 id=2018 data-nosnippet>2018</a> (PrimitiveType::Int, PrimitiveLiteral::Int(val)) => {
+<a href=#2019 id=2019 data-nosnippet>2019</a> <span class="prelude-val">Ok</span>(JsonValue::Number((val).into()))
+<a href=#2020 id=2020 data-nosnippet>2020</a> }
+<a href=#2021 id=2021 data-nosnippet>2021</a> (PrimitiveType::Long, PrimitiveLiteral::Long(val)) => {
+<a href=#2022 id=2022 data-nosnippet>2022</a> <span class="prelude-val">Ok</span>(JsonValue::Number((val).into()))
+<a href=#2023 id=2023 data-nosnippet>2023</a> }
+<a href=#2024 id=2024 data-nosnippet>2024</a> (PrimitiveType::Float, PrimitiveLiteral::Float(val)) => {
+<a href=#2025 id=2025 data-nosnippet>2025</a> <span class="kw">match </span>Number::from_f64(val.<span class="number">0 </span><span class="kw">as </span>f64) {
+<a href=#2026 id=2026 data-nosnippet>2026</a> <span class="prelude-val">Some</span>(number) => <span class="prelude-val">Ok</span>(JsonValue::Number(number)),
+<a href=#2027 id=2027 data-nosnippet>2027</a> <span class="prelude-val">None </span>=> <span class="prelude-val">Ok</span>(JsonValue::Null),
+<a href=#2028 id=2028 data-nosnippet>2028</a> }
+<a href=#2029 id=2029 data-nosnippet>2029</a> }
+<a href=#2030 id=2030 data-nosnippet>2030</a> (PrimitiveType::Double, PrimitiveLiteral::Double(val)) => {
+<a href=#2031 id=2031 data-nosnippet>2031</a> <span class="kw">match </span>Number::from_f64(val.<span class="number">0</span>) {
+<a href=#2032 id=2032 data-nosnippet>2032</a> <span class="prelude-val">Some</span>(number) => <span class="prelude-val">Ok</span>(JsonValue::Number(number)),
+<a href=#2033 id=2033 data-nosnippet>2033</a> <span class="prelude-val">None </span>=> <span class="prelude-val">Ok</span>(JsonValue::Null),
+<a href=#2034 id=2034 data-nosnippet>2034</a> }
<a href=#2035 id=2035 data-nosnippet>2035</a> }
-<a href=#2036 id=2036 data-nosnippet>2036</a> (<span class="kw">_</span>, PrimitiveLiteral::UInt128(val)) => {
-<a href=#2037 id=2037 data-nosnippet>2037</a> <span class="prelude-val">Ok</span>(JsonValue::String(Uuid::from_u128(val).to_string()))
+<a href=#2036 id=2036 data-nosnippet>2036</a> (PrimitiveType::Date, PrimitiveLiteral::Int(val)) => {
+<a href=#2037 id=2037 data-nosnippet>2037</a> <span class="prelude-val">Ok</span>(JsonValue::String(date::days_to_date(val).to_string()))
<a href=#2038 id=2038 data-nosnippet>2038</a> }
-<a href=#2039 id=2039 data-nosnippet>2039</a> (<span class="kw">_</span>, PrimitiveLiteral::Binary(val)) => <span class="prelude-val">Ok</span>(JsonValue::String(val.iter().fold(
-<a href=#2040 id=2040 data-nosnippet>2040</a> String::new(),
-<a href=#2041 id=2041 data-nosnippet>2041</a> |<span class="kw-2">mut </span>acc, x| {
-<a href=#2042 id=2042 data-nosnippet>2042</a> acc.push_str(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{:x}"</span>, x));
-<a href=#2043 id=2043 data-nosnippet>2043</a> acc
-<a href=#2044 id=2044 data-nosnippet>2044</a> },
-<a href=#2045 id=2045 data-nosnippet>2045</a> ))),
-<a href=#2046 id=2046 data-nosnippet>2046</a> (<span class="kw">_</span>, PrimitiveLiteral::Int128(val)) => <span class="kw">match </span>r#type {
-<a href=#2047 id=2047 data-nosnippet>2047</a> Type::Primitive(PrimitiveType::Decimal {
-<a href=#2048 id=2048 data-nosnippet>2048</a> precision: _precision,
-<a href=#2049 id=2049 data-nosnippet>2049</a> scale,
-<a href=#2050 id=2050 data-nosnippet>2050</a> }) => {
-<a href=#2051 id=2051 data-nosnippet>2051</a> <span class="kw">let </span>decimal = Decimal::try_from_i128_with_scale(val, <span class="kw-2">*</span>scale)<span class="question-mark">?</span>;
-<a href=#2052 id=2052 data-nosnippet>2052</a> <span class="prelude-val">Ok</span>(JsonValue::String(decimal.to_string()))
-<a href=#2053 id=2053 data-nosnippet>2053</a> }
-<a href=#2054 id=2054 data-nosnippet>2054</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(Error::new(
-<a href=#2055 id=2055 data-nosnippet>2055</a> ErrorKind::DataInvalid,
-<a href=#2056 id=2056 data-nosnippet>2056</a> <span class="string">"The iceberg type for decimal literal must be decimal."</span>,
-<a href=#2057 id=2057 data-nosnippet>2057</a> ))<span class="question-mark">?</span>,
-<a href=#2058 id=2058 data-nosnippet>2058</a> },
-<a href=#2059 id=2059 data-nosnippet>2059</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(Error::new(
-<a href=#2060 id=2060 data-nosnippet>2060</a> ErrorKind::DataInvalid,
-<a href=#2061 id=2061 data-nosnippet>2061</a> <span class="string">"The iceberg value doesn't fit to the iceberg type."</span>,
-<a href=#2062 id=2062 data-nosnippet>2062</a> )),
-<a href=#2063 id=2063 data-nosnippet>2063</a> },
-<a href=#2064 id=2064 data-nosnippet>2064</a> (Literal::Struct(s), Type::Struct(struct_type)) => {
-<a href=#2065 id=2065 data-nosnippet>2065</a> <span class="kw">let </span><span class="kw-2">mut </span>id_and_value = Vec::with_capacity(struct_type.fields().len());
-<a href=#2066 id=2066 data-nosnippet>2066</a> <span class="kw">for </span>(value, field) <span class="kw">in </span>s.into_iter().zip(struct_type.fields()) {
-<a href=#2067 id=2067 data-nosnippet>2067</a> <span class="kw">let </span>json = <span class="kw">match </span>value {
-<a href=#2068 id=2068 data-nosnippet>2068</a> <span class="prelude-val">Some</span>(val) => val.try_into_json(<span class="kw-2">&</span>field.field_type)<span class="question-mark">?</span>,
-<a href=#2069 id=2069 data-nosnippet>2069</a> <span class="prelude-val">None </span>=> JsonValue::Null,
-<a href=#2070 id=2070 data-nosnippet>2070</a> };
-<a href=#2071 id=2071 data-nosnippet>2071</a> id_and_value.push((field.id.to_string(), json));
-<a href=#2072 id=2072 data-nosnippet>2072</a> }
-<a href=#2073 id=2073 data-nosnippet>2073</a> <span class="prelude-val">Ok</span>(JsonValue::Object(JsonMap::from_iter(id_and_value)))
-<a href=#2074 id=2074 data-nosnippet>2074</a> }
-<a href=#2075 id=2075 data-nosnippet>2075</a> (Literal::List(list), Type::List(list_type)) => <span class="prelude-val">Ok</span>(JsonValue::Array(
-<a href=#2076 id=2076 data-nosnippet>2076</a> list.into_iter()
-<a href=#2077 id=2077 data-nosnippet>2077</a> .map(|opt| <span class="kw">match </span>opt {
-<a href=#2078 id=2078 data-nosnippet>2078</a> <span class="prelude-val">Some</span>(literal) => literal.try_into_json(<span class="kw-2">&</span>list_type.element_field.field_type),
-<a href=#2079 id=2079 data-nosnippet>2079</a> <span class="prelude-val">None </span>=> <span class="prelude-val">Ok</span>(JsonValue::Null),
-<a href=#2080 id=2080 data-nosnippet>2080</a> })
-<a href=#2081 id=2081 data-nosnippet>2081</a> .collect::<<span class="prelude-ty">Result</span><Vec<JsonValue>>>()<span class="question-mark">?</span>,
-<a href=#2082 id=2082 data-nosnippet>2082</a> )),
-<a href=#2083 id=2083 data-nosnippet>2083</a> (Literal::Map(map), Type::Map(map_type)) => {
-<a href=#2084 id=2084 data-nosnippet>2084</a> <span class="kw">let </span><span class="kw-2">mut </span>object = JsonMap::with_capacity(<span class="number">2</span>);
-<a href=#2085 id=2085 data-nosnippet>2085</a> <span class="kw">let </span><span class="kw-2">mut </span>json_keys = Vec::with_capacity(map.len());
-<a href=#2086 id=2086 data-nosnippet>2086</a> <span class="kw">let </span><span class="kw-2">mut </span>json_values = Vec::with_capacity(map.len());
-<a href=#2087 id=2087 data-nosnippet>2087</a> <span class="kw">for </span>(key, value) <span class="kw">in </span>map.into_iter() {
-<a href=#2088 id=2088 data-nosnippet>2088</a> json_keys.push(key.try_into_json(<span class="kw-2">&</span>map_type.key_field.field_type)<span class="question-mark">?</span>);
-<a href=#2089 id=2089 data-nosnippet>2089</a> json_values.push(<span class="kw">match </span>value {
-<a href=#2090 id=2090 data-nosnippet>2090</a> <span class="prelude-val">Some</span>(literal) => literal.try_into_json(<span class="kw-2">&</span>map_type.value_field.field_type)<span class="question-mark">?</span>,
-<a href=#2091 id=2091 data-nosnippet>2091</a> <span class="prelude-val">None </span>=> JsonValue::Null,
-<a href=#2092 id=2092 data-nosnippet>2092</a> });
-<a href=#2093 id=2093 data-nosnippet>2093</a> }
-<a href=#2094 id=2094 data-nosnippet>2094</a> object.insert(<span class="string">"keys"</span>.to_string(), JsonValue::Array(json_keys));
-<a href=#2095 id=2095 data-nosnippet>2095</a> object.insert(<span class="string">"values"</span>.to_string(), JsonValue::Array(json_values));
-<a href=#2096 id=2096 data-nosnippet>2096</a> <span class="prelude-val">Ok</span>(JsonValue::Object(object))
-<a href=#2097 id=2097 data-nosnippet>2097</a> }
-<a href=#2098 id=2098 data-nosnippet>2098</a> (value, r#type) => <span class="prelude-val">Err</span>(Error::new(
-<a href=#2099 id=2099 data-nosnippet>2099</a> ErrorKind::DataInvalid,
-<a href=#2100 id=2100 data-nosnippet>2100</a> <span class="macro">format!</span>(
-<a href=#2101 id=2101 data-nosnippet>2101</a> <span class="string">"The iceberg value {:?} doesn't fit to the iceberg type {}."</span>,
-<a href=#2102 id=2102 data-nosnippet>2102</a> value, r#type
-<a href=#2103 id=2103 data-nosnippet>2103</a> ),
-<a href=#2104 id=2104 data-nosnippet>2104</a> )),
-<a href=#2105 id=2105 data-nosnippet>2105</a> }
-<a href=#2106 id=2106 data-nosnippet>2106</a> }
-<a href=#2107 id=2107 data-nosnippet>2107</a>
-<a href=#2108 id=2108 data-nosnippet>2108</a> <span class="doccomment">/// Convert Value to the any type
-<a href=#2109 id=2109 data-nosnippet>2109</a> </span><span class="kw">pub fn </span>into_any(<span class="self">self</span>) -> Box<<span class="kw">dyn </span>Any> {
-<a href=#2110 id=2110 data-nosnippet>2110</a> <span class="kw">match </span><span class="self">self </span>{
-<a href=#2111 id=2111 data-nosnippet>2111</a> Literal::Primitive(prim) => <span class="kw">match </span>prim {
-<a href=#2112 id=2112 data-nosnippet>2112</a> PrimitiveLiteral::Boolean(any) => Box::new(any),
-<a href=#2113 id=2113 data-nosnippet>2113</a> PrimitiveLiteral::Int(any) => Box::new(any),
-<a href=#2114 id=2114 data-nosnippet>2114</a> PrimitiveLiteral::Long(any) => Box::new(any),
-<a href=#2115 id=2115 data-nosnippet>2115</a> PrimitiveLiteral::Float(any) => Box::new(any),
-<a href=#2116 id=2116 data-nosnippet>2116</a> PrimitiveLiteral::Double(any) => Box::new(any),
-<a href=#2117 id=2117 data-nosnippet>2117</a> PrimitiveLiteral::Binary(any) => Box::new(any),
-<a href=#2118 id=2118 data-nosnippet>2118</a> PrimitiveLiteral::String(any) => Box::new(any),
-<a href=#2119 id=2119 data-nosnippet>2119</a> PrimitiveLiteral::UInt128(any) => Box::new(any),
-<a href=#2120 id=2120 data-nosnippet>2120</a> PrimitiveLiteral::Int128(any) => Box::new(any),
-<a href=#2121 id=2121 data-nosnippet>2121</a> PrimitiveLiteral::AboveMax | PrimitiveLiteral::BelowMin => <span class="macro">unimplemented!</span>(),
-<a href=#2122 id=2122 data-nosnippet>2122</a> },
-<a href=#2123 id=2123 data-nosnippet>2123</a> <span class="kw">_ </span>=> <span class="macro">unimplemented!</span>(),
-<a href=#2124 id=2124 data-nosnippet>2124</a> }
-<a href=#2125 id=2125 data-nosnippet>2125</a> }
-<a href=#2126 id=2126 data-nosnippet>2126</a>}
-<a href=#2127 id=2127 data-nosnippet>2127</a>
-<a href=#2128 id=2128 data-nosnippet>2128</a><span class="kw">mod </span>date {
-<a href=#2129 id=2129 data-nosnippet>2129</a> <span class="kw">use </span>chrono::{DateTime, NaiveDate, TimeDelta, TimeZone, Utc};
-<a href=#2130 id=2130 data-nosnippet>2130</a>
-<a href=#2131 id=2131 data-nosnippet>2131</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>date_to_days(date: <span class="kw-2">&</span>NaiveDate) -> i32 {
-<a href=#2132 id=2132 data-nosnippet>2132</a> date.signed_duration_since(
-<a href=#2133 id=2133 data-nosnippet>2133</a> <span class="comment">// This is always the same and shouldn't fail
-<a href=#2134 id=2134 data-nosnippet>2134</a> </span>NaiveDate::from_ymd_opt(<span class="number">1970</span>, <span class="number">1</span>, <span class="number">1</span>).unwrap(),
-<a href=#2135 id=2135 data-nosnippet>2135</a> )
-<a href=#2136 id=2136 data-nosnippet>2136</a> .num_days() <span class="kw">as </span>i32
+<a href=#2039 id=2039 data-nosnippet>2039</a> (PrimitiveType::Time, PrimitiveLiteral::Long(val)) => <span class="prelude-val">Ok</span>(JsonValue::String(
+<a href=#2040 id=2040 data-nosnippet>2040</a> time::microseconds_to_time(val).to_string(),
+<a href=#2041 id=2041 data-nosnippet>2041</a> )),
+<a href=#2042 id=2042 data-nosnippet>2042</a> (PrimitiveType::Timestamp, PrimitiveLiteral::Long(val)) => <span class="prelude-val">Ok</span>(JsonValue::String(
+<a href=#2043 id=2043 data-nosnippet>2043</a> timestamp::microseconds_to_datetime(val)
+<a href=#2044 id=2044 data-nosnippet>2044</a> .format(<span class="string">"%Y-%m-%dT%H:%M:%S%.f"</span>)
+<a href=#2045 id=2045 data-nosnippet>2045</a> .to_string(),
+<a href=#2046 id=2046 data-nosnippet>2046</a> )),
+<a href=#2047 id=2047 data-nosnippet>2047</a> (PrimitiveType::Timestamptz, PrimitiveLiteral::Long(val)) => <span class="prelude-val">Ok</span>(JsonValue::String(
+<a href=#2048 id=2048 data-nosnippet>2048</a> timestamptz::microseconds_to_datetimetz(val)
+<a href=#2049 id=2049 data-nosnippet>2049</a> .format(<span class="string">"%Y-%m-%dT%H:%M:%S%.f+00:00"</span>)
+<a href=#2050 id=2050 data-nosnippet>2050</a> .to_string(),
+<a href=#2051 id=2051 data-nosnippet>2051</a> )),
+<a href=#2052 id=2052 data-nosnippet>2052</a> (PrimitiveType::TimestampNs, PrimitiveLiteral::Long(val)) => <span class="prelude-val">Ok</span>(JsonValue::String(
+<a href=#2053 id=2053 data-nosnippet>2053</a> timestamp::nanoseconds_to_datetime(val)
+<a href=#2054 id=2054 data-nosnippet>2054</a> .format(<span class="string">"%Y-%m-%dT%H:%M:%S%.f"</span>)
+<a href=#2055 id=2055 data-nosnippet>2055</a> .to_string(),
+<a href=#2056 id=2056 data-nosnippet>2056</a> )),
+<a href=#2057 id=2057 data-nosnippet>2057</a> (PrimitiveType::TimestamptzNs, PrimitiveLiteral::Long(val)) => {
+<a href=#2058 id=2058 data-nosnippet>2058</a> <span class="prelude-val">Ok</span>(JsonValue::String(
+<a href=#2059 id=2059 data-nosnippet>2059</a> timestamptz::nanoseconds_to_datetimetz(val)
+<a href=#2060 id=2060 data-nosnippet>2060</a> .format(<span class="string">"%Y-%m-%dT%H:%M:%S%.f+00:00"</span>)
+<a href=#2061 id=2061 data-nosnippet>2061</a> .to_string(),
+<a href=#2062 id=2062 data-nosnippet>2062</a> ))
+<a href=#2063 id=2063 data-nosnippet>2063</a> }
+<a href=#2064 id=2064 data-nosnippet>2064</a> (PrimitiveType::String, PrimitiveLiteral::String(val)) => {
+<a href=#2065 id=2065 data-nosnippet>2065</a> <span class="prelude-val">Ok</span>(JsonValue::String(val.clone()))
+<a href=#2066 id=2066 data-nosnippet>2066</a> }
+<a href=#2067 id=2067 data-nosnippet>2067</a> (<span class="kw">_</span>, PrimitiveLiteral::UInt128(val)) => {
+<a href=#2068 id=2068 data-nosnippet>2068</a> <span class="prelude-val">Ok</span>(JsonValue::String(Uuid::from_u128(val).to_string()))
+<a href=#2069 id=2069 data-nosnippet>2069</a> }
+<a href=#2070 id=2070 data-nosnippet>2070</a> (<span class="kw">_</span>, PrimitiveLiteral::Binary(val)) => <span class="prelude-val">Ok</span>(JsonValue::String(val.iter().fold(
+<a href=#2071 id=2071 data-nosnippet>2071</a> String::new(),
+<a href=#2072 id=2072 data-nosnippet>2072</a> |<span class="kw-2">mut </span>acc, x| {
+<a href=#2073 id=2073 data-nosnippet>2073</a> acc.push_str(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{:x}"</span>, x));
+<a href=#2074 id=2074 data-nosnippet>2074</a> acc
+<a href=#2075 id=2075 data-nosnippet>2075</a> },
+<a href=#2076 id=2076 data-nosnippet>2076</a> ))),
+<a href=#2077 id=2077 data-nosnippet>2077</a> (<span class="kw">_</span>, PrimitiveLiteral::Int128(val)) => <span class="kw">match </span>r#type {
+<a href=#2078 id=2078 data-nosnippet>2078</a> Type::Primitive(PrimitiveType::Decimal {
+<a href=#2079 id=2079 data-nosnippet>2079</a> precision: _precision,
+<a href=#2080 id=2080 data-nosnippet>2080</a> scale,
+<a href=#2081 id=2081 data-nosnippet>2081</a> }) => {
+<a href=#2082 id=2082 data-nosnippet>2082</a> <span class="kw">let </span>decimal = Decimal::try_from_i128_with_scale(val, <span class="kw-2">*</span>scale)<span class="question-mark">?</span>;
+<a href=#2083 id=2083 data-nosnippet>2083</a> <span class="prelude-val">Ok</span>(JsonValue::String(decimal.to_string()))
+<a href=#2084 id=2084 data-nosnippet>2084</a> }
+<a href=#2085 id=2085 data-nosnippet>2085</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(Error::new(
+<a href=#2086 id=2086 data-nosnippet>2086</a> ErrorKind::DataInvalid,
+<a href=#2087 id=2087 data-nosnippet>2087</a> <span class="string">"The iceberg type for decimal literal must be decimal."</span>,
+<a href=#2088 id=2088 data-nosnippet>2088</a> ))<span class="question-mark">?</span>,
+<a href=#2089 id=2089 data-nosnippet>2089</a> },
+<a href=#2090 id=2090 data-nosnippet>2090</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(Error::new(
+<a href=#2091 id=2091 data-nosnippet>2091</a> ErrorKind::DataInvalid,
+<a href=#2092 id=2092 data-nosnippet>2092</a> <span class="string">"The iceberg value doesn't fit to the iceberg type."</span>,
+<a href=#2093 id=2093 data-nosnippet>2093</a> )),
+<a href=#2094 id=2094 data-nosnippet>2094</a> },
+<a href=#2095 id=2095 data-nosnippet>2095</a> (Literal::Struct(s), Type::Struct(struct_type)) => {
+<a href=#2096 id=2096 data-nosnippet>2096</a> <span class="kw">let </span><span class="kw-2">mut </span>id_and_value = Vec::with_capacity(struct_type.fields().len());
+<a href=#2097 id=2097 data-nosnippet>2097</a> <span class="kw">for </span>(value, field) <span class="kw">in </span>s.into_iter().zip(struct_type.fields()) {
+<a href=#2098 id=2098 data-nosnippet>2098</a> <span class="kw">let </span>json = <span class="kw">match </span>value {
+<a href=#2099 id=2099 data-nosnippet>2099</a> <span class="prelude-val">Some</span>(val) => val.try_into_json(<span class="kw-2">&</span>field.field_type)<span class="question-mark">?</span>,
+<a href=#2100 id=2100 data-nosnippet>2100</a> <span class="prelude-val">None </span>=> JsonValue::Null,
+<a href=#2101 id=2101 data-nosnippet>2101</a> };
+<a href=#2102 id=2102 data-nosnippet>2102</a> id_and_value.push((field.id.to_string(), json));
+<a href=#2103 id=2103 data-nosnippet>2103</a> }
+<a href=#2104 id=2104 data-nosnippet>2104</a> <span class="prelude-val">Ok</span>(JsonValue::Object(JsonMap::from_iter(id_and_value)))
+<a href=#2105 id=2105 data-nosnippet>2105</a> }
+<a href=#2106 id=2106 data-nosnippet>2106</a> (Literal::List(list), Type::List(list_type)) => <span class="prelude-val">Ok</span>(JsonValue::Array(
+<a href=#2107 id=2107 data-nosnippet>2107</a> list.into_iter()
+<a href=#2108 id=2108 data-nosnippet>2108</a> .map(|opt| <span class="kw">match </span>opt {
+<a href=#2109 id=2109 data-nosnippet>2109</a> <span class="prelude-val">Some</span>(literal) => literal.try_into_json(<span class="kw-2">&</span>list_type.element_field.field_type),
+<a href=#2110 id=2110 data-nosnippet>2110</a> <span class="prelude-val">None </span>=> <span class="prelude-val">Ok</span>(JsonValue::Null),
+<a href=#2111 id=2111 data-nosnippet>2111</a> })
+<a href=#2112 id=2112 data-nosnippet>2112</a> .collect::<<span class="prelude-ty">Result</span><Vec<JsonValue>>>()<span class="question-mark">?</span>,
+<a href=#2113 id=2113 data-nosnippet>2113</a> )),
+<a href=#2114 id=2114 data-nosnippet>2114</a> (Literal::Map(map), Type::Map(map_type)) => {
+<a href=#2115 id=2115 data-nosnippet>2115</a> <span class="kw">let </span><span class="kw-2">mut </span>object = JsonMap::with_capacity(<span class="number">2</span>);
+<a href=#2116 id=2116 data-nosnippet>2116</a> <span class="kw">let </span><span class="kw-2">mut </span>json_keys = Vec::with_capacity(map.len());
+<a href=#2117 id=2117 data-nosnippet>2117</a> <span class="kw">let </span><span class="kw-2">mut </span>json_values = Vec::with_capacity(map.len());
+<a href=#2118 id=2118 data-nosnippet>2118</a> <span class="kw">for </span>(key, value) <span class="kw">in </span>map.into_iter() {
+<a href=#2119 id=2119 data-nosnippet>2119</a> json_keys.push(key.try_into_json(<span class="kw-2">&</span>map_type.key_field.field_type)<span class="question-mark">?</span>);
+<a href=#2120 id=2120 data-nosnippet>2120</a> json_values.push(<span class="kw">match </span>value {
+<a href=#2121 id=2121 data-nosnippet>2121</a> <span class="prelude-val">Some</span>(literal) => literal.try_into_json(<span class="kw-2">&</span>map_type.value_field.field_type)<span class="question-mark">?</span>,
+<a href=#2122 id=2122 data-nosnippet>2122</a> <span class="prelude-val">None </span>=> JsonValue::Null,
+<a href=#2123 id=2123 data-nosnippet>2123</a> });
+<a href=#2124 id=2124 data-nosnippet>2124</a> }
+<a href=#2125 id=2125 data-nosnippet>2125</a> object.insert(<span class="string">"keys"</span>.to_string(), JsonValue::Array(json_keys));
+<a href=#2126 id=2126 data-nosnippet>2126</a> object.insert(<span class="string">"values"</span>.to_string(), JsonValue::Array(json_values));
+<a href=#2127 id=2127 data-nosnippet>2127</a> <span class="prelude-val">Ok</span>(JsonValue::Object(object))
+<a href=#2128 id=2128 data-nosnippet>2128</a> }
+<a href=#2129 id=2129 data-nosnippet>2129</a> (value, r#type) => <span class="prelude-val">Err</span>(Error::new(
+<a href=#2130 id=2130 data-nosnippet>2130</a> ErrorKind::DataInvalid,
+<a href=#2131 id=2131 data-nosnippet>2131</a> <span class="macro">format!</span>(
+<a href=#2132 id=2132 data-nosnippet>2132</a> <span class="string">"The iceberg value {:?} doesn't fit to the iceberg type {}."</span>,
+<a href=#2133 id=2133 data-nosnippet>2133</a> value, r#type
+<a href=#2134 id=2134 data-nosnippet>2134</a> ),
+<a href=#2135 id=2135 data-nosnippet>2135</a> )),
+<a href=#2136 id=2136 data-nosnippet>2136</a> }
<a href=#2137 id=2137 data-nosnippet>2137</a> }
<a href=#2138 id=2138 data-nosnippet>2138</a>
-<a href=#2139 id=2139 data-nosnippet>2139</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>days_to_date(days: i32) -> NaiveDate {
-<a href=#2140 id=2140 data-nosnippet>2140</a> <span class="comment">// This shouldn't fail until the year 262000
-<a href=#2141 id=2141 data-nosnippet>2141</a> </span>(chrono::DateTime::UNIX_EPOCH + TimeDelta::try_days(days <span class="kw">as </span>i64).unwrap())
-<a href=#2142 id=2142 data-nosnippet>2142</a> .naive_utc()
-<a href=#2143 id=2143 data-nosnippet>2143</a> .date()
-<a href=#2144 id=2144 data-nosnippet>2144</a> }
-<a href=#2145 id=2145 data-nosnippet>2145</a>
-<a href=#2146 id=2146 data-nosnippet>2146</a> <span class="doccomment">/// Returns unix epoch.
-<a href=#2147 id=2147 data-nosnippet>2147</a> </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>unix_epoch() -> DateTime<Utc> {
-<a href=#2148 id=2148 data-nosnippet>2148</a> Utc.timestamp_nanos(<span class="number">0</span>)
-<a href=#2149 id=2149 data-nosnippet>2149</a> }
-<a href=#2150 id=2150 data-nosnippet>2150</a>
-<a href=#2151 id=2151 data-nosnippet>2151</a> <span class="doccomment">/// Creates date literal from `NaiveDate`, assuming it's utc timezone.
-<a href=#2152 id=2152 data-nosnippet>2152</a> </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>date_from_naive_date(date: NaiveDate) -> i32 {
-<a href=#2153 id=2153 data-nosnippet>2153</a> (date - unix_epoch().date_naive()).num_days() <span class="kw">as </span>i32
-<a href=#2154 id=2154 data-nosnippet>2154</a> }
-<a href=#2155 id=2155 data-nosnippet>2155</a>}
-<a href=#2156 id=2156 data-nosnippet>2156</a>
-<a href=#2157 id=2157 data-nosnippet>2157</a><span class="kw">mod </span>time {
-<a href=#2158 id=2158 data-nosnippet>2158</a> <span class="kw">use </span>chrono::NaiveTime;
-<a href=#2159 id=2159 data-nosnippet>2159</a>
-<a href=#2160 id=2160 data-nosnippet>2160</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>time_to_microseconds(time: <span class="kw-2">&</span>NaiveTime) -> i64 {
-<a href=#2161 id=2161 data-nosnippet>2161</a> time.signed_duration_since(
-<a href=#2162 id=2162 data-nosnippet>2162</a> <span class="comment">// This is always the same and shouldn't fail
-<a href=#2163 id=2163 data-nosnippet>2163</a> </span>NaiveTime::from_num_seconds_from_midnight_opt(<span class="number">0</span>, <span class="number">0</span>).unwrap(),
-<a href=#2164 id=2164 data-nosnippet>2164</a> )
-<a href=#2165 id=2165 data-nosnippet>2165</a> .num_microseconds()
-<a href=#2166 id=2166 data-nosnippet>2166</a> .unwrap()
-<a href=#2167 id=2167 data-nosnippet>2167</a> }
-<a href=#2168 id=2168 data-nosnippet>2168</a>
-<a href=#2169 id=2169 data-nosnippet>2169</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>microseconds_to_time(micros: i64) -> NaiveTime {
-<a href=#2170 id=2170 data-nosnippet>2170</a> <span class="kw">let </span>(secs, rem) = (micros / <span class="number">1_000_000</span>, micros % <span class="number">1_000_000</span>);
-<a href=#2171 id=2171 data-nosnippet>2171</a>
-<a href=#2172 id=2172 data-nosnippet>2172</a> NaiveTime::from_num_seconds_from_midnight_opt(secs <span class="kw">as </span>u32, rem <span class="kw">as </span>u32 * <span class="number">1_000</span>).unwrap()
-<a href=#2173 id=2173 data-nosnippet>2173</a> }
-<a href=#2174 id=2174 data-nosnippet>2174</a>}
-<a href=#2175 id=2175 data-nosnippet>2175</a>
-<a href=#2176 id=2176 data-nosnippet>2176</a><span class="kw">mod </span>timestamp {
-<a href=#2177 id=2177 data-nosnippet>2177</a> <span class="kw">use </span>chrono::{DateTime, NaiveDateTime};
-<a href=#2178 id=2178 data-nosnippet>2178</a>
-<a href=#2179 id=2179 data-nosnippet>2179</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>datetime_to_microseconds(time: <span class="kw-2">&</span>NaiveDateTime) -> i64 {
-<a href=#2180 id=2180 data-nosnippet>2180</a> time.and_utc().timestamp_micros()
-<a href=#2181 id=2181 data-nosnippet>2181</a> }
-<a href=#2182 id=2182 data-nosnippet>2182</a>
-<a href=#2183 id=2183 data-nosnippet>2183</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>microseconds_to_datetime(micros: i64) -> NaiveDateTime {
-<a href=#2184 id=2184 data-nosnippet>2184</a> <span class="comment">// This shouldn't fail until the year 262000
-<a href=#2185 id=2185 data-nosnippet>2185</a> </span>DateTime::from_timestamp_micros(micros).unwrap().naive_utc()
-<a href=#2186 id=2186 data-nosnippet>2186</a> }
+<a href=#2139 id=2139 data-nosnippet>2139</a> <span class="doccomment">/// Convert Value to the any type
+<a href=#2140 id=2140 data-nosnippet>2140</a> </span><span class="kw">pub fn </span>into_any(<span class="self">self</span>) -> Box<<span class="kw">dyn </span>Any> {
+<a href=#2141 id=2141 data-nosnippet>2141</a> <span class="kw">match </span><span class="self">self </span>{
+<a href=#2142 id=2142 data-nosnippet>2142</a> Literal::Primitive(prim) => <span class="kw">match </span>prim {
+<a href=#2143 id=2143 data-nosnippet>2143</a> PrimitiveLiteral::Boolean(any) => Box::new(any),
+<a href=#2144 id=2144 data-nosnippet>2144</a> PrimitiveLiteral::Int(any) => Box::new(any),
+<a href=#2145 id=2145 data-nosnippet>2145</a> PrimitiveLiteral::Long(any) => Box::new(any),
+<a href=#2146 id=2146 data-nosnippet>2146</a> PrimitiveLiteral::Float(any) => Box::new(any),
+<a href=#2147 id=2147 data-nosnippet>2147</a> PrimitiveLiteral::Double(any) => Box::new(any),
+<a href=#2148 id=2148 data-nosnippet>2148</a> PrimitiveLiteral::Binary(any) => Box::new(any),
+<a href=#2149 id=2149 data-nosnippet>2149</a> PrimitiveLiteral::String(any) => Box::new(any),
+<a href=#2150 id=2150 data-nosnippet>2150</a> PrimitiveLiteral::UInt128(any) => Box::new(any),
+<a href=#2151 id=2151 data-nosnippet>2151</a> PrimitiveLiteral::Int128(any) => Box::new(any),
+<a href=#2152 id=2152 data-nosnippet>2152</a> PrimitiveLiteral::AboveMax | PrimitiveLiteral::BelowMin => <span class="macro">unimplemented!</span>(),
+<a href=#2153 id=2153 data-nosnippet>2153</a> },
+<a href=#2154 id=2154 data-nosnippet>2154</a> <span class="kw">_ </span>=> <span class="macro">unimplemented!</span>(),
+<a href=#2155 id=2155 data-nosnippet>2155</a> }
+<a href=#2156 id=2156 data-nosnippet>2156</a> }
+<a href=#2157 id=2157 data-nosnippet>2157</a>}
+<a href=#2158 id=2158 data-nosnippet>2158</a>
+<a href=#2159 id=2159 data-nosnippet>2159</a><span class="kw">mod </span>date {
+<a href=#2160 id=2160 data-nosnippet>2160</a> <span class="kw">use </span>chrono::{DateTime, NaiveDate, TimeDelta, TimeZone, Utc};
+<a href=#2161 id=2161 data-nosnippet>2161</a>
+<a href=#2162 id=2162 data-nosnippet>2162</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>date_to_days(date: <span class="kw-2">&</span>NaiveDate) -> i32 {
+<a href=#2163 id=2163 data-nosnippet>2163</a> date.signed_duration_since(
+<a href=#2164 id=2164 data-nosnippet>2164</a> <span class="comment">// This is always the same and shouldn't fail
+<a href=#2165 id=2165 data-nosnippet>2165</a> </span>NaiveDate::from_ymd_opt(<span class="number">1970</span>, <span class="number">1</span>, <span class="number">1</span>).unwrap(),
+<a href=#2166 id=2166 data-nosnippet>2166</a> )
+<a href=#2167 id=2167 data-nosnippet>2167</a> .num_days() <span class="kw">as </span>i32
+<a href=#2168 id=2168 data-nosnippet>2168</a> }
+<a href=#2169 id=2169 data-nosnippet>2169</a>
+<a href=#2170 id=2170 data-nosnippet>2170</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>days_to_date(days: i32) -> NaiveDate {
+<a href=#2171 id=2171 data-nosnippet>2171</a> <span class="comment">// This shouldn't fail until the year 262000
+<a href=#2172 id=2172 data-nosnippet>2172</a> </span>(chrono::DateTime::UNIX_EPOCH + TimeDelta::try_days(days <span class="kw">as </span>i64).unwrap())
+<a href=#2173 id=2173 data-nosnippet>2173</a> .naive_utc()
+<a href=#2174 id=2174 data-nosnippet>2174</a> .date()
+<a href=#2175 id=2175 data-nosnippet>2175</a> }
+<a href=#2176 id=2176 data-nosnippet>2176</a>
+<a href=#2177 id=2177 data-nosnippet>2177</a> <span class="doccomment">/// Returns unix epoch.
+<a href=#2178 id=2178 data-nosnippet>2178</a> </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>unix_epoch() -> DateTime<Utc> {
+<a href=#2179 id=2179 data-nosnippet>2179</a> Utc.timestamp_nanos(<span class="number">0</span>)
+<a href=#2180 id=2180 data-nosnippet>2180</a> }
+<a href=#2181 id=2181 data-nosnippet>2181</a>
+<a href=#2182 id=2182 data-nosnippet>2182</a> <span class="doccomment">/// Creates date literal from `NaiveDate`, assuming it's utc timezone.
+<a href=#2183 id=2183 data-nosnippet>2183</a> </span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>date_from_naive_date(date: NaiveDate) -> i32 {
+<a href=#2184 id=2184 data-nosnippet>2184</a> (date - unix_epoch().date_naive()).num_days() <span class="kw">as </span>i32
+<a href=#2185 id=2185 data-nosnippet>2185</a> }
+<a href=#2186 id=2186 data-nosnippet>2186</a>}
<a href=#2187 id=2187 data-nosnippet>2187</a>
-<a href=#2188 id=2188 data-nosnippet>2188</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>nanoseconds_to_datetime(nanos: i64) -> NaiveDateTime {
-<a href=#2189 id=2189 data-nosnippet>2189</a> DateTime::from_timestamp_nanos(nanos).naive_utc()
-<a href=#2190 id=2190 data-nosnippet>2190</a> }
-<a href=#2191 id=2191 data-nosnippet>2191</a>}
-<a href=#2192 id=2192 data-nosnippet>2192</a>
-<a href=#2193 id=2193 data-nosnippet>2193</a><span class="kw">mod </span>timestamptz {
-<a href=#2194 id=2194 data-nosnippet>2194</a> <span class="kw">use </span>chrono::{DateTime, Utc};
-<a href=#2195 id=2195 data-nosnippet>2195</a>
-<a href=#2196 id=2196 data-nosnippet>2196</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>datetimetz_to_microseconds(time: <span class="kw-2">&</span>DateTime<Utc>) -> i64 {
-<a href=#2197 id=2197 data-nosnippet>2197</a> time.timestamp_micros()
+<a href=#2188 id=2188 data-nosnippet>2188</a><span class="kw">mod </span>time {
+<a href=#2189 id=2189 data-nosnippet>2189</a> <span class="kw">use </span>chrono::NaiveTime;
+<a href=#2190 id=2190 data-nosnippet>2190</a>
+<a href=#2191 id=2191 data-nosnippet>2191</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>time_to_microseconds(time: <span class="kw-2">&</span>NaiveTime) -> i64 {
+<a href=#2192 id=2192 data-nosnippet>2192</a> time.signed_duration_since(
+<a href=#2193 id=2193 data-nosnippet>2193</a> <span class="comment">// This is always the same and shouldn't fail
+<a href=#2194 id=2194 data-nosnippet>2194</a> </span>NaiveTime::from_num_seconds_from_midnight_opt(<span class="number">0</span>, <span class="number">0</span>).unwrap(),
+<a href=#2195 id=2195 data-nosnippet>2195</a> )
+<a href=#2196 id=2196 data-nosnippet>2196</a> .num_microseconds()
+<a href=#2197 id=2197 data-nosnippet>2197</a> .unwrap()
<a href=#2198 id=2198 data-nosnippet>2198</a> }
<a href=#2199 id=2199 data-nosnippet>2199</a>
-<a href=#2200 id=2200 data-nosnippet>2200</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>microseconds_to_datetimetz(micros: i64) -> DateTime<Utc> {
+<a href=#2200 id=2200 data-nosnippet>2200</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>microseconds_to_time(micros: i64) -> NaiveTime {
<a href=#2201 id=2201 data-nosnippet>2201</a> <span class="kw">let </span>(secs, rem) = (micros / <span class="number">1_000_000</span>, micros % <span class="number">1_000_000</span>);
<a href=#2202 id=2202 data-nosnippet>2202</a>
-<a href=#2203 id=2203 data-nosnippet>2203</a> DateTime::from_timestamp(secs, rem <span class="kw">as </span>u32 * <span class="number">1_000</span>).unwrap()
+<a href=#2203 id=2203 data-nosnippet>2203</a> NaiveTime::from_num_seconds_from_midnight_opt(secs <span class="kw">as </span>u32, rem <span class="kw">as </span>u32 * <span class="number">1_000</span>).unwrap()
<a href=#2204 id=2204 data-nosnippet>2204</a> }
-<a href=#2205 id=2205 data-nosnippet>2205</a>
-<a href=#2206 id=2206 data-nosnippet>2206</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>nanoseconds_to_datetimetz(nanos: i64) -> DateTime<Utc> {
-<a href=#2207 id=2207 data-nosnippet>2207</a> <span class="kw">let </span>(secs, rem) = (nanos / <span class="number">1_000_000_000</span>, nanos % <span class="number">1_000_000_000</span>);
-<a href=#2208 id=2208 data-nosnippet>2208</a>
-<a href=#2209 id=2209 data-nosnippet>2209</a> DateTime::from_timestamp(secs, rem <span class="kw">as </span>u32).unwrap()
-<a href=#2210 id=2210 data-nosnippet>2210</a> }
-<a href=#2211 id=2211 data-nosnippet>2211</a>}
-<a href=#2212 id=2212 data-nosnippet>2212</a>
-<a href=#2213 id=2213 data-nosnippet>2213</a><span class="kw">mod </span>_serde {
-<a href=#2214 id=2214 data-nosnippet>2214</a> <span class="kw">use </span>serde::de::Visitor;
-<a href=#2215 id=2215 data-nosnippet>2215</a> <span class="kw">use </span>serde::ser::{SerializeMap, SerializeSeq, SerializeStruct};
-<a href=#2216 id=2216 data-nosnippet>2216</a> <span class="kw">use </span>serde::{Deserialize, Serialize};
-<a href=#2217 id=2217 data-nosnippet>2217</a> <span class="kw">use </span>serde_bytes::ByteBuf;
-<a href=#2218 id=2218 data-nosnippet>2218</a> <span class="kw">use </span>serde_derive::{Deserialize <span class="kw">as </span>DeserializeDerive, Serialize <span class="kw">as </span>SerializeDerive};
-<a href=#2219 id=2219 data-nosnippet>2219</a>
-<a href=#2220 id=2220 data-nosnippet>2220</a> <span class="kw">use super</span>::{Literal, Map, PrimitiveLiteral};
-<a href=#2221 id=2221 data-nosnippet>2221</a> <span class="kw">use </span><span class="kw">crate</span>::spec::{MAP_KEY_FIELD_NAME, MAP_VALUE_FIELD_NAME, PrimitiveType, Type};
-<a href=#2222 id=2222 data-nosnippet>2222</a> <span class="kw">use crate</span>::{Error, ErrorKind};
+<a href=#2205 id=2205 data-nosnippet>2205</a>}
+<a href=#2206 id=2206 data-nosnippet>2206</a>
+<a href=#2207 id=2207 data-nosnippet>2207</a><span class="kw">mod </span>timestamp {
+<a href=#2208 id=2208 data-nosnippet>2208</a> <span class="kw">use </span>chrono::{DateTime, NaiveDateTime};
+<a href=#2209 id=2209 data-nosnippet>2209</a>
+<a href=#2210 id=2210 data-nosnippet>2210</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>datetime_to_microseconds(time: <span class="kw-2">&</span>NaiveDateTime) -> i64 {
+<a href=#2211 id=2211 data-nosnippet>2211</a> time.and_utc().timestamp_micros()
+<a href=#2212 id=2212 data-nosnippet>2212</a> }
+<a href=#2213 id=2213 data-nosnippet>2213</a>
+<a href=#2214 id=2214 data-nosnippet>2214</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>microseconds_to_datetime(micros: i64) -> NaiveDateTime {
+<a href=#2215 id=2215 data-nosnippet>2215</a> <span class="comment">// This shouldn't fail until the year 262000
+<a href=#2216 id=2216 data-nosnippet>2216</a> </span>DateTime::from_timestamp_micros(micros).unwrap().naive_utc()
+<a href=#2217 id=2217 data-nosnippet>2217</a> }
+<a href=#2218 id=2218 data-nosnippet>2218</a>
+<a href=#2219 id=2219 data-nosnippet>2219</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>nanoseconds_to_datetime(nanos: i64) -> NaiveDateTime {
+<a href=#2220 id=2220 data-nosnippet>2220</a> DateTime::from_timestamp_nanos(nanos).naive_utc()
+<a href=#2221 id=2221 data-nosnippet>2221</a> }
+<a href=#2222 id=2222 data-nosnippet>2222</a>}
<a href=#2223 id=2223 data-nosnippet>2223</a>
-<a href=#2224 id=2224 data-nosnippet>2224</a> <span class="attr">#[derive(SerializeDerive, DeserializeDerive, Debug)]
-<a href=#2225 id=2225 data-nosnippet>2225</a> #[serde(transparent)]
-<a href=#2226 id=2226 data-nosnippet>2226</a> </span><span class="doccomment">/// Raw literal representation used for serde. The serialize way is used for Avro serializer.
-<a href=#2227 id=2227 data-nosnippet>2227</a> </span><span class="kw">pub struct </span>RawLiteral(RawLiteralEnum);
-<a href=#2228 id=2228 data-nosnippet>2228</a>
-<a href=#2229 id=2229 data-nosnippet>2229</a> <span class="kw">impl </span>RawLiteral {
-<a href=#2230 id=2230 data-nosnippet>2230</a> <span class="doccomment">/// Covert literal to raw literal.
-<a href=#2231 id=2231 data-nosnippet>2231</a> </span><span class="kw">pub fn </span>try_from(literal: Literal, ty: <span class="kw-2">&</span>Type) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>, Error> {
-<a href=#2232 id=2232 data-nosnippet>2232</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>(RawLiteralEnum::try_from(literal, ty)<span class="question-mark">?</span>))
-<a href=#2233 id=2233 data-nosnippet>2233</a> }
-<a href=#2234 id=2234 data-nosnippet>2234</a>
-<a href=#2235 id=2235 data-nosnippet>2235</a> <span class="doccomment">/// Convert raw literal to literal.
-<a href=#2236 id=2236 data-nosnippet>2236</a> </span><span class="kw">pub fn </span>try_into(<span class="self">self</span>, ty: <span class="kw-2">&</span>Type) -> <span class="prelude-ty">Result</span><<span class="prelude-ty">Option</span><Literal>, Error> {
-<a href=#2237 id=2237 data-nosnippet>2237</a> <span class="self">self</span>.<span class="number">0</span>.try_into(ty)
-<a href=#2238 id=2238 data-nosnippet>2238</a> }
-<a href=#2239 id=2239 data-nosnippet>2239</a> }
-<a href=#2240 id=2240 data-nosnippet>2240</a>
-<a href=#2241 id=2241 data-nosnippet>2241</a> <span class="attr">#[derive(SerializeDerive, Clone, Debug)]
-<a href=#2242 id=2242 data-nosnippet>2242</a> #[serde(untagged)]
-<a href=#2243 id=2243 data-nosnippet>2243</a> </span><span class="kw">enum </span>RawLiteralEnum {
-<a href=#2244 id=2244 data-nosnippet>2244</a> Null,
-<a href=#2245 id=2245 data-nosnippet>2245</a> Boolean(bool),
-<a href=#2246 id=2246 data-nosnippet>2246</a> Int(i32),
-<a href=#2247 id=2247 data-nosnippet>2247</a> Long(i64),
-<a href=#2248 id=2248 data-nosnippet>2248</a> Float(f32),
-<a href=#2249 id=2249 data-nosnippet>2249</a> Double(f64),
-<a href=#2250 id=2250 data-nosnippet>2250</a> String(String),
-<a href=#2251 id=2251 data-nosnippet>2251</a> Bytes(ByteBuf),
-<a href=#2252 id=2252 data-nosnippet>2252</a> List(List),
-<a href=#2253 id=2253 data-nosnippet>2253</a> StringMap(StringMap),
-<a href=#2254 id=2254 data-nosnippet>2254</a> Record(Record),
-<a href=#2255 id=2255 data-nosnippet>2255</a> }
-<a href=#2256 id=2256 data-nosnippet>2256</a>
-<a href=#2257 id=2257 data-nosnippet>2257</a> <span class="attr">#[derive(Clone, Debug)]
-<a href=#2258 id=2258 data-nosnippet>2258</a> </span><span class="kw">struct </span>Record {
-<a href=#2259 id=2259 data-nosnippet>2259</a> required: Vec<(String, RawLiteralEnum)>,
-<a href=#2260 id=2260 data-nosnippet>2260</a> optional: Vec<(String, <span class="prelude-ty">Option</span><RawLiteralEnum>)>,
-<a href=#2261 id=2261 data-nosnippet>2261</a> }
-<a href=#2262 id=2262 data-nosnippet>2262</a>
-<a href=#2263 id=2263 data-nosnippet>2263</a> <span class="kw">impl </span>Serialize <span class="kw">for </span>Record {
-<a href=#2264 id=2264 data-nosnippet>2264</a> <span class="kw">fn </span>serialize<S>(<span class="kw-2">&</span><span class="self">self</span>, serializer: S) -> <span class="prelude-ty">Result</span><S::Ok, S::Error>
-<a href=#2265 id=2265 data-nosnippet>2265</a> <span class="kw">where </span>S: serde::Serializer {
-<a href=#2266 id=2266 data-nosnippet>2266</a> <span class="kw">let </span>len = <span class="self">self</span>.required.len() + <span class="self">self</span>.optional.len();
-<a href=#2267 id=2267 data-nosnippet>2267</a> <span class="kw">let </span><span class="kw-2">mut </span>record = serializer.serialize_struct(<span class="string">""</span>, len)<span class="question-mark">?</span>;
-<a href=#2268 id=2268 data-nosnippet>2268</a> <span class="kw">for </span>(k, v) <span class="kw">in </span><span class="kw-2">&</span><span class="self">self</span>.required {
-<a href=#2269 id=2269 data-nosnippet>2269</a> record.serialize_field(Box::leak(k.clone().into_boxed_str()), <span class="kw-2">&</span>v)<span class="question-mark">?</span>;
-<a href=#2270 id=2270 data-nosnippet>2270</a> }
-<a href=#2271 id=2271 data-nosnippet>2271</a> <span class="kw">for </span>(k, v) <span class="kw">in </span><span class="kw-2">&</span><span class="self">self</span>.optional {
-<a href=#2272 id=2272 data-nosnippet>2272</a> record.serialize_field(Box::leak(k.clone().into_boxed_str()), <span class="kw-2">&</span>v)<span class="question-mark">?</span>;
-<a href=#2273 id=2273 data-nosnippet>2273</a> }
-<a href=#2274 id=2274 data-nosnippet>2274</a> record.end()
-<a href=#2275 id=2275 data-nosnippet>2275</a> }
-<a href=#2276 id=2276 data-nosnippet>2276</a> }
-<a href=#2277 id=2277 data-nosnippet>2277</a>
-<a href=#2278 id=2278 data-nosnippet>2278</a> <span class="attr">#[derive(Clone, Debug)]
-<a href=#2279 id=2279 data-nosnippet>2279</a> </span><span class="kw">struct </span>List {
-<a href=#2280 id=2280 data-nosnippet>2280</a> list: Vec<<span class="prelude-ty">Option</span><RawLiteralEnum>>,
-<a href=#2281 id=2281 data-nosnippet>2281</a> required: bool,
-<a href=#2282 id=2282 data-nosnippet>2282</a> }
-<a href=#2283 id=2283 data-nosnippet>2283</a>
-<a href=#2284 id=2284 data-nosnippet>2284</a> <span class="kw">impl </span>Serialize <span class="kw">for </span>List {
-<a href=#2285 id=2285 data-nosnippet>2285</a> <span class="kw">fn </span>serialize<S>(<span class="kw-2">&</span><span class="self">self</span>, serializer: S) -> <span class="prelude-ty">Result</span><S::Ok, S::Error>
-<a href=#2286 id=2286 data-nosnippet>2286</a> <span class="kw">where </span>S: serde::Serializer {
-<a href=#2287 id=2287 data-nosnippet>2287</a> <span class="kw">let </span><span class="kw-2">mut </span>seq = serializer.serialize_seq(<span class="prelude-val">Some</span>(<span class="self">self</span>.list.len()))<span class="question-mark">?</span>;
-<a href=#2288 id=2288 data-nosnippet>2288</a> <span class="kw">for </span>value <span class="kw">in </span><span class="kw-2">&</span><span class="self">self</span>.list {
-<a href=#2289 id=2289 data-nosnippet>2289</a> <span class="kw">if </span><span class="self">self</span>.required {
-<a href=#2290 id=2290 data-nosnippet>2290</a> seq.serialize_element(value.as_ref().ok_or_else(|| {
-<a href=#2291 id=2291 data-nosnippet>2291</a> serde::ser::Error::custom(
-<a href=#2292 id=2292 data-nosnippet>2292</a> <span class="string">"List element is required, element cannot be null"</span>,
-<a href=#2293 id=2293 data-nosnippet>2293</a> )
-<a href=#2294 id=2294 data-nosnippet>2294</a> })<span class="question-mark">?</span>)<span class="question-mark">?</span>;
-<a href=#2295 id=2295 data-nosnippet>2295</a> } <span class="kw">else </span>{
-<a href=#2296 id=2296 data-nosnippet>2296</a> seq.serialize_element(<span class="kw-2">&</span>value)<span class="question-mark">?</span>;
-<a href=#2297 id=2297 data-nosnippet>2297</a> }
-<a href=#2298 id=2298 data-nosnippet>2298</a> }
-<a href=#2299 id=2299 data-nosnippet>2299</a> seq.end()
-<a href=#2300 id=2300 data-nosnippet>2300</a> }
-<a href=#2301 id=2301 data-nosnippet>2301</a> }
-<a href=#2302 id=2302 data-nosnippet>2302</a>
-<a href=#2303 id=2303 data-nosnippet>2303</a> <span class="attr">#[derive(Clone, Debug)]
-<a href=#2304 id=2304 data-nosnippet>2304</a> </span><span class="kw">struct </span>StringMap {
-<a href=#2305 id=2305 data-nosnippet>2305</a> raw: Vec<(String, <span class="prelude-ty">Option</span><RawLiteralEnum>)>,
-<a href=#2306 id=2306 data-nosnippet>2306</a> required: bool,
+<a href=#2224 id=2224 data-nosnippet>2224</a><span class="kw">mod </span>timestamptz {
+<a href=#2225 id=2225 data-nosnippet>2225</a> <span class="kw">use </span>chrono::{DateTime, Utc};
+<a href=#2226 id=2226 data-nosnippet>2226</a>
+<a href=#2227 id=2227 data-nosnippet>2227</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>datetimetz_to_microseconds(time: <span class="kw-2">&</span>DateTime<Utc>) -> i64 {
+<a href=#2228 id=2228 data-nosnippet>2228</a> time.timestamp_micros()
+<a href=#2229 id=2229 data-nosnippet>2229</a> }
+<a href=#2230 id=2230 data-nosnippet>2230</a>
+<a href=#2231 id=2231 data-nosnippet>2231</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>microseconds_to_datetimetz(micros: i64) -> DateTime<Utc> {
+<a href=#2232 id=2232 data-nosnippet>2232</a> <span class="kw">let </span>(secs, rem) = (micros / <span class="number">1_000_000</span>, micros % <span class="number">1_000_000</span>);
+<a href=#2233 id=2233 data-nosnippet>2233</a>
+<a href=#2234 id=2234 data-nosnippet>2234</a> DateTime::from_timestamp(secs, rem <span class="kw">as </span>u32 * <span class="number">1_000</span>).unwrap()
+<a href=#2235 id=2235 data-nosnippet>2235</a> }
+<a href=#2236 id=2236 data-nosnippet>2236</a>
+<a href=#2237 id=2237 data-nosnippet>2237</a> <span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">fn </span>nanoseconds_to_datetimetz(nanos: i64) -> DateTime<Utc> {
+<a href=#2238 id=2238 data-nosnippet>2238</a> <span class="kw">let </span>(secs, rem) = (nanos / <span class="number">1_000_000_000</span>, nanos % <span class="number">1_000_000_000</span>);
+<a href=#2239 id=2239 data-nosnippet>2239</a>
+<a href=#2240 id=2240 data-nosnippet>2240</a> DateTime::from_timestamp(secs, rem <span class="kw">as </span>u32).unwrap()
+<a href=#2241 id=2241 data-nosnippet>2241</a> }
+<a href=#2242 id=2242 data-nosnippet>2242</a>}
+<a href=#2243 id=2243 data-nosnippet>2243</a>
+<a href=#2244 id=2244 data-nosnippet>2244</a><span class="kw">mod </span>_serde {
+<a href=#2245 id=2245 data-nosnippet>2245</a> <span class="kw">use </span>serde::de::Visitor;
+<a href=#2246 id=2246 data-nosnippet>2246</a> <span class="kw">use </span>serde::ser::{SerializeMap, SerializeSeq, SerializeStruct};
+<a href=#2247 id=2247 data-nosnippet>2247</a> <span class="kw">use </span>serde::{Deserialize, Serialize};
+<a href=#2248 id=2248 data-nosnippet>2248</a> <span class="kw">use </span>serde_bytes::ByteBuf;
+<a href=#2249 id=2249 data-nosnippet>2249</a> <span class="kw">use </span>serde_derive::{Deserialize <span class="kw">as </span>DeserializeDerive, Serialize <span class="kw">as </span>SerializeDerive};
+<a href=#2250 id=2250 data-nosnippet>2250</a>
+<a href=#2251 id=2251 data-nosnippet>2251</a> <span class="kw">use super</span>::{Literal, Map, PrimitiveLiteral};
+<a href=#2252 id=2252 data-nosnippet>2252</a> <span class="kw">use </span><span class="kw">crate</span>::spec::{MAP_KEY_FIELD_NAME, MAP_VALUE_FIELD_NAME, PrimitiveType, Type};
+<a href=#2253 id=2253 data-nosnippet>2253</a> <span class="kw">use crate</span>::{Error, ErrorKind};
+<a href=#2254 id=2254 data-nosnippet>2254</a>
+<a href=#2255 id=2255 data-nosnippet>2255</a> <span class="attr">#[derive(SerializeDerive, DeserializeDerive, Debug)]
+<a href=#2256 id=2256 data-nosnippet>2256</a> #[serde(transparent)]
+<a href=#2257 id=2257 data-nosnippet>2257</a> </span><span class="doccomment">/// Raw literal representation used for serde. The serialize way is used for Avro serializer.
+<a href=#2258 id=2258 data-nosnippet>2258</a> </span><span class="kw">pub struct </span>RawLiteral(RawLiteralEnum);
+<a href=#2259 id=2259 data-nosnippet>2259</a>
+<a href=#2260 id=2260 data-nosnippet>2260</a> <span class="kw">impl </span>RawLiteral {
+<a href=#2261 id=2261 data-nosnippet>2261</a> <span class="doccomment">/// Covert literal to raw literal.
+<a href=#2262 id=2262 data-nosnippet>2262</a> </span><span class="kw">pub fn </span>try_from(literal: Literal, ty: <span class="kw-2">&</span>Type) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>, Error> {
+<a href=#2263 id=2263 data-nosnippet>2263</a> <span class="prelude-val">Ok</span>(<span class="self">Self</span>(RawLiteralEnum::try_from(literal, ty)<span class="question-mark">?</span>))
+<a href=#2264 id=2264 data-nosnippet>2264</a> }
+<a href=#2265 id=2265 data-nosnippet>2265</a>
+<a href=#2266 id=2266 data-nosnippet>2266</a> <span class="doccomment">/// Convert raw literal to literal.
+<a href=#2267 id=2267 data-nosnippet>2267</a> </span><span class="kw">pub fn </span>try_into(<span class="self">self</span>, ty: <span class="kw-2">&</span>Type) -> <span class="prelude-ty">Result</span><<span class="prelude-ty">Option</span><Literal>, Error> {
+<a href=#2268 id=2268 data-nosnippet>2268</a> <span class="self">self</span>.<span class="number">0</span>.try_into(ty)
+<a href=#2269 id=2269 data-nosnippet>2269</a> }
+<a href=#2270 id=2270 data-nosnippet>2270</a> }
+<a href=#2271 id=2271 data-nosnippet>2271</a>
+<a href=#2272 id=2272 data-nosnippet>2272</a> <span class="attr">#[derive(SerializeDerive, Clone, Debug)]
+<a href=#2273 id=2273 data-nosnippet>2273</a> #[serde(untagged)]
+<a href=#2274 id=2274 data-nosnippet>2274</a> </span><span class="kw">enum </span>RawLiteralEnum {
+<a href=#2275 id=2275 data-nosnippet>2275</a> Null,
+<a href=#2276 id=2276 data-nosnippet>2276</a> Boolean(bool),
+<a href=#2277 id=2277 data-nosnippet>2277</a> Int(i32),
+<a href=#2278 id=2278 data-nosnippet>2278</a> Long(i64),
+<a href=#2279 id=2279 data-nosnippet>2279</a> Float(f32),
+<a href=#2280 id=2280 data-nosnippet>2280</a> Double(f64),
+<a href=#2281 id=2281 data-nosnippet>2281</a> String(String),
+<a href=#2282 id=2282 data-nosnippet>2282</a> Bytes(ByteBuf),
+<a href=#2283 id=2283 data-nosnippet>2283</a> List(List),
+<a href=#2284 id=2284 data-nosnippet>2284</a> StringMap(StringMap),
+<a href=#2285 id=2285 data-nosnippet>2285</a> Record(Record),
+<a href=#2286 id=2286 data-nosnippet>2286</a> }
+<a href=#2287 id=2287 data-nosnippet>2287</a>
+<a href=#2288 id=2288 data-nosnippet>2288</a> <span class="attr">#[derive(Clone, Debug)]
+<a href=#2289 id=2289 data-nosnippet>2289</a> </span><span class="kw">struct </span>Record {
+<a href=#2290 id=2290 data-nosnippet>2290</a> required: Vec<(String, RawLiteralEnum)>,
+<a href=#2291 id=2291 data-nosnippet>2291</a> optional: Vec<(String, <span class="prelude-ty">Option</span><RawLiteralEnum>)>,
+<a href=#2292 id=2292 data-nosnippet>2292</a> }
+<a href=#2293 id=2293 data-nosnippet>2293</a>
+<a href=#2294 id=2294 data-nosnippet>2294</a> <span class="kw">impl </span>Serialize <span class="kw">for </span>Record {
+<a href=#2295 id=2295 data-nosnippet>2295</a> <span class="kw">fn </span>serialize<S>(<span class="kw-2">&</span><span class="self">self</span>, serializer: S) -> <span class="prelude-ty">Result</span><S::Ok, S::Error>
+<a href=#2296 id=2296 data-nosnippet>2296</a> <span class="kw">where </span>S: serde::Serializer {
+<a href=#2297 id=2297 data-nosnippet>2297</a> <span class="kw">let </span>len = <span class="self">self</span>.required.len() + <span class="self">self</span>.optional.len();
+<a href=#2298 id=2298 data-nosnippet>2298</a> <span class="kw">let </span><span class="kw-2">mut </span>record = serializer.serialize_struct(<span class="string">""</span>, len)<span class="question-mark">?</span>;
+<a href=#2299 id=2299 data-nosnippet>2299</a> <span class="kw">for </span>(k, v) <span class="kw">in </span><span class="kw-2">&</span><span class="self">self</span>.required {
+<a href=#2300 id=2300 data-nosnippet>2300</a> record.serialize_field(Box::leak(k.clone().into_boxed_str()), <span class="kw-2">&</span>v)<span class="question-mark">?</span>;
+<a href=#2301 id=2301 data-nosnippet>2301</a> }
+<a href=#2302 id=2302 data-nosnippet>2302</a> <span class="kw">for </span>(k, v) <span class="kw">in </span><span class="kw-2">&</span><span class="self">self</span>.optional {
+<a href=#2303 id=2303 data-nosnippet>2303</a> record.serialize_field(Box::leak(k.clone().into_boxed_str()), <span class="kw-2">&</span>v)<span class="question-mark">?</span>;
+<a href=#2304 id=2304 data-nosnippet>2304</a> }
+<a href=#2305 id=2305 data-nosnippet>2305</a> record.end()
+<a href=#2306 id=2306 data-nosnippet>2306</a> }
<a href=#2307 id=2307 data-nosnippet>2307</a> }
<a href=#2308 id=2308 data-nosnippet>2308</a>
-<a href=#2309 id=2309 data-nosnippet>2309</a> <span class="kw">impl </span>Serialize <span class="kw">for </span>StringMap {
-<a href=#2310 id=2310 data-nosnippet>2310</a> <span class="kw">fn </span>serialize<S>(<span class="kw-2">&</span><span class="self">self</span>, serializer: S) -> <span class="prelude-ty">Result</span><S::Ok, S::Error>
-<a href=#2311 id=2311 data-nosnippet>2311</a> <span class="kw">where </span>S: serde::Serializer {
-<a href=#2312 id=2312 data-nosnippet>2312</a> <span class="kw">let </span><span class="kw-2">mut </span>map = serializer.serialize_map(<span class="prelude-val">Some</span>(<span class="self">self</span>.raw.len()))<span class="question-mark">?</span>;
-<a href=#2313 id=2313 data-nosnippet>2313</a> <span class="kw">for </span>(k, v) <span class="kw">in </span><span class="kw-2">&</span><span class="self">self</span>.raw {
-<a href=#2314 id=2314 data-nosnippet>2314</a> <span class="kw">if </span><span class="self">self</span>.required {
-<a href=#2315 id=2315 data-nosnippet>2315</a> map.serialize_entry(
-<a href=#2316 id=2316 data-nosnippet>2316</a> k,
-<a href=#2317 id=2317 data-nosnippet>2317</a> v.as_ref().ok_or_else(|| {
-<a href=#2318 id=2318 data-nosnippet>2318</a> serde::ser::Error::custom(
-<a href=#2319 id=2319 data-nosnippet>2319</a> <span class="string">"Map element is required, element cannot be null"</span>,
-<a href=#2320 id=2320 data-nosnippet>2320</a> )
-<a href=#2321 id=2321 data-nosnippet>2321</a> })<span class="question-mark">?</span>,
-<a href=#2322 id=2322 data-nosnippet>2322</a> )<span class="question-mark">?</span>;
-<a href=#2323 id=2323 data-nosnippet>2323</a> } <span class="kw">else </span>{
-<a href=#2324 id=2324 data-nosnippet>2324</a> map.serialize_entry(k, v)<span class="question-mark">?</span>;
-<a href=#2325 id=2325 data-nosnippet>2325</a> }
-<a href=#2326 id=2326 data-nosnippet>2326</a> }
-<a href=#2327 id=2327 data-nosnippet>2327</a> map.end()
-<a href=#2328 id=2328 data-nosnippet>2328</a> }
-<a href=#2329 id=2329 data-nosnippet>2329</a> }
-<a href=#2330 id=2330 data-nosnippet>2330</a>
-<a href=#2331 id=2331 data-nosnippet>2331</a> <span class="kw">impl</span><<span class="lifetime">'de</span>> Deserialize<<span class="lifetime">'de</span>> <span class="kw">for </span>RawLiteralEnum {
-<a href=#2332 id=2332 data-nosnippet>2332</a> <span class="kw">fn </span>deserialize<D>(deserializer: D) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>, D::Error>
-<a href=#2333 id=2333 data-nosnippet>2333</a> <span class="kw">where </span>D: serde::Deserializer<<span class="lifetime">'de</span>> {
-<a href=#2334 id=2334 data-nosnippet>2334</a> <span class="kw">struct </span>RawLiteralVisitor;
-<a href=#2335 id=2335 data-nosnippet>2335</a> <span class="kw">impl</span><<span class="lifetime">'de</span>> Visitor<<span class="lifetime">'de</span>> <span class="kw">for </span>RawLiteralVisitor {
-<a href=#2336 id=2336 data-nosnippet>2336</a> <span class="kw">type </span>Value = RawLiteralEnum;
-<a href=#2337 id=2337 data-nosnippet>2337</a>
-<a href=#2338 id=2338 data-nosnippet>2338</a> <span class="kw">fn </span>expecting(<span class="kw-2">&</span><span class="self">self</span>, formatter: <span class="kw-2">&mut </span>std::fmt::Formatter) -> std::fmt::Result {
-<a href=#2339 id=2339 data-nosnippet>2339</a> formatter.write_str(<span class="string">"expect"</span>)
-<a href=#2340 id=2340 data-nosnippet>2340</a> }
-<a href=#2341 id=2341 data-nosnippet>2341</a>
-<a href=#2342 id=2342 data-nosnippet>2342</a> <span class="kw">fn </span>visit_bool<E>(<span class="self">self</span>, v: bool) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
-<a href=#2343 id=2343 data-nosnippet>2343</a> <span class="kw">where </span>E: serde::de::Error {
-<a href=#2344 id=2344 data-nosnippet>2344</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::Boolean(v))
-<a href=#2345 id=2345 data-nosnippet>2345</a> }
-<a href=#2346 id=2346 data-nosnippet>2346</a>
-<a href=#2347 id=2347 data-nosnippet>2347</a> <span class="kw">fn </span>visit_i32<E>(<span class="self">self</span>, v: i32) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
-<a href=#2348 id=2348 data-nosnippet>2348</a> <span class="kw">where </span>E: serde::de::Error {
-<a href=#2349 id=2349 data-nosnippet>2349</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::Int(v))
-<a href=#2350 id=2350 data-nosnippet>2350</a> }
-<a href=#2351 id=2351 data-nosnippet>2351</a>
-<a href=#2352 id=2352 data-nosnippet>2352</a> <span class="kw">fn </span>visit_i64<E>(<span class="self">self</span>, v: i64) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
-<a href=#2353 id=2353 data-nosnippet>2353</a> <span class="kw">where </span>E: serde::de::Error {
-<a href=#2354 id=2354 data-nosnippet>2354</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::Long(v))
-<a href=#2355 id=2355 data-nosnippet>2355</a> }
-<a href=#2356 id=2356 data-nosnippet>2356</a>
-<a href=#2357 id=2357 data-nosnippet>2357</a> <span class="doccomment">/// Used in json
-<a href=#2358 id=2358 data-nosnippet>2358</a> </span><span class="kw">fn </span>visit_u64<E>(<span class="self">self</span>, v: u64) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
-<a href=#2359 id=2359 data-nosnippet>2359</a> <span class="kw">where </span>E: serde::de::Error {
-<a href=#2360 id=2360 data-nosnippet>2360</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::Long(v <span class="kw">as </span>i64))
-<a href=#2361 id=2361 data-nosnippet>2361</a> }
-<a href=#2362 id=2362 data-nosnippet>2362</a>
-<a href=#2363 id=2363 data-nosnippet>2363</a> <span class="kw">fn </span>visit_f32<E>(<span class="self">self</span>, v: f32) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
-<a href=#2364 id=2364 data-nosnippet>2364</a> <span class="kw">where </span>E: serde::de::Error {
-<a href=#2365 id=2365 data-nosnippet>2365</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::Float(v))
-<a href=#2366 id=2366 data-nosnippet>2366</a> }
-<a href=#2367 id=2367 data-nosnippet>2367</a>
-<a href=#2368 id=2368 data-nosnippet>2368</a> <span class="kw">fn </span>visit_f64<E>(<span class="self">self</span>, v: f64) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
-<a href=#2369 id=2369 data-nosnippet>2369</a> <span class="kw">where </span>E: serde::de::Error {
-<a href=#2370 id=2370 data-nosnippet>2370</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::Double(v))
+<a href=#2309 id=2309 data-nosnippet>2309</a> <span class="attr">#[derive(Clone, Debug)]
+<a href=#2310 id=2310 data-nosnippet>2310</a> </span><span class="kw">struct </span>List {
+<a href=#2311 id=2311 data-nosnippet>2311</a> list: Vec<<span class="prelude-ty">Option</span><RawLiteralEnum>>,
+<a href=#2312 id=2312 data-nosnippet>2312</a> required: bool,
+<a href=#2313 id=2313 data-nosnippet>2313</a> }
+<a href=#2314 id=2314 data-nosnippet>2314</a>
+<a href=#2315 id=2315 data-nosnippet>2315</a> <span class="kw">impl </span>Serialize <span class="kw">for </span>List {
+<a href=#2316 id=2316 data-nosnippet>2316</a> <span class="kw">fn </span>serialize<S>(<span class="kw-2">&</span><span class="self">self</span>, serializer: S) -> <span class="prelude-ty">Result</span><S::Ok, S::Error>
+<a href=#2317 id=2317 data-nosnippet>2317</a> <span class="kw">where </span>S: serde::Serializer {
+<a href=#2318 id=2318 data-nosnippet>2318</a> <span class="kw">let </span><span class="kw-2">mut </span>seq = serializer.serialize_seq(<span class="prelude-val">Some</span>(<span class="self">self</span>.list.len()))<span class="question-mark">?</span>;
+<a href=#2319 id=2319 data-nosnippet>2319</a> <span class="kw">for </span>value <span class="kw">in </span><span class="kw-2">&</span><span class="self">self</span>.list {
+<a href=#2320 id=2320 data-nosnippet>2320</a> <span class="kw">if </span><span class="self">self</span>.required {
+<a href=#2321 id=2321 data-nosnippet>2321</a> seq.serialize_element(value.as_ref().ok_or_else(|| {
+<a href=#2322 id=2322 data-nosnippet>2322</a> serde::ser::Error::custom(
+<a href=#2323 id=2323 data-nosnippet>2323</a> <span class="string">"List element is required, element cannot be null"</span>,
+<a href=#2324 id=2324 data-nosnippet>2324</a> )
+<a href=#2325 id=2325 data-nosnippet>2325</a> })<span class="question-mark">?</span>)<span class="question-mark">?</span>;
+<a href=#2326 id=2326 data-nosnippet>2326</a> } <span class="kw">else </span>{
+<a href=#2327 id=2327 data-nosnippet>2327</a> seq.serialize_element(<span class="kw-2">&</span>value)<span class="question-mark">?</span>;
+<a href=#2328 id=2328 data-nosnippet>2328</a> }
+<a href=#2329 id=2329 data-nosnippet>2329</a> }
+<a href=#2330 id=2330 data-nosnippet>2330</a> seq.end()
+<a href=#2331 id=2331 data-nosnippet>2331</a> }
+<a href=#2332 id=2332 data-nosnippet>2332</a> }
+<a href=#2333 id=2333 data-nosnippet>2333</a>
+<a href=#2334 id=2334 data-nosnippet>2334</a> <span class="attr">#[derive(Clone, Debug)]
+<a href=#2335 id=2335 data-nosnippet>2335</a> </span><span class="kw">struct </span>StringMap {
+<a href=#2336 id=2336 data-nosnippet>2336</a> raw: Vec<(String, <span class="prelude-ty">Option</span><RawLiteralEnum>)>,
+<a href=#2337 id=2337 data-nosnippet>2337</a> required: bool,
+<a href=#2338 id=2338 data-nosnippet>2338</a> }
+<a href=#2339 id=2339 data-nosnippet>2339</a>
+<a href=#2340 id=2340 data-nosnippet>2340</a> <span class="kw">impl </span>Serialize <span class="kw">for </span>StringMap {
+<a href=#2341 id=2341 data-nosnippet>2341</a> <span class="kw">fn </span>serialize<S>(<span class="kw-2">&</span><span class="self">self</span>, serializer: S) -> <span class="prelude-ty">Result</span><S::Ok, S::Error>
+<a href=#2342 id=2342 data-nosnippet>2342</a> <span class="kw">where </span>S: serde::Serializer {
+<a href=#2343 id=2343 data-nosnippet>2343</a> <span class="kw">let </span><span class="kw-2">mut </span>map = serializer.serialize_map(<span class="prelude-val">Some</span>(<span class="self">self</span>.raw.len()))<span class="question-mark">?</span>;
+<a href=#2344 id=2344 data-nosnippet>2344</a> <span class="kw">for </span>(k, v) <span class="kw">in </span><span class="kw-2">&</span><span class="self">self</span>.raw {
+<a href=#2345 id=2345 data-nosnippet>2345</a> <span class="kw">if </span><span class="self">self</span>.required {
+<a href=#2346 id=2346 data-nosnippet>2346</a> map.serialize_entry(
+<a href=#2347 id=2347 data-nosnippet>2347</a> k,
+<a href=#2348 id=2348 data-nosnippet>2348</a> v.as_ref().ok_or_else(|| {
+<a href=#2349 id=2349 data-nosnippet>2349</a> serde::ser::Error::custom(
+<a href=#2350 id=2350 data-nosnippet>2350</a> <span class="string">"Map element is required, element cannot be null"</span>,
+<a href=#2351 id=2351 data-nosnippet>2351</a> )
+<a href=#2352 id=2352 data-nosnippet>2352</a> })<span class="question-mark">?</span>,
+<a href=#2353 id=2353 data-nosnippet>2353</a> )<span class="question-mark">?</span>;
+<a href=#2354 id=2354 data-nosnippet>2354</a> } <span class="kw">else </span>{
+<a href=#2355 id=2355 data-nosnippet>2355</a> map.serialize_entry(k, v)<span class="question-mark">?</span>;
+<a href=#2356 id=2356 data-nosnippet>2356</a> }
+<a href=#2357 id=2357 data-nosnippet>2357</a> }
+<a href=#2358 id=2358 data-nosnippet>2358</a> map.end()
+<a href=#2359 id=2359 data-nosnippet>2359</a> }
+<a href=#2360 id=2360 data-nosnippet>2360</a> }
+<a href=#2361 id=2361 data-nosnippet>2361</a>
+<a href=#2362 id=2362 data-nosnippet>2362</a> <span class="kw">impl</span><<span class="lifetime">'de</span>> Deserialize<<span class="lifetime">'de</span>> <span class="kw">for </span>RawLiteralEnum {
+<a href=#2363 id=2363 data-nosnippet>2363</a> <span class="kw">fn </span>deserialize<D>(deserializer: D) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>, D::Error>
+<a href=#2364 id=2364 data-nosnippet>2364</a> <span class="kw">where </span>D: serde::Deserializer<<span class="lifetime">'de</span>> {
+<a href=#2365 id=2365 data-nosnippet>2365</a> <span class="kw">struct </span>RawLiteralVisitor;
+<a href=#2366 id=2366 data-nosnippet>2366</a> <span class="kw">impl</span><<span class="lifetime">'de</span>> Visitor<<span class="lifetime">'de</span>> <span class="kw">for </span>RawLiteralVisitor {
+<a href=#2367 id=2367 data-nosnippet>2367</a> <span class="kw">type </span>Value = RawLiteralEnum;
+<a href=#2368 id=2368 data-nosnippet>2368</a>
+<a href=#2369 id=2369 data-nosnippet>2369</a> <span class="kw">fn </span>expecting(<span class="kw-2">&</span><span class="self">self</span>, formatter: <span class="kw-2">&mut </span>std::fmt::Formatter) -> std::fmt::Result {
+<a href=#2370 id=2370 data-nosnippet>2370</a> formatter.write_str(<span class="string">"expect"</span>)
<a href=#2371 id=2371 data-nosnippet>2371</a> }
<a href=#2372 id=2372 data-nosnippet>2372</a>
-<a href=#2373 id=2373 data-nosnippet>2373</a> <span class="kw">fn </span>visit_str<E>(<span class="self">self</span>, v: <span class="kw-2">&</span>str) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
+<a href=#2373 id=2373 data-nosnippet>2373</a> <span class="kw">fn </span>visit_bool<E>(<span class="self">self</span>, v: bool) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
<a href=#2374 id=2374 data-nosnippet>2374</a> <span class="kw">where </span>E: serde::de::Error {
-<a href=#2375 id=2375 data-nosnippet>2375</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::String(v.to_string()))
+<a href=#2375 id=2375 data-nosnippet>2375</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::Boolean(v))
<a href=#2376 id=2376 data-nosnippet>2376</a> }
<a href=#2377 id=2377 data-nosnippet>2377</a>
-<a href=#2378 id=2378 data-nosnippet>2378</a> <span class="kw">fn </span>visit_bytes<E>(<span class="self">self</span>, v: <span class="kw-2">&</span>[u8]) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
+<a href=#2378 id=2378 data-nosnippet>2378</a> <span class="kw">fn </span>visit_i32<E>(<span class="self">self</span>, v: i32) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
<a href=#2379 id=2379 data-nosnippet>2379</a> <span class="kw">where </span>E: serde::de::Error {
-<a href=#2380 id=2380 data-nosnippet>2380</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::Bytes(ByteBuf::from(v)))
+<a href=#2380 id=2380 data-nosnippet>2380</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::Int(v))
<a href=#2381 id=2381 data-nosnippet>2381</a> }
<a href=#2382 id=2382 data-nosnippet>2382</a>
-<a href=#2383 id=2383 data-nosnippet>2383</a> <span class="kw">fn </span>visit_borrowed_str<E>(<span class="self">self</span>, v: <span class="kw-2">&</span><span class="lifetime">'de </span>str) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
+<a href=#2383 id=2383 data-nosnippet>2383</a> <span class="kw">fn </span>visit_i64<E>(<span class="self">self</span>, v: i64) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
<a href=#2384 id=2384 data-nosnippet>2384</a> <span class="kw">where </span>E: serde::de::Error {
-<a href=#2385 id=2385 data-nosnippet>2385</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::String(v.to_string()))
+<a href=#2385 id=2385 data-nosnippet>2385</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::Long(v))
<a href=#2386 id=2386 data-nosnippet>2386</a> }
<a href=#2387 id=2387 data-nosnippet>2387</a>
-<a href=#2388 id=2388 data-nosnippet>2388</a> <span class="kw">fn </span>visit_unit<E>(<span class="self">self</span>) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
-<a href=#2389 id=2389 data-nosnippet>2389</a> <span class="kw">where </span>E: serde::de::Error {
-<a href=#2390 id=2390 data-nosnippet>2390</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::Null)
-<a href=#2391 id=2391 data-nosnippet>2391</a> }
-<a href=#2392 id=2392 data-nosnippet>2392</a>
-<a href=#2393 id=2393 data-nosnippet>2393</a> <span class="kw">fn </span>visit_map<A>(<span class="self">self</span>, <span class="kw-2">mut </span>map: A) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, A::Error>
-<a href=#2394 id=2394 data-nosnippet>2394</a> <span class="kw">where </span>A: serde::de::MapAccess<<span class="lifetime">'de</span>> {
-<a href=#2395 id=2395 data-nosnippet>2395</a> <span class="kw">let </span><span class="kw-2">mut </span>required = Vec::new();
-<a href=#2396 id=2396 data-nosnippet>2396</a> <span class="kw">while let </span><span class="prelude-val">Some</span>(key) = map.next_key::<String>()<span class="question-mark">? </span>{
-<a href=#2397 id=2397 data-nosnippet>2397</a> <span class="kw">let </span>value = map.next_value::<RawLiteralEnum>()<span class="question-mark">?</span>;
-<a href=#2398 id=2398 data-nosnippet>2398</a> required.push((key, value));
-<a href=#2399 id=2399 data-nosnippet>2399</a> }
-<a href=#2400 id=2400 data-nosnippet>2400</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::Record(Record {
-<a href=#2401 id=2401 data-nosnippet>2401</a> required,
-<a href=#2402 id=2402 data-nosnippet>2402</a> optional: Vec::new(),
-<a href=#2403 id=2403 data-nosnippet>2403</a> }))
-<a href=#2404 id=2404 data-nosnippet>2404</a> }
-<a href=#2405 id=2405 data-nosnippet>2405</a>
-<a href=#2406 id=2406 data-nosnippet>2406</a> <span class="kw">fn </span>visit_seq<A>(<span class="self">self</span>, <span class="kw-2">mut </span>seq: A) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, A::Error>
-<a href=#2407 id=2407 data-nosnippet>2407</a> <span class="kw">where </span>A: serde::de::SeqAccess<<span class="lifetime">'de</span>> {
-<a href=#2408 id=2408 data-nosnippet>2408</a> <span class="kw">let </span><span class="kw-2">mut </span>list = Vec::new();
-<a href=#2409 id=2409 data-nosnippet>2409</a> <span class="kw">while let </span><span class="prelude-val">Some</span>(value) = seq.next_element::<RawLiteralEnum>()<span class="question-mark">? </span>{
-<a href=#2410 id=2410 data-nosnippet>2410</a> list.push(<span class="prelude-val">Some</span>(value));
-<a href=#2411 id=2411 data-nosnippet>2411</a> }
-<a href=#2412 id=2412 data-nosnippet>2412</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::List(List {
-<a href=#2413 id=2413 data-nosnippet>2413</a> list,
-<a href=#2414 id=2414 data-nosnippet>2414</a> <span class="comment">// `required` only used in serialize, just set default in deserialize.
-<a href=#2415 id=2415 data-nosnippet>2415</a> </span>required: <span class="bool-val">false</span>,
-<a href=#2416 id=2416 data-nosnippet>2416</a> }))
+<a href=#2388 id=2388 data-nosnippet>2388</a> <span class="doccomment">/// Used in json
+<a href=#2389 id=2389 data-nosnippet>2389</a> </span><span class="kw">fn </span>visit_u64<E>(<span class="self">self</span>, v: u64) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
+<a href=#2390 id=2390 data-nosnippet>2390</a> <span class="kw">where </span>E: serde::de::Error {
+<a href=#2391 id=2391 data-nosnippet>2391</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::Long(v <span class="kw">as </span>i64))
+<a href=#2392 id=2392 data-nosnippet>2392</a> }
+<a href=#2393 id=2393 data-nosnippet>2393</a>
+<a href=#2394 id=2394 data-nosnippet>2394</a> <span class="kw">fn </span>visit_f32<E>(<span class="self">self</span>, v: f32) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
+<a href=#2395 id=2395 data-nosnippet>2395</a> <span class="kw">where </span>E: serde::de::Error {
+<a href=#2396 id=2396 data-nosnippet>2396</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::Float(v))
+<a href=#2397 id=2397 data-nosnippet>2397</a> }
+<a href=#2398 id=2398 data-nosnippet>2398</a>
+<a href=#2399 id=2399 data-nosnippet>2399</a> <span class="kw">fn </span>visit_f64<E>(<span class="self">self</span>, v: f64) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
+<a href=#2400 id=2400 data-nosnippet>2400</a> <span class="kw">where </span>E: serde::de::Error {
+<a href=#2401 id=2401 data-nosnippet>2401</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::Double(v))
+<a href=#2402 id=2402 data-nosnippet>2402</a> }
+<a href=#2403 id=2403 data-nosnippet>2403</a>
+<a href=#2404 id=2404 data-nosnippet>2404</a> <span class="kw">fn </span>visit_str<E>(<span class="self">self</span>, v: <span class="kw-2">&</span>str) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
+<a href=#2405 id=2405 data-nosnippet>2405</a> <span class="kw">where </span>E: serde::de::Error {
+<a href=#2406 id=2406 data-nosnippet>2406</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::String(v.to_string()))
+<a href=#2407 id=2407 data-nosnippet>2407</a> }
+<a href=#2408 id=2408 data-nosnippet>2408</a>
+<a href=#2409 id=2409 data-nosnippet>2409</a> <span class="kw">fn </span>visit_bytes<E>(<span class="self">self</span>, v: <span class="kw-2">&</span>[u8]) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
+<a href=#2410 id=2410 data-nosnippet>2410</a> <span class="kw">where </span>E: serde::de::Error {
+<a href=#2411 id=2411 data-nosnippet>2411</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::Bytes(ByteBuf::from(v)))
+<a href=#2412 id=2412 data-nosnippet>2412</a> }
+<a href=#2413 id=2413 data-nosnippet>2413</a>
+<a href=#2414 id=2414 data-nosnippet>2414</a> <span class="kw">fn </span>visit_borrowed_str<E>(<span class="self">self</span>, v: <span class="kw-2">&</span><span class="lifetime">'de </span>str) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
+<a href=#2415 id=2415 data-nosnippet>2415</a> <span class="kw">where </span>E: serde::de::Error {
+<a href=#2416 id=2416 data-nosnippet>2416</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::String(v.to_string()))
<a href=#2417 id=2417 data-nosnippet>2417</a> }
-<a href=#2418 id=2418 data-nosnippet>2418</a> }
-<a href=#2419 id=2419 data-nosnippet>2419</a> deserializer.deserialize_any(RawLiteralVisitor)
-<a href=#2420 id=2420 data-nosnippet>2420</a> }
-<a href=#2421 id=2421 data-nosnippet>2421</a> }
-<a href=#2422 id=2422 data-nosnippet>2422</a>
-<a href=#2423 id=2423 data-nosnippet>2423</a> <span class="kw">impl </span>RawLiteralEnum {
-<a href=#2424 id=2424 data-nosnippet>2424</a> <span class="kw">pub fn </span>try_from(literal: Literal, ty: <span class="kw-2">&</span>Type) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>, Error> {
-<a href=#2425 id=2425 data-nosnippet>2425</a> <span class="kw">let </span>raw = <span class="kw">match </span>literal {
-<a href=#2426 id=2426 data-nosnippet>2426</a> Literal::Primitive(prim) => <span class="kw">match </span>prim {
-<a href=#2427 id=2427 data-nosnippet>2427</a> <span class="kw">super</span>::PrimitiveLiteral::Boolean(v) => RawLiteralEnum::Boolean(v),
-<a href=#2428 id=2428 data-nosnippet>2428</a> <span class="kw">super</span>::PrimitiveLiteral::Int(v) => RawLiteralEnum::Int(v),
-<a href=#2429 id=2429 data-nosnippet>2429</a> <span class="kw">super</span>::PrimitiveLiteral::Long(v) => RawLiteralEnum::Long(v),
-<a href=#2430 id=2430 data-nosnippet>2430</a> <span class="kw">super</span>::PrimitiveLiteral::Float(v) => RawLiteralEnum::Float(v.<span class="number">0</span>),
-<a href=#2431 id=2431 data-nosnippet>2431</a> <span class="kw">super</span>::PrimitiveLiteral::Double(v) => RawLiteralEnum::Double(v.<span class="number">0</span>),
-<a href=#2432 id=2432 data-nosnippet>2432</a> <span class="kw">super</span>::PrimitiveLiteral::String(v) => RawLiteralEnum::String(v),
-<a href=#2433 id=2433 data-nosnippet>2433</a> <span class="kw">super</span>::PrimitiveLiteral::UInt128(v) => {
-<a href=#2434 id=2434 data-nosnippet>2434</a> RawLiteralEnum::Bytes(ByteBuf::from(v.to_be_bytes()))
-<a href=#2435 id=2435 data-nosnippet>2435</a> }
-<a href=#2436 id=2436 data-nosnippet>2436</a> <span class="kw">super</span>::PrimitiveLiteral::Binary(v) => RawLiteralEnum::Bytes(ByteBuf::from(v)),
-<a href=#2437 id=2437 data-nosnippet>2437</a> <span class="kw">super</span>::PrimitiveLiteral::Int128(v) => {
-<a href=#2438 id=2438 data-nosnippet>2438</a> RawLiteralEnum::Bytes(ByteBuf::from(v.to_be_bytes()))
-<a href=#2439 id=2439 data-nosnippet>2439</a> }
-<a href=#2440 id=2440 data-nosnippet>2440</a> <span class="kw">super</span>::PrimitiveLiteral::AboveMax | <span class="kw">super</span>::PrimitiveLiteral::BelowMin => {
-<a href=#2441 id=2441 data-nosnippet>2441</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
-<a href=#2442 id=2442 data-nosnippet>2442</a> ErrorKind::DataInvalid,
-<a href=#2443 id=2443 data-nosnippet>2443</a> <span class="string">"Can't convert AboveMax or BelowMax"</span>,
-<a href=#2444 id=2444 data-nosnippet>2444</a> ));
-<a href=#2445 id=2445 data-nosnippet>2445</a> }
-<a href=#2446 id=2446 data-nosnippet>2446</a> },
-<a href=#2447 id=2447 data-nosnippet>2447</a> Literal::Struct(r#struct) => {
-<a href=#2448 id=2448 data-nosnippet>2448</a> <span class="kw">let </span><span class="kw-2">mut </span>required = Vec::new();
-<a href=#2449 id=2449 data-nosnippet>2449</a> <span class="kw">let </span><span class="kw-2">mut </span>optional = Vec::new();
-<a href=#2450 id=2450 data-nosnippet>2450</a> <span class="kw">if let </span>Type::Struct(struct_ty) = ty {
-<a href=#2451 id=2451 data-nosnippet>2451</a> <span class="kw">for </span>(value, field) <span class="kw">in </span>r#struct.into_iter().zip(struct_ty.fields()) {
-<a href=#2452 id=2452 data-nosnippet>2452</a> <span class="kw">if </span>field.required {
-<a href=#2453 id=2453 data-nosnippet>2453</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(value) = value {
-<a href=#2454 id=2454 data-nosnippet>2454</a> required.push((
-<a href=#2455 id=2455 data-nosnippet>2455</a> field.name.clone(),
-<a href=#2456 id=2456 data-nosnippet>2456</a> RawLiteralEnum::try_from(value, <span class="kw-2">&</span>field.field_type)<span class="question-mark">?</span>,
-<a href=#2457 id=2457 data-nosnippet>2457</a> ));
-<a href=#2458 id=2458 data-nosnippet>2458</a> } <span class="kw">else </span>{
-<a href=#2459 id=2459 data-nosnippet>2459</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
-<a href=#2460 id=2460 data-nosnippet>2460</a> ErrorKind::DataInvalid,
-<a href=#2461 id=2461 data-nosnippet>2461</a> <span class="string">"Can't convert null to required field"</span>,
-<a href=#2462 id=2462 data-nosnippet>2462</a> ));
-<a href=#2463 id=2463 data-nosnippet>2463</a> }
-<a href=#2464 id=2464 data-nosnippet>2464</a> } <span class="kw">else if let </span><span class="prelude-val">Some</span>(value) = value {
-<a href=#2465 id=2465 data-nosnippet>2465</a> optional.push((
-<a href=#2466 id=2466 data-nosnippet>2466</a> field.name.clone(),
-<a href=#2467 id=2467 data-nosnippet>2467</a> <span class="prelude-val">Some</span>(RawLiteralEnum::try_from(value, <span class="kw-2">&</span>field.field_type)<span class="question-mark">?</span>),
-<a href=#2468 id=2468 data-nosnippet>2468</a> ));
-<a href=#2469 id=2469 data-nosnippet>2469</a> } <span class="kw">else </span>{
-<a href=#2470 id=2470 data-nosnippet>2470</a> optional.push((field.name.clone(), <span class="prelude-val">None</span>));
-<a href=#2471 id=2471 data-nosnippet>2471</a> }
-<a href=#2472 id=2472 data-nosnippet>2472</a> }
-<a href=#2473 id=2473 data-nosnippet>2473</a> } <span class="kw">else </span>{
-<a href=#2474 id=2474 data-nosnippet>2474</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
-<a href=#2475 id=2475 data-nosnippet>2475</a> ErrorKind::DataInvalid,
-<a href=#2476 id=2476 data-nosnippet>2476</a> <span class="macro">format!</span>(<span class="string">"Type {} should be a struct"</span>, ty),
-<a href=#2477 id=2477 data-nosnippet>2477</a> ));
-<a href=#2478 id=2478 data-nosnippet>2478</a> }
-<a href=#2479 id=2479 data-nosnippet>2479</a> RawLiteralEnum::Record(Record { required, optional })
-<a href=#2480 id=2480 data-nosnippet>2480</a> }
-<a href=#2481 id=2481 data-nosnippet>2481</a> Literal::List(list) => {
-<a href=#2482 id=2482 data-nosnippet>2482</a> <span class="kw">if let </span>Type::List(list_ty) = ty {
-<a href=#2483 id=2483 data-nosnippet>2483</a> <span class="kw">let </span>list = list
-<a href=#2484 id=2484 data-nosnippet>2484</a> .into_iter()
-<a href=#2485 id=2485 data-nosnippet>2485</a> .map(|v| {
-<a href=#2486 id=2486 data-nosnippet>2486</a> v.map(|v| {
-<a href=#2487 id=2487 data-nosnippet>2487</a> RawLiteralEnum::try_from(v, <span class="kw-2">&</span>list_ty.element_field.field_type)
-<a href=#2488 id=2488 data-nosnippet>2488</a> })
-<a href=#2489 id=2489 data-nosnippet>2489</a> .transpose()
-<a href=#2490 id=2490 data-nosnippet>2490</a> })
-<a href=#2491 id=2491 data-nosnippet>2491</a> .collect::<<span class="prelude-ty">Result</span><<span class="kw">_</span>, Error>>()<span class="question-mark">?</span>;
-<a href=#2492 id=2492 data-nosnippet>2492</a> RawLiteralEnum::List(List {
-<a href=#2493 id=2493 data-nosnippet>2493</a> list,
-<a href=#2494 id=2494 data-nosnippet>2494</a> required: list_ty.element_field.required,
-<a href=#2495 id=2495 data-nosnippet>2495</a> })
-<a href=#2496 id=2496 data-nosnippet>2496</a> } <span class="kw">else </span>{
-<a href=#2497 id=2497 data-nosnippet>2497</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
-<a href=#2498 id=2498 data-nosnippet>2498</a> ErrorKind::DataInvalid,
-<a href=#2499 id=2499 data-nosnippet>2499</a> <span class="macro">format!</span>(<span class="string">"Type {} should be a list"</span>, ty),
-<a href=#2500 id=2500 data-nosnippet>2500</a> ));
-<a href=#2501 id=2501 data-nosnippet>2501</a> }
-<a href=#2502 id=2502 data-nosnippet>2502</a> }
-<a href=#2503 id=2503 data-nosnippet>2503</a> Literal::Map(map) => {
-<a href=#2504 id=2504 data-nosnippet>2504</a> <span class="kw">if let </span>Type::Map(map_ty) = ty {
-<a href=#2505 id=2505 data-nosnippet>2505</a> <span class="kw">if let </span>Type::Primitive(PrimitiveType::String) = <span class="kw-2">*</span>map_ty.key_field.field_type
-<a href=#2506 id=2506 data-nosnippet>2506</a> {
-<a href=#2507 id=2507 data-nosnippet>2507</a> <span class="kw">let </span><span class="kw-2">mut </span>raw = Vec::with_capacity(map.len());
-<a href=#2508 id=2508 data-nosnippet>2508</a> <span class="kw">for </span>(k, v) <span class="kw">in </span>map {
-<a href=#2509 id=2509 data-nosnippet>2509</a> <span class="kw">if let </span>Literal::Primitive(PrimitiveLiteral::String(k)) = k {
-<a href=#2510 id=2510 data-nosnippet>2510</a> raw.push((
-<a href=#2511 id=2511 data-nosnippet>2511</a> k,
-<a href=#2512 id=2512 data-nosnippet>2512</a> v.map(|v| {
-<a href=#2513 id=2513 data-nosnippet>2513</a> RawLiteralEnum::try_from(
-<a href=#2514 id=2514 data-nosnippet>2514</a> v,
-<a href=#2515 id=2515 data-nosnippet>2515</a> <span class="kw-2">&</span>map_ty.value_field.field_type,
-<a href=#2516 id=2516 data-nosnippet>2516</a> )
-<a href=#2517 id=2517 data-nosnippet>2517</a> })
-<a href=#2518 id=2518 data-nosnippet>2518</a> .transpose()<span class="question-mark">?</span>,
-<a href=#2519 id=2519 data-nosnippet>2519</a> ));
-<a href=#2520 id=2520 data-nosnippet>2520</a> } <span class="kw">else </span>{
-<a href=#2521 id=2521 data-nosnippet>2521</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
-<a href=#2522 id=2522 data-nosnippet>2522</a> ErrorKind::DataInvalid,
-<a href=#2523 id=2523 data-nosnippet>2523</a> <span class="string">"literal type is inconsistent with type"</span>,
-<a href=#2524 id=2524 data-nosnippet>2524</a> ));
-<a href=#2525 id=2525 data-nosnippet>2525</a> }
-<a href=#2526 id=2526 data-nosnippet>2526</a> }
-<a href=#2527 id=2527 data-nosnippet>2527</a> RawLiteralEnum::StringMap(StringMap {
-<a href=#2528 id=2528 data-nosnippet>2528</a> raw,
-<a href=#2529 id=2529 data-nosnippet>2529</a> required: map_ty.value_field.required,
-<a href=#2530 id=2530 data-nosnippet>2530</a> })
-<a href=#2531 id=2531 data-nosnippet>2531</a> } <span class="kw">else </span>{
-<a href=#2532 id=2532 data-nosnippet>2532</a> <span class="kw">let </span>list = map.into_iter().map(|(k,v)| {
-<a href=#2533 id=2533 data-nosnippet>2533</a> <span class="kw">let </span>raw_k =
-<a href=#2534 id=2534 data-nosnippet>2534</a> RawLiteralEnum::try_from(k, <span class="kw-2">&</span>map_ty.key_field.field_type)<span class="question-mark">?</span>;
-<a href=#2535 id=2535 data-nosnippet>2535</a> <span class="kw">let </span>raw_v = v
-<a href=#2536 id=2536 data-nosnippet>2536</a> .map(|v| {
-<a href=#2537 id=2537 data-nosnippet>2537</a> RawLiteralEnum::try_from(v, <span class="kw-2">&</span>map_ty.value_field.field_type)
-<a href=#2538 id=2538 data-nosnippet>2538</a> })
-<a href=#2539 id=2539 data-nosnippet>2539</a> .transpose()<span class="question-mark">?</span>;
-<a href=#2540 id=2540 data-nosnippet>2540</a> <span class="kw">if </span>map_ty.value_field.required {
-<a href=#2541 id=2541 data-nosnippet>2541</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(RawLiteralEnum::Record(Record {
-<a href=#2542 id=2542 data-nosnippet>2542</a> required: <span class="macro">vec!</span>[
-<a href=#2543 id=2543 data-nosnippet>2543</a> (MAP_KEY_FIELD_NAME.to_string(), raw_k),
-<a href=#2544 id=2544 data-nosnippet>2544</a> (MAP_VALUE_FIELD_NAME.to_string(), raw_v.ok_or_else(||Error::new(ErrorKind::DataInvalid, <span class="string">"Map value is required, value cannot be null"</span>))<span class="question-mark">?</span>),
-<a href=#2545 id=2545 data-nosnippet>2545</a> ],
-<a href=#2546 id=2546 data-nosnippet>2546</a> optional: <span class="macro">vec!</span>[],
-<a href=#2547 id=2547 data-nosnippet>2547</a> })))
-<a href=#2548 id=2548 data-nosnippet>2548</a> } <span class="kw">else </span>{
-<a href=#2549 id=2549 data-nosnippet>2549</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(RawLiteralEnum::Record(Record {
-<a href=#2550 id=2550 data-nosnippet>2550</a> required: <span class="macro">vec!</span>[
-<a href=#2551 id=2551 data-nosnippet>2551</a> (MAP_KEY_FIELD_NAME.to_string(), raw_k),
-<a href=#2552 id=2552 data-nosnippet>2552</a> ],
-<a href=#2553 id=2553 data-nosnippet>2553</a> optional: <span class="macro">vec!</span>[
-<a href=#2554 id=2554 data-nosnippet>2554</a> (MAP_VALUE_FIELD_NAME.to_string(), raw_v)
-<a href=#2555 id=2555 data-nosnippet>2555</a> ],
-<a href=#2556 id=2556 data-nosnippet>2556</a> })))
-<a href=#2557 id=2557 data-nosnippet>2557</a> }
-<a href=#2558 id=2558 data-nosnippet>2558</a> }).collect::<<span class="prelude-ty">Result</span><<span class="kw">_</span>, Error>>()<span class="question-mark">?</span>;
-<a href=#2559 id=2559 data-nosnippet>2559</a> RawLiteralEnum::List(List {
-<a href=#2560 id=2560 data-nosnippet>2560</a> list,
-<a href=#2561 id=2561 data-nosnippet>2561</a> required: <span class="bool-val">true</span>,
-<a href=#2562 id=2562 data-nosnippet>2562</a> })
-<a href=#2563 id=2563 data-nosnippet>2563</a> }
-<a href=#2564 id=2564 data-nosnippet>2564</a> } <span class="kw">else </span>{
-<a href=#2565 id=2565 data-nosnippet>2565</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
-<a href=#2566 id=2566 data-nosnippet>2566</a> ErrorKind::DataInvalid,
-<a href=#2567 id=2567 data-nosnippet>2567</a> <span class="macro">format!</span>(<span class="string">"Type {} should be a map"</span>, ty),
-<a href=#2568 id=2568 data-nosnippet>2568</a> ));
-<a href=#2569 id=2569 data-nosnippet>2569</a> }
-<a href=#2570 id=2570 data-nosnippet>2570</a> }
-<a href=#2571 id=2571 data-nosnippet>2571</a> };
-<a href=#2572 id=2572 data-nosnippet>2572</a> <span class="prelude-val">Ok</span>(raw)
-<a href=#2573 id=2573 data-nosnippet>2573</a> }
-<a href=#2574 id=2574 data-nosnippet>2574</a>
-<a href=#2575 id=2575 data-nosnippet>2575</a> <span class="kw">pub fn </span>try_into(<span class="self">self</span>, ty: <span class="kw-2">&</span>Type) -> <span class="prelude-ty">Result</span><<span class="prelude-ty">Option</span><Literal>, Error> {
-<a href=#2576 id=2576 data-nosnippet>2576</a> <span class="kw">let </span>invalid_err = |v: <span class="kw-2">&</span>str| {
-<a href=#2577 id=2577 data-nosnippet>2577</a> Error::new(
-<a href=#2578 id=2578 data-nosnippet>2578</a> ErrorKind::DataInvalid,
-<a href=#2579 id=2579 data-nosnippet>2579</a> <span class="macro">format!</span>(
-<a href=#2580 id=2580 data-nosnippet>2580</a> <span class="string">"Unable to convert raw literal ({}) fail convert to type {} for: type mismatch"</span>,
-<a href=#2581 id=2581 data-nosnippet>2581</a> v, ty
-<a href=#2582 id=2582 data-nosnippet>2582</a> ),
-<a href=#2583 id=2583 data-nosnippet>2583</a> )
-<a href=#2584 id=2584 data-nosnippet>2584</a> };
-<a href=#2585 id=2585 data-nosnippet>2585</a> <span class="kw">let </span>invalid_err_with_reason = |v: <span class="kw-2">&</span>str, reason: <span class="kw-2">&</span>str| {
-<a href=#2586 id=2586 data-nosnippet>2586</a> Error::new(
-<a href=#2587 id=2587 data-nosnippet>2587</a> ErrorKind::DataInvalid,
-<a href=#2588 id=2588 data-nosnippet>2588</a> <span class="macro">format!</span>(
-<a href=#2589 id=2589 data-nosnippet>2589</a> <span class="string">"Unable to convert raw literal ({}) fail convert to type {} for: {}"</span>,
-<a href=#2590 id=2590 data-nosnippet>2590</a> v, ty, reason
-<a href=#2591 id=2591 data-nosnippet>2591</a> ),
-<a href=#2592 id=2592 data-nosnippet>2592</a> )
-<a href=#2593 id=2593 data-nosnippet>2593</a> };
-<a href=#2594 id=2594 data-nosnippet>2594</a> <span class="kw">match </span><span class="self">self </span>{
-<a href=#2595 id=2595 data-nosnippet>2595</a> RawLiteralEnum::Null => <span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>),
-<a href=#2596 id=2596 data-nosnippet>2596</a> RawLiteralEnum::Boolean(v) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::bool(v))),
-<a href=#2597 id=2597 data-nosnippet>2597</a> RawLiteralEnum::Int(v) => <span class="kw">match </span>ty {
-<a href=#2598 id=2598 data-nosnippet>2598</a> Type::Primitive(PrimitiveType::Int) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::int(v))),
-<a href=#2599 id=2599 data-nosnippet>2599</a> Type::Primitive(PrimitiveType::Long) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::long(i64::from(v)))),
-<a href=#2600 id=2600 data-nosnippet>2600</a> Type::Primitive(PrimitiveType::Date) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::date(v))),
-<a href=#2601 id=2601 data-nosnippet>2601</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"int"</span>)),
-<a href=#2602 id=2602 data-nosnippet>2602</a> },
-<a href=#2603 id=2603 data-nosnippet>2603</a> RawLiteralEnum::Long(v) => <span class="kw">match </span>ty {
-<a href=#2604 id=2604 data-nosnippet>2604</a> Type::Primitive(PrimitiveType::Int) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::int(
-<a href=#2605 id=2605 data-nosnippet>2605</a> i32::try_from(v).map_err(|<span class="kw">_</span>| invalid_err(<span class="string">"long"</span>))<span class="question-mark">?</span>,
-<a href=#2606 id=2606 data-nosnippet>2606</a> ))),
-<a href=#2607 id=2607 data-nosnippet>2607</a> Type::Primitive(PrimitiveType::Date) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::date(
-<a href=#2608 id=2608 data-nosnippet>2608</a> i32::try_from(v).map_err(|<span class="kw">_</span>| invalid_err(<span class="string">"long"</span>))<span class="question-mark">?</span>,
-<a href=#2609 id=2609 data-nosnippet>2609</a> ))),
-<a href=#2610 id=2610 data-nosnippet>2610</a> Type::Primitive(PrimitiveType::Long) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::long(v))),
-<a href=#2611 id=2611 data-nosnippet>2611</a> Type::Primitive(PrimitiveType::Time) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::time(v))),
-<a href=#2612 id=2612 data-nosnippet>2612</a> Type::Primitive(PrimitiveType::Timestamp) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::timestamp(v))),
-<a href=#2613 id=2613 data-nosnippet>2613</a> Type::Primitive(PrimitiveType::Timestamptz) => {
-<a href=#2614 id=2614 data-nosnippet>2614</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::timestamptz(v)))
-<a href=#2615 id=2615 data-nosnippet>2615</a> }
-<a href=#2616 id=2616 data-nosnippet>2616</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"long"</span>)),
-<a href=#2617 id=2617 data-nosnippet>2617</a> },
-<a href=#2618 id=2618 data-nosnippet>2618</a> RawLiteralEnum::Float(v) => <span class="kw">match </span>ty {
-<a href=#2619 id=2619 data-nosnippet>2619</a> Type::Primitive(PrimitiveType::Float) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::float(v))),
-<a href=#2620 id=2620 data-nosnippet>2620</a> Type::Primitive(PrimitiveType::Double) => {
-<a href=#2621 id=2621 data-nosnippet>2621</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::double(f64::from(v))))
-<a href=#2622 id=2622 data-nosnippet>2622</a> }
-<a href=#2623 id=2623 data-nosnippet>2623</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"float"</span>)),
-<a href=#2624 id=2624 data-nosnippet>2624</a> },
-<a href=#2625 id=2625 data-nosnippet>2625</a> RawLiteralEnum::Double(v) => <span class="kw">match </span>ty {
-<a href=#2626 id=2626 data-nosnippet>2626</a> Type::Primitive(PrimitiveType::Float) => {
-<a href=#2627 id=2627 data-nosnippet>2627</a> <span class="kw">let </span>v_32 = v <span class="kw">as </span>f32;
-<a href=#2628 id=2628 data-nosnippet>2628</a> <span class="kw">if </span>v_32.is_finite() {
-<a href=#2629 id=2629 data-nosnippet>2629</a> <span class="kw">let </span>v_64 = f64::from(v_32);
-<a href=#2630 id=2630 data-nosnippet>2630</a> <span class="kw">if </span>(v_64 - v).abs() > f32::EPSILON <span class="kw">as </span>f64 {
-<a href=#2631 id=2631 data-nosnippet>2631</a> <span class="comment">// there is a precision loss
-<a href=#2632 id=2632 data-nosnippet>2632</a> </span><span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err(<span class="string">"double"</span>));
-<a href=#2633 id=2633 data-nosnippet>2633</a> }
-<a href=#2634 id=2634 data-nosnippet>2634</a> }
-<a href=#2635 id=2635 data-nosnippet>2635</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::float(v_32)))
-<a href=#2636 id=2636 data-nosnippet>2636</a> }
-<a href=#2637 id=2637 data-nosnippet>2637</a> Type::Primitive(PrimitiveType::Double) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::double(v))),
-<a href=#2638 id=2638 data-nosnippet>2638</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"double"</span>)),
-<a href=#2639 id=2639 data-nosnippet>2639</a> },
-<a href=#2640 id=2640 data-nosnippet>2640</a> RawLiteralEnum::String(v) => <span class="kw">match </span>ty {
-<a href=#2641 id=2641 data-nosnippet>2641</a> Type::Primitive(PrimitiveType::String) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::string(v))),
-<a href=#2642 id=2642 data-nosnippet>2642</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"string"</span>)),
-<a href=#2643 id=2643 data-nosnippet>2643</a> },
-<a href=#2644 id=2644 data-nosnippet>2644</a> <span class="comment">// # TODO:https://github.com/apache/iceberg-rust/issues/86
-<a href=#2645 id=2645 data-nosnippet>2645</a> // rust avro don't support deserialize any bytes representation now.
-<a href=#2646 id=2646 data-nosnippet>2646</a> </span>RawLiteralEnum::Bytes(<span class="kw">_</span>) => <span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2647 id=2647 data-nosnippet>2647</a> <span class="string">"bytes"</span>,
-<a href=#2648 id=2648 data-nosnippet>2648</a> <span class="string">"todo: rust avro doesn't support deserialize any bytes representation now"</span>,
-<a href=#2649 id=2649 data-nosnippet>2649</a> )),
-<a href=#2650 id=2650 data-nosnippet>2650</a> RawLiteralEnum::List(v) => <span class="kw">match </span>ty {
-<a href=#2651 id=2651 data-nosnippet>2651</a> Type::List(ty) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::List(
-<a href=#2652 id=2652 data-nosnippet>2652</a> v.list
-<a href=#2653 id=2653 data-nosnippet>2653</a> .into_iter()
-<a href=#2654 id=2654 data-nosnippet>2654</a> .map(|v| {
-<a href=#2655 id=2655 data-nosnippet>2655</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(v) = v {
-<a href=#2656 id=2656 data-nosnippet>2656</a> v.try_into(<span class="kw-2">&</span>ty.element_field.field_type)
-<a href=#2657 id=2657 data-nosnippet>2657</a> } <span class="kw">else </span>{
-<a href=#2658 id=2658 data-nosnippet>2658</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>)
-<a href=#2659 id=2659 data-nosnippet>2659</a> }
-<a href=#2660 id=2660 data-nosnippet>2660</a> })
-<a href=#2661 id=2661 data-nosnippet>2661</a> .collect::<<span class="prelude-ty">Result</span><<span class="kw">_</span>, Error>>()<span class="question-mark">?</span>,
-<a href=#2662 id=2662 data-nosnippet>2662</a> ))),
-<a href=#2663 id=2663 data-nosnippet>2663</a> Type::Map(map_ty) => {
-<a href=#2664 id=2664 data-nosnippet>2664</a> <span class="kw">let </span>key_ty = map_ty.key_field.field_type.as_ref();
-<a href=#2665 id=2665 data-nosnippet>2665</a> <span class="kw">let </span>value_ty = map_ty.value_field.field_type.as_ref();
-<a href=#2666 id=2666 data-nosnippet>2666</a> <span class="kw">let </span><span class="kw-2">mut </span>map = Map::new();
-<a href=#2667 id=2667 data-nosnippet>2667</a> <span class="kw">for </span>k_v <span class="kw">in </span>v.list {
-<a href=#2668 id=2668 data-nosnippet>2668</a> <span class="kw">let </span>k_v = k_v.ok_or_else(|| invalid_err_with_reason(<span class="string">"list"</span>,<span class="string">"In deserialize, None will be represented as Some(RawLiteral::Null), all element in list must be valid"</span>))<span class="question-mark">?</span>;
-<a href=#2669 id=2669 data-nosnippet>2669</a> <span class="kw">if let </span>RawLiteralEnum::Record(Record {
-<a href=#2670 id=2670 data-nosnippet>2670</a> required,
-<a href=#2671 id=2671 data-nosnippet>2671</a> optional: <span class="kw">_</span>,
-<a href=#2672 id=2672 data-nosnippet>2672</a> }) = k_v
-<a href=#2673 id=2673 data-nosnippet>2673</a> {
-<a href=#2674 id=2674 data-nosnippet>2674</a> <span class="kw">if </span>required.len() != <span class="number">2 </span>{
-<a href=#2675 id=2675 data-nosnippet>2675</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2676 id=2676 data-nosnippet>2676</a> <span class="string">"list"</span>,
-<a href=#2677 id=2677 data-nosnippet>2677</a> <span class="string">"Record must contains two element(key and value) of array"</span>,
-<a href=#2678 id=2678 data-nosnippet>2678</a> ));
-<a href=#2679 id=2679 data-nosnippet>2679</a> }
-<a href=#2680 id=2680 data-nosnippet>2680</a> <span class="kw">let </span><span class="kw-2">mut </span>key = <span class="prelude-val">None</span>;
-<a href=#2681 id=2681 data-nosnippet>2681</a> <span class="kw">let </span><span class="kw-2">mut </span>value = <span class="prelude-val">None</span>;
-<a href=#2682 id=2682 data-nosnippet>2682</a> required.into_iter().for_each(|(k, v)| {
-<a href=#2683 id=2683 data-nosnippet>2683</a> <span class="kw">if </span>k == MAP_KEY_FIELD_NAME {
-<a href=#2684 id=2684 data-nosnippet>2684</a> key = <span class="prelude-val">Some</span>(v);
-<a href=#2685 id=2685 data-nosnippet>2685</a> } <span class="kw">else if </span>k == MAP_VALUE_FIELD_NAME {
-<a href=#2686 id=2686 data-nosnippet>2686</a> value = <span class="prelude-val">Some</span>(v);
-<a href=#2687 id=2687 data-nosnippet>2687</a> }
-<a href=#2688 id=2688 data-nosnippet>2688</a> });
-<a href=#2689 id=2689 data-nosnippet>2689</a> <span class="kw">match </span>(key, value) {
-<a href=#2690 id=2690 data-nosnippet>2690</a> (<span class="prelude-val">Some</span>(k), <span class="prelude-val">Some</span>(v)) => {
-<a href=#2691 id=2691 data-nosnippet>2691</a> <span class="kw">let </span>key = k.try_into(key_ty)<span class="question-mark">?</span>.ok_or_else(|| {
-<a href=#2692 id=2692 data-nosnippet>2692</a> invalid_err_with_reason(
-<a href=#2693 id=2693 data-nosnippet>2693</a> <span class="string">"list"</span>,
-<a href=#2694 id=2694 data-nosnippet>2694</a> <span class="string">"Key element in Map must be valid"</span>,
-<a href=#2695 id=2695 data-nosnippet>2695</a> )
-<a href=#2696 id=2696 data-nosnippet>2696</a> })<span class="question-mark">?</span>;
-<a href=#2697 id=2697 data-nosnippet>2697</a> <span class="kw">let </span>value = v.try_into(value_ty)<span class="question-mark">?</span>;
-<a href=#2698 id=2698 data-nosnippet>2698</a> <span class="kw">if </span>map_ty.value_field.required && value.is_none() {
-<a href=#2699 id=2699 data-nosnippet>2699</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2700 id=2700 data-nosnippet>2700</a> <span class="string">"list"</span>,
-<a href=#2701 id=2701 data-nosnippet>2701</a> <span class="string">"Value element is required in this Map"</span>,
-<a href=#2702 id=2702 data-nosnippet>2702</a> ));
-<a href=#2703 id=2703 data-nosnippet>2703</a> }
-<a href=#2704 id=2704 data-nosnippet>2704</a> map.insert(key, value);
-<a href=#2705 id=2705 data-nosnippet>2705</a> }
-<a href=#2706 id=2706 data-nosnippet>2706</a> <span class="kw">_ </span>=> {
-<a href=#2707 id=2707 data-nosnippet>2707</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2708 id=2708 data-nosnippet>2708</a> <span class="string">"list"</span>,
-<a href=#2709 id=2709 data-nosnippet>2709</a> <span class="string">"The elements of record in list are not key and value"</span>,
-<a href=#2710 id=2710 data-nosnippet>2710</a> ));
-<a href=#2711 id=2711 data-nosnippet>2711</a> }
-<a href=#2712 id=2712 data-nosnippet>2712</a> }
-<a href=#2713 id=2713 data-nosnippet>2713</a> } <span class="kw">else </span>{
-<a href=#2714 id=2714 data-nosnippet>2714</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2715 id=2715 data-nosnippet>2715</a> <span class="string">"list"</span>,
-<a href=#2716 id=2716 data-nosnippet>2716</a> <span class="string">"Map should represented as record array."</span>,
-<a href=#2717 id=2717 data-nosnippet>2717</a> ));
-<a href=#2718 id=2718 data-nosnippet>2718</a> }
-<a href=#2719 id=2719 data-nosnippet>2719</a> }
-<a href=#2720 id=2720 data-nosnippet>2720</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Map(map)))
-<a href=#2721 id=2721 data-nosnippet>2721</a> }
-<a href=#2722 id=2722 data-nosnippet>2722</a> Type::Primitive(PrimitiveType::Uuid) => {
-<a href=#2723 id=2723 data-nosnippet>2723</a> <span class="kw">if </span>v.list.len() != <span class="number">16 </span>{
-<a href=#2724 id=2724 data-nosnippet>2724</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2725 id=2725 data-nosnippet>2725</a> <span class="string">"list"</span>,
-<a href=#2726 id=2726 data-nosnippet>2726</a> <span class="string">"The length of list should be 16"</span>,
-<a href=#2727 id=2727 data-nosnippet>2727</a> ));
-<a href=#2728 id=2728 data-nosnippet>2728</a> }
-<a href=#2729 id=2729 data-nosnippet>2729</a> <span class="kw">let </span><span class="kw-2">mut </span>bytes = [<span class="number">0u8</span>; <span class="number">16</span>];
-<a href=#2730 id=2730 data-nosnippet>2730</a> <span class="kw">for </span>(i, v) <span class="kw">in </span>v.list.iter().enumerate() {
-<a href=#2731 id=2731 data-nosnippet>2731</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
-<a href=#2732 id=2732 data-nosnippet>2732</a> bytes[i] = <span class="kw-2">*</span>v <span class="kw">as </span>u8;
-<a href=#2733 id=2733 data-nosnippet>2733</a> } <span class="kw">else </span>{
-<a href=#2734 id=2734 data-nosnippet>2734</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2735 id=2735 data-nosnippet>2735</a> <span class="string">"list"</span>,
-<a href=#2736 id=2736 data-nosnippet>2736</a> <span class="string">"The element of list should be int"</span>,
-<a href=#2737 id=2737 data-nosnippet>2737</a> ));
-<a href=#2738 id=2738 data-nosnippet>2738</a> }
-<a href=#2739 id=2739 data-nosnippet>2739</a> }
-<a href=#2740 id=2740 data-nosnippet>2740</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::uuid(uuid::Uuid::from_bytes(bytes))))
-<a href=#2741 id=2741 data-nosnippet>2741</a> }
-<a href=#2742 id=2742 data-nosnippet>2742</a> Type::Primitive(PrimitiveType::Decimal {
-<a href=#2743 id=2743 data-nosnippet>2743</a> precision: <span class="kw">_</span>,
-<a href=#2744 id=2744 data-nosnippet>2744</a> scale: <span class="kw">_</span>,
-<a href=#2745 id=2745 data-nosnippet>2745</a> }) => {
-<a href=#2746 id=2746 data-nosnippet>2746</a> <span class="kw">if </span>v.list.len() != <span class="number">16 </span>{
-<a href=#2747 id=2747 data-nosnippet>2747</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2748 id=2748 data-nosnippet>2748</a> <span class="string">"list"</span>,
-<a href=#2749 id=2749 data-nosnippet>2749</a> <span class="string">"The length of list should be 16"</span>,
-<a href=#2750 id=2750 data-nosnippet>2750</a> ));
-<a href=#2751 id=2751 data-nosnippet>2751</a> }
-<a href=#2752 id=2752 data-nosnippet>2752</a> <span class="kw">let </span><span class="kw-2">mut </span>bytes = [<span class="number">0u8</span>; <span class="number">16</span>];
-<a href=#2753 id=2753 data-nosnippet>2753</a> <span class="kw">for </span>(i, v) <span class="kw">in </span>v.list.iter().enumerate() {
-<a href=#2754 id=2754 data-nosnippet>2754</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
-<a href=#2755 id=2755 data-nosnippet>2755</a> bytes[i] = <span class="kw-2">*</span>v <span class="kw">as </span>u8;
-<a href=#2756 id=2756 data-nosnippet>2756</a> } <span class="kw">else </span>{
-<a href=#2757 id=2757 data-nosnippet>2757</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2758 id=2758 data-nosnippet>2758</a> <span class="string">"list"</span>,
-<a href=#2759 id=2759 data-nosnippet>2759</a> <span class="string">"The element of list should be int"</span>,
-<a href=#2760 id=2760 data-nosnippet>2760</a> ));
-<a href=#2761 id=2761 data-nosnippet>2761</a> }
-<a href=#2762 id=2762 data-nosnippet>2762</a> }
-<a href=#2763 id=2763 data-nosnippet>2763</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::decimal(i128::from_be_bytes(bytes))))
-<a href=#2764 id=2764 data-nosnippet>2764</a> }
-<a href=#2765 id=2765 data-nosnippet>2765</a> Type::Primitive(PrimitiveType::Binary) => {
-<a href=#2766 id=2766 data-nosnippet>2766</a> <span class="kw">let </span>bytes = v
-<a href=#2767 id=2767 data-nosnippet>2767</a> .list
-<a href=#2768 id=2768 data-nosnippet>2768</a> .into_iter()
-<a href=#2769 id=2769 data-nosnippet>2769</a> .map(|v| {
-<a href=#2770 id=2770 data-nosnippet>2770</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
-<a href=#2771 id=2771 data-nosnippet>2771</a> <span class="prelude-val">Ok</span>(v <span class="kw">as </span>u8)
-<a href=#2772 id=2772 data-nosnippet>2772</a> } <span class="kw">else </span>{
-<a href=#2773 id=2773 data-nosnippet>2773</a> <span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2774 id=2774 data-nosnippet>2774</a> <span class="string">"list"</span>,
-<a href=#2775 id=2775 data-nosnippet>2775</a> <span class="string">"The element of list should be int"</span>,
-<a href=#2776 id=2776 data-nosnippet>2776</a> ))
-<a href=#2777 id=2777 data-nosnippet>2777</a> }
-<a href=#2778 id=2778 data-nosnippet>2778</a> })
-<a href=#2779 id=2779 data-nosnippet>2779</a> .collect::<<span class="prelude-ty">Result</span><Vec<<span class="kw">_</span>>, Error>>()<span class="question-mark">?</span>;
-<a href=#2780 id=2780 data-nosnippet>2780</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::binary(bytes)))
-<a href=#2781 id=2781 data-nosnippet>2781</a> }
-<a href=#2782 id=2782 data-nosnippet>2782</a> Type::Primitive(PrimitiveType::Fixed(size)) => {
-<a href=#2783 id=2783 data-nosnippet>2783</a> <span class="kw">if </span>v.list.len() != <span class="kw-2">*</span>size <span class="kw">as </span>usize {
-<a href=#2784 id=2784 data-nosnippet>2784</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2785 id=2785 data-nosnippet>2785</a> <span class="string">"list"</span>,
-<a href=#2786 id=2786 data-nosnippet>2786</a> <span class="string">"The length of list should be equal to size"</span>,
-<a href=#2787 id=2787 data-nosnippet>2787</a> ));
-<a href=#2788 id=2788 data-nosnippet>2788</a> }
-<a href=#2789 id=2789 data-nosnippet>2789</a> <span class="kw">let </span>bytes = v
-<a href=#2790 id=2790 data-nosnippet>2790</a> .list
-<a href=#2791 id=2791 data-nosnippet>2791</a> .into_iter()
-<a href=#2792 id=2792 data-nosnippet>2792</a> .map(|v| {
-<a href=#2793 id=2793 data-nosnippet>2793</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
-<a href=#2794 id=2794 data-nosnippet>2794</a> <span class="prelude-val">Ok</span>(v <span class="kw">as </span>u8)
-<a href=#2795 id=2795 data-nosnippet>2795</a> } <span class="kw">else </span>{
-<a href=#2796 id=2796 data-nosnippet>2796</a> <span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2797 id=2797 data-nosnippet>2797</a> <span class="string">"list"</span>,
-<a href=#2798 id=2798 data-nosnippet>2798</a> <span class="string">"The element of list should be int"</span>,
-<a href=#2799 id=2799 data-nosnippet>2799</a> ))
-<a href=#2800 id=2800 data-nosnippet>2800</a> }
-<a href=#2801 id=2801 data-nosnippet>2801</a> })
-<a href=#2802 id=2802 data-nosnippet>2802</a> .collect::<<span class="prelude-ty">Result</span><Vec<<span class="kw">_</span>>, Error>>()<span class="question-mark">?</span>;
-<a href=#2803 id=2803 data-nosnippet>2803</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::fixed(bytes)))
-<a href=#2804 id=2804 data-nosnippet>2804</a> }
-<a href=#2805 id=2805 data-nosnippet>2805</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"list"</span>)),
-<a href=#2806 id=2806 data-nosnippet>2806</a> },
-<a href=#2807 id=2807 data-nosnippet>2807</a> RawLiteralEnum::Record(Record {
-<a href=#2808 id=2808 data-nosnippet>2808</a> required,
-<a href=#2809 id=2809 data-nosnippet>2809</a> optional: <span class="kw">_</span>,
-<a href=#2810 id=2810 data-nosnippet>2810</a> }) => <span class="kw">match </span>ty {
-<a href=#2811 id=2811 data-nosnippet>2811</a> Type::Struct(struct_ty) => {
-<a href=#2812 id=2812 data-nosnippet>2812</a> <span class="kw">let </span>iters: Vec<<span class="prelude-ty">Option</span><Literal>> = required
-<a href=#2813 id=2813 data-nosnippet>2813</a> .into_iter()
-<a href=#2814 id=2814 data-nosnippet>2814</a> .map(|(field_name, value)| {
-<a href=#2815 id=2815 data-nosnippet>2815</a> <span class="kw">let </span>field = struct_ty
-<a href=#2816 id=2816 data-nosnippet>2816</a> .field_by_name(field_name.as_str())
-<a href=#2817 id=2817 data-nosnippet>2817</a> .ok_or_else(|| {
-<a href=#2818 id=2818 data-nosnippet>2818</a> invalid_err_with_reason(
-<a href=#2819 id=2819 data-nosnippet>2819</a> <span class="string">"record"</span>,
-<a href=#2820 id=2820 data-nosnippet>2820</a> <span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"field {} is not exist"</span>, <span class="kw-2">&</span>field_name),
-<a href=#2821 id=2821 data-nosnippet>2821</a> )
-<a href=#2822 id=2822 data-nosnippet>2822</a> })<span class="question-mark">?</span>;
-<a href=#2823 id=2823 data-nosnippet>2823</a> <span class="kw">let </span>value = value.try_into(<span class="kw-2">&</span>field.field_type)<span class="question-mark">?</span>;
-<a href=#2824 id=2824 data-nosnippet>2824</a> <span class="prelude-val">Ok</span>(value)
-<a href=#2825 id=2825 data-nosnippet>2825</a> })
-<a href=#2826 id=2826 data-nosnippet>2826</a> .collect::<<span class="prelude-ty">Result</span><<span class="kw">_</span>, Error>>()<span class="question-mark">?</span>;
-<a href=#2827 id=2827 data-nosnippet>2827</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Struct(<span class="kw">super</span>::Struct::from_iter(iters))))
-<a href=#2828 id=2828 data-nosnippet>2828</a> }
-<a href=#2829 id=2829 data-nosnippet>2829</a> Type::Map(map_ty) => {
-<a href=#2830 id=2830 data-nosnippet>2830</a> <span class="kw">if </span><span class="kw-2">*</span>map_ty.key_field.field_type != Type::Primitive(PrimitiveType::String) {
-<a href=#2831 id=2831 data-nosnippet>2831</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2832 id=2832 data-nosnippet>2832</a> <span class="string">"record"</span>,
-<a href=#2833 id=2833 data-nosnippet>2833</a> <span class="string">"Map key must be string"</span>,
-<a href=#2834 id=2834 data-nosnippet>2834</a> ));
-<a href=#2835 id=2835 data-nosnippet>2835</a> }
-<a href=#2836 id=2836 data-nosnippet>2836</a> <span class="kw">let </span><span class="kw-2">mut </span>map = Map::new();
-<a href=#2837 id=2837 data-nosnippet>2837</a> <span class="kw">for </span>(k, v) <span class="kw">in </span>required {
-<a href=#2838 id=2838 data-nosnippet>2838</a> <span class="kw">let </span>value = v.try_into(<span class="kw-2">&</span>map_ty.value_field.field_type)<span class="question-mark">?</span>;
-<a href=#2839 id=2839 data-nosnippet>2839</a> <span class="kw">if </span>map_ty.value_field.required && value.is_none() {
-<a href=#2840 id=2840 data-nosnippet>2840</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2841 id=2841 data-nosnippet>2841</a> <span class="string">"record"</span>,
-<a href=#2842 id=2842 data-nosnippet>2842</a> <span class="string">"Value element is required in this Map"</span>,
-<a href=#2843 id=2843 data-nosnippet>2843</a> ));
-<a href=#2844 id=2844 data-nosnippet>2844</a> }
-<a href=#2845 id=2845 data-nosnippet>2845</a> map.insert(Literal::string(k), value);
-<a href=#2846 id=2846 data-nosnippet>2846</a> }
-<a href=#2847 id=2847 data-nosnippet>2847</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Map(map)))
-<a href=#2848 id=2848 data-nosnippet>2848</a> }
-<a href=#2849 id=2849 data-nosnippet>2849</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"record"</span>)),
-<a href=#2850 id=2850 data-nosnippet>2850</a> },
-<a href=#2851 id=2851 data-nosnippet>2851</a> RawLiteralEnum::StringMap(<span class="kw">_</span>) => <span class="prelude-val">Err</span>(invalid_err(<span class="string">"string map"</span>)),
-<a href=#2852 id=2852 data-nosnippet>2852</a> }
-<a href=#2853 id=2853 data-nosnippet>2853</a> }
-<a href=#2854 id=2854 data-nosnippet>2854</a> }
-<a href=#2855 id=2855 data-nosnippet>2855</a>}
-<a href=#2856 id=2856 data-nosnippet>2856</a>
-<a href=#2857 id=2857 data-nosnippet>2857</a><span class="attr">#[cfg(test)]
-<a href=#2858 id=2858 data-nosnippet>2858</a></span><span class="kw">mod </span>tests {
-<a href=#2859 id=2859 data-nosnippet>2859</a> <span class="kw">use </span>apache_avro::to_value;
-<a href=#2860 id=2860 data-nosnippet>2860</a> <span class="kw">use </span>apache_avro::types::Value;
-<a href=#2861 id=2861 data-nosnippet>2861</a>
-<a href=#2862 id=2862 data-nosnippet>2862</a> <span class="kw">use super</span>::<span class="kw-2">*</span>;
-<a href=#2863 id=2863 data-nosnippet>2863</a> <span class="kw">use </span><span class="kw">crate</span>::avro::schema_to_avro_schema;
-<a href=#2864 id=2864 data-nosnippet>2864</a> <span class="kw">use </span><span class="kw">crate</span>::spec::Schema;
-<a href=#2865 id=2865 data-nosnippet>2865</a> <span class="kw">use </span><span class="kw">crate</span>::spec::Type::Primitive;
-<a href=#2866 id=2866 data-nosnippet>2866</a> <span class="kw">use </span><span class="kw">crate</span>::spec::datatypes::{ListType, MapType, NestedField, StructType};
-<a href=#2867 id=2867 data-nosnippet>2867</a>
-<a href=#2868 id=2868 data-nosnippet>2868</a> <span class="kw">fn </span>check_json_serde(json: <span class="kw-2">&</span>str, expected_literal: Literal, expected_type: <span class="kw-2">&</span>Type) {
-<a href=#2869 id=2869 data-nosnippet>2869</a> <span class="kw">let </span>raw_json_value = serde_json::from_str::<JsonValue>(json).unwrap();
-<a href=#2870 id=2870 data-nosnippet>2870</a> <span class="kw">let </span>desered_literal =
-<a href=#2871 id=2871 data-nosnippet>2871</a> Literal::try_from_json(raw_json_value.clone(), expected_type).unwrap();
-<a href=#2872 id=2872 data-nosnippet>2872</a> <span class="macro">assert_eq!</span>(desered_literal, <span class="prelude-val">Some</span>(expected_literal.clone()));
-<a href=#2873 id=2873 data-nosnippet>2873</a>
-<a href=#2874 id=2874 data-nosnippet>2874</a> <span class="kw">let </span>expected_json_value: JsonValue = expected_literal.try_into_json(expected_type).unwrap();
-<a href=#2875 id=2875 data-nosnippet>2875</a> <span class="kw">let </span>sered_json = serde_json::to_string(<span class="kw-2">&</span>expected_json_value).unwrap();
-<a href=#2876 id=2876 data-nosnippet>2876</a> <span class="kw">let </span>parsed_json_value = serde_json::from_str::<JsonValue>(<span class="kw-2">&</span>sered_json).unwrap();
-<a href=#2877 id=2877 data-nosnippet>2877</a>
-<a href=#2878 id=2878 data-nosnippet>2878</a> <span class="macro">assert_eq!</span>(parsed_json_value, raw_json_value);
-<a href=#2879 id=2879 data-nosnippet>2879</a> }
-<a href=#2880 id=2880 data-nosnippet>2880</a>
-<a href=#2881 id=2881 data-nosnippet>2881</a> <span class="kw">fn </span>check_avro_bytes_serde(
-<a href=#2882 id=2882 data-nosnippet>2882</a> input: Vec<u8>,
-<a href=#2883 id=2883 data-nosnippet>2883</a> expected_datum: Datum,
-<a href=#2884 id=2884 data-nosnippet>2884</a> expected_type: <span class="kw-2">&</span>PrimitiveType,
-<a href=#2885 id=2885 data-nosnippet>2885</a> ) {
-<a href=#2886 id=2886 data-nosnippet>2886</a> <span class="kw">let </span>raw_schema = <span class="string">r#""bytes""#</span>;
-<a href=#2887 id=2887 data-nosnippet>2887</a> <span class="kw">let </span>schema = apache_avro::Schema::parse_str(raw_schema).unwrap();
-<a href=#2888 id=2888 data-nosnippet>2888</a>
-<a href=#2889 id=2889 data-nosnippet>2889</a> <span class="kw">let </span>bytes = ByteBuf::from(input);
-<a href=#2890 id=2890 data-nosnippet>2890</a> <span class="kw">let </span>datum = Datum::try_from_bytes(<span class="kw-2">&</span>bytes, expected_type.clone()).unwrap();
-<a href=#2891 id=2891 data-nosnippet>2891</a> <span class="macro">assert_eq!</span>(datum, expected_datum);
+<a href=#2418 id=2418 data-nosnippet>2418</a>
+<a href=#2419 id=2419 data-nosnippet>2419</a> <span class="kw">fn </span>visit_unit<E>(<span class="self">self</span>) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, E>
+<a href=#2420 id=2420 data-nosnippet>2420</a> <span class="kw">where </span>E: serde::de::Error {
+<a href=#2421 id=2421 data-nosnippet>2421</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::Null)
+<a href=#2422 id=2422 data-nosnippet>2422</a> }
+<a href=#2423 id=2423 data-nosnippet>2423</a>
+<a href=#2424 id=2424 data-nosnippet>2424</a> <span class="kw">fn </span>visit_map<A>(<span class="self">self</span>, <span class="kw-2">mut </span>map: A) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, A::Error>
+<a href=#2425 id=2425 data-nosnippet>2425</a> <span class="kw">where </span>A: serde::de::MapAccess<<span class="lifetime">'de</span>> {
+<a href=#2426 id=2426 data-nosnippet>2426</a> <span class="kw">let </span><span class="kw-2">mut </span>required = Vec::new();
+<a href=#2427 id=2427 data-nosnippet>2427</a> <span class="kw">while let </span><span class="prelude-val">Some</span>(key) = map.next_key::<String>()<span class="question-mark">? </span>{
+<a href=#2428 id=2428 data-nosnippet>2428</a> <span class="kw">let </span>value = map.next_value::<RawLiteralEnum>()<span class="question-mark">?</span>;
+<a href=#2429 id=2429 data-nosnippet>2429</a> required.push((key, value));
+<a href=#2430 id=2430 data-nosnippet>2430</a> }
+<a href=#2431 id=2431 data-nosnippet>2431</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::Record(Record {
+<a href=#2432 id=2432 data-nosnippet>2432</a> required,
+<a href=#2433 id=2433 data-nosnippet>2433</a> optional: Vec::new(),
+<a href=#2434 id=2434 data-nosnippet>2434</a> }))
+<a href=#2435 id=2435 data-nosnippet>2435</a> }
+<a href=#2436 id=2436 data-nosnippet>2436</a>
+<a href=#2437 id=2437 data-nosnippet>2437</a> <span class="kw">fn </span>visit_seq<A>(<span class="self">self</span>, <span class="kw-2">mut </span>seq: A) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>::Value, A::Error>
+<a href=#2438 id=2438 data-nosnippet>2438</a> <span class="kw">where </span>A: serde::de::SeqAccess<<span class="lifetime">'de</span>> {
+<a href=#2439 id=2439 data-nosnippet>2439</a> <span class="kw">let </span><span class="kw-2">mut </span>list = Vec::new();
+<a href=#2440 id=2440 data-nosnippet>2440</a> <span class="kw">while let </span><span class="prelude-val">Some</span>(value) = seq.next_element::<RawLiteralEnum>()<span class="question-mark">? </span>{
+<a href=#2441 id=2441 data-nosnippet>2441</a> list.push(<span class="prelude-val">Some</span>(value));
+<a href=#2442 id=2442 data-nosnippet>2442</a> }
+<a href=#2443 id=2443 data-nosnippet>2443</a> <span class="prelude-val">Ok</span>(RawLiteralEnum::List(List {
+<a href=#2444 id=2444 data-nosnippet>2444</a> list,
+<a href=#2445 id=2445 data-nosnippet>2445</a> <span class="comment">// `required` only used in serialize, just set default in deserialize.
+<a href=#2446 id=2446 data-nosnippet>2446</a> </span>required: <span class="bool-val">false</span>,
+<a href=#2447 id=2447 data-nosnippet>2447</a> }))
+<a href=#2448 id=2448 data-nosnippet>2448</a> }
+<a href=#2449 id=2449 data-nosnippet>2449</a> }
+<a href=#2450 id=2450 data-nosnippet>2450</a> deserializer.deserialize_any(RawLiteralVisitor)
+<a href=#2451 id=2451 data-nosnippet>2451</a> }
+<a href=#2452 id=2452 data-nosnippet>2452</a> }
+<a href=#2453 id=2453 data-nosnippet>2453</a>
+<a href=#2454 id=2454 data-nosnippet>2454</a> <span class="kw">impl </span>RawLiteralEnum {
+<a href=#2455 id=2455 data-nosnippet>2455</a> <span class="kw">pub fn </span>try_from(literal: Literal, ty: <span class="kw-2">&</span>Type) -> <span class="prelude-ty">Result</span><<span class="self">Self</span>, Error> {
+<a href=#2456 id=2456 data-nosnippet>2456</a> <span class="kw">let </span>raw = <span class="kw">match </span>literal {
+<a href=#2457 id=2457 data-nosnippet>2457</a> Literal::Primitive(prim) => <span class="kw">match </span>prim {
+<a href=#2458 id=2458 data-nosnippet>2458</a> <span class="kw">super</span>::PrimitiveLiteral::Boolean(v) => RawLiteralEnum::Boolean(v),
+<a href=#2459 id=2459 data-nosnippet>2459</a> <span class="kw">super</span>::PrimitiveLiteral::Int(v) => RawLiteralEnum::Int(v),
+<a href=#2460 id=2460 data-nosnippet>2460</a> <span class="kw">super</span>::PrimitiveLiteral::Long(v) => RawLiteralEnum::Long(v),
+<a href=#2461 id=2461 data-nosnippet>2461</a> <span class="kw">super</span>::PrimitiveLiteral::Float(v) => RawLiteralEnum::Float(v.<span class="number">0</span>),
+<a href=#2462 id=2462 data-nosnippet>2462</a> <span class="kw">super</span>::PrimitiveLiteral::Double(v) => RawLiteralEnum::Double(v.<span class="number">0</span>),
+<a href=#2463 id=2463 data-nosnippet>2463</a> <span class="kw">super</span>::PrimitiveLiteral::String(v) => RawLiteralEnum::String(v),
+<a href=#2464 id=2464 data-nosnippet>2464</a> <span class="kw">super</span>::PrimitiveLiteral::UInt128(v) => {
+<a href=#2465 id=2465 data-nosnippet>2465</a> RawLiteralEnum::Bytes(ByteBuf::from(v.to_be_bytes()))
+<a href=#2466 id=2466 data-nosnippet>2466</a> }
+<a href=#2467 id=2467 data-nosnippet>2467</a> <span class="kw">super</span>::PrimitiveLiteral::Binary(v) => RawLiteralEnum::Bytes(ByteBuf::from(v)),
+<a href=#2468 id=2468 data-nosnippet>2468</a> <span class="kw">super</span>::PrimitiveLiteral::Int128(v) => {
+<a href=#2469 id=2469 data-nosnippet>2469</a> RawLiteralEnum::Bytes(ByteBuf::from(v.to_be_bytes()))
+<a href=#2470 id=2470 data-nosnippet>2470</a> }
+<a href=#2471 id=2471 data-nosnippet>2471</a> <span class="kw">super</span>::PrimitiveLiteral::AboveMax | <span class="kw">super</span>::PrimitiveLiteral::BelowMin => {
+<a href=#2472 id=2472 data-nosnippet>2472</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#2473 id=2473 data-nosnippet>2473</a> ErrorKind::DataInvalid,
+<a href=#2474 id=2474 data-nosnippet>2474</a> <span class="string">"Can't convert AboveMax or BelowMax"</span>,
+<a href=#2475 id=2475 data-nosnippet>2475</a> ));
+<a href=#2476 id=2476 data-nosnippet>2476</a> }
+<a href=#2477 id=2477 data-nosnippet>2477</a> },
+<a href=#2478 id=2478 data-nosnippet>2478</a> Literal::Struct(r#struct) => {
+<a href=#2479 id=2479 data-nosnippet>2479</a> <span class="kw">let </span><span class="kw-2">mut </span>required = Vec::new();
+<a href=#2480 id=2480 data-nosnippet>2480</a> <span class="kw">let </span><span class="kw-2">mut </span>optional = Vec::new();
+<a href=#2481 id=2481 data-nosnippet>2481</a> <span class="kw">if let </span>Type::Struct(struct_ty) = ty {
+<a href=#2482 id=2482 data-nosnippet>2482</a> <span class="kw">for </span>(value, field) <span class="kw">in </span>r#struct.into_iter().zip(struct_ty.fields()) {
+<a href=#2483 id=2483 data-nosnippet>2483</a> <span class="kw">if </span>field.required {
+<a href=#2484 id=2484 data-nosnippet>2484</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(value) = value {
+<a href=#2485 id=2485 data-nosnippet>2485</a> required.push((
+<a href=#2486 id=2486 data-nosnippet>2486</a> field.name.clone(),
+<a href=#2487 id=2487 data-nosnippet>2487</a> RawLiteralEnum::try_from(value, <span class="kw-2">&</span>field.field_type)<span class="question-mark">?</span>,
+<a href=#2488 id=2488 data-nosnippet>2488</a> ));
+<a href=#2489 id=2489 data-nosnippet>2489</a> } <span class="kw">else </span>{
+<a href=#2490 id=2490 data-nosnippet>2490</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#2491 id=2491 data-nosnippet>2491</a> ErrorKind::DataInvalid,
+<a href=#2492 id=2492 data-nosnippet>2492</a> <span class="string">"Can't convert null to required field"</span>,
+<a href=#2493 id=2493 data-nosnippet>2493</a> ));
+<a href=#2494 id=2494 data-nosnippet>2494</a> }
+<a href=#2495 id=2495 data-nosnippet>2495</a> } <span class="kw">else if let </span><span class="prelude-val">Some</span>(value) = value {
+<a href=#2496 id=2496 data-nosnippet>2496</a> optional.push((
+<a href=#2497 id=2497 data-nosnippet>2497</a> field.name.clone(),
+<a href=#2498 id=2498 data-nosnippet>2498</a> <span class="prelude-val">Some</span>(RawLiteralEnum::try_from(value, <span class="kw-2">&</span>field.field_type)<span class="question-mark">?</span>),
+<a href=#2499 id=2499 data-nosnippet>2499</a> ));
+<a href=#2500 id=2500 data-nosnippet>2500</a> } <span class="kw">else </span>{
+<a href=#2501 id=2501 data-nosnippet>2501</a> optional.push((field.name.clone(), <span class="prelude-val">None</span>));
+<a href=#2502 id=2502 data-nosnippet>2502</a> }
+<a href=#2503 id=2503 data-nosnippet>2503</a> }
+<a href=#2504 id=2504 data-nosnippet>2504</a> } <span class="kw">else </span>{
+<a href=#2505 id=2505 data-nosnippet>2505</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#2506 id=2506 data-nosnippet>2506</a> ErrorKind::DataInvalid,
+<a href=#2507 id=2507 data-nosnippet>2507</a> <span class="macro">format!</span>(<span class="string">"Type {} should be a struct"</span>, ty),
+<a href=#2508 id=2508 data-nosnippet>2508</a> ));
+<a href=#2509 id=2509 data-nosnippet>2509</a> }
+<a href=#2510 id=2510 data-nosnippet>2510</a> RawLiteralEnum::Record(Record { required, optional })
+<a href=#2511 id=2511 data-nosnippet>2511</a> }
+<a href=#2512 id=2512 data-nosnippet>2512</a> Literal::List(list) => {
+<a href=#2513 id=2513 data-nosnippet>2513</a> <span class="kw">if let </span>Type::List(list_ty) = ty {
+<a href=#2514 id=2514 data-nosnippet>2514</a> <span class="kw">let </span>list = list
+<a href=#2515 id=2515 data-nosnippet>2515</a> .into_iter()
+<a href=#2516 id=2516 data-nosnippet>2516</a> .map(|v| {
+<a href=#2517 id=2517 data-nosnippet>2517</a> v.map(|v| {
+<a href=#2518 id=2518 data-nosnippet>2518</a> RawLiteralEnum::try_from(v, <span class="kw-2">&</span>list_ty.element_field.field_type)
+<a href=#2519 id=2519 data-nosnippet>2519</a> })
+<a href=#2520 id=2520 data-nosnippet>2520</a> .transpose()
+<a href=#2521 id=2521 data-nosnippet>2521</a> })
+<a href=#2522 id=2522 data-nosnippet>2522</a> .collect::<<span class="prelude-ty">Result</span><<span class="kw">_</span>, Error>>()<span class="question-mark">?</span>;
+<a href=#2523 id=2523 data-nosnippet>2523</a> RawLiteralEnum::List(List {
+<a href=#2524 id=2524 data-nosnippet>2524</a> list,
+<a href=#2525 id=2525 data-nosnippet>2525</a> required: list_ty.element_field.required,
+<a href=#2526 id=2526 data-nosnippet>2526</a> })
+<a href=#2527 id=2527 data-nosnippet>2527</a> } <span class="kw">else </span>{
+<a href=#2528 id=2528 data-nosnippet>2528</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#2529 id=2529 data-nosnippet>2529</a> ErrorKind::DataInvalid,
+<a href=#2530 id=2530 data-nosnippet>2530</a> <span class="macro">format!</span>(<span class="string">"Type {} should be a list"</span>, ty),
+<a href=#2531 id=2531 data-nosnippet>2531</a> ));
+<a href=#2532 id=2532 data-nosnippet>2532</a> }
+<a href=#2533 id=2533 data-nosnippet>2533</a> }
+<a href=#2534 id=2534 data-nosnippet>2534</a> Literal::Map(map) => {
+<a href=#2535 id=2535 data-nosnippet>2535</a> <span class="kw">if let </span>Type::Map(map_ty) = ty {
+<a href=#2536 id=2536 data-nosnippet>2536</a> <span class="kw">if let </span>Type::Primitive(PrimitiveType::String) = <span class="kw-2">*</span>map_ty.key_field.field_type
+<a href=#2537 id=2537 data-nosnippet>2537</a> {
+<a href=#2538 id=2538 data-nosnippet>2538</a> <span class="kw">let </span><span class="kw-2">mut </span>raw = Vec::with_capacity(map.len());
+<a href=#2539 id=2539 data-nosnippet>2539</a> <span class="kw">for </span>(k, v) <span class="kw">in </span>map {
+<a href=#2540 id=2540 data-nosnippet>2540</a> <span class="kw">if let </span>Literal::Primitive(PrimitiveLiteral::String(k)) = k {
+<a href=#2541 id=2541 data-nosnippet>2541</a> raw.push((
+<a href=#2542 id=2542 data-nosnippet>2542</a> k,
+<a href=#2543 id=2543 data-nosnippet>2543</a> v.map(|v| {
+<a href=#2544 id=2544 data-nosnippet>2544</a> RawLiteralEnum::try_from(
+<a href=#2545 id=2545 data-nosnippet>2545</a> v,
+<a href=#2546 id=2546 data-nosnippet>2546</a> <span class="kw-2">&</span>map_ty.value_field.field_type,
+<a href=#2547 id=2547 data-nosnippet>2547</a> )
+<a href=#2548 id=2548 data-nosnippet>2548</a> })
+<a href=#2549 id=2549 data-nosnippet>2549</a> .transpose()<span class="question-mark">?</span>,
+<a href=#2550 id=2550 data-nosnippet>2550</a> ));
+<a href=#2551 id=2551 data-nosnippet>2551</a> } <span class="kw">else </span>{
+<a href=#2552 id=2552 data-nosnippet>2552</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#2553 id=2553 data-nosnippet>2553</a> ErrorKind::DataInvalid,
+<a href=#2554 id=2554 data-nosnippet>2554</a> <span class="string">"literal type is inconsistent with type"</span>,
+<a href=#2555 id=2555 data-nosnippet>2555</a> ));
+<a href=#2556 id=2556 data-nosnippet>2556</a> }
+<a href=#2557 id=2557 data-nosnippet>2557</a> }
+<a href=#2558 id=2558 data-nosnippet>2558</a> RawLiteralEnum::StringMap(StringMap {
+<a href=#2559 id=2559 data-nosnippet>2559</a> raw,
+<a href=#2560 id=2560 data-nosnippet>2560</a> required: map_ty.value_field.required,
+<a href=#2561 id=2561 data-nosnippet>2561</a> })
+<a href=#2562 id=2562 data-nosnippet>2562</a> } <span class="kw">else </span>{
+<a href=#2563 id=2563 data-nosnippet>2563</a> <span class="kw">let </span>list = map.into_iter().map(|(k,v)| {
+<a href=#2564 id=2564 data-nosnippet>2564</a> <span class="kw">let </span>raw_k =
+<a href=#2565 id=2565 data-nosnippet>2565</a> RawLiteralEnum::try_from(k, <span class="kw-2">&</span>map_ty.key_field.field_type)<span class="question-mark">?</span>;
+<a href=#2566 id=2566 data-nosnippet>2566</a> <span class="kw">let </span>raw_v = v
+<a href=#2567 id=2567 data-nosnippet>2567</a> .map(|v| {
+<a href=#2568 id=2568 data-nosnippet>2568</a> RawLiteralEnum::try_from(v, <span class="kw-2">&</span>map_ty.value_field.field_type)
+<a href=#2569 id=2569 data-nosnippet>2569</a> })
+<a href=#2570 id=2570 data-nosnippet>2570</a> .transpose()<span class="question-mark">?</span>;
+<a href=#2571 id=2571 data-nosnippet>2571</a> <span class="kw">if </span>map_ty.value_field.required {
+<a href=#2572 id=2572 data-nosnippet>2572</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(RawLiteralEnum::Record(Record {
+<a href=#2573 id=2573 data-nosnippet>2573</a> required: <span class="macro">vec!</span>[
+<a href=#2574 id=2574 data-nosnippet>2574</a> (MAP_KEY_FIELD_NAME.to_string(), raw_k),
+<a href=#2575 id=2575 data-nosnippet>2575</a> (MAP_VALUE_FIELD_NAME.to_string(), raw_v.ok_or_else(||Error::new(ErrorKind::DataInvalid, <span class="string">"Map value is required, value cannot be null"</span>))<span class="question-mark">?</span>),
+<a href=#2576 id=2576 data-nosnippet>2576</a> ],
+<a href=#2577 id=2577 data-nosnippet>2577</a> optional: <span class="macro">vec!</span>[],
+<a href=#2578 id=2578 data-nosnippet>2578</a> })))
+<a href=#2579 id=2579 data-nosnippet>2579</a> } <span class="kw">else </span>{
+<a href=#2580 id=2580 data-nosnippet>2580</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(RawLiteralEnum::Record(Record {
+<a href=#2581 id=2581 data-nosnippet>2581</a> required: <span class="macro">vec!</span>[
+<a href=#2582 id=2582 data-nosnippet>2582</a> (MAP_KEY_FIELD_NAME.to_string(), raw_k),
+<a href=#2583 id=2583 data-nosnippet>2583</a> ],
+<a href=#2584 id=2584 data-nosnippet>2584</a> optional: <span class="macro">vec!</span>[
+<a href=#2585 id=2585 data-nosnippet>2585</a> (MAP_VALUE_FIELD_NAME.to_string(), raw_v)
+<a href=#2586 id=2586 data-nosnippet>2586</a> ],
+<a href=#2587 id=2587 data-nosnippet>2587</a> })))
+<a href=#2588 id=2588 data-nosnippet>2588</a> }
+<a href=#2589 id=2589 data-nosnippet>2589</a> }).collect::<<span class="prelude-ty">Result</span><<span class="kw">_</span>, Error>>()<span class="question-mark">?</span>;
+<a href=#2590 id=2590 data-nosnippet>2590</a> RawLiteralEnum::List(List {
+<a href=#2591 id=2591 data-nosnippet>2591</a> list,
+<a href=#2592 id=2592 data-nosnippet>2592</a> required: <span class="bool-val">true</span>,
+<a href=#2593 id=2593 data-nosnippet>2593</a> })
+<a href=#2594 id=2594 data-nosnippet>2594</a> }
+<a href=#2595 id=2595 data-nosnippet>2595</a> } <span class="kw">else </span>{
+<a href=#2596 id=2596 data-nosnippet>2596</a> <span class="kw">return </span><span class="prelude-val">Err</span>(Error::new(
+<a href=#2597 id=2597 data-nosnippet>2597</a> ErrorKind::DataInvalid,
+<a href=#2598 id=2598 data-nosnippet>2598</a> <span class="macro">format!</span>(<span class="string">"Type {} should be a map"</span>, ty),
+<a href=#2599 id=2599 data-nosnippet>2599</a> ));
+<a href=#2600 id=2600 data-nosnippet>2600</a> }
+<a href=#2601 id=2601 data-nosnippet>2601</a> }
+<a href=#2602 id=2602 data-nosnippet>2602</a> };
+<a href=#2603 id=2603 data-nosnippet>2603</a> <span class="prelude-val">Ok</span>(raw)
+<a href=#2604 id=2604 data-nosnippet>2604</a> }
+<a href=#2605 id=2605 data-nosnippet>2605</a>
+<a href=#2606 id=2606 data-nosnippet>2606</a> <span class="kw">pub fn </span>try_into(<span class="self">self</span>, ty: <span class="kw-2">&</span>Type) -> <span class="prelude-ty">Result</span><<span class="prelude-ty">Option</span><Literal>, Error> {
+<a href=#2607 id=2607 data-nosnippet>2607</a> <span class="kw">let </span>invalid_err = |v: <span class="kw-2">&</span>str| {
+<a href=#2608 id=2608 data-nosnippet>2608</a> Error::new(
+<a href=#2609 id=2609 data-nosnippet>2609</a> ErrorKind::DataInvalid,
+<a href=#2610 id=2610 data-nosnippet>2610</a> <span class="macro">format!</span>(
+<a href=#2611 id=2611 data-nosnippet>2611</a> <span class="string">"Unable to convert raw literal ({}) fail convert to type {} for: type mismatch"</span>,
+<a href=#2612 id=2612 data-nosnippet>2612</a> v, ty
+<a href=#2613 id=2613 data-nosnippet>2613</a> ),
+<a href=#2614 id=2614 data-nosnippet>2614</a> )
+<a href=#2615 id=2615 data-nosnippet>2615</a> };
+<a href=#2616 id=2616 data-nosnippet>2616</a> <span class="kw">let </span>invalid_err_with_reason = |v: <span class="kw-2">&</span>str, reason: <span class="kw-2">&</span>str| {
+<a href=#2617 id=2617 data-nosnippet>2617</a> Error::new(
+<a href=#2618 id=2618 data-nosnippet>2618</a> ErrorKind::DataInvalid,
+<a href=#2619 id=2619 data-nosnippet>2619</a> <span class="macro">format!</span>(
+<a href=#2620 id=2620 data-nosnippet>2620</a> <span class="string">"Unable to convert raw literal ({}) fail convert to type {} for: {}"</span>,
+<a href=#2621 id=2621 data-nosnippet>2621</a> v, ty, reason
+<a href=#2622 id=2622 data-nosnippet>2622</a> ),
+<a href=#2623 id=2623 data-nosnippet>2623</a> )
+<a href=#2624 id=2624 data-nosnippet>2624</a> };
+<a href=#2625 id=2625 data-nosnippet>2625</a> <span class="kw">match </span><span class="self">self </span>{
+<a href=#2626 id=2626 data-nosnippet>2626</a> RawLiteralEnum::Null => <span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>),
+<a href=#2627 id=2627 data-nosnippet>2627</a> RawLiteralEnum::Boolean(v) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::bool(v))),
+<a href=#2628 id=2628 data-nosnippet>2628</a> RawLiteralEnum::Int(v) => <span class="kw">match </span>ty {
+<a href=#2629 id=2629 data-nosnippet>2629</a> Type::Primitive(PrimitiveType::Int) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::int(v))),
+<a href=#2630 id=2630 data-nosnippet>2630</a> Type::Primitive(PrimitiveType::Long) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::long(i64::from(v)))),
+<a href=#2631 id=2631 data-nosnippet>2631</a> Type::Primitive(PrimitiveType::Date) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::date(v))),
+<a href=#2632 id=2632 data-nosnippet>2632</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"int"</span>)),
+<a href=#2633 id=2633 data-nosnippet>2633</a> },
+<a href=#2634 id=2634 data-nosnippet>2634</a> RawLiteralEnum::Long(v) => <span class="kw">match </span>ty {
+<a href=#2635 id=2635 data-nosnippet>2635</a> Type::Primitive(PrimitiveType::Int) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::int(
+<a href=#2636 id=2636 data-nosnippet>2636</a> i32::try_from(v).map_err(|<span class="kw">_</span>| invalid_err(<span class="string">"long"</span>))<span class="question-mark">?</span>,
+<a href=#2637 id=2637 data-nosnippet>2637</a> ))),
+<a href=#2638 id=2638 data-nosnippet>2638</a> Type::Primitive(PrimitiveType::Date) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::date(
+<a href=#2639 id=2639 data-nosnippet>2639</a> i32::try_from(v).map_err(|<span class="kw">_</span>| invalid_err(<span class="string">"long"</span>))<span class="question-mark">?</span>,
+<a href=#2640 id=2640 data-nosnippet>2640</a> ))),
+<a href=#2641 id=2641 data-nosnippet>2641</a> Type::Primitive(PrimitiveType::Long) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::long(v))),
+<a href=#2642 id=2642 data-nosnippet>2642</a> Type::Primitive(PrimitiveType::Time) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::time(v))),
+<a href=#2643 id=2643 data-nosnippet>2643</a> Type::Primitive(PrimitiveType::Timestamp) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::timestamp(v))),
+<a href=#2644 id=2644 data-nosnippet>2644</a> Type::Primitive(PrimitiveType::Timestamptz) => {
+<a href=#2645 id=2645 data-nosnippet>2645</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::timestamptz(v)))
+<a href=#2646 id=2646 data-nosnippet>2646</a> }
+<a href=#2647 id=2647 data-nosnippet>2647</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"long"</span>)),
+<a href=#2648 id=2648 data-nosnippet>2648</a> },
+<a href=#2649 id=2649 data-nosnippet>2649</a> RawLiteralEnum::Float(v) => <span class="kw">match </span>ty {
+<a href=#2650 id=2650 data-nosnippet>2650</a> Type::Primitive(PrimitiveType::Float) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::float(v))),
+<a href=#2651 id=2651 data-nosnippet>2651</a> Type::Primitive(PrimitiveType::Double) => {
+<a href=#2652 id=2652 data-nosnippet>2652</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::double(f64::from(v))))
+<a href=#2653 id=2653 data-nosnippet>2653</a> }
+<a href=#2654 id=2654 data-nosnippet>2654</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"float"</span>)),
+<a href=#2655 id=2655 data-nosnippet>2655</a> },
+<a href=#2656 id=2656 data-nosnippet>2656</a> RawLiteralEnum::Double(v) => <span class="kw">match </span>ty {
+<a href=#2657 id=2657 data-nosnippet>2657</a> Type::Primitive(PrimitiveType::Float) => {
+<a href=#2658 id=2658 data-nosnippet>2658</a> <span class="kw">let </span>v_32 = v <span class="kw">as </span>f32;
+<a href=#2659 id=2659 data-nosnippet>2659</a> <span class="kw">if </span>v_32.is_finite() {
+<a href=#2660 id=2660 data-nosnippet>2660</a> <span class="kw">let </span>v_64 = f64::from(v_32);
+<a href=#2661 id=2661 data-nosnippet>2661</a> <span class="kw">if </span>(v_64 - v).abs() > f32::EPSILON <span class="kw">as </span>f64 {
+<a href=#2662 id=2662 data-nosnippet>2662</a> <span class="comment">// there is a precision loss
+<a href=#2663 id=2663 data-nosnippet>2663</a> </span><span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err(<span class="string">"double"</span>));
+<a href=#2664 id=2664 data-nosnippet>2664</a> }
+<a href=#2665 id=2665 data-nosnippet>2665</a> }
+<a href=#2666 id=2666 data-nosnippet>2666</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::float(v_32)))
+<a href=#2667 id=2667 data-nosnippet>2667</a> }
+<a href=#2668 id=2668 data-nosnippet>2668</a> Type::Primitive(PrimitiveType::Double) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::double(v))),
+<a href=#2669 id=2669 data-nosnippet>2669</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"double"</span>)),
+<a href=#2670 id=2670 data-nosnippet>2670</a> },
+<a href=#2671 id=2671 data-nosnippet>2671</a> RawLiteralEnum::String(v) => <span class="kw">match </span>ty {
+<a href=#2672 id=2672 data-nosnippet>2672</a> Type::Primitive(PrimitiveType::String) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::string(v))),
+<a href=#2673 id=2673 data-nosnippet>2673</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"string"</span>)),
+<a href=#2674 id=2674 data-nosnippet>2674</a> },
+<a href=#2675 id=2675 data-nosnippet>2675</a> <span class="comment">// # TODO:https://github.com/apache/iceberg-rust/issues/86
+<a href=#2676 id=2676 data-nosnippet>2676</a> // rust avro don't support deserialize any bytes representation now.
+<a href=#2677 id=2677 data-nosnippet>2677</a> </span>RawLiteralEnum::Bytes(<span class="kw">_</span>) => <span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2678 id=2678 data-nosnippet>2678</a> <span class="string">"bytes"</span>,
+<a href=#2679 id=2679 data-nosnippet>2679</a> <span class="string">"todo: rust avro doesn't support deserialize any bytes representation now"</span>,
+<a href=#2680 id=2680 data-nosnippet>2680</a> )),
+<a href=#2681 id=2681 data-nosnippet>2681</a> RawLiteralEnum::List(v) => <span class="kw">match </span>ty {
+<a href=#2682 id=2682 data-nosnippet>2682</a> Type::List(ty) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::List(
+<a href=#2683 id=2683 data-nosnippet>2683</a> v.list
+<a href=#2684 id=2684 data-nosnippet>2684</a> .into_iter()
+<a href=#2685 id=2685 data-nosnippet>2685</a> .map(|v| {
+<a href=#2686 id=2686 data-nosnippet>2686</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(v) = v {
+<a href=#2687 id=2687 data-nosnippet>2687</a> v.try_into(<span class="kw-2">&</span>ty.element_field.field_type)
+<a href=#2688 id=2688 data-nosnippet>2688</a> } <span class="kw">else </span>{
+<a href=#2689 id=2689 data-nosnippet>2689</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>)
+<a href=#2690 id=2690 data-nosnippet>2690</a> }
+<a href=#2691 id=2691 data-nosnippet>2691</a> })
+<a href=#2692 id=2692 data-nosnippet>2692</a> .collect::<<span class="prelude-ty">Result</span><<span class="kw">_</span>, Error>>()<span class="question-mark">?</span>,
+<a href=#2693 id=2693 data-nosnippet>2693</a> ))),
+<a href=#2694 id=2694 data-nosnippet>2694</a> Type::Map(map_ty) => {
+<a href=#2695 id=2695 data-nosnippet>2695</a> <span class="kw">let </span>key_ty = map_ty.key_field.field_type.as_ref();
+<a href=#2696 id=2696 data-nosnippet>2696</a> <span class="kw">let </span>value_ty = map_ty.value_field.field_type.as_ref();
+<a href=#2697 id=2697 data-nosnippet>2697</a> <span class="kw">let </span><span class="kw-2">mut </span>map = Map::new();
+<a href=#2698 id=2698 data-nosnippet>2698</a> <span class="kw">for </span>k_v <span class="kw">in </span>v.list {
+<a href=#2699 id=2699 data-nosnippet>2699</a> <span class="kw">let </span>k_v = k_v.ok_or_else(|| invalid_err_with_reason(<span class="string">"list"</span>,<span class="string">"In deserialize, None will be represented as Some(RawLiteral::Null), all element in list must be valid"</span>))<span class="question-mark">?</span>;
+<a href=#2700 id=2700 data-nosnippet>2700</a> <span class="kw">if let </span>RawLiteralEnum::Record(Record {
+<a href=#2701 id=2701 data-nosnippet>2701</a> required,
+<a href=#2702 id=2702 data-nosnippet>2702</a> optional: <span class="kw">_</span>,
+<a href=#2703 id=2703 data-nosnippet>2703</a> }) = k_v
+<a href=#2704 id=2704 data-nosnippet>2704</a> {
+<a href=#2705 id=2705 data-nosnippet>2705</a> <span class="kw">if </span>required.len() != <span class="number">2 </span>{
+<a href=#2706 id=2706 data-nosnippet>2706</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2707 id=2707 data-nosnippet>2707</a> <span class="string">"list"</span>,
+<a href=#2708 id=2708 data-nosnippet>2708</a> <span class="string">"Record must contains two element(key and value) of array"</span>,
+<a href=#2709 id=2709 data-nosnippet>2709</a> ));
+<a href=#2710 id=2710 data-nosnippet>2710</a> }
+<a href=#2711 id=2711 data-nosnippet>2711</a> <span class="kw">let </span><span class="kw-2">mut </span>key = <span class="prelude-val">None</span>;
+<a href=#2712 id=2712 data-nosnippet>2712</a> <span class="kw">let </span><span class="kw-2">mut </span>value = <span class="prelude-val">None</span>;
+<a href=#2713 id=2713 data-nosnippet>2713</a> required.into_iter().for_each(|(k, v)| {
+<a href=#2714 id=2714 data-nosnippet>2714</a> <span class="kw">if </span>k == MAP_KEY_FIELD_NAME {
+<a href=#2715 id=2715 data-nosnippet>2715</a> key = <span class="prelude-val">Some</span>(v);
+<a href=#2716 id=2716 data-nosnippet>2716</a> } <span class="kw">else if </span>k == MAP_VALUE_FIELD_NAME {
+<a href=#2717 id=2717 data-nosnippet>2717</a> value = <span class="prelude-val">Some</span>(v);
+<a href=#2718 id=2718 data-nosnippet>2718</a> }
+<a href=#2719 id=2719 data-nosnippet>2719</a> });
+<a href=#2720 id=2720 data-nosnippet>2720</a> <span class="kw">match </span>(key, value) {
+<a href=#2721 id=2721 data-nosnippet>2721</a> (<span class="prelude-val">Some</span>(k), <span class="prelude-val">Some</span>(v)) => {
+<a href=#2722 id=2722 data-nosnippet>2722</a> <span class="kw">let </span>key = k.try_into(key_ty)<span class="question-mark">?</span>.ok_or_else(|| {
+<a href=#2723 id=2723 data-nosnippet>2723</a> invalid_err_with_reason(
+<a href=#2724 id=2724 data-nosnippet>2724</a> <span class="string">"list"</span>,
+<a href=#2725 id=2725 data-nosnippet>2725</a> <span class="string">"Key element in Map must be valid"</span>,
+<a href=#2726 id=2726 data-nosnippet>2726</a> )
+<a href=#2727 id=2727 data-nosnippet>2727</a> })<span class="question-mark">?</span>;
+<a href=#2728 id=2728 data-nosnippet>2728</a> <span class="kw">let </span>value = v.try_into(value_ty)<span class="question-mark">?</span>;
+<a href=#2729 id=2729 data-nosnippet>2729</a> <span class="kw">if </span>map_ty.value_field.required && value.is_none() {
+<a href=#2730 id=2730 data-nosnippet>2730</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2731 id=2731 data-nosnippet>2731</a> <span class="string">"list"</span>,
+<a href=#2732 id=2732 data-nosnippet>2732</a> <span class="string">"Value element is required in this Map"</span>,
+<a href=#2733 id=2733 data-nosnippet>2733</a> ));
+<a href=#2734 id=2734 data-nosnippet>2734</a> }
+<a href=#2735 id=2735 data-nosnippet>2735</a> map.insert(key, value);
+<a href=#2736 id=2736 data-nosnippet>2736</a> }
+<a href=#2737 id=2737 data-nosnippet>2737</a> <span class="kw">_ </span>=> {
+<a href=#2738 id=2738 data-nosnippet>2738</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2739 id=2739 data-nosnippet>2739</a> <span class="string">"list"</span>,
+<a href=#2740 id=2740 data-nosnippet>2740</a> <span class="string">"The elements of record in list are not key and value"</span>,
+<a href=#2741 id=2741 data-nosnippet>2741</a> ));
+<a href=#2742 id=2742 data-nosnippet>2742</a> }
+<a href=#2743 id=2743 data-nosnippet>2743</a> }
+<a href=#2744 id=2744 data-nosnippet>2744</a> } <span class="kw">else </span>{
+<a href=#2745 id=2745 data-nosnippet>2745</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2746 id=2746 data-nosnippet>2746</a> <span class="string">"list"</span>,
+<a href=#2747 id=2747 data-nosnippet>2747</a> <span class="string">"Map should represented as record array."</span>,
+<a href=#2748 id=2748 data-nosnippet>2748</a> ));
+<a href=#2749 id=2749 data-nosnippet>2749</a> }
+<a href=#2750 id=2750 data-nosnippet>2750</a> }
+<a href=#2751 id=2751 data-nosnippet>2751</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Map(map)))
+<a href=#2752 id=2752 data-nosnippet>2752</a> }
+<a href=#2753 id=2753 data-nosnippet>2753</a> Type::Primitive(PrimitiveType::Uuid) => {
+<a href=#2754 id=2754 data-nosnippet>2754</a> <span class="kw">if </span>v.list.len() != <span class="number">16 </span>{
+<a href=#2755 id=2755 data-nosnippet>2755</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2756 id=2756 data-nosnippet>2756</a> <span class="string">"list"</span>,
+<a href=#2757 id=2757 data-nosnippet>2757</a> <span class="string">"The length of list should be 16"</span>,
+<a href=#2758 id=2758 data-nosnippet>2758</a> ));
+<a href=#2759 id=2759 data-nosnippet>2759</a> }
+<a href=#2760 id=2760 data-nosnippet>2760</a> <span class="kw">let </span><span class="kw-2">mut </span>bytes = [<span class="number">0u8</span>; <span class="number">16</span>];
+<a href=#2761 id=2761 data-nosnippet>2761</a> <span class="kw">for </span>(i, v) <span class="kw">in </span>v.list.iter().enumerate() {
+<a href=#2762 id=2762 data-nosnippet>2762</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
+<a href=#2763 id=2763 data-nosnippet>2763</a> bytes[i] = <span class="kw-2">*</span>v <span class="kw">as </span>u8;
+<a href=#2764 id=2764 data-nosnippet>2764</a> } <span class="kw">else </span>{
+<a href=#2765 id=2765 data-nosnippet>2765</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2766 id=2766 data-nosnippet>2766</a> <span class="string">"list"</span>,
+<a href=#2767 id=2767 data-nosnippet>2767</a> <span class="string">"The element of list should be int"</span>,
+<a href=#2768 id=2768 data-nosnippet>2768</a> ));
+<a href=#2769 id=2769 data-nosnippet>2769</a> }
+<a href=#2770 id=2770 data-nosnippet>2770</a> }
+<a href=#2771 id=2771 data-nosnippet>2771</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::uuid(uuid::Uuid::from_bytes(bytes))))
+<a href=#2772 id=2772 data-nosnippet>2772</a> }
+<a href=#2773 id=2773 data-nosnippet>2773</a> Type::Primitive(PrimitiveType::Decimal {
+<a href=#2774 id=2774 data-nosnippet>2774</a> precision: <span class="kw">_</span>,
+<a href=#2775 id=2775 data-nosnippet>2775</a> scale: <span class="kw">_</span>,
+<a href=#2776 id=2776 data-nosnippet>2776</a> }) => {
+<a href=#2777 id=2777 data-nosnippet>2777</a> <span class="kw">if </span>v.list.len() != <span class="number">16 </span>{
+<a href=#2778 id=2778 data-nosnippet>2778</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2779 id=2779 data-nosnippet>2779</a> <span class="string">"list"</span>,
+<a href=#2780 id=2780 data-nosnippet>2780</a> <span class="string">"The length of list should be 16"</span>,
+<a href=#2781 id=2781 data-nosnippet>2781</a> ));
+<a href=#2782 id=2782 data-nosnippet>2782</a> }
+<a href=#2783 id=2783 data-nosnippet>2783</a> <span class="kw">let </span><span class="kw-2">mut </span>bytes = [<span class="number">0u8</span>; <span class="number">16</span>];
+<a href=#2784 id=2784 data-nosnippet>2784</a> <span class="kw">for </span>(i, v) <span class="kw">in </span>v.list.iter().enumerate() {
+<a href=#2785 id=2785 data-nosnippet>2785</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
+<a href=#2786 id=2786 data-nosnippet>2786</a> bytes[i] = <span class="kw-2">*</span>v <span class="kw">as </span>u8;
+<a href=#2787 id=2787 data-nosnippet>2787</a> } <span class="kw">else </span>{
+<a href=#2788 id=2788 data-nosnippet>2788</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2789 id=2789 data-nosnippet>2789</a> <span class="string">"list"</span>,
+<a href=#2790 id=2790 data-nosnippet>2790</a> <span class="string">"The element of list should be int"</span>,
+<a href=#2791 id=2791 data-nosnippet>2791</a> ));
+<a href=#2792 id=2792 data-nosnippet>2792</a> }
+<a href=#2793 id=2793 data-nosnippet>2793</a> }
+<a href=#2794 id=2794 data-nosnippet>2794</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::decimal(i128::from_be_bytes(bytes))))
+<a href=#2795 id=2795 data-nosnippet>2795</a> }
+<a href=#2796 id=2796 data-nosnippet>2796</a> Type::Primitive(PrimitiveType::Binary) => {
+<a href=#2797 id=2797 data-nosnippet>2797</a> <span class="kw">let </span>bytes = v
+<a href=#2798 id=2798 data-nosnippet>2798</a> .list
+<a href=#2799 id=2799 data-nosnippet>2799</a> .into_iter()
+<a href=#2800 id=2800 data-nosnippet>2800</a> .map(|v| {
+<a href=#2801 id=2801 data-nosnippet>2801</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
+<a href=#2802 id=2802 data-nosnippet>2802</a> <span class="prelude-val">Ok</span>(v <span class="kw">as </span>u8)
+<a href=#2803 id=2803 data-nosnippet>2803</a> } <span class="kw">else </span>{
+<a href=#2804 id=2804 data-nosnippet>2804</a> <span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2805 id=2805 data-nosnippet>2805</a> <span class="string">"list"</span>,
+<a href=#2806 id=2806 data-nosnippet>2806</a> <span class="string">"The element of list should be int"</span>,
+<a href=#2807 id=2807 data-nosnippet>2807</a> ))
+<a href=#2808 id=2808 data-nosnippet>2808</a> }
+<a href=#2809 id=2809 data-nosnippet>2809</a> })
+<a href=#2810 id=2810 data-nosnippet>2810</a> .collect::<<span class="prelude-ty">Result</span><Vec<<span class="kw">_</span>>, Error>>()<span class="question-mark">?</span>;
+<a href=#2811 id=2811 data-nosnippet>2811</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::binary(bytes)))
+<a href=#2812 id=2812 data-nosnippet>2812</a> }
+<a href=#2813 id=2813 data-nosnippet>2813</a> Type::Primitive(PrimitiveType::Fixed(size)) => {
+<a href=#2814 id=2814 data-nosnippet>2814</a> <span class="kw">if </span>v.list.len() != <span class="kw-2">*</span>size <span class="kw">as </span>usize {
+<a href=#2815 id=2815 data-nosnippet>2815</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2816 id=2816 data-nosnippet>2816</a> <span class="string">"list"</span>,
+<a href=#2817 id=2817 data-nosnippet>2817</a> <span class="string">"The length of list should be equal to size"</span>,
+<a href=#2818 id=2818 data-nosnippet>2818</a> ));
+<a href=#2819 id=2819 data-nosnippet>2819</a> }
+<a href=#2820 id=2820 data-nosnippet>2820</a> <span class="kw">let </span>bytes = v
+<a href=#2821 id=2821 data-nosnippet>2821</a> .list
+<a href=#2822 id=2822 data-nosnippet>2822</a> .into_iter()
+<a href=#2823 id=2823 data-nosnippet>2823</a> .map(|v| {
+<a href=#2824 id=2824 data-nosnippet>2824</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
+<a href=#2825 id=2825 data-nosnippet>2825</a> <span class="prelude-val">Ok</span>(v <span class="kw">as </span>u8)
+<a href=#2826 id=2826 data-nosnippet>2826</a> } <span class="kw">else </span>{
+<a href=#2827 id=2827 data-nosnippet>2827</a> <span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2828 id=2828 data-nosnippet>2828</a> <span class="string">"list"</span>,
+<a href=#2829 id=2829 data-nosnippet>2829</a> <span class="string">"The element of list should be int"</span>,
+<a href=#2830 id=2830 data-nosnippet>2830</a> ))
+<a href=#2831 id=2831 data-nosnippet>2831</a> }
+<a href=#2832 id=2832 data-nosnippet>2832</a> })
+<a href=#2833 id=2833 data-nosnippet>2833</a> .collect::<<span class="prelude-ty">Result</span><Vec<<span class="kw">_</span>>, Error>>()<span class="question-mark">?</span>;
+<a href=#2834 id=2834 data-nosnippet>2834</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::fixed(bytes)))
+<a href=#2835 id=2835 data-nosnippet>2835</a> }
+<a href=#2836 id=2836 data-nosnippet>2836</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"list"</span>)),
+<a href=#2837 id=2837 data-nosnippet>2837</a> },
+<a href=#2838 id=2838 data-nosnippet>2838</a> RawLiteralEnum::Record(Record {
+<a href=#2839 id=2839 data-nosnippet>2839</a> required,
+<a href=#2840 id=2840 data-nosnippet>2840</a> optional: <span class="kw">_</span>,
+<a href=#2841 id=2841 data-nosnippet>2841</a> }) => <span class="kw">match </span>ty {
+<a href=#2842 id=2842 data-nosnippet>2842</a> Type::Struct(struct_ty) => {
+<a href=#2843 id=2843 data-nosnippet>2843</a> <span class="kw">let </span>iters: Vec<<span class="prelude-ty">Option</span><Literal>> = required
+<a href=#2844 id=2844 data-nosnippet>2844</a> .into_iter()
+<a href=#2845 id=2845 data-nosnippet>2845</a> .map(|(field_name, value)| {
+<a href=#2846 id=2846 data-nosnippet>2846</a> <span class="kw">let </span>field = struct_ty
+<a href=#2847 id=2847 data-nosnippet>2847</a> .field_by_name(field_name.as_str())
+<a href=#2848 id=2848 data-nosnippet>2848</a> .ok_or_else(|| {
+<a href=#2849 id=2849 data-nosnippet>2849</a> invalid_err_with_reason(
+<a href=#2850 id=2850 data-nosnippet>2850</a> <span class="string">"record"</span>,
+<a href=#2851 id=2851 data-nosnippet>2851</a> <span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"field {} is not exist"</span>, <span class="kw-2">&</span>field_name),
+<a href=#2852 id=2852 data-nosnippet>2852</a> )
+<a href=#2853 id=2853 data-nosnippet>2853</a> })<span class="question-mark">?</span>;
+<a href=#2854 id=2854 data-nosnippet>2854</a> <span class="kw">let </span>value = value.try_into(<span class="kw-2">&</span>field.field_type)<span class="question-mark">?</span>;
+<a href=#2855 id=2855 data-nosnippet>2855</a> <span class="prelude-val">Ok</span>(value)
+<a href=#2856 id=2856 data-nosnippet>2856</a> })
+<a href=#2857 id=2857 data-nosnippet>2857</a> .collect::<<span class="prelude-ty">Result</span><<span class="kw">_</span>, Error>>()<span class="question-mark">?</span>;
+<a href=#2858 id=2858 data-nosnippet>2858</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Struct(<span class="kw">super</span>::Struct::from_iter(iters))))
+<a href=#2859 id=2859 data-nosnippet>2859</a> }
+<a href=#2860 id=2860 data-nosnippet>2860</a> Type::Map(map_ty) => {
+<a href=#2861 id=2861 data-nosnippet>2861</a> <span class="kw">if </span><span class="kw-2">*</span>map_ty.key_field.field_type != Type::Primitive(PrimitiveType::String) {
+<a href=#2862 id=2862 data-nosnippet>2862</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2863 id=2863 data-nosnippet>2863</a> <span class="string">"record"</span>,
+<a href=#2864 id=2864 data-nosnippet>2864</a> <span class="string">"Map key must be string"</span>,
+<a href=#2865 id=2865 data-nosnippet>2865</a> ));
+<a href=#2866 id=2866 data-nosnippet>2866</a> }
+<a href=#2867 id=2867 data-nosnippet>2867</a> <span class="kw">let </span><span class="kw-2">mut </span>map = Map::new();
+<a href=#2868 id=2868 data-nosnippet>2868</a> <span class="kw">for </span>(k, v) <span class="kw">in </span>required {
+<a href=#2869 id=2869 data-nosnippet>2869</a> <span class="kw">let </span>value = v.try_into(<span class="kw-2">&</span>map_ty.value_field.field_type)<span class="question-mark">?</span>;
+<a href=#2870 id=2870 data-nosnippet>2870</a> <span class="kw">if </span>map_ty.value_field.required && value.is_none() {
+<a href=#2871 id=2871 data-nosnippet>2871</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2872 id=2872 data-nosnippet>2872</a> <span class="string">"record"</span>,
+<a href=#2873 id=2873 data-nosnippet>2873</a> <span class="string">"Value element is required in this Map"</span>,
+<a href=#2874 id=2874 data-nosnippet>2874</a> ));
+<a href=#2875 id=2875 data-nosnippet>2875</a> }
+<a href=#2876 id=2876 data-nosnippet>2876</a> map.insert(Literal::string(k), value);
+<a href=#2877 id=2877 data-nosnippet>2877</a> }
+<a href=#2878 id=2878 data-nosnippet>2878</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Map(map)))
+<a href=#2879 id=2879 data-nosnippet>2879</a> }
+<a href=#2880 id=2880 data-nosnippet>2880</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"record"</span>)),
+<a href=#2881 id=2881 data-nosnippet>2881</a> },
+<a href=#2882 id=2882 data-nosnippet>2882</a> RawLiteralEnum::StringMap(<span class="kw">_</span>) => <span class="prelude-val">Err</span>(invalid_err(<span class="string">"string map"</span>)),
+<a href=#2883 id=2883 data-nosnippet>2883</a> }
+<a href=#2884 id=2884 data-nosnippet>2884</a> }
+<a href=#2885 id=2885 data-nosnippet>2885</a> }
+<a href=#2886 id=2886 data-nosnippet>2886</a>}
+<a href=#2887 id=2887 data-nosnippet>2887</a>
+<a href=#2888 id=2888 data-nosnippet>2888</a><span class="attr">#[cfg(test)]
+<a href=#2889 id=2889 data-nosnippet>2889</a></span><span class="kw">mod </span>tests {
+<a href=#2890 id=2890 data-nosnippet>2890</a> <span class="kw">use </span>apache_avro::to_value;
+<a href=#2891 id=2891 data-nosnippet>2891</a> <span class="kw">use </span>apache_avro::types::Value;
<a href=#2892 id=2892 data-nosnippet>2892</a>
-<a href=#2893 id=2893 data-nosnippet>2893</a> <span class="kw">let </span><span class="kw-2">mut </span>writer = apache_avro::Writer::new(<span class="kw-2">&</span>schema, Vec::new());
-<a href=#2894 id=2894 data-nosnippet>2894</a> writer.append_ser(datum.to_bytes().unwrap()).unwrap();
-<a href=#2895 id=2895 data-nosnippet>2895</a> <span class="kw">let </span>encoded = writer.into_inner().unwrap();
-<a href=#2896 id=2896 data-nosnippet>2896</a> <span class="kw">let </span>reader = apache_avro::Reader::with_schema(<span class="kw-2">&</span>schema, <span class="kw-2">&*</span>encoded).unwrap();
-<a href=#2897 id=2897 data-nosnippet>2897</a>
-<a href=#2898 id=2898 data-nosnippet>2898</a> <span class="kw">for </span>record <span class="kw">in </span>reader {
-<a href=#2899 id=2899 data-nosnippet>2899</a> <span class="kw">let </span>result = apache_avro::from_value::<ByteBuf>(<span class="kw-2">&</span>record.unwrap()).unwrap();
-<a href=#2900 id=2900 data-nosnippet>2900</a> <span class="kw">let </span>desered_datum = Datum::try_from_bytes(<span class="kw-2">&</span>result, expected_type.clone()).unwrap();
-<a href=#2901 id=2901 data-nosnippet>2901</a> <span class="macro">assert_eq!</span>(desered_datum, expected_datum);
-<a href=#2902 id=2902 data-nosnippet>2902</a> }
-<a href=#2903 id=2903 data-nosnippet>2903</a> }
+<a href=#2893 id=2893 data-nosnippet>2893</a> <span class="kw">use super</span>::<span class="kw-2">*</span>;
+<a href=#2894 id=2894 data-nosnippet>2894</a> <span class="kw">use </span><span class="kw">crate</span>::avro::schema_to_avro_schema;
+<a href=#2895 id=2895 data-nosnippet>2895</a> <span class="kw">use </span><span class="kw">crate</span>::spec::Schema;
+<a href=#2896 id=2896 data-nosnippet>2896</a> <span class="kw">use </span><span class="kw">crate</span>::spec::Type::Primitive;
+<a href=#2897 id=2897 data-nosnippet>2897</a> <span class="kw">use </span><span class="kw">crate</span>::spec::datatypes::{ListType, MapType, NestedField, StructType};
+<a href=#2898 id=2898 data-nosnippet>2898</a>
+<a href=#2899 id=2899 data-nosnippet>2899</a> <span class="kw">fn </span>check_json_serde(json: <span class="kw-2">&</span>str, expected_literal: Literal, expected_type: <span class="kw-2">&</span>Type) {
+<a href=#2900 id=2900 data-nosnippet>2900</a> <span class="kw">let </span>raw_json_value = serde_json::from_str::<JsonValue>(json).unwrap();
+<a href=#2901 id=2901 data-nosnippet>2901</a> <span class="kw">let </span>desered_literal =
+<a href=#2902 id=2902 data-nosnippet>2902</a> Literal::try_from_json(raw_json_value.clone(), expected_type).unwrap();
+<a href=#2903 id=2903 data-nosnippet>2903</a> <span class="macro">assert_eq!</span>(desered_literal, <span class="prelude-val">Some</span>(expected_literal.clone()));
<a href=#2904 id=2904 data-nosnippet>2904</a>
-<a href=#2905 id=2905 data-nosnippet>2905</a> <span class="kw">fn </span>check_convert_with_avro(expected_literal: Literal, expected_type: <span class="kw-2">&</span>Type) {
-<a href=#2906 id=2906 data-nosnippet>2906</a> <span class="kw">let </span>fields = <span class="macro">vec!</span>[NestedField::required(<span class="number">1</span>, <span class="string">"col"</span>, expected_type.clone()).into()];
-<a href=#2907 id=2907 data-nosnippet>2907</a> <span class="kw">let </span>schema = Schema::builder()
-<a href=#2908 id=2908 data-nosnippet>2908</a> .with_fields(fields.clone())
-<a href=#2909 id=2909 data-nosnippet>2909</a> .build()
-<a href=#2910 id=2910 data-nosnippet>2910</a> .unwrap();
-<a href=#2911 id=2911 data-nosnippet>2911</a> <span class="kw">let </span>avro_schema = schema_to_avro_schema(<span class="string">"test"</span>, <span class="kw-2">&</span>schema).unwrap();
-<a href=#2912 id=2912 data-nosnippet>2912</a> <span class="kw">let </span>struct_type = Type::Struct(StructType::new(fields));
-<a href=#2913 id=2913 data-nosnippet>2913</a> <span class="kw">let </span>struct_literal =
-<a href=#2914 id=2914 data-nosnippet>2914</a> Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[<span class="prelude-val">Some</span>(expected_literal.clone())]));
-<a href=#2915 id=2915 data-nosnippet>2915</a>
-<a href=#2916 id=2916 data-nosnippet>2916</a> <span class="kw">let </span><span class="kw-2">mut </span>writer = apache_avro::Writer::new(<span class="kw-2">&</span>avro_schema, Vec::new());
-<a href=#2917 id=2917 data-nosnippet>2917</a> <span class="kw">let </span>raw_literal = RawLiteral::try_from(struct_literal.clone(), <span class="kw-2">&</span>struct_type).unwrap();
-<a href=#2918 id=2918 data-nosnippet>2918</a> writer.append_ser(raw_literal).unwrap();
-<a href=#2919 id=2919 data-nosnippet>2919</a> <span class="kw">let </span>encoded = writer.into_inner().unwrap();
-<a href=#2920 id=2920 data-nosnippet>2920</a>
-<a href=#2921 id=2921 data-nosnippet>2921</a> <span class="kw">let </span>reader = apache_avro::Reader::new(<span class="kw-2">&*</span>encoded).unwrap();
-<a href=#2922 id=2922 data-nosnippet>2922</a> <span class="kw">for </span>record <span class="kw">in </span>reader {
-<a href=#2923 id=2923 data-nosnippet>2923</a> <span class="kw">let </span>result = apache_avro::from_value::<RawLiteral>(<span class="kw-2">&</span>record.unwrap()).unwrap();
-<a href=#2924 id=2924 data-nosnippet>2924</a> <span class="kw">let </span>desered_literal = result.try_into(<span class="kw-2">&</span>struct_type).unwrap().unwrap();
-<a href=#2925 id=2925 data-nosnippet>2925</a> <span class="macro">assert_eq!</span>(desered_literal, struct_literal);
-<a href=#2926 id=2926 data-nosnippet>2926</a> }
-<a href=#2927 id=2927 data-nosnippet>2927</a> }
+<a href=#2905 id=2905 data-nosnippet>2905</a> <span class="kw">let </span>expected_json_value: JsonValue = expected_literal.try_into_json(expected_type).unwrap();
+<a href=#2906 id=2906 data-nosnippet>2906</a> <span class="kw">let </span>sered_json = serde_json::to_string(<span class="kw-2">&</span>expected_json_value).unwrap();
+<a href=#2907 id=2907 data-nosnippet>2907</a> <span class="kw">let </span>parsed_json_value = serde_json::from_str::<JsonValue>(<span class="kw-2">&</span>sered_json).unwrap();
+<a href=#2908 id=2908 data-nosnippet>2908</a>
+<a href=#2909 id=2909 data-nosnippet>2909</a> <span class="macro">assert_eq!</span>(parsed_json_value, raw_json_value);
+<a href=#2910 id=2910 data-nosnippet>2910</a> }
+<a href=#2911 id=2911 data-nosnippet>2911</a>
+<a href=#2912 id=2912 data-nosnippet>2912</a> <span class="kw">fn </span>check_avro_bytes_serde(
+<a href=#2913 id=2913 data-nosnippet>2913</a> input: Vec<u8>,
+<a href=#2914 id=2914 data-nosnippet>2914</a> expected_datum: Datum,
+<a href=#2915 id=2915 data-nosnippet>2915</a> expected_type: <span class="kw-2">&</span>PrimitiveType,
+<a href=#2916 id=2916 data-nosnippet>2916</a> ) {
+<a href=#2917 id=2917 data-nosnippet>2917</a> <span class="kw">let </span>raw_schema = <span class="string">r#""bytes""#</span>;
+<a href=#2918 id=2918 data-nosnippet>2918</a> <span class="kw">let </span>schema = apache_avro::Schema::parse_str(raw_schema).unwrap();
+<a href=#2919 id=2919 data-nosnippet>2919</a>
+<a href=#2920 id=2920 data-nosnippet>2920</a> <span class="kw">let </span>bytes = ByteBuf::from(input);
+<a href=#2921 id=2921 data-nosnippet>2921</a> <span class="kw">let </span>datum = Datum::try_from_bytes(<span class="kw-2">&</span>bytes, expected_type.clone()).unwrap();
+<a href=#2922 id=2922 data-nosnippet>2922</a> <span class="macro">assert_eq!</span>(datum, expected_datum);
+<a href=#2923 id=2923 data-nosnippet>2923</a>
+<a href=#2924 id=2924 data-nosnippet>2924</a> <span class="kw">let </span><span class="kw-2">mut </span>writer = apache_avro::Writer::new(<span class="kw-2">&</span>schema, Vec::new());
+<a href=#2925 id=2925 data-nosnippet>2925</a> writer.append_ser(datum.to_bytes().unwrap()).unwrap();
+<a href=#2926 id=2926 data-nosnippet>2926</a> <span class="kw">let </span>encoded = writer.into_inner().unwrap();
+<a href=#2927 id=2927 data-nosnippet>2927</a> <span class="kw">let </span>reader = apache_avro::Reader::with_schema(<span class="kw-2">&</span>schema, <span class="kw-2">&*</span>encoded).unwrap();
<a href=#2928 id=2928 data-nosnippet>2928</a>
-<a href=#2929 id=2929 data-nosnippet>2929</a> <span class="kw">fn </span>check_serialize_avro(literal: Literal, ty: <span class="kw-2">&</span>Type, expect_value: Value) {
-<a href=#2930 id=2930 data-nosnippet>2930</a> <span class="kw">let </span>expect_value = Value::Record(<span class="macro">vec!</span>[(<span class="string">"col"</span>.to_string(), expect_value)]);
-<a href=#2931 id=2931 data-nosnippet>2931</a>
-<a href=#2932 id=2932 data-nosnippet>2932</a> <span class="kw">let </span>fields = <span class="macro">vec!</span>[NestedField::required(<span class="number">1</span>, <span class="string">"col"</span>, ty.clone()).into()];
-<a href=#2933 id=2933 data-nosnippet>2933</a> <span class="kw">let </span>schema = Schema::builder()
-<a href=#2934 id=2934 data-nosnippet>2934</a> .with_fields(fields.clone())
-<a href=#2935 id=2935 data-nosnippet>2935</a> .build()
-<a href=#2936 id=2936 data-nosnippet>2936</a> .unwrap();
-<a href=#2937 id=2937 data-nosnippet>2937</a> <span class="kw">let </span>avro_schema = schema_to_avro_schema(<span class="string">"test"</span>, <span class="kw-2">&</span>schema).unwrap();
-<a href=#2938 id=2938 data-nosnippet>2938</a> <span class="kw">let </span>struct_type = Type::Struct(StructType::new(fields));
-<a href=#2939 id=2939 data-nosnippet>2939</a> <span class="kw">let </span>struct_literal = Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[<span class="prelude-val">Some</span>(literal.clone())]));
-<a href=#2940 id=2940 data-nosnippet>2940</a> <span class="kw">let </span><span class="kw-2">mut </span>writer = apache_avro::Writer::new(<span class="kw-2">&</span>avro_schema, Vec::new());
-<a href=#2941 id=2941 data-nosnippet>2941</a> <span class="kw">let </span>raw_literal = RawLiteral::try_from(struct_literal.clone(), <span class="kw-2">&</span>struct_type).unwrap();
-<a href=#2942 id=2942 data-nosnippet>2942</a> <span class="kw">let </span>value = to_value(raw_literal)
-<a href=#2943 id=2943 data-nosnippet>2943</a> .unwrap()
-<a href=#2944 id=2944 data-nosnippet>2944</a> .resolve(<span class="kw-2">&</span>avro_schema)
-<a href=#2945 id=2945 data-nosnippet>2945</a> .unwrap();
-<a href=#2946 id=2946 data-nosnippet>2946</a> writer.append_value_ref(<span class="kw-2">&</span>value).unwrap();
-<a href=#2947 id=2947 data-nosnippet>2947</a> <span class="kw">let </span>encoded = writer.into_inner().unwrap();
-<a href=#2948 id=2948 data-nosnippet>2948</a>
-<a href=#2949 id=2949 data-nosnippet>2949</a> <span class="kw">let </span>reader = apache_avro::Reader::new(<span class="kw-2">&*</span>encoded).unwrap();
-<a href=#2950 id=2950 data-nosnippet>2950</a> <span class="kw">for </span>record <span class="kw">in </span>reader {
-<a href=#2951 id=2951 data-nosnippet>2951</a> <span class="macro">assert_eq!</span>(record.unwrap(), expect_value);
-<a href=#2952 id=2952 data-nosnippet>2952</a> }
-<a href=#2953 id=2953 data-nosnippet>2953</a> }
-<a href=#2954 id=2954 data-nosnippet>2954</a>
-<a href=#2955 id=2955 data-nosnippet>2955</a> <span class="attr">#[test]
-<a href=#2956 id=2956 data-nosnippet>2956</a> </span><span class="kw">fn </span>json_boolean() {
-<a href=#2957 id=2957 data-nosnippet>2957</a> <span class="kw">let </span>record = <span class="string">r#"true"#</span>;
-<a href=#2958 id=2958 data-nosnippet>2958</a>
-<a href=#2959 id=2959 data-nosnippet>2959</a> check_json_serde(
-<a href=#2960 id=2960 data-nosnippet>2960</a> record,
-<a href=#2961 id=2961 data-nosnippet>2961</a> Literal::Primitive(PrimitiveLiteral::Boolean(<span class="bool-val">true</span>)),
-<a href=#2962 id=2962 data-nosnippet>2962</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Boolean),
-<a href=#2963 id=2963 data-nosnippet>2963</a> );
-<a href=#2964 id=2964 data-nosnippet>2964</a> }
-<a href=#2965 id=2965 data-nosnippet>2965</a>
-<a href=#2966 id=2966 data-nosnippet>2966</a> <span class="attr">#[test]
-<a href=#2967 id=2967 data-nosnippet>2967</a> </span><span class="kw">fn </span>json_int() {
-<a href=#2968 id=2968 data-nosnippet>2968</a> <span class="kw">let </span>record = <span class="string">r#"32"#</span>;
-<a href=#2969 id=2969 data-nosnippet>2969</a>
-<a href=#2970 id=2970 data-nosnippet>2970</a> check_json_serde(
-<a href=#2971 id=2971 data-nosnippet>2971</a> record,
-<a href=#2972 id=2972 data-nosnippet>2972</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">32</span>)),
-<a href=#2973 id=2973 data-nosnippet>2973</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Int),
-<a href=#2974 id=2974 data-nosnippet>2974</a> );
-<a href=#2975 id=2975 data-nosnippet>2975</a> }
-<a href=#2976 id=2976 data-nosnippet>2976</a>
-<a href=#2977 id=2977 data-nosnippet>2977</a> <span class="attr">#[test]
-<a href=#2978 id=2978 data-nosnippet>2978</a> </span><span class="kw">fn </span>json_long() {
-<a href=#2979 id=2979 data-nosnippet>2979</a> <span class="kw">let </span>record = <span class="string">r#"32"#</span>;
-<a href=#2980 id=2980 data-nosnippet>2980</a>
-<a href=#2981 id=2981 data-nosnippet>2981</a> check_json_serde(
-<a href=#2982 id=2982 data-nosnippet>2982</a> record,
-<a href=#2983 id=2983 data-nosnippet>2983</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">32</span>)),
-<a href=#2984 id=2984 data-nosnippet>2984</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Long),
-<a href=#2985 id=2985 data-nosnippet>2985</a> );
-<a href=#2986 id=2986 data-nosnippet>2986</a> }
-<a href=#2987 id=2987 data-nosnippet>2987</a>
-<a href=#2988 id=2988 data-nosnippet>2988</a> <span class="attr">#[test]
-<a href=#2989 id=2989 data-nosnippet>2989</a> </span><span class="kw">fn </span>json_float() {
-<a href=#2990 id=2990 data-nosnippet>2990</a> <span class="kw">let </span>record = <span class="string">r#"1.0"#</span>;
-<a href=#2991 id=2991 data-nosnippet>2991</a>
-<a href=#2992 id=2992 data-nosnippet>2992</a> check_json_serde(
-<a href=#2993 id=2993 data-nosnippet>2993</a> record,
-<a href=#2994 id=2994 data-nosnippet>2994</a> Literal::Primitive(PrimitiveLiteral::Float(OrderedFloat(<span class="number">1.0</span>))),
-<a href=#2995 id=2995 data-nosnippet>2995</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Float),
-<a href=#2996 id=2996 data-nosnippet>2996</a> );
-<a href=#2997 id=2997 data-nosnippet>2997</a> }
-<a href=#2998 id=2998 data-nosnippet>2998</a>
-<a href=#2999 id=2999 data-nosnippet>2999</a> <span class="attr">#[test]
-<a href=#3000 id=3000 data-nosnippet>3000</a> </span><span class="kw">fn </span>json_double() {
-<a href=#3001 id=3001 data-nosnippet>3001</a> <span class="kw">let </span>record = <span class="string">r#"1.0"#</span>;
-<a href=#3002 id=3002 data-nosnippet>3002</a>
-<a href=#3003 id=3003 data-nosnippet>3003</a> check_json_serde(
-<a href=#3004 id=3004 data-nosnippet>3004</a> record,
-<a href=#3005 id=3005 data-nosnippet>3005</a> Literal::Primitive(PrimitiveLiteral::Double(OrderedFloat(<span class="number">1.0</span>))),
-<a href=#3006 id=3006 data-nosnippet>3006</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Double),
-<a href=#3007 id=3007 data-nosnippet>3007</a> );
-<a href=#3008 id=3008 data-nosnippet>3008</a> }
-<a href=#3009 id=3009 data-nosnippet>3009</a>
-<a href=#3010 id=3010 data-nosnippet>3010</a> <span class="attr">#[test]
-<a href=#3011 id=3011 data-nosnippet>3011</a> </span><span class="kw">fn </span>json_date() {
-<a href=#3012 id=3012 data-nosnippet>3012</a> <span class="kw">let </span>record = <span class="string">r#""2017-11-16""#</span>;
-<a href=#3013 id=3013 data-nosnippet>3013</a>
-<a href=#3014 id=3014 data-nosnippet>3014</a> check_json_serde(
-<a href=#3015 id=3015 data-nosnippet>3015</a> record,
-<a href=#3016 id=3016 data-nosnippet>3016</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">17486</span>)),
-<a href=#3017 id=3017 data-nosnippet>3017</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Date),
-<a href=#3018 id=3018 data-nosnippet>3018</a> );
-<a href=#3019 id=3019 data-nosnippet>3019</a> }
-<a href=#3020 id=3020 data-nosnippet>3020</a>
-<a href=#3021 id=3021 data-nosnippet>3021</a> <span class="attr">#[test]
-<a href=#3022 id=3022 data-nosnippet>3022</a> </span><span class="kw">fn </span>json_time() {
-<a href=#3023 id=3023 data-nosnippet>3023</a> <span class="kw">let </span>record = <span class="string">r#""22:31:08.123456""#</span>;
-<a href=#3024 id=3024 data-nosnippet>3024</a>
-<a href=#3025 id=3025 data-nosnippet>3025</a> check_json_serde(
-<a href=#3026 id=3026 data-nosnippet>3026</a> record,
-<a href=#3027 id=3027 data-nosnippet>3027</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">81068123456</span>)),
-<a href=#3028 id=3028 data-nosnippet>3028</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Time),
-<a href=#3029 id=3029 data-nosnippet>3029</a> );
-<a href=#3030 id=3030 data-nosnippet>3030</a> }
-<a href=#3031 id=3031 data-nosnippet>3031</a>
-<a href=#3032 id=3032 data-nosnippet>3032</a> <span class="attr">#[test]
-<a href=#3033 id=3033 data-nosnippet>3033</a> </span><span class="kw">fn </span>json_timestamp() {
-<a href=#3034 id=3034 data-nosnippet>3034</a> <span class="kw">let </span>record = <span class="string">r#""2017-11-16T22:31:08.123456""#</span>;
-<a href=#3035 id=3035 data-nosnippet>3035</a>
-<a href=#3036 id=3036 data-nosnippet>3036</a> check_json_serde(
-<a href=#3037 id=3037 data-nosnippet>3037</a> record,
-<a href=#3038 id=3038 data-nosnippet>3038</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
-<a href=#3039 id=3039 data-nosnippet>3039</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Timestamp),
-<a href=#3040 id=3040 data-nosnippet>3040</a> );
-<a href=#3041 id=3041 data-nosnippet>3041</a> }
-<a href=#3042 id=3042 data-nosnippet>3042</a>
-<a href=#3043 id=3043 data-nosnippet>3043</a> <span class="attr">#[test]
-<a href=#3044 id=3044 data-nosnippet>3044</a> </span><span class="kw">fn </span>json_timestamptz() {
-<a href=#3045 id=3045 data-nosnippet>3045</a> <span class="kw">let </span>record = <span class="string">r#""2017-11-16T22:31:08.123456+00:00""#</span>;
-<a href=#3046 id=3046 data-nosnippet>3046</a>
-<a href=#3047 id=3047 data-nosnippet>3047</a> check_json_serde(
-<a href=#3048 id=3048 data-nosnippet>3048</a> record,
-<a href=#3049 id=3049 data-nosnippet>3049</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
-<a href=#3050 id=3050 data-nosnippet>3050</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Timestamptz),
-<a href=#3051 id=3051 data-nosnippet>3051</a> );
-<a href=#3052 id=3052 data-nosnippet>3052</a> }
-<a href=#3053 id=3053 data-nosnippet>3053</a>
-<a href=#3054 id=3054 data-nosnippet>3054</a> <span class="attr">#[test]
-<a href=#3055 id=3055 data-nosnippet>3055</a> </span><span class="kw">fn </span>json_string() {
-<a href=#3056 id=3056 data-nosnippet>3056</a> <span class="kw">let </span>record = <span class="string">r#""iceberg""#</span>;
-<a href=#3057 id=3057 data-nosnippet>3057</a>
-<a href=#3058 id=3058 data-nosnippet>3058</a> check_json_serde(
-<a href=#3059 id=3059 data-nosnippet>3059</a> record,
-<a href=#3060 id=3060 data-nosnippet>3060</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"iceberg"</span>.to_string())),
-<a href=#3061 id=3061 data-nosnippet>3061</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::String),
-<a href=#3062 id=3062 data-nosnippet>3062</a> );
-<a href=#3063 id=3063 data-nosnippet>3063</a> }
-<a href=#3064 id=3064 data-nosnippet>3064</a>
-<a href=#3065 id=3065 data-nosnippet>3065</a> <span class="attr">#[test]
-<a href=#3066 id=3066 data-nosnippet>3066</a> </span><span class="kw">fn </span>json_uuid() {
-<a href=#3067 id=3067 data-nosnippet>3067</a> <span class="kw">let </span>record = <span class="string">r#""f79c3e09-677c-4bbd-a479-3f349cb785e7""#</span>;
-<a href=#3068 id=3068 data-nosnippet>3068</a>
-<a href=#3069 id=3069 data-nosnippet>3069</a> check_json_serde(
-<a href=#3070 id=3070 data-nosnippet>3070</a> record,
-<a href=#3071 id=3071 data-nosnippet>3071</a> Literal::Primitive(PrimitiveLiteral::UInt128(
-<a href=#3072 id=3072 data-nosnippet>3072</a> Uuid::parse_str(<span class="string">"f79c3e09-677c-4bbd-a479-3f349cb785e7"</span>)
-<a href=#3073 id=3073 data-nosnippet>3073</a> .unwrap()
-<a href=#3074 id=3074 data-nosnippet>3074</a> .as_u128(),
-<a href=#3075 id=3075 data-nosnippet>3075</a> )),
-<a href=#3076 id=3076 data-nosnippet>3076</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Uuid),
-<a href=#3077 id=3077 data-nosnippet>3077</a> );
-<a href=#3078 id=3078 data-nosnippet>3078</a> }
-<a href=#3079 id=3079 data-nosnippet>3079</a>
-<a href=#3080 id=3080 data-nosnippet>3080</a> <span class="attr">#[test]
-<a href=#3081 id=3081 data-nosnippet>3081</a> </span><span class="kw">fn </span>json_decimal() {
-<a href=#3082 id=3082 data-nosnippet>3082</a> <span class="kw">let </span>record = <span class="string">r#""14.20""#</span>;
-<a href=#3083 id=3083 data-nosnippet>3083</a>
-<a href=#3084 id=3084 data-nosnippet>3084</a> check_json_serde(
-<a href=#3085 id=3085 data-nosnippet>3085</a> record,
-<a href=#3086 id=3086 data-nosnippet>3086</a> Literal::Primitive(PrimitiveLiteral::Int128(<span class="number">1420</span>)),
-<a href=#3087 id=3087 data-nosnippet>3087</a> <span class="kw-2">&</span>Type::decimal(<span class="number">28</span>, <span class="number">2</span>).unwrap(),
-<a href=#3088 id=3088 data-nosnippet>3088</a> );
-<a href=#3089 id=3089 data-nosnippet>3089</a> }
-<a href=#3090 id=3090 data-nosnippet>3090</a>
-<a href=#3091 id=3091 data-nosnippet>3091</a> <span class="attr">#[test]
-<a href=#3092 id=3092 data-nosnippet>3092</a> </span><span class="kw">fn </span>json_struct() {
-<a href=#3093 id=3093 data-nosnippet>3093</a> <span class="kw">let </span>record = <span class="string">r#"{"1": 1, "2": "bar", "3": null}"#</span>;
-<a href=#3094 id=3094 data-nosnippet>3094</a>
-<a href=#3095 id=3095 data-nosnippet>3095</a> check_json_serde(
-<a href=#3096 id=3096 data-nosnippet>3096</a> record,
-<a href=#3097 id=3097 data-nosnippet>3097</a> Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[
-<a href=#3098 id=3098 data-nosnippet>3098</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3099 id=3099 data-nosnippet>3099</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::String(
-<a href=#3100 id=3100 data-nosnippet>3100</a> <span class="string">"bar"</span>.to_string(),
-<a href=#3101 id=3101 data-nosnippet>3101</a> ))),
-<a href=#3102 id=3102 data-nosnippet>3102</a> <span class="prelude-val">None</span>,
-<a href=#3103 id=3103 data-nosnippet>3103</a> ])),
-<a href=#3104 id=3104 data-nosnippet>3104</a> <span class="kw-2">&</span>Type::Struct(StructType::new(<span class="macro">vec!</span>[
-<a href=#3105 id=3105 data-nosnippet>3105</a> NestedField::required(<span class="number">1</span>, <span class="string">"id"</span>, Type::Primitive(PrimitiveType::Int)).into(),
-<a href=#3106 id=3106 data-nosnippet>3106</a> NestedField::optional(<span class="number">2</span>, <span class="string">"name"</span>, Type::Primitive(PrimitiveType::String)).into(),
-<a href=#3107 id=3107 data-nosnippet>3107</a> NestedField::optional(<span class="number">3</span>, <span class="string">"address"</span>, Type::Primitive(PrimitiveType::String)).into(),
-<a href=#3108 id=3108 data-nosnippet>3108</a> ])),
-<a href=#3109 id=3109 data-nosnippet>3109</a> );
-<a href=#3110 id=3110 data-nosnippet>3110</a> }
-<a href=#3111 id=3111 data-nosnippet>3111</a>
-<a href=#3112 id=3112 data-nosnippet>3112</a> <span class="attr">#[test]
-<a href=#3113 id=3113 data-nosnippet>3113</a> </span><span class="kw">fn </span>json_list() {
-<a href=#3114 id=3114 data-nosnippet>3114</a> <span class="kw">let </span>record = <span class="string">r#"[1, 2, 3, null]"#</span>;
-<a href=#3115 id=3115 data-nosnippet>3115</a>
-<a href=#3116 id=3116 data-nosnippet>3116</a> check_json_serde(
-<a href=#3117 id=3117 data-nosnippet>3117</a> record,
-<a href=#3118 id=3118 data-nosnippet>3118</a> Literal::List(<span class="macro">vec!</span>[
-<a href=#3119 id=3119 data-nosnippet>3119</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3120 id=3120 data-nosnippet>3120</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
-<a href=#3121 id=3121 data-nosnippet>3121</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
-<a href=#3122 id=3122 data-nosnippet>3122</a> <span class="prelude-val">None</span>,
-<a href=#3123 id=3123 data-nosnippet>3123</a> ]),
-<a href=#3124 id=3124 data-nosnippet>3124</a> <span class="kw-2">&</span>Type::List(ListType {
-<a href=#3125 id=3125 data-nosnippet>3125</a> element_field: NestedField::list_element(
-<a href=#3126 id=3126 data-nosnippet>3126</a> <span class="number">0</span>,
-<a href=#3127 id=3127 data-nosnippet>3127</a> Type::Primitive(PrimitiveType::Int),
-<a href=#3128 id=3128 data-nosnippet>3128</a> <span class="bool-val">true</span>,
-<a href=#3129 id=3129 data-nosnippet>3129</a> )
-<a href=#3130 id=3130 data-nosnippet>3130</a> .into(),
-<a href=#3131 id=3131 data-nosnippet>3131</a> }),
-<a href=#3132 id=3132 data-nosnippet>3132</a> );
-<a href=#3133 id=3133 data-nosnippet>3133</a> }
-<a href=#3134 id=3134 data-nosnippet>3134</a>
-<a href=#3135 id=3135 data-nosnippet>3135</a> <span class="attr">#[test]
-<a href=#3136 id=3136 data-nosnippet>3136</a> </span><span class="kw">fn </span>json_map() {
-<a href=#3137 id=3137 data-nosnippet>3137</a> <span class="kw">let </span>record = <span class="string">r#"{ "keys": ["a", "b", "c"], "values": [1, 2, null] }"#</span>;
-<a href=#3138 id=3138 data-nosnippet>3138</a>
-<a href=#3139 id=3139 data-nosnippet>3139</a> check_json_serde(
-<a href=#3140 id=3140 data-nosnippet>3140</a> record,
-<a href=#3141 id=3141 data-nosnippet>3141</a> Literal::Map(Map::from([
-<a href=#3142 id=3142 data-nosnippet>3142</a> (
-<a href=#3143 id=3143 data-nosnippet>3143</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"a"</span>.to_string())),
-<a href=#3144 id=3144 data-nosnippet>3144</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3145 id=3145 data-nosnippet>3145</a> ),
-<a href=#3146 id=3146 data-nosnippet>3146</a> (
-<a href=#3147 id=3147 data-nosnippet>3147</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"b"</span>.to_string())),
-<a href=#3148 id=3148 data-nosnippet>3148</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
-<a href=#3149 id=3149 data-nosnippet>3149</a> ),
-<a href=#3150 id=3150 data-nosnippet>3150</a> (
-<a href=#3151 id=3151 data-nosnippet>3151</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"c"</span>.to_string())),
-<a href=#3152 id=3152 data-nosnippet>3152</a> <span class="prelude-val">None</span>,
-<a href=#3153 id=3153 data-nosnippet>3153</a> ),
-<a href=#3154 id=3154 data-nosnippet>3154</a> ])),
-<a href=#3155 id=3155 data-nosnippet>3155</a> <span class="kw-2">&</span>Type::Map(MapType {
-<a href=#3156 id=3156 data-nosnippet>3156</a> key_field: NestedField::map_key_element(<span class="number">0</span>, Type::Primitive(PrimitiveType::String))
-<a href=#3157 id=3157 data-nosnippet>3157</a> .into(),
-<a href=#3158 id=3158 data-nosnippet>3158</a> value_field: NestedField::map_value_element(
-<a href=#3159 id=3159 data-nosnippet>3159</a> <span class="number">1</span>,
-<a href=#3160 id=3160 data-nosnippet>3160</a> Type::Primitive(PrimitiveType::Int),
-<a href=#3161 id=3161 data-nosnippet>3161</a> <span class="bool-val">true</span>,
-<a href=#3162 id=3162 data-nosnippet>3162</a> )
-<a href=#3163 id=3163 data-nosnippet>3163</a> .into(),
-<a href=#3164 id=3164 data-nosnippet>3164</a> }),
-<a href=#3165 id=3165 data-nosnippet>3165</a> );
-<a href=#3166 id=3166 data-nosnippet>3166</a> }
-<a href=#3167 id=3167 data-nosnippet>3167</a>
-<a href=#3168 id=3168 data-nosnippet>3168</a> <span class="attr">#[test]
-<a href=#3169 id=3169 data-nosnippet>3169</a> </span><span class="kw">fn </span>avro_bytes_boolean() {
-<a href=#3170 id=3170 data-nosnippet>3170</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">1u8</span>];
-<a href=#3171 id=3171 data-nosnippet>3171</a>
-<a href=#3172 id=3172 data-nosnippet>3172</a> check_avro_bytes_serde(bytes, Datum::bool(<span class="bool-val">true</span>), <span class="kw-2">&</span>PrimitiveType::Boolean);
-<a href=#3173 id=3173 data-nosnippet>3173</a> }
-<a href=#3174 id=3174 data-nosnippet>3174</a>
-<a href=#3175 id=3175 data-nosnippet>3175</a> <span class="attr">#[test]
-<a href=#3176 id=3176 data-nosnippet>3176</a> </span><span class="kw">fn </span>avro_bytes_int() {
-<a href=#3177 id=3177 data-nosnippet>3177</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">32u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>];
-<a href=#3178 id=3178 data-nosnippet>3178</a>
-<a href=#3179 id=3179 data-nosnippet>3179</a> check_avro_bytes_serde(bytes, Datum::int(<span class="number">32</span>), <span class="kw-2">&</span>PrimitiveType::Int);
-<a href=#3180 id=3180 data-nosnippet>3180</a> }
-<a href=#3181 id=3181 data-nosnippet>3181</a>
-<a href=#3182 id=3182 data-nosnippet>3182</a> <span class="attr">#[test]
-<a href=#3183 id=3183 data-nosnippet>3183</a> </span><span class="kw">fn </span>avro_bytes_long() {
-<a href=#3184 id=3184 data-nosnippet>3184</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">32u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>];
-<a href=#3185 id=3185 data-nosnippet>3185</a>
-<a href=#3186 id=3186 data-nosnippet>3186</a> check_avro_bytes_serde(bytes, Datum::long(<span class="number">32</span>), <span class="kw-2">&</span>PrimitiveType::Long);
-<a href=#3187 id=3187 data-nosnippet>3187</a> }
-<a href=#3188 id=3188 data-nosnippet>3188</a>
-<a href=#3189 id=3189 data-nosnippet>3189</a> <span class="attr">#[test]
-<a href=#3190 id=3190 data-nosnippet>3190</a> </span><span class="kw">fn </span>avro_bytes_long_from_int() {
-<a href=#3191 id=3191 data-nosnippet>3191</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">32u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>];
-<a href=#3192 id=3192 data-nosnippet>3192</a>
-<a href=#3193 id=3193 data-nosnippet>3193</a> check_avro_bytes_serde(bytes, Datum::long(<span class="number">32</span>), <span class="kw-2">&</span>PrimitiveType::Long);
-<a href=#3194 id=3194 data-nosnippet>3194</a> }
-<a href=#3195 id=3195 data-nosnippet>3195</a>
-<a href=#3196 id=3196 data-nosnippet>3196</a> <span class="attr">#[test]
-<a href=#3197 id=3197 data-nosnippet>3197</a> </span><span class="kw">fn </span>avro_bytes_float() {
-<a href=#3198 id=3198 data-nosnippet>3198</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">128u8</span>, <span class="number">63u8</span>];
-<a href=#3199 id=3199 data-nosnippet>3199</a>
-<a href=#3200 id=3200 data-nosnippet>3200</a> check_avro_bytes_serde(bytes, Datum::float(<span class="number">1.0</span>), <span class="kw-2">&</span>PrimitiveType::Float);
-<a href=#3201 id=3201 data-nosnippet>3201</a> }
+<a href=#2929 id=2929 data-nosnippet>2929</a> <span class="kw">for </span>record <span class="kw">in </span>reader {
+<a href=#2930 id=2930 data-nosnippet>2930</a> <span class="kw">let </span>result = apache_avro::from_value::<ByteBuf>(<span class="kw-2">&</span>record.unwrap()).unwrap();
+<a href=#2931 id=2931 data-nosnippet>2931</a> <span class="kw">let </span>desered_datum = Datum::try_from_bytes(<span class="kw-2">&</span>result, expected_type.clone()).unwrap();
+<a href=#2932 id=2932 data-nosnippet>2932</a> <span class="macro">assert_eq!</span>(desered_datum, expected_datum);
+<a href=#2933 id=2933 data-nosnippet>2933</a> }
+<a href=#2934 id=2934 data-nosnippet>2934</a> }
+<a href=#2935 id=2935 data-nosnippet>2935</a>
+<a href=#2936 id=2936 data-nosnippet>2936</a> <span class="kw">fn </span>check_convert_with_avro(expected_literal: Literal, expected_type: <span class="kw-2">&</span>Type) {
+<a href=#2937 id=2937 data-nosnippet>2937</a> <span class="kw">let </span>fields = <span class="macro">vec!</span>[NestedField::required(<span class="number">1</span>, <span class="string">"col"</span>, expected_type.clone()).into()];
+<a href=#2938 id=2938 data-nosnippet>2938</a> <span class="kw">let </span>schema = Schema::builder()
+<a href=#2939 id=2939 data-nosnippet>2939</a> .with_fields(fields.clone())
+<a href=#2940 id=2940 data-nosnippet>2940</a> .build()
+<a href=#2941 id=2941 data-nosnippet>2941</a> .unwrap();
+<a href=#2942 id=2942 data-nosnippet>2942</a> <span class="kw">let </span>avro_schema = schema_to_avro_schema(<span class="string">"test"</span>, <span class="kw-2">&</span>schema).unwrap();
+<a href=#2943 id=2943 data-nosnippet>2943</a> <span class="kw">let </span>struct_type = Type::Struct(StructType::new(fields));
+<a href=#2944 id=2944 data-nosnippet>2944</a> <span class="kw">let </span>struct_literal =
+<a href=#2945 id=2945 data-nosnippet>2945</a> Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[<span class="prelude-val">Some</span>(expected_literal.clone())]));
+<a href=#2946 id=2946 data-nosnippet>2946</a>
+<a href=#2947 id=2947 data-nosnippet>2947</a> <span class="kw">let </span><span class="kw-2">mut </span>writer = apache_avro::Writer::new(<span class="kw-2">&</span>avro_schema, Vec::new());
+<a href=#2948 id=2948 data-nosnippet>2948</a> <span class="kw">let </span>raw_literal = RawLiteral::try_from(struct_literal.clone(), <span class="kw-2">&</span>struct_type).unwrap();
+<a href=#2949 id=2949 data-nosnippet>2949</a> writer.append_ser(raw_literal).unwrap();
+<a href=#2950 id=2950 data-nosnippet>2950</a> <span class="kw">let </span>encoded = writer.into_inner().unwrap();
+<a href=#2951 id=2951 data-nosnippet>2951</a>
+<a href=#2952 id=2952 data-nosnippet>2952</a> <span class="kw">let </span>reader = apache_avro::Reader::new(<span class="kw-2">&*</span>encoded).unwrap();
+<a href=#2953 id=2953 data-nosnippet>2953</a> <span class="kw">for </span>record <span class="kw">in </span>reader {
+<a href=#2954 id=2954 data-nosnippet>2954</a> <span class="kw">let </span>result = apache_avro::from_value::<RawLiteral>(<span class="kw-2">&</span>record.unwrap()).unwrap();
+<a href=#2955 id=2955 data-nosnippet>2955</a> <span class="kw">let </span>desered_literal = result.try_into(<span class="kw-2">&</span>struct_type).unwrap().unwrap();
+<a href=#2956 id=2956 data-nosnippet>2956</a> <span class="macro">assert_eq!</span>(desered_literal, struct_literal);
+<a href=#2957 id=2957 data-nosnippet>2957</a> }
+<a href=#2958 id=2958 data-nosnippet>2958</a> }
+<a href=#2959 id=2959 data-nosnippet>2959</a>
+<a href=#2960 id=2960 data-nosnippet>2960</a> <span class="kw">fn </span>check_serialize_avro(literal: Literal, ty: <span class="kw-2">&</span>Type, expect_value: Value) {
+<a href=#2961 id=2961 data-nosnippet>2961</a> <span class="kw">let </span>expect_value = Value::Record(<span class="macro">vec!</span>[(<span class="string">"col"</span>.to_string(), expect_value)]);
+<a href=#2962 id=2962 data-nosnippet>2962</a>
+<a href=#2963 id=2963 data-nosnippet>2963</a> <span class="kw">let </span>fields = <span class="macro">vec!</span>[NestedField::required(<span class="number">1</span>, <span class="string">"col"</span>, ty.clone()).into()];
+<a href=#2964 id=2964 data-nosnippet>2964</a> <span class="kw">let </span>schema = Schema::builder()
+<a href=#2965 id=2965 data-nosnippet>2965</a> .with_fields(fields.clone())
+<a href=#2966 id=2966 data-nosnippet>2966</a> .build()
+<a href=#2967 id=2967 data-nosnippet>2967</a> .unwrap();
+<a href=#2968 id=2968 data-nosnippet>2968</a> <span class="kw">let </span>avro_schema = schema_to_avro_schema(<span class="string">"test"</span>, <span class="kw-2">&</span>schema).unwrap();
+<a href=#2969 id=2969 data-nosnippet>2969</a> <span class="kw">let </span>struct_type = Type::Struct(StructType::new(fields));
+<a href=#2970 id=2970 data-nosnippet>2970</a> <span class="kw">let </span>struct_literal = Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[<span class="prelude-val">Some</span>(literal.clone())]));
+<a href=#2971 id=2971 data-nosnippet>2971</a> <span class="kw">let </span><span class="kw-2">mut </span>writer = apache_avro::Writer::new(<span class="kw-2">&</span>avro_schema, Vec::new());
+<a href=#2972 id=2972 data-nosnippet>2972</a> <span class="kw">let </span>raw_literal = RawLiteral::try_from(struct_literal.clone(), <span class="kw-2">&</span>struct_type).unwrap();
+<a href=#2973 id=2973 data-nosnippet>2973</a> <span class="kw">let </span>value = to_value(raw_literal)
+<a href=#2974 id=2974 data-nosnippet>2974</a> .unwrap()
+<a href=#2975 id=2975 data-nosnippet>2975</a> .resolve(<span class="kw-2">&</span>avro_schema)
+<a href=#2976 id=2976 data-nosnippet>2976</a> .unwrap();
+<a href=#2977 id=2977 data-nosnippet>2977</a> writer.append_value_ref(<span class="kw-2">&</span>value).unwrap();
+<a href=#2978 id=2978 data-nosnippet>2978</a> <span class="kw">let </span>encoded = writer.into_inner().unwrap();
+<a href=#2979 id=2979 data-nosnippet>2979</a>
+<a href=#2980 id=2980 data-nosnippet>2980</a> <span class="kw">let </span>reader = apache_avro::Reader::new(<span class="kw-2">&*</span>encoded).unwrap();
+<a href=#2981 id=2981 data-nosnippet>2981</a> <span class="kw">for </span>record <span class="kw">in </span>reader {
+<a href=#2982 id=2982 data-nosnippet>2982</a> <span class="macro">assert_eq!</span>(record.unwrap(), expect_value);
+<a href=#2983 id=2983 data-nosnippet>2983</a> }
+<a href=#2984 id=2984 data-nosnippet>2984</a> }
+<a href=#2985 id=2985 data-nosnippet>2985</a>
+<a href=#2986 id=2986 data-nosnippet>2986</a> <span class="attr">#[test]
+<a href=#2987 id=2987 data-nosnippet>2987</a> </span><span class="kw">fn </span>json_boolean() {
+<a href=#2988 id=2988 data-nosnippet>2988</a> <span class="kw">let </span>record = <span class="string">r#"true"#</span>;
+<a href=#2989 id=2989 data-nosnippet>2989</a>
+<a href=#2990 id=2990 data-nosnippet>2990</a> check_json_serde(
+<a href=#2991 id=2991 data-nosnippet>2991</a> record,
+<a href=#2992 id=2992 data-nosnippet>2992</a> Literal::Primitive(PrimitiveLiteral::Boolean(<span class="bool-val">true</span>)),
+<a href=#2993 id=2993 data-nosnippet>2993</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Boolean),
+<a href=#2994 id=2994 data-nosnippet>2994</a> );
+<a href=#2995 id=2995 data-nosnippet>2995</a> }
+<a href=#2996 id=2996 data-nosnippet>2996</a>
+<a href=#2997 id=2997 data-nosnippet>2997</a> <span class="attr">#[test]
+<a href=#2998 id=2998 data-nosnippet>2998</a> </span><span class="kw">fn </span>json_int() {
+<a href=#2999 id=2999 data-nosnippet>2999</a> <span class="kw">let </span>record = <span class="string">r#"32"#</span>;
+<a href=#3000 id=3000 data-nosnippet>3000</a>
+<a href=#3001 id=3001 data-nosnippet>3001</a> check_json_serde(
+<a href=#3002 id=3002 data-nosnippet>3002</a> record,
+<a href=#3003 id=3003 data-nosnippet>3003</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">32</span>)),
+<a href=#3004 id=3004 data-nosnippet>3004</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Int),
+<a href=#3005 id=3005 data-nosnippet>3005</a> );
+<a href=#3006 id=3006 data-nosnippet>3006</a> }
+<a href=#3007 id=3007 data-nosnippet>3007</a>
+<a href=#3008 id=3008 data-nosnippet>3008</a> <span class="attr">#[test]
+<a href=#3009 id=3009 data-nosnippet>3009</a> </span><span class="kw">fn </span>json_long() {
+<a href=#3010 id=3010 data-nosnippet>3010</a> <span class="kw">let </span>record = <span class="string">r#"32"#</span>;
+<a href=#3011 id=3011 data-nosnippet>3011</a>
+<a href=#3012 id=3012 data-nosnippet>3012</a> check_json_serde(
+<a href=#3013 id=3013 data-nosnippet>3013</a> record,
+<a href=#3014 id=3014 data-nosnippet>3014</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">32</span>)),
+<a href=#3015 id=3015 data-nosnippet>3015</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Long),
+<a href=#3016 id=3016 data-nosnippet>3016</a> );
+<a href=#3017 id=3017 data-nosnippet>3017</a> }
+<a href=#3018 id=3018 data-nosnippet>3018</a>
+<a href=#3019 id=3019 data-nosnippet>3019</a> <span class="attr">#[test]
+<a href=#3020 id=3020 data-nosnippet>3020</a> </span><span class="kw">fn </span>json_float() {
+<a href=#3021 id=3021 data-nosnippet>3021</a> <span class="kw">let </span>record = <span class="string">r#"1.0"#</span>;
+<a href=#3022 id=3022 data-nosnippet>3022</a>
+<a href=#3023 id=3023 data-nosnippet>3023</a> check_json_serde(
+<a href=#3024 id=3024 data-nosnippet>3024</a> record,
+<a href=#3025 id=3025 data-nosnippet>3025</a> Literal::Primitive(PrimitiveLiteral::Float(OrderedFloat(<span class="number">1.0</span>))),
+<a href=#3026 id=3026 data-nosnippet>3026</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Float),
+<a href=#3027 id=3027 data-nosnippet>3027</a> );
+<a href=#3028 id=3028 data-nosnippet>3028</a> }
+<a href=#3029 id=3029 data-nosnippet>3029</a>
+<a href=#3030 id=3030 data-nosnippet>3030</a> <span class="attr">#[test]
+<a href=#3031 id=3031 data-nosnippet>3031</a> </span><span class="kw">fn </span>json_double() {
+<a href=#3032 id=3032 data-nosnippet>3032</a> <span class="kw">let </span>record = <span class="string">r#"1.0"#</span>;
+<a href=#3033 id=3033 data-nosnippet>3033</a>
+<a href=#3034 id=3034 data-nosnippet>3034</a> check_json_serde(
+<a href=#3035 id=3035 data-nosnippet>3035</a> record,
+<a href=#3036 id=3036 data-nosnippet>3036</a> Literal::Primitive(PrimitiveLiteral::Double(OrderedFloat(<span class="number">1.0</span>))),
+<a href=#3037 id=3037 data-nosnippet>3037</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Double),
+<a href=#3038 id=3038 data-nosnippet>3038</a> );
+<a href=#3039 id=3039 data-nosnippet>3039</a> }
+<a href=#3040 id=3040 data-nosnippet>3040</a>
+<a href=#3041 id=3041 data-nosnippet>3041</a> <span class="attr">#[test]
+<a href=#3042 id=3042 data-nosnippet>3042</a> </span><span class="kw">fn </span>json_date() {
+<a href=#3043 id=3043 data-nosnippet>3043</a> <span class="kw">let </span>record = <span class="string">r#""2017-11-16""#</span>;
+<a href=#3044 id=3044 data-nosnippet>3044</a>
+<a href=#3045 id=3045 data-nosnippet>3045</a> check_json_serde(
+<a href=#3046 id=3046 data-nosnippet>3046</a> record,
+<a href=#3047 id=3047 data-nosnippet>3047</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">17486</span>)),
+<a href=#3048 id=3048 data-nosnippet>3048</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Date),
+<a href=#3049 id=3049 data-nosnippet>3049</a> );
+<a href=#3050 id=3050 data-nosnippet>3050</a> }
+<a href=#3051 id=3051 data-nosnippet>3051</a>
+<a href=#3052 id=3052 data-nosnippet>3052</a> <span class="attr">#[test]
+<a href=#3053 id=3053 data-nosnippet>3053</a> </span><span class="kw">fn </span>json_time() {
+<a href=#3054 id=3054 data-nosnippet>3054</a> <span class="kw">let </span>record = <span class="string">r#""22:31:08.123456""#</span>;
+<a href=#3055 id=3055 data-nosnippet>3055</a>
+<a href=#3056 id=3056 data-nosnippet>3056</a> check_json_serde(
+<a href=#3057 id=3057 data-nosnippet>3057</a> record,
+<a href=#3058 id=3058 data-nosnippet>3058</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">81068123456</span>)),
+<a href=#3059 id=3059 data-nosnippet>3059</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Time),
+<a href=#3060 id=3060 data-nosnippet>3060</a> );
+<a href=#3061 id=3061 data-nosnippet>3061</a> }
+<a href=#3062 id=3062 data-nosnippet>3062</a>
+<a href=#3063 id=3063 data-nosnippet>3063</a> <span class="attr">#[test]
+<a href=#3064 id=3064 data-nosnippet>3064</a> </span><span class="kw">fn </span>json_timestamp() {
+<a href=#3065 id=3065 data-nosnippet>3065</a> <span class="kw">let </span>record = <span class="string">r#""2017-11-16T22:31:08.123456""#</span>;
+<a href=#3066 id=3066 data-nosnippet>3066</a>
+<a href=#3067 id=3067 data-nosnippet>3067</a> check_json_serde(
+<a href=#3068 id=3068 data-nosnippet>3068</a> record,
+<a href=#3069 id=3069 data-nosnippet>3069</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
+<a href=#3070 id=3070 data-nosnippet>3070</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Timestamp),
+<a href=#3071 id=3071 data-nosnippet>3071</a> );
+<a href=#3072 id=3072 data-nosnippet>3072</a> }
+<a href=#3073 id=3073 data-nosnippet>3073</a>
+<a href=#3074 id=3074 data-nosnippet>3074</a> <span class="attr">#[test]
+<a href=#3075 id=3075 data-nosnippet>3075</a> </span><span class="kw">fn </span>json_timestamptz() {
+<a href=#3076 id=3076 data-nosnippet>3076</a> <span class="kw">let </span>record = <span class="string">r#""2017-11-16T22:31:08.123456+00:00""#</span>;
+<a href=#3077 id=3077 data-nosnippet>3077</a>
+<a href=#3078 id=3078 data-nosnippet>3078</a> check_json_serde(
+<a href=#3079 id=3079 data-nosnippet>3079</a> record,
+<a href=#3080 id=3080 data-nosnippet>3080</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
+<a href=#3081 id=3081 data-nosnippet>3081</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Timestamptz),
+<a href=#3082 id=3082 data-nosnippet>3082</a> );
+<a href=#3083 id=3083 data-nosnippet>3083</a> }
+<a href=#3084 id=3084 data-nosnippet>3084</a>
+<a href=#3085 id=3085 data-nosnippet>3085</a> <span class="attr">#[test]
+<a href=#3086 id=3086 data-nosnippet>3086</a> </span><span class="kw">fn </span>json_string() {
+<a href=#3087 id=3087 data-nosnippet>3087</a> <span class="kw">let </span>record = <span class="string">r#""iceberg""#</span>;
+<a href=#3088 id=3088 data-nosnippet>3088</a>
+<a href=#3089 id=3089 data-nosnippet>3089</a> check_json_serde(
+<a href=#3090 id=3090 data-nosnippet>3090</a> record,
+<a href=#3091 id=3091 data-nosnippet>3091</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"iceberg"</span>.to_string())),
+<a href=#3092 id=3092 data-nosnippet>3092</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::String),
+<a href=#3093 id=3093 data-nosnippet>3093</a> );
+<a href=#3094 id=3094 data-nosnippet>3094</a> }
+<a href=#3095 id=3095 data-nosnippet>3095</a>
+<a href=#3096 id=3096 data-nosnippet>3096</a> <span class="attr">#[test]
+<a href=#3097 id=3097 data-nosnippet>3097</a> </span><span class="kw">fn </span>json_uuid() {
+<a href=#3098 id=3098 data-nosnippet>3098</a> <span class="kw">let </span>record = <span class="string">r#""f79c3e09-677c-4bbd-a479-3f349cb785e7""#</span>;
+<a href=#3099 id=3099 data-nosnippet>3099</a>
+<a href=#3100 id=3100 data-nosnippet>3100</a> check_json_serde(
+<a href=#3101 id=3101 data-nosnippet>3101</a> record,
+<a href=#3102 id=3102 data-nosnippet>3102</a> Literal::Primitive(PrimitiveLiteral::UInt128(
+<a href=#3103 id=3103 data-nosnippet>3103</a> Uuid::parse_str(<span class="string">"f79c3e09-677c-4bbd-a479-3f349cb785e7"</span>)
+<a href=#3104 id=3104 data-nosnippet>3104</a> .unwrap()
+<a href=#3105 id=3105 data-nosnippet>3105</a> .as_u128(),
+<a href=#3106 id=3106 data-nosnippet>3106</a> )),
+<a href=#3107 id=3107 data-nosnippet>3107</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Uuid),
+<a href=#3108 id=3108 data-nosnippet>3108</a> );
+<a href=#3109 id=3109 data-nosnippet>3109</a> }
+<a href=#3110 id=3110 data-nosnippet>3110</a>
+<a href=#3111 id=3111 data-nosnippet>3111</a> <span class="attr">#[test]
+<a href=#3112 id=3112 data-nosnippet>3112</a> </span><span class="kw">fn </span>json_decimal() {
+<a href=#3113 id=3113 data-nosnippet>3113</a> <span class="kw">let </span>record = <span class="string">r#""14.20""#</span>;
+<a href=#3114 id=3114 data-nosnippet>3114</a>
+<a href=#3115 id=3115 data-nosnippet>3115</a> check_json_serde(
+<a href=#3116 id=3116 data-nosnippet>3116</a> record,
+<a href=#3117 id=3117 data-nosnippet>3117</a> Literal::Primitive(PrimitiveLiteral::Int128(<span class="number">1420</span>)),
+<a href=#3118 id=3118 data-nosnippet>3118</a> <span class="kw-2">&</span>Type::decimal(<span class="number">28</span>, <span class="number">2</span>).unwrap(),
+<a href=#3119 id=3119 data-nosnippet>3119</a> );
+<a href=#3120 id=3120 data-nosnippet>3120</a> }
+<a href=#3121 id=3121 data-nosnippet>3121</a>
+<a href=#3122 id=3122 data-nosnippet>3122</a> <span class="attr">#[test]
+<a href=#3123 id=3123 data-nosnippet>3123</a> </span><span class="kw">fn </span>json_struct() {
+<a href=#3124 id=3124 data-nosnippet>3124</a> <span class="kw">let </span>record = <span class="string">r#"{"1": 1, "2": "bar", "3": null}"#</span>;
+<a href=#3125 id=3125 data-nosnippet>3125</a>
+<a href=#3126 id=3126 data-nosnippet>3126</a> check_json_serde(
+<a href=#3127 id=3127 data-nosnippet>3127</a> record,
+<a href=#3128 id=3128 data-nosnippet>3128</a> Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[
+<a href=#3129 id=3129 data-nosnippet>3129</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3130 id=3130 data-nosnippet>3130</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::String(
+<a href=#3131 id=3131 data-nosnippet>3131</a> <span class="string">"bar"</span>.to_string(),
+<a href=#3132 id=3132 data-nosnippet>3132</a> ))),
+<a href=#3133 id=3133 data-nosnippet>3133</a> <span class="prelude-val">None</span>,
+<a href=#3134 id=3134 data-nosnippet>3134</a> ])),
+<a href=#3135 id=3135 data-nosnippet>3135</a> <span class="kw-2">&</span>Type::Struct(StructType::new(<span class="macro">vec!</span>[
+<a href=#3136 id=3136 data-nosnippet>3136</a> NestedField::required(<span class="number">1</span>, <span class="string">"id"</span>, Type::Primitive(PrimitiveType::Int)).into(),
+<a href=#3137 id=3137 data-nosnippet>3137</a> NestedField::optional(<span class="number">2</span>, <span class="string">"name"</span>, Type::Primitive(PrimitiveType::String)).into(),
+<a href=#3138 id=3138 data-nosnippet>3138</a> NestedField::optional(<span class="number">3</span>, <span class="string">"address"</span>, Type::Primitive(PrimitiveType::String)).into(),
+<a href=#3139 id=3139 data-nosnippet>3139</a> ])),
+<a href=#3140 id=3140 data-nosnippet>3140</a> );
+<a href=#3141 id=3141 data-nosnippet>3141</a> }
+<a href=#3142 id=3142 data-nosnippet>3142</a>
+<a href=#3143 id=3143 data-nosnippet>3143</a> <span class="attr">#[test]
+<a href=#3144 id=3144 data-nosnippet>3144</a> </span><span class="kw">fn </span>json_list() {
+<a href=#3145 id=3145 data-nosnippet>3145</a> <span class="kw">let </span>record = <span class="string">r#"[1, 2, 3, null]"#</span>;
+<a href=#3146 id=3146 data-nosnippet>3146</a>
+<a href=#3147 id=3147 data-nosnippet>3147</a> check_json_serde(
+<a href=#3148 id=3148 data-nosnippet>3148</a> record,
+<a href=#3149 id=3149 data-nosnippet>3149</a> Literal::List(<span class="macro">vec!</span>[
+<a href=#3150 id=3150 data-nosnippet>3150</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3151 id=3151 data-nosnippet>3151</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
+<a href=#3152 id=3152 data-nosnippet>3152</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
+<a href=#3153 id=3153 data-nosnippet>3153</a> <span class="prelude-val">None</span>,
+<a href=#3154 id=3154 data-nosnippet>3154</a> ]),
+<a href=#3155 id=3155 data-nosnippet>3155</a> <span class="kw-2">&</span>Type::List(ListType {
+<a href=#3156 id=3156 data-nosnippet>3156</a> element_field: NestedField::list_element(
+<a href=#3157 id=3157 data-nosnippet>3157</a> <span class="number">0</span>,
+<a href=#3158 id=3158 data-nosnippet>3158</a> Type::Primitive(PrimitiveType::Int),
+<a href=#3159 id=3159 data-nosnippet>3159</a> <span class="bool-val">true</span>,
+<a href=#3160 id=3160 data-nosnippet>3160</a> )
+<a href=#3161 id=3161 data-nosnippet>3161</a> .into(),
+<a href=#3162 id=3162 data-nosnippet>3162</a> }),
+<a href=#3163 id=3163 data-nosnippet>3163</a> );
+<a href=#3164 id=3164 data-nosnippet>3164</a> }
+<a href=#3165 id=3165 data-nosnippet>3165</a>
+<a href=#3166 id=3166 data-nosnippet>3166</a> <span class="attr">#[test]
+<a href=#3167 id=3167 data-nosnippet>3167</a> </span><span class="kw">fn </span>json_map() {
+<a href=#3168 id=3168 data-nosnippet>3168</a> <span class="kw">let </span>record = <span class="string">r#"{ "keys": ["a", "b", "c"], "values": [1, 2, null] }"#</span>;
+<a href=#3169 id=3169 data-nosnippet>3169</a>
+<a href=#3170 id=3170 data-nosnippet>3170</a> check_json_serde(
+<a href=#3171 id=3171 data-nosnippet>3171</a> record,
+<a href=#3172 id=3172 data-nosnippet>3172</a> Literal::Map(Map::from([
+<a href=#3173 id=3173 data-nosnippet>3173</a> (
+<a href=#3174 id=3174 data-nosnippet>3174</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"a"</span>.to_string())),
+<a href=#3175 id=3175 data-nosnippet>3175</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3176 id=3176 data-nosnippet>3176</a> ),
+<a href=#3177 id=3177 data-nosnippet>3177</a> (
+<a href=#3178 id=3178 data-nosnippet>3178</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"b"</span>.to_string())),
+<a href=#3179 id=3179 data-nosnippet>3179</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
+<a href=#3180 id=3180 data-nosnippet>3180</a> ),
+<a href=#3181 id=3181 data-nosnippet>3181</a> (
+<a href=#3182 id=3182 data-nosnippet>3182</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"c"</span>.to_string())),
+<a href=#3183 id=3183 data-nosnippet>3183</a> <span class="prelude-val">None</span>,
+<a href=#3184 id=3184 data-nosnippet>3184</a> ),
+<a href=#3185 id=3185 data-nosnippet>3185</a> ])),
+<a href=#3186 id=3186 data-nosnippet>3186</a> <span class="kw-2">&</span>Type::Map(MapType {
+<a href=#3187 id=3187 data-nosnippet>3187</a> key_field: NestedField::map_key_element(<span class="number">0</span>, Type::Primitive(PrimitiveType::String))
+<a href=#3188 id=3188 data-nosnippet>3188</a> .into(),
+<a href=#3189 id=3189 data-nosnippet>3189</a> value_field: NestedField::map_value_element(
+<a href=#3190 id=3190 data-nosnippet>3190</a> <span class="number">1</span>,
+<a href=#3191 id=3191 data-nosnippet>3191</a> Type::Primitive(PrimitiveType::Int),
+<a href=#3192 id=3192 data-nosnippet>3192</a> <span class="bool-val">true</span>,
+<a href=#3193 id=3193 data-nosnippet>3193</a> )
+<a href=#3194 id=3194 data-nosnippet>3194</a> .into(),
+<a href=#3195 id=3195 data-nosnippet>3195</a> }),
+<a href=#3196 id=3196 data-nosnippet>3196</a> );
+<a href=#3197 id=3197 data-nosnippet>3197</a> }
+<a href=#3198 id=3198 data-nosnippet>3198</a>
+<a href=#3199 id=3199 data-nosnippet>3199</a> <span class="attr">#[test]
+<a href=#3200 id=3200 data-nosnippet>3200</a> </span><span class="kw">fn </span>avro_bytes_boolean() {
+<a href=#3201 id=3201 data-nosnippet>3201</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">1u8</span>];
<a href=#3202 id=3202 data-nosnippet>3202</a>
-<a href=#3203 id=3203 data-nosnippet>3203</a> <span class="attr">#[test]
-<a href=#3204 id=3204 data-nosnippet>3204</a> </span><span class="kw">fn </span>avro_bytes_double() {
-<a href=#3205 id=3205 data-nosnippet>3205</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">240u8</span>, <span class="number">63u8</span>];
-<a href=#3206 id=3206 data-nosnippet>3206</a>
-<a href=#3207 id=3207 data-nosnippet>3207</a> check_avro_bytes_serde(bytes, Datum::double(<span class="number">1.0</span>), <span class="kw-2">&</span>PrimitiveType::Double);
-<a href=#3208 id=3208 data-nosnippet>3208</a> }
+<a href=#3203 id=3203 data-nosnippet>3203</a> check_avro_bytes_serde(bytes, Datum::bool(<span class="bool-val">true</span>), <span class="kw-2">&</span>PrimitiveType::Boolean);
+<a href=#3204 id=3204 data-nosnippet>3204</a> }
+<a href=#3205 id=3205 data-nosnippet>3205</a>
+<a href=#3206 id=3206 data-nosnippet>3206</a> <span class="attr">#[test]
+<a href=#3207 id=3207 data-nosnippet>3207</a> </span><span class="kw">fn </span>avro_bytes_int() {
+<a href=#3208 id=3208 data-nosnippet>3208</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">32u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>];
<a href=#3209 id=3209 data-nosnippet>3209</a>
-<a href=#3210 id=3210 data-nosnippet>3210</a> <span class="attr">#[test]
-<a href=#3211 id=3211 data-nosnippet>3211</a> </span><span class="kw">fn </span>avro_bytes_double_from_float() {
-<a href=#3212 id=3212 data-nosnippet>3212</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">128u8</span>, <span class="number">63u8</span>];
-<a href=#3213 id=3213 data-nosnippet>3213</a>
-<a href=#3214 id=3214 data-nosnippet>3214</a> check_avro_bytes_serde(bytes, Datum::double(<span class="number">1.0</span>), <span class="kw-2">&</span>PrimitiveType::Double);
-<a href=#3215 id=3215 data-nosnippet>3215</a> }
+<a href=#3210 id=3210 data-nosnippet>3210</a> check_avro_bytes_serde(bytes, Datum::int(<span class="number">32</span>), <span class="kw-2">&</span>PrimitiveType::Int);
+<a href=#3211 id=3211 data-nosnippet>3211</a> }
+<a href=#3212 id=3212 data-nosnippet>3212</a>
+<a href=#3213 id=3213 data-nosnippet>3213</a> <span class="attr">#[test]
+<a href=#3214 id=3214 data-nosnippet>3214</a> </span><span class="kw">fn </span>avro_bytes_long() {
+<a href=#3215 id=3215 data-nosnippet>3215</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">32u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>];
<a href=#3216 id=3216 data-nosnippet>3216</a>
-<a href=#3217 id=3217 data-nosnippet>3217</a> <span class="attr">#[test]
-<a href=#3218 id=3218 data-nosnippet>3218</a> </span><span class="kw">fn </span>avro_bytes_string() {
-<a href=#3219 id=3219 data-nosnippet>3219</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">105u8</span>, <span class="number">99u8</span>, <span class="number">101u8</span>, <span class="number">98u8</span>, <span class="number">101u8</span>, <span class="number">114u8</span>, <span class="number">103u8</span>];
-<a href=#3220 id=3220 data-nosnippet>3220</a>
-<a href=#3221 id=3221 data-nosnippet>3221</a> check_avro_bytes_serde(bytes, Datum::string(<span class="string">"iceberg"</span>), <span class="kw-2">&</span>PrimitiveType::String);
-<a href=#3222 id=3222 data-nosnippet>3222</a> }
+<a href=#3217 id=3217 data-nosnippet>3217</a> check_avro_bytes_serde(bytes, Datum::long(<span class="number">32</span>), <span class="kw-2">&</span>PrimitiveType::Long);
+<a href=#3218 id=3218 data-nosnippet>3218</a> }
+<a href=#3219 id=3219 data-nosnippet>3219</a>
+<a href=#3220 id=3220 data-nosnippet>3220</a> <span class="attr">#[test]
+<a href=#3221 id=3221 data-nosnippet>3221</a> </span><span class="kw">fn </span>avro_bytes_long_from_int() {
+<a href=#3222 id=3222 data-nosnippet>3222</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">32u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>];
<a href=#3223 id=3223 data-nosnippet>3223</a>
-<a href=#3224 id=3224 data-nosnippet>3224</a> <span class="attr">#[test]
-<a href=#3225 id=3225 data-nosnippet>3225</a> </span><span class="kw">fn </span>avro_bytes_decimal() {
-<a href=#3226 id=3226 data-nosnippet>3226</a> <span class="comment">// (input_bytes, decimal_num, expect_scale, expect_precision)
-<a href=#3227 id=3227 data-nosnippet>3227</a> </span><span class="kw">let </span>cases = <span class="macro">vec!</span>[
-<a href=#3228 id=3228 data-nosnippet>3228</a> (<span class="macro">vec!</span>[<span class="number">4u8</span>, <span class="number">210u8</span>], <span class="number">1234</span>, <span class="number">2</span>, <span class="number">38</span>),
-<a href=#3229 id=3229 data-nosnippet>3229</a> (<span class="macro">vec!</span>[<span class="number">251u8</span>, <span class="number">46u8</span>], -<span class="number">1234</span>, <span class="number">2</span>, <span class="number">38</span>),
-<a href=#3230 id=3230 data-nosnippet>3230</a> (<span class="macro">vec!</span>[<span class="number">4u8</span>, <span class="number">210u8</span>], <span class="number">1234</span>, <span class="number">3</span>, <span class="number">38</span>),
-<a href=#3231 id=3231 data-nosnippet>3231</a> (<span class="macro">vec!</span>[<span class="number">251u8</span>, <span class="number">46u8</span>], -<span class="number">1234</span>, <span class="number">3</span>, <span class="number">38</span>),
-<a href=#3232 id=3232 data-nosnippet>3232</a> (<span class="macro">vec!</span>[<span class="number">42u8</span>], <span class="number">42</span>, <span class="number">2</span>, <span class="number">1</span>),
-<a href=#3233 id=3233 data-nosnippet>3233</a> (<span class="macro">vec!</span>[<span class="number">214u8</span>], -<span class="number">42</span>, <span class="number">2</span>, <span class="number">1</span>),
-<a href=#3234 id=3234 data-nosnippet>3234</a> ];
-<a href=#3235 id=3235 data-nosnippet>3235</a>
-<a href=#3236 id=3236 data-nosnippet>3236</a> <span class="kw">for </span>(input_bytes, decimal_num, expect_scale, expect_precision) <span class="kw">in </span>cases {
-<a href=#3237 id=3237 data-nosnippet>3237</a> check_avro_bytes_serde(
-<a href=#3238 id=3238 data-nosnippet>3238</a> input_bytes,
-<a href=#3239 id=3239 data-nosnippet>3239</a> Datum::decimal_with_precision(
-<a href=#3240 id=3240 data-nosnippet>3240</a> Decimal::new(decimal_num, expect_scale),
-<a href=#3241 id=3241 data-nosnippet>3241</a> expect_precision,
-<a href=#3242 id=3242 data-nosnippet>3242</a> )
-<a href=#3243 id=3243 data-nosnippet>3243</a> .unwrap(),
-<a href=#3244 id=3244 data-nosnippet>3244</a> <span class="kw-2">&</span>PrimitiveType::Decimal {
-<a href=#3245 id=3245 data-nosnippet>3245</a> precision: expect_precision,
-<a href=#3246 id=3246 data-nosnippet>3246</a> scale: expect_scale,
-<a href=#3247 id=3247 data-nosnippet>3247</a> },
-<a href=#3248 id=3248 data-nosnippet>3248</a> );
-<a href=#3249 id=3249 data-nosnippet>3249</a> }
-<a href=#3250 id=3250 data-nosnippet>3250</a> }
+<a href=#3224 id=3224 data-nosnippet>3224</a> check_avro_bytes_serde(bytes, Datum::long(<span class="number">32</span>), <span class="kw-2">&</span>PrimitiveType::Long);
+<a href=#3225 id=3225 data-nosnippet>3225</a> }
+<a href=#3226 id=3226 data-nosnippet>3226</a>
+<a href=#3227 id=3227 data-nosnippet>3227</a> <span class="attr">#[test]
+<a href=#3228 id=3228 data-nosnippet>3228</a> </span><span class="kw">fn </span>avro_bytes_float() {
+<a href=#3229 id=3229 data-nosnippet>3229</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">128u8</span>, <span class="number">63u8</span>];
+<a href=#3230 id=3230 data-nosnippet>3230</a>
+<a href=#3231 id=3231 data-nosnippet>3231</a> check_avro_bytes_serde(bytes, Datum::float(<span class="number">1.0</span>), <span class="kw-2">&</span>PrimitiveType::Float);
+<a href=#3232 id=3232 data-nosnippet>3232</a> }
+<a href=#3233 id=3233 data-nosnippet>3233</a>
+<a href=#3234 id=3234 data-nosnippet>3234</a> <span class="attr">#[test]
+<a href=#3235 id=3235 data-nosnippet>3235</a> </span><span class="kw">fn </span>avro_bytes_double() {
+<a href=#3236 id=3236 data-nosnippet>3236</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">240u8</span>, <span class="number">63u8</span>];
+<a href=#3237 id=3237 data-nosnippet>3237</a>
+<a href=#3238 id=3238 data-nosnippet>3238</a> check_avro_bytes_serde(bytes, Datum::double(<span class="number">1.0</span>), <span class="kw-2">&</span>PrimitiveType::Double);
+<a href=#3239 id=3239 data-nosnippet>3239</a> }
+<a href=#3240 id=3240 data-nosnippet>3240</a>
+<a href=#3241 id=3241 data-nosnippet>3241</a> <span class="attr">#[test]
+<a href=#3242 id=3242 data-nosnippet>3242</a> </span><span class="kw">fn </span>avro_bytes_double_from_float() {
+<a href=#3243 id=3243 data-nosnippet>3243</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">0u8</span>, <span class="number">0u8</span>, <span class="number">128u8</span>, <span class="number">63u8</span>];
+<a href=#3244 id=3244 data-nosnippet>3244</a>
+<a href=#3245 id=3245 data-nosnippet>3245</a> check_avro_bytes_serde(bytes, Datum::double(<span class="number">1.0</span>), <span class="kw-2">&</span>PrimitiveType::Double);
+<a href=#3246 id=3246 data-nosnippet>3246</a> }
+<a href=#3247 id=3247 data-nosnippet>3247</a>
+<a href=#3248 id=3248 data-nosnippet>3248</a> <span class="attr">#[test]
+<a href=#3249 id=3249 data-nosnippet>3249</a> </span><span class="kw">fn </span>avro_bytes_string() {
+<a href=#3250 id=3250 data-nosnippet>3250</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">105u8</span>, <span class="number">99u8</span>, <span class="number">101u8</span>, <span class="number">98u8</span>, <span class="number">101u8</span>, <span class="number">114u8</span>, <span class="number">103u8</span>];
<a href=#3251 id=3251 data-nosnippet>3251</a>
-<a href=#3252 id=3252 data-nosnippet>3252</a> <span class="attr">#[test]
-<a href=#3253 id=3253 data-nosnippet>3253</a> </span><span class="kw">fn </span>avro_bytes_decimal_expect_error() {
-<a href=#3254 id=3254 data-nosnippet>3254</a> <span class="comment">// (decimal_num, expect_scale, expect_precision)
-<a href=#3255 id=3255 data-nosnippet>3255</a> </span><span class="kw">let </span>cases = <span class="macro">vec!</span>[(<span class="number">1234</span>, <span class="number">2</span>, <span class="number">1</span>)];
-<a href=#3256 id=3256 data-nosnippet>3256</a>
-<a href=#3257 id=3257 data-nosnippet>3257</a> <span class="kw">for </span>(decimal_num, expect_scale, expect_precision) <span class="kw">in </span>cases {
-<a href=#3258 id=3258 data-nosnippet>3258</a> <span class="kw">let </span>result = Datum::decimal_with_precision(
-<a href=#3259 id=3259 data-nosnippet>3259</a> Decimal::new(decimal_num, expect_scale),
-<a href=#3260 id=3260 data-nosnippet>3260</a> expect_precision,
-<a href=#3261 id=3261 data-nosnippet>3261</a> );
-<a href=#3262 id=3262 data-nosnippet>3262</a> <span class="macro">assert!</span>(result.is_err(), <span class="string">"expect error but got {:?}"</span>, result);
-<a href=#3263 id=3263 data-nosnippet>3263</a> <span class="macro">assert_eq!</span>(
-<a href=#3264 id=3264 data-nosnippet>3264</a> result.unwrap_err().kind(),
-<a href=#3265 id=3265 data-nosnippet>3265</a> ErrorKind::DataInvalid,
-<a href=#3266 id=3266 data-nosnippet>3266</a> <span class="string">"expect error DataInvalid"</span>,
-<a href=#3267 id=3267 data-nosnippet>3267</a> );
-<a href=#3268 id=3268 data-nosnippet>3268</a> }
-<a href=#3269 id=3269 data-nosnippet>3269</a> }
-<a href=#3270 id=3270 data-nosnippet>3270</a>
-<a href=#3271 id=3271 data-nosnippet>3271</a> <span class="attr">#[test]
-<a href=#3272 id=3272 data-nosnippet>3272</a> </span><span class="kw">fn </span>avro_convert_test_int() {
-<a href=#3273 id=3273 data-nosnippet>3273</a> check_convert_with_avro(
-<a href=#3274 id=3274 data-nosnippet>3274</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">32</span>)),
-<a href=#3275 id=3275 data-nosnippet>3275</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Int),
-<a href=#3276 id=3276 data-nosnippet>3276</a> );
-<a href=#3277 id=3277 data-nosnippet>3277</a> }
-<a href=#3278 id=3278 data-nosnippet>3278</a>
-<a href=#3279 id=3279 data-nosnippet>3279</a> <span class="attr">#[test]
-<a href=#3280 id=3280 data-nosnippet>3280</a> </span><span class="kw">fn </span>avro_convert_test_long() {
-<a href=#3281 id=3281 data-nosnippet>3281</a> check_convert_with_avro(
-<a href=#3282 id=3282 data-nosnippet>3282</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">32</span>)),
-<a href=#3283 id=3283 data-nosnippet>3283</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Long),
-<a href=#3284 id=3284 data-nosnippet>3284</a> );
-<a href=#3285 id=3285 data-nosnippet>3285</a> }
-<a href=#3286 id=3286 data-nosnippet>3286</a>
-<a href=#3287 id=3287 data-nosnippet>3287</a> <span class="attr">#[test]
-<a href=#3288 id=3288 data-nosnippet>3288</a> </span><span class="kw">fn </span>avro_convert_test_float() {
-<a href=#3289 id=3289 data-nosnippet>3289</a> check_convert_with_avro(
-<a href=#3290 id=3290 data-nosnippet>3290</a> Literal::Primitive(PrimitiveLiteral::Float(OrderedFloat(<span class="number">1.0</span>))),
-<a href=#3291 id=3291 data-nosnippet>3291</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Float),
-<a href=#3292 id=3292 data-nosnippet>3292</a> );
-<a href=#3293 id=3293 data-nosnippet>3293</a> }
-<a href=#3294 id=3294 data-nosnippet>3294</a>
-<a href=#3295 id=3295 data-nosnippet>3295</a> <span class="attr">#[test]
-<a href=#3296 id=3296 data-nosnippet>3296</a> </span><span class="kw">fn </span>avro_convert_test_double() {
-<a href=#3297 id=3297 data-nosnippet>3297</a> check_convert_with_avro(
-<a href=#3298 id=3298 data-nosnippet>3298</a> Literal::Primitive(PrimitiveLiteral::Double(OrderedFloat(<span class="number">1.0</span>))),
-<a href=#3299 id=3299 data-nosnippet>3299</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Double),
-<a href=#3300 id=3300 data-nosnippet>3300</a> );
-<a href=#3301 id=3301 data-nosnippet>3301</a> }
-<a href=#3302 id=3302 data-nosnippet>3302</a>
-<a href=#3303 id=3303 data-nosnippet>3303</a> <span class="attr">#[test]
-<a href=#3304 id=3304 data-nosnippet>3304</a> </span><span class="kw">fn </span>avro_convert_test_string() {
-<a href=#3305 id=3305 data-nosnippet>3305</a> check_convert_with_avro(
-<a href=#3306 id=3306 data-nosnippet>3306</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"iceberg"</span>.to_string())),
-<a href=#3307 id=3307 data-nosnippet>3307</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::String),
-<a href=#3308 id=3308 data-nosnippet>3308</a> );
-<a href=#3309 id=3309 data-nosnippet>3309</a> }
-<a href=#3310 id=3310 data-nosnippet>3310</a>
-<a href=#3311 id=3311 data-nosnippet>3311</a> <span class="attr">#[test]
-<a href=#3312 id=3312 data-nosnippet>3312</a> </span><span class="kw">fn </span>avro_convert_test_date() {
-<a href=#3313 id=3313 data-nosnippet>3313</a> check_convert_with_avro(
-<a href=#3314 id=3314 data-nosnippet>3314</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">17486</span>)),
-<a href=#3315 id=3315 data-nosnippet>3315</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Date),
-<a href=#3316 id=3316 data-nosnippet>3316</a> );
-<a href=#3317 id=3317 data-nosnippet>3317</a> }
-<a href=#3318 id=3318 data-nosnippet>3318</a>
-<a href=#3319 id=3319 data-nosnippet>3319</a> <span class="attr">#[test]
-<a href=#3320 id=3320 data-nosnippet>3320</a> </span><span class="kw">fn </span>avro_convert_test_time() {
-<a href=#3321 id=3321 data-nosnippet>3321</a> check_convert_with_avro(
-<a href=#3322 id=3322 data-nosnippet>3322</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">81068123456</span>)),
-<a href=#3323 id=3323 data-nosnippet>3323</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Time),
-<a href=#3324 id=3324 data-nosnippet>3324</a> );
-<a href=#3325 id=3325 data-nosnippet>3325</a> }
-<a href=#3326 id=3326 data-nosnippet>3326</a>
-<a href=#3327 id=3327 data-nosnippet>3327</a> <span class="attr">#[test]
-<a href=#3328 id=3328 data-nosnippet>3328</a> </span><span class="kw">fn </span>avro_convert_test_timestamp() {
-<a href=#3329 id=3329 data-nosnippet>3329</a> check_convert_with_avro(
-<a href=#3330 id=3330 data-nosnippet>3330</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
-<a href=#3331 id=3331 data-nosnippet>3331</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Timestamp),
-<a href=#3332 id=3332 data-nosnippet>3332</a> );
-<a href=#3333 id=3333 data-nosnippet>3333</a> }
-<a href=#3334 id=3334 data-nosnippet>3334</a>
-<a href=#3335 id=3335 data-nosnippet>3335</a> <span class="attr">#[test]
-<a href=#3336 id=3336 data-nosnippet>3336</a> </span><span class="kw">fn </span>avro_convert_test_timestamptz() {
-<a href=#3337 id=3337 data-nosnippet>3337</a> check_convert_with_avro(
-<a href=#3338 id=3338 data-nosnippet>3338</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
-<a href=#3339 id=3339 data-nosnippet>3339</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Timestamptz),
-<a href=#3340 id=3340 data-nosnippet>3340</a> );
-<a href=#3341 id=3341 data-nosnippet>3341</a> }
-<a href=#3342 id=3342 data-nosnippet>3342</a>
-<a href=#3343 id=3343 data-nosnippet>3343</a> <span class="attr">#[test]
-<a href=#3344 id=3344 data-nosnippet>3344</a> </span><span class="kw">fn </span>avro_convert_test_list() {
-<a href=#3345 id=3345 data-nosnippet>3345</a> check_convert_with_avro(
-<a href=#3346 id=3346 data-nosnippet>3346</a> Literal::List(<span class="macro">vec!</span>[
-<a href=#3347 id=3347 data-nosnippet>3347</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3348 id=3348 data-nosnippet>3348</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
-<a href=#3349 id=3349 data-nosnippet>3349</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
-<a href=#3350 id=3350 data-nosnippet>3350</a> <span class="prelude-val">None</span>,
-<a href=#3351 id=3351 data-nosnippet>3351</a> ]),
-<a href=#3352 id=3352 data-nosnippet>3352</a> <span class="kw-2">&</span>Type::List(ListType {
-<a href=#3353 id=3353 data-nosnippet>3353</a> element_field: NestedField::list_element(
-<a href=#3354 id=3354 data-nosnippet>3354</a> <span class="number">0</span>,
-<a href=#3355 id=3355 data-nosnippet>3355</a> Type::Primitive(PrimitiveType::Int),
-<a href=#3356 id=3356 data-nosnippet>3356</a> <span class="bool-val">false</span>,
-<a href=#3357 id=3357 data-nosnippet>3357</a> )
-<a href=#3358 id=3358 data-nosnippet>3358</a> .into(),
-<a href=#3359 id=3359 data-nosnippet>3359</a> }),
-<a href=#3360 id=3360 data-nosnippet>3360</a> );
-<a href=#3361 id=3361 data-nosnippet>3361</a>
-<a href=#3362 id=3362 data-nosnippet>3362</a> check_convert_with_avro(
-<a href=#3363 id=3363 data-nosnippet>3363</a> Literal::List(<span class="macro">vec!</span>[
-<a href=#3364 id=3364 data-nosnippet>3364</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3365 id=3365 data-nosnippet>3365</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
-<a href=#3366 id=3366 data-nosnippet>3366</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
-<a href=#3367 id=3367 data-nosnippet>3367</a> ]),
-<a href=#3368 id=3368 data-nosnippet>3368</a> <span class="kw-2">&</span>Type::List(ListType {
-<a href=#3369 id=3369 data-nosnippet>3369</a> element_field: NestedField::list_element(
-<a href=#3370 id=3370 data-nosnippet>3370</a> <span class="number">0</span>,
-<a href=#3371 id=3371 data-nosnippet>3371</a> Type::Primitive(PrimitiveType::Int),
-<a href=#3372 id=3372 data-nosnippet>3372</a> <span class="bool-val">true</span>,
-<a href=#3373 id=3373 data-nosnippet>3373</a> )
-<a href=#3374 id=3374 data-nosnippet>3374</a> .into(),
-<a href=#3375 id=3375 data-nosnippet>3375</a> }),
-<a href=#3376 id=3376 data-nosnippet>3376</a> );
-<a href=#3377 id=3377 data-nosnippet>3377</a> }
-<a href=#3378 id=3378 data-nosnippet>3378</a>
-<a href=#3379 id=3379 data-nosnippet>3379</a> <span class="kw">fn </span>check_convert_with_avro_map(expected_literal: Literal, expected_type: <span class="kw-2">&</span>Type) {
-<a href=#3380 id=3380 data-nosnippet>3380</a> <span class="kw">let </span>fields = <span class="macro">vec!</span>[NestedField::required(<span class="number">1</span>, <span class="string">"col"</span>, expected_type.clone()).into()];
-<a href=#3381 id=3381 data-nosnippet>3381</a> <span class="kw">let </span>schema = Schema::builder()
-<a href=#3382 id=3382 data-nosnippet>3382</a> .with_fields(fields.clone())
-<a href=#3383 id=3383 data-nosnippet>3383</a> .build()
-<a href=#3384 id=3384 data-nosnippet>3384</a> .unwrap();
-<a href=#3385 id=3385 data-nosnippet>3385</a> <span class="kw">let </span>avro_schema = schema_to_avro_schema(<span class="string">"test"</span>, <span class="kw-2">&</span>schema).unwrap();
-<a href=#3386 id=3386 data-nosnippet>3386</a> <span class="kw">let </span>struct_type = Type::Struct(StructType::new(fields));
-<a href=#3387 id=3387 data-nosnippet>3387</a> <span class="kw">let </span>struct_literal =
-<a href=#3388 id=3388 data-nosnippet>3388</a> Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[<span class="prelude-val">Some</span>(expected_literal.clone())]));
-<a href=#3389 id=3389 data-nosnippet>3389</a>
-<a href=#3390 id=3390 data-nosnippet>3390</a> <span class="kw">let </span><span class="kw-2">mut </span>writer = apache_avro::Writer::new(<span class="kw-2">&</span>avro_schema, Vec::new());
-<a href=#3391 id=3391 data-nosnippet>3391</a> <span class="kw">let </span>raw_literal = RawLiteral::try_from(struct_literal.clone(), <span class="kw-2">&</span>struct_type).unwrap();
-<a href=#3392 id=3392 data-nosnippet>3392</a> writer.append_ser(raw_literal).unwrap();
-<a href=#3393 id=3393 data-nosnippet>3393</a> <span class="kw">let </span>encoded = writer.into_inner().unwrap();
-<a href=#3394 id=3394 data-nosnippet>3394</a>
-<a href=#3395 id=3395 data-nosnippet>3395</a> <span class="kw">let </span>reader = apache_avro::Reader::new(<span class="kw-2">&*</span>encoded).unwrap();
-<a href=#3396 id=3396 data-nosnippet>3396</a> <span class="kw">for </span>record <span class="kw">in </span>reader {
-<a href=#3397 id=3397 data-nosnippet>3397</a> <span class="kw">let </span>result = apache_avro::from_value::<RawLiteral>(<span class="kw-2">&</span>record.unwrap()).unwrap();
-<a href=#3398 id=3398 data-nosnippet>3398</a> <span class="kw">let </span>desered_literal = result.try_into(<span class="kw-2">&</span>struct_type).unwrap().unwrap();
-<a href=#3399 id=3399 data-nosnippet>3399</a> <span class="kw">match </span>(<span class="kw-2">&</span>desered_literal, <span class="kw-2">&</span>struct_literal) {
-<a href=#3400 id=3400 data-nosnippet>3400</a> (Literal::Struct(desered), Literal::Struct(expected)) => {
-<a href=#3401 id=3401 data-nosnippet>3401</a> <span class="kw">match </span>(<span class="kw-2">&</span>desered.fields[<span class="number">0</span>], <span class="kw-2">&</span>expected.fields[<span class="number">0</span>]) {
-<a href=#3402 id=3402 data-nosnippet>3402</a> (<span class="prelude-val">Some</span>(Literal::Map(desered)), <span class="prelude-val">Some</span>(Literal::Map(expected))) => {
-<a href=#3403 id=3403 data-nosnippet>3403</a> <span class="macro">assert!</span>(desered.has_same_content(expected))
-<a href=#3404 id=3404 data-nosnippet>3404</a> }
-<a href=#3405 id=3405 data-nosnippet>3405</a> <span class="kw">_ </span>=> {
-<a href=#3406 id=3406 data-nosnippet>3406</a> <span class="macro">unreachable!</span>()
-<a href=#3407 id=3407 data-nosnippet>3407</a> }
-<a href=#3408 id=3408 data-nosnippet>3408</a> }
-<a href=#3409 id=3409 data-nosnippet>3409</a> }
-<a href=#3410 id=3410 data-nosnippet>3410</a> <span class="kw">_ </span>=> {
-<a href=#3411 id=3411 data-nosnippet>3411</a> <span class="macro">panic!</span>(<span class="string">"unexpected literal type"</span>);
-<a href=#3412 id=3412 data-nosnippet>3412</a> }
-<a href=#3413 id=3413 data-nosnippet>3413</a> }
-<a href=#3414 id=3414 data-nosnippet>3414</a> }
-<a href=#3415 id=3415 data-nosnippet>3415</a> }
-<a href=#3416 id=3416 data-nosnippet>3416</a>
-<a href=#3417 id=3417 data-nosnippet>3417</a> <span class="attr">#[test]
-<a href=#3418 id=3418 data-nosnippet>3418</a> </span><span class="kw">fn </span>avro_convert_test_map() {
-<a href=#3419 id=3419 data-nosnippet>3419</a> check_convert_with_avro_map(
-<a href=#3420 id=3420 data-nosnippet>3420</a> Literal::Map(Map::from([
-<a href=#3421 id=3421 data-nosnippet>3421</a> (
-<a href=#3422 id=3422 data-nosnippet>3422</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>)),
-<a href=#3423 id=3423 data-nosnippet>3423</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1</span>))),
-<a href=#3424 id=3424 data-nosnippet>3424</a> ),
-<a href=#3425 id=3425 data-nosnippet>3425</a> (
-<a href=#3426 id=3426 data-nosnippet>3426</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>)),
-<a href=#3427 id=3427 data-nosnippet>3427</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">2</span>))),
-<a href=#3428 id=3428 data-nosnippet>3428</a> ),
-<a href=#3429 id=3429 data-nosnippet>3429</a> (Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>)), <span class="prelude-val">None</span>),
-<a href=#3430 id=3430 data-nosnippet>3430</a> ])),
-<a href=#3431 id=3431 data-nosnippet>3431</a> <span class="kw-2">&</span>Type::Map(MapType {
-<a href=#3432 id=3432 data-nosnippet>3432</a> key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::Int))
-<a href=#3433 id=3433 data-nosnippet>3433</a> .into(),
-<a href=#3434 id=3434 data-nosnippet>3434</a> value_field: NestedField::map_value_element(
-<a href=#3435 id=3435 data-nosnippet>3435</a> <span class="number">3</span>,
-<a href=#3436 id=3436 data-nosnippet>3436</a> Type::Primitive(PrimitiveType::Long),
-<a href=#3437 id=3437 data-nosnippet>3437</a> <span class="bool-val">false</span>,
-<a href=#3438 id=3438 data-nosnippet>3438</a> )
-<a href=#3439 id=3439 data-nosnippet>3439</a> .into(),
-<a href=#3440 id=3440 data-nosnippet>3440</a> }),
-<a href=#3441 id=3441 data-nosnippet>3441</a> );
-<a href=#3442 id=3442 data-nosnippet>3442</a>
-<a href=#3443 id=3443 data-nosnippet>3443</a> check_convert_with_avro_map(
-<a href=#3444 id=3444 data-nosnippet>3444</a> Literal::Map(Map::from([
-<a href=#3445 id=3445 data-nosnippet>3445</a> (
-<a href=#3446 id=3446 data-nosnippet>3446</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>)),
-<a href=#3447 id=3447 data-nosnippet>3447</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1</span>))),
-<a href=#3448 id=3448 data-nosnippet>3448</a> ),
-<a href=#3449 id=3449 data-nosnippet>3449</a> (
-<a href=#3450 id=3450 data-nosnippet>3450</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>)),
-<a href=#3451 id=3451 data-nosnippet>3451</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">2</span>))),
-<a href=#3452 id=3452 data-nosnippet>3452</a> ),
-<a href=#3453 id=3453 data-nosnippet>3453</a> (
-<a href=#3454 id=3454 data-nosnippet>3454</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>)),
-<a href=#3455 id=3455 data-nosnippet>3455</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">3</span>))),
-<a href=#3456 id=3456 data-nosnippet>3456</a> ),
-<a href=#3457 id=3457 data-nosnippet>3457</a> ])),
-<a href=#3458 id=3458 data-nosnippet>3458</a> <span class="kw-2">&</span>Type::Map(MapType {
-<a href=#3459 id=3459 data-nosnippet>3459</a> key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::Int))
-<a href=#3460 id=3460 data-nosnippet>3460</a> .into(),
-<a href=#3461 id=3461 data-nosnippet>3461</a> value_field: NestedField::map_value_element(
-<a href=#3462 id=3462 data-nosnippet>3462</a> <span class="number">3</span>,
-<a href=#3463 id=3463 data-nosnippet>3463</a> Type::Primitive(PrimitiveType::Long),
-<a href=#3464 id=3464 data-nosnippet>3464</a> <span class="bool-val">true</span>,
-<a href=#3465 id=3465 data-nosnippet>3465</a> )
-<a href=#3466 id=3466 data-nosnippet>3466</a> .into(),
-<a href=#3467 id=3467 data-nosnippet>3467</a> }),
-<a href=#3468 id=3468 data-nosnippet>3468</a> );
-<a href=#3469 id=3469 data-nosnippet>3469</a> }
-<a href=#3470 id=3470 data-nosnippet>3470</a>
-<a href=#3471 id=3471 data-nosnippet>3471</a> <span class="attr">#[test]
-<a href=#3472 id=3472 data-nosnippet>3472</a> </span><span class="kw">fn </span>avro_convert_test_string_map() {
-<a href=#3473 id=3473 data-nosnippet>3473</a> check_convert_with_avro_map(
-<a href=#3474 id=3474 data-nosnippet>3474</a> Literal::Map(Map::from([
-<a href=#3475 id=3475 data-nosnippet>3475</a> (
-<a href=#3476 id=3476 data-nosnippet>3476</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"a"</span>.to_string())),
-<a href=#3477 id=3477 data-nosnippet>3477</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3478 id=3478 data-nosnippet>3478</a> ),
-<a href=#3479 id=3479 data-nosnippet>3479</a> (
-<a href=#3480 id=3480 data-nosnippet>3480</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"b"</span>.to_string())),
-<a href=#3481 id=3481 data-nosnippet>3481</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
-<a href=#3482 id=3482 data-nosnippet>3482</a> ),
-<a href=#3483 id=3483 data-nosnippet>3483</a> (
-<a href=#3484 id=3484 data-nosnippet>3484</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"c"</span>.to_string())),
-<a href=#3485 id=3485 data-nosnippet>3485</a> <span class="prelude-val">None</span>,
-<a href=#3486 id=3486 data-nosnippet>3486</a> ),
-<a href=#3487 id=3487 data-nosnippet>3487</a> ])),
-<a href=#3488 id=3488 data-nosnippet>3488</a> <span class="kw-2">&</span>Type::Map(MapType {
-<a href=#3489 id=3489 data-nosnippet>3489</a> key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::String))
-<a href=#3490 id=3490 data-nosnippet>3490</a> .into(),
-<a href=#3491 id=3491 data-nosnippet>3491</a> value_field: NestedField::map_value_element(
-<a href=#3492 id=3492 data-nosnippet>3492</a> <span class="number">3</span>,
-<a href=#3493 id=3493 data-nosnippet>3493</a> Type::Primitive(PrimitiveType::Int),
-<a href=#3494 id=3494 data-nosnippet>3494</a> <span class="bool-val">false</span>,
-<a href=#3495 id=3495 data-nosnippet>3495</a> )
-<a href=#3496 id=3496 data-nosnippet>3496</a> .into(),
-<a href=#3497 id=3497 data-nosnippet>3497</a> }),
-<a href=#3498 id=3498 data-nosnippet>3498</a> );
-<a href=#3499 id=3499 data-nosnippet>3499</a>
-<a href=#3500 id=3500 data-nosnippet>3500</a> check_convert_with_avro_map(
-<a href=#3501 id=3501 data-nosnippet>3501</a> Literal::Map(Map::from([
-<a href=#3502 id=3502 data-nosnippet>3502</a> (
-<a href=#3503 id=3503 data-nosnippet>3503</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"a"</span>.to_string())),
-<a href=#3504 id=3504 data-nosnippet>3504</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3505 id=3505 data-nosnippet>3505</a> ),
+<a href=#3252 id=3252 data-nosnippet>3252</a> check_avro_bytes_serde(bytes, Datum::string(<span class="string">"iceberg"</span>), <span class="kw-2">&</span>PrimitiveType::String);
+<a href=#3253 id=3253 data-nosnippet>3253</a> }
+<a href=#3254 id=3254 data-nosnippet>3254</a>
+<a href=#3255 id=3255 data-nosnippet>3255</a> <span class="attr">#[test]
+<a href=#3256 id=3256 data-nosnippet>3256</a> </span><span class="kw">fn </span>avro_bytes_decimal() {
+<a href=#3257 id=3257 data-nosnippet>3257</a> <span class="comment">// (input_bytes, decimal_num, expect_scale, expect_precision)
+<a href=#3258 id=3258 data-nosnippet>3258</a> </span><span class="kw">let </span>cases = <span class="macro">vec!</span>[
+<a href=#3259 id=3259 data-nosnippet>3259</a> (<span class="macro">vec!</span>[<span class="number">4u8</span>, <span class="number">210u8</span>], <span class="number">1234</span>, <span class="number">2</span>, <span class="number">38</span>),
+<a href=#3260 id=3260 data-nosnippet>3260</a> (<span class="macro">vec!</span>[<span class="number">251u8</span>, <span class="number">46u8</span>], -<span class="number">1234</span>, <span class="number">2</span>, <span class="number">38</span>),
+<a href=#3261 id=3261 data-nosnippet>3261</a> (<span class="macro">vec!</span>[<span class="number">4u8</span>, <span class="number">210u8</span>], <span class="number">1234</span>, <span class="number">3</span>, <span class="number">38</span>),
+<a href=#3262 id=3262 data-nosnippet>3262</a> (<span class="macro">vec!</span>[<span class="number">251u8</span>, <span class="number">46u8</span>], -<span class="number">1234</span>, <span class="number">3</span>, <span class="number">38</span>),
+<a href=#3263 id=3263 data-nosnippet>3263</a> (<span class="macro">vec!</span>[<span class="number">42u8</span>], <span class="number">42</span>, <span class="number">2</span>, <span class="number">1</span>),
+<a href=#3264 id=3264 data-nosnippet>3264</a> (<span class="macro">vec!</span>[<span class="number">214u8</span>], -<span class="number">42</span>, <span class="number">2</span>, <span class="number">1</span>),
+<a href=#3265 id=3265 data-nosnippet>3265</a> ];
+<a href=#3266 id=3266 data-nosnippet>3266</a>
+<a href=#3267 id=3267 data-nosnippet>3267</a> <span class="kw">for </span>(input_bytes, decimal_num, expect_scale, expect_precision) <span class="kw">in </span>cases {
+<a href=#3268 id=3268 data-nosnippet>3268</a> check_avro_bytes_serde(
+<a href=#3269 id=3269 data-nosnippet>3269</a> input_bytes,
+<a href=#3270 id=3270 data-nosnippet>3270</a> Datum::decimal_with_precision(
+<a href=#3271 id=3271 data-nosnippet>3271</a> Decimal::new(decimal_num, expect_scale),
+<a href=#3272 id=3272 data-nosnippet>3272</a> expect_precision,
+<a href=#3273 id=3273 data-nosnippet>3273</a> )
+<a href=#3274 id=3274 data-nosnippet>3274</a> .unwrap(),
+<a href=#3275 id=3275 data-nosnippet>3275</a> <span class="kw-2">&</span>PrimitiveType::Decimal {
+<a href=#3276 id=3276 data-nosnippet>3276</a> precision: expect_precision,
+<a href=#3277 id=3277 data-nosnippet>3277</a> scale: expect_scale,
+<a href=#3278 id=3278 data-nosnippet>3278</a> },
+<a href=#3279 id=3279 data-nosnippet>3279</a> );
+<a href=#3280 id=3280 data-nosnippet>3280</a> }
+<a href=#3281 id=3281 data-nosnippet>3281</a> }
+<a href=#3282 id=3282 data-nosnippet>3282</a>
+<a href=#3283 id=3283 data-nosnippet>3283</a> <span class="attr">#[test]
+<a href=#3284 id=3284 data-nosnippet>3284</a> </span><span class="kw">fn </span>avro_bytes_decimal_expect_error() {
+<a href=#3285 id=3285 data-nosnippet>3285</a> <span class="comment">// (decimal_num, expect_scale, expect_precision)
+<a href=#3286 id=3286 data-nosnippet>3286</a> </span><span class="kw">let </span>cases = <span class="macro">vec!</span>[(<span class="number">1234</span>, <span class="number">2</span>, <span class="number">1</span>)];
+<a href=#3287 id=3287 data-nosnippet>3287</a>
+<a href=#3288 id=3288 data-nosnippet>3288</a> <span class="kw">for </span>(decimal_num, expect_scale, expect_precision) <span class="kw">in </span>cases {
+<a href=#3289 id=3289 data-nosnippet>3289</a> <span class="kw">let </span>result = Datum::decimal_with_precision(
+<a href=#3290 id=3290 data-nosnippet>3290</a> Decimal::new(decimal_num, expect_scale),
+<a href=#3291 id=3291 data-nosnippet>3291</a> expect_precision,
+<a href=#3292 id=3292 data-nosnippet>3292</a> );
+<a href=#3293 id=3293 data-nosnippet>3293</a> <span class="macro">assert!</span>(result.is_err(), <span class="string">"expect error but got {:?}"</span>, result);
+<a href=#3294 id=3294 data-nosnippet>3294</a> <span class="macro">assert_eq!</span>(
+<a href=#3295 id=3295 data-nosnippet>3295</a> result.unwrap_err().kind(),
+<a href=#3296 id=3296 data-nosnippet>3296</a> ErrorKind::DataInvalid,
+<a href=#3297 id=3297 data-nosnippet>3297</a> <span class="string">"expect error DataInvalid"</span>,
+<a href=#3298 id=3298 data-nosnippet>3298</a> );
+<a href=#3299 id=3299 data-nosnippet>3299</a> }
+<a href=#3300 id=3300 data-nosnippet>3300</a> }
+<a href=#3301 id=3301 data-nosnippet>3301</a>
+<a href=#3302 id=3302 data-nosnippet>3302</a> <span class="attr">#[test]
+<a href=#3303 id=3303 data-nosnippet>3303</a> </span><span class="kw">fn </span>avro_convert_test_int() {
+<a href=#3304 id=3304 data-nosnippet>3304</a> check_convert_with_avro(
+<a href=#3305 id=3305 data-nosnippet>3305</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">32</span>)),
+<a href=#3306 id=3306 data-nosnippet>3306</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Int),
+<a href=#3307 id=3307 data-nosnippet>3307</a> );
+<a href=#3308 id=3308 data-nosnippet>3308</a> }
+<a href=#3309 id=3309 data-nosnippet>3309</a>
+<a href=#3310 id=3310 data-nosnippet>3310</a> <span class="attr">#[test]
+<a href=#3311 id=3311 data-nosnippet>3311</a> </span><span class="kw">fn </span>avro_convert_test_long() {
+<a href=#3312 id=3312 data-nosnippet>3312</a> check_convert_with_avro(
+<a href=#3313 id=3313 data-nosnippet>3313</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">32</span>)),
+<a href=#3314 id=3314 data-nosnippet>3314</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Long),
+<a href=#3315 id=3315 data-nosnippet>3315</a> );
+<a href=#3316 id=3316 data-nosnippet>3316</a> }
+<a href=#3317 id=3317 data-nosnippet>3317</a>
+<a href=#3318 id=3318 data-nosnippet>3318</a> <span class="attr">#[test]
+<a href=#3319 id=3319 data-nosnippet>3319</a> </span><span class="kw">fn </span>avro_convert_test_float() {
+<a href=#3320 id=3320 data-nosnippet>3320</a> check_convert_with_avro(
+<a href=#3321 id=3321 data-nosnippet>3321</a> Literal::Primitive(PrimitiveLiteral::Float(OrderedFloat(<span class="number">1.0</span>))),
+<a href=#3322 id=3322 data-nosnippet>3322</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Float),
+<a href=#3323 id=3323 data-nosnippet>3323</a> );
+<a href=#3324 id=3324 data-nosnippet>3324</a> }
+<a href=#3325 id=3325 data-nosnippet>3325</a>
+<a href=#3326 id=3326 data-nosnippet>3326</a> <span class="attr">#[test]
+<a href=#3327 id=3327 data-nosnippet>3327</a> </span><span class="kw">fn </span>avro_convert_test_double() {
+<a href=#3328 id=3328 data-nosnippet>3328</a> check_convert_with_avro(
+<a href=#3329 id=3329 data-nosnippet>3329</a> Literal::Primitive(PrimitiveLiteral::Double(OrderedFloat(<span class="number">1.0</span>))),
+<a href=#3330 id=3330 data-nosnippet>3330</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Double),
+<a href=#3331 id=3331 data-nosnippet>3331</a> );
+<a href=#3332 id=3332 data-nosnippet>3332</a> }
+<a href=#3333 id=3333 data-nosnippet>3333</a>
+<a href=#3334 id=3334 data-nosnippet>3334</a> <span class="attr">#[test]
+<a href=#3335 id=3335 data-nosnippet>3335</a> </span><span class="kw">fn </span>avro_convert_test_string() {
+<a href=#3336 id=3336 data-nosnippet>3336</a> check_convert_with_avro(
+<a href=#3337 id=3337 data-nosnippet>3337</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"iceberg"</span>.to_string())),
+<a href=#3338 id=3338 data-nosnippet>3338</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::String),
+<a href=#3339 id=3339 data-nosnippet>3339</a> );
+<a href=#3340 id=3340 data-nosnippet>3340</a> }
+<a href=#3341 id=3341 data-nosnippet>3341</a>
+<a href=#3342 id=3342 data-nosnippet>3342</a> <span class="attr">#[test]
+<a href=#3343 id=3343 data-nosnippet>3343</a> </span><span class="kw">fn </span>avro_convert_test_date() {
+<a href=#3344 id=3344 data-nosnippet>3344</a> check_convert_with_avro(
+<a href=#3345 id=3345 data-nosnippet>3345</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">17486</span>)),
+<a href=#3346 id=3346 data-nosnippet>3346</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Date),
+<a href=#3347 id=3347 data-nosnippet>3347</a> );
+<a href=#3348 id=3348 data-nosnippet>3348</a> }
+<a href=#3349 id=3349 data-nosnippet>3349</a>
+<a href=#3350 id=3350 data-nosnippet>3350</a> <span class="attr">#[test]
+<a href=#3351 id=3351 data-nosnippet>3351</a> </span><span class="kw">fn </span>avro_convert_test_time() {
+<a href=#3352 id=3352 data-nosnippet>3352</a> check_convert_with_avro(
+<a href=#3353 id=3353 data-nosnippet>3353</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">81068123456</span>)),
+<a href=#3354 id=3354 data-nosnippet>3354</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Time),
+<a href=#3355 id=3355 data-nosnippet>3355</a> );
+<a href=#3356 id=3356 data-nosnippet>3356</a> }
+<a href=#3357 id=3357 data-nosnippet>3357</a>
+<a href=#3358 id=3358 data-nosnippet>3358</a> <span class="attr">#[test]
+<a href=#3359 id=3359 data-nosnippet>3359</a> </span><span class="kw">fn </span>avro_convert_test_timestamp() {
+<a href=#3360 id=3360 data-nosnippet>3360</a> check_convert_with_avro(
+<a href=#3361 id=3361 data-nosnippet>3361</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
+<a href=#3362 id=3362 data-nosnippet>3362</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Timestamp),
+<a href=#3363 id=3363 data-nosnippet>3363</a> );
+<a href=#3364 id=3364 data-nosnippet>3364</a> }
+<a href=#3365 id=3365 data-nosnippet>3365</a>
+<a href=#3366 id=3366 data-nosnippet>3366</a> <span class="attr">#[test]
+<a href=#3367 id=3367 data-nosnippet>3367</a> </span><span class="kw">fn </span>avro_convert_test_timestamptz() {
+<a href=#3368 id=3368 data-nosnippet>3368</a> check_convert_with_avro(
+<a href=#3369 id=3369 data-nosnippet>3369</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
+<a href=#3370 id=3370 data-nosnippet>3370</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Timestamptz),
+<a href=#3371 id=3371 data-nosnippet>3371</a> );
+<a href=#3372 id=3372 data-nosnippet>3372</a> }
+<a href=#3373 id=3373 data-nosnippet>3373</a>
+<a href=#3374 id=3374 data-nosnippet>3374</a> <span class="attr">#[test]
+<a href=#3375 id=3375 data-nosnippet>3375</a> </span><span class="kw">fn </span>avro_convert_test_list() {
+<a href=#3376 id=3376 data-nosnippet>3376</a> check_convert_with_avro(
+<a href=#3377 id=3377 data-nosnippet>3377</a> Literal::List(<span class="macro">vec!</span>[
+<a href=#3378 id=3378 data-nosnippet>3378</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3379 id=3379 data-nosnippet>3379</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
+<a href=#3380 id=3380 data-nosnippet>3380</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
+<a href=#3381 id=3381 data-nosnippet>3381</a> <span class="prelude-val">None</span>,
+<a href=#3382 id=3382 data-nosnippet>3382</a> ]),
+<a href=#3383 id=3383 data-nosnippet>3383</a> <span class="kw-2">&</span>Type::List(ListType {
+<a href=#3384 id=3384 data-nosnippet>3384</a> element_field: NestedField::list_element(
+<a href=#3385 id=3385 data-nosnippet>3385</a> <span class="number">0</span>,
+<a href=#3386 id=3386 data-nosnippet>3386</a> Type::Primitive(PrimitiveType::Int),
+<a href=#3387 id=3387 data-nosnippet>3387</a> <span class="bool-val">false</span>,
+<a href=#3388 id=3388 data-nosnippet>3388</a> )
+<a href=#3389 id=3389 data-nosnippet>3389</a> .into(),
+<a href=#3390 id=3390 data-nosnippet>3390</a> }),
+<a href=#3391 id=3391 data-nosnippet>3391</a> );
+<a href=#3392 id=3392 data-nosnippet>3392</a>
+<a href=#3393 id=3393 data-nosnippet>3393</a> check_convert_with_avro(
+<a href=#3394 id=3394 data-nosnippet>3394</a> Literal::List(<span class="macro">vec!</span>[
+<a href=#3395 id=3395 data-nosnippet>3395</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3396 id=3396 data-nosnippet>3396</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
+<a href=#3397 id=3397 data-nosnippet>3397</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
+<a href=#3398 id=3398 data-nosnippet>3398</a> ]),
+<a href=#3399 id=3399 data-nosnippet>3399</a> <span class="kw-2">&</span>Type::List(ListType {
+<a href=#3400 id=3400 data-nosnippet>3400</a> element_field: NestedField::list_element(
+<a href=#3401 id=3401 data-nosnippet>3401</a> <span class="number">0</span>,
+<a href=#3402 id=3402 data-nosnippet>3402</a> Type::Primitive(PrimitiveType::Int),
+<a href=#3403 id=3403 data-nosnippet>3403</a> <span class="bool-val">true</span>,
+<a href=#3404 id=3404 data-nosnippet>3404</a> )
+<a href=#3405 id=3405 data-nosnippet>3405</a> .into(),
+<a href=#3406 id=3406 data-nosnippet>3406</a> }),
+<a href=#3407 id=3407 data-nosnippet>3407</a> );
+<a href=#3408 id=3408 data-nosnippet>3408</a> }
+<a href=#3409 id=3409 data-nosnippet>3409</a>
+<a href=#3410 id=3410 data-nosnippet>3410</a> <span class="kw">fn </span>check_convert_with_avro_map(expected_literal: Literal, expected_type: <span class="kw-2">&</span>Type) {
+<a href=#3411 id=3411 data-nosnippet>3411</a> <span class="kw">let </span>fields = <span class="macro">vec!</span>[NestedField::required(<span class="number">1</span>, <span class="string">"col"</span>, expected_type.clone()).into()];
+<a href=#3412 id=3412 data-nosnippet>3412</a> <span class="kw">let </span>schema = Schema::builder()
+<a href=#3413 id=3413 data-nosnippet>3413</a> .with_fields(fields.clone())
+<a href=#3414 id=3414 data-nosnippet>3414</a> .build()
+<a href=#3415 id=3415 data-nosnippet>3415</a> .unwrap();
+<a href=#3416 id=3416 data-nosnippet>3416</a> <span class="kw">let </span>avro_schema = schema_to_avro_schema(<span class="string">"test"</span>, <span class="kw-2">&</span>schema).unwrap();
+<a href=#3417 id=3417 data-nosnippet>3417</a> <span class="kw">let </span>struct_type = Type::Struct(StructType::new(fields));
+<a href=#3418 id=3418 data-nosnippet>3418</a> <span class="kw">let </span>struct_literal =
+<a href=#3419 id=3419 data-nosnippet>3419</a> Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[<span class="prelude-val">Some</span>(expected_literal.clone())]));
+<a href=#3420 id=3420 data-nosnippet>3420</a>
+<a href=#3421 id=3421 data-nosnippet>3421</a> <span class="kw">let </span><span class="kw-2">mut </span>writer = apache_avro::Writer::new(<span class="kw-2">&</span>avro_schema, Vec::new());
+<a href=#3422 id=3422 data-nosnippet>3422</a> <span class="kw">let </span>raw_literal = RawLiteral::try_from(struct_literal.clone(), <span class="kw-2">&</span>struct_type).unwrap();
+<a href=#3423 id=3423 data-nosnippet>3423</a> writer.append_ser(raw_literal).unwrap();
+<a href=#3424 id=3424 data-nosnippet>3424</a> <span class="kw">let </span>encoded = writer.into_inner().unwrap();
+<a href=#3425 id=3425 data-nosnippet>3425</a>
+<a href=#3426 id=3426 data-nosnippet>3426</a> <span class="kw">let </span>reader = apache_avro::Reader::new(<span class="kw-2">&*</span>encoded).unwrap();
+<a href=#3427 id=3427 data-nosnippet>3427</a> <span class="kw">for </span>record <span class="kw">in </span>reader {
+<a href=#3428 id=3428 data-nosnippet>3428</a> <span class="kw">let </span>result = apache_avro::from_value::<RawLiteral>(<span class="kw-2">&</span>record.unwrap()).unwrap();
+<a href=#3429 id=3429 data-nosnippet>3429</a> <span class="kw">let </span>desered_literal = result.try_into(<span class="kw-2">&</span>struct_type).unwrap().unwrap();
+<a href=#3430 id=3430 data-nosnippet>3430</a> <span class="kw">match </span>(<span class="kw-2">&</span>desered_literal, <span class="kw-2">&</span>struct_literal) {
+<a href=#3431 id=3431 data-nosnippet>3431</a> (Literal::Struct(desered), Literal::Struct(expected)) => {
+<a href=#3432 id=3432 data-nosnippet>3432</a> <span class="kw">match </span>(<span class="kw-2">&</span>desered.fields[<span class="number">0</span>], <span class="kw-2">&</span>expected.fields[<span class="number">0</span>]) {
+<a href=#3433 id=3433 data-nosnippet>3433</a> (<span class="prelude-val">Some</span>(Literal::Map(desered)), <span class="prelude-val">Some</span>(Literal::Map(expected))) => {
+<a href=#3434 id=3434 data-nosnippet>3434</a> <span class="macro">assert!</span>(desered.has_same_content(expected))
+<a href=#3435 id=3435 data-nosnippet>3435</a> }
+<a href=#3436 id=3436 data-nosnippet>3436</a> <span class="kw">_ </span>=> {
+<a href=#3437 id=3437 data-nosnippet>3437</a> <span class="macro">unreachable!</span>()
+<a href=#3438 id=3438 data-nosnippet>3438</a> }
+<a href=#3439 id=3439 data-nosnippet>3439</a> }
+<a href=#3440 id=3440 data-nosnippet>3440</a> }
+<a href=#3441 id=3441 data-nosnippet>3441</a> <span class="kw">_ </span>=> {
+<a href=#3442 id=3442 data-nosnippet>3442</a> <span class="macro">panic!</span>(<span class="string">"unexpected literal type"</span>);
+<a href=#3443 id=3443 data-nosnippet>3443</a> }
+<a href=#3444 id=3444 data-nosnippet>3444</a> }
+<a href=#3445 id=3445 data-nosnippet>3445</a> }
+<a href=#3446 id=3446 data-nosnippet>3446</a> }
+<a href=#3447 id=3447 data-nosnippet>3447</a>
+<a href=#3448 id=3448 data-nosnippet>3448</a> <span class="attr">#[test]
+<a href=#3449 id=3449 data-nosnippet>3449</a> </span><span class="kw">fn </span>avro_convert_test_map() {
+<a href=#3450 id=3450 data-nosnippet>3450</a> check_convert_with_avro_map(
+<a href=#3451 id=3451 data-nosnippet>3451</a> Literal::Map(Map::from([
+<a href=#3452 id=3452 data-nosnippet>3452</a> (
+<a href=#3453 id=3453 data-nosnippet>3453</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>)),
+<a href=#3454 id=3454 data-nosnippet>3454</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1</span>))),
+<a href=#3455 id=3455 data-nosnippet>3455</a> ),
+<a href=#3456 id=3456 data-nosnippet>3456</a> (
+<a href=#3457 id=3457 data-nosnippet>3457</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>)),
+<a href=#3458 id=3458 data-nosnippet>3458</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">2</span>))),
+<a href=#3459 id=3459 data-nosnippet>3459</a> ),
+<a href=#3460 id=3460 data-nosnippet>3460</a> (Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>)), <span class="prelude-val">None</span>),
+<a href=#3461 id=3461 data-nosnippet>3461</a> ])),
+<a href=#3462 id=3462 data-nosnippet>3462</a> <span class="kw-2">&</span>Type::Map(MapType {
+<a href=#3463 id=3463 data-nosnippet>3463</a> key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::Int))
+<a href=#3464 id=3464 data-nosnippet>3464</a> .into(),
+<a href=#3465 id=3465 data-nosnippet>3465</a> value_field: NestedField::map_value_element(
+<a href=#3466 id=3466 data-nosnippet>3466</a> <span class="number">3</span>,
+<a href=#3467 id=3467 data-nosnippet>3467</a> Type::Primitive(PrimitiveType::Long),
+<a href=#3468 id=3468 data-nosnippet>3468</a> <span class="bool-val">false</span>,
+<a href=#3469 id=3469 data-nosnippet>3469</a> )
+<a href=#3470 id=3470 data-nosnippet>3470</a> .into(),
+<a href=#3471 id=3471 data-nosnippet>3471</a> }),
+<a href=#3472 id=3472 data-nosnippet>3472</a> );
+<a href=#3473 id=3473 data-nosnippet>3473</a>
+<a href=#3474 id=3474 data-nosnippet>3474</a> check_convert_with_avro_map(
+<a href=#3475 id=3475 data-nosnippet>3475</a> Literal::Map(Map::from([
+<a href=#3476 id=3476 data-nosnippet>3476</a> (
+<a href=#3477 id=3477 data-nosnippet>3477</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>)),
+<a href=#3478 id=3478 data-nosnippet>3478</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1</span>))),
+<a href=#3479 id=3479 data-nosnippet>3479</a> ),
+<a href=#3480 id=3480 data-nosnippet>3480</a> (
+<a href=#3481 id=3481 data-nosnippet>3481</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>)),
+<a href=#3482 id=3482 data-nosnippet>3482</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">2</span>))),
+<a href=#3483 id=3483 data-nosnippet>3483</a> ),
+<a href=#3484 id=3484 data-nosnippet>3484</a> (
+<a href=#3485 id=3485 data-nosnippet>3485</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>)),
+<a href=#3486 id=3486 data-nosnippet>3486</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">3</span>))),
+<a href=#3487 id=3487 data-nosnippet>3487</a> ),
+<a href=#3488 id=3488 data-nosnippet>3488</a> ])),
+<a href=#3489 id=3489 data-nosnippet>3489</a> <span class="kw-2">&</span>Type::Map(MapType {
+<a href=#3490 id=3490 data-nosnippet>3490</a> key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::Int))
+<a href=#3491 id=3491 data-nosnippet>3491</a> .into(),
+<a href=#3492 id=3492 data-nosnippet>3492</a> value_field: NestedField::map_value_element(
+<a href=#3493 id=3493 data-nosnippet>3493</a> <span class="number">3</span>,
+<a href=#3494 id=3494 data-nosnippet>3494</a> Type::Primitive(PrimitiveType::Long),
+<a href=#3495 id=3495 data-nosnippet>3495</a> <span class="bool-val">true</span>,
+<a href=#3496 id=3496 data-nosnippet>3496</a> )
+<a href=#3497 id=3497 data-nosnippet>3497</a> .into(),
+<a href=#3498 id=3498 data-nosnippet>3498</a> }),
+<a href=#3499 id=3499 data-nosnippet>3499</a> );
+<a href=#3500 id=3500 data-nosnippet>3500</a> }
+<a href=#3501 id=3501 data-nosnippet>3501</a>
+<a href=#3502 id=3502 data-nosnippet>3502</a> <span class="attr">#[test]
+<a href=#3503 id=3503 data-nosnippet>3503</a> </span><span class="kw">fn </span>avro_convert_test_string_map() {
+<a href=#3504 id=3504 data-nosnippet>3504</a> check_convert_with_avro_map(
+<a href=#3505 id=3505 data-nosnippet>3505</a> Literal::Map(Map::from([
<a href=#3506 id=3506 data-nosnippet>3506</a> (
-<a href=#3507 id=3507 data-nosnippet>3507</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"b"</span>.to_string())),
-<a href=#3508 id=3508 data-nosnippet>3508</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
+<a href=#3507 id=3507 data-nosnippet>3507</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"a"</span>.to_string())),
+<a href=#3508 id=3508 data-nosnippet>3508</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
<a href=#3509 id=3509 data-nosnippet>3509</a> ),
<a href=#3510 id=3510 data-nosnippet>3510</a> (
-<a href=#3511 id=3511 data-nosnippet>3511</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"c"</span>.to_string())),
-<a href=#3512 id=3512 data-nosnippet>3512</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
+<a href=#3511 id=3511 data-nosnippet>3511</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"b"</span>.to_string())),
+<a href=#3512 id=3512 data-nosnippet>3512</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
<a href=#3513 id=3513 data-nosnippet>3513</a> ),
-<a href=#3514 id=3514 data-nosnippet>3514</a> ])),
-<a href=#3515 id=3515 data-nosnippet>3515</a> <span class="kw-2">&</span>Type::Map(MapType {
-<a href=#3516 id=3516 data-nosnippet>3516</a> key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::String))
-<a href=#3517 id=3517 data-nosnippet>3517</a> .into(),
-<a href=#3518 id=3518 data-nosnippet>3518</a> value_field: NestedField::map_value_element(
-<a href=#3519 id=3519 data-nosnippet>3519</a> <span class="number">3</span>,
-<a href=#3520 id=3520 data-nosnippet>3520</a> Type::Primitive(PrimitiveType::Int),
-<a href=#3521 id=3521 data-nosnippet>3521</a> <span class="bool-val">true</span>,
-<a href=#3522 id=3522 data-nosnippet>3522</a> )
-<a href=#3523 id=3523 data-nosnippet>3523</a> .into(),
-<a href=#3524 id=3524 data-nosnippet>3524</a> }),
-<a href=#3525 id=3525 data-nosnippet>3525</a> );
-<a href=#3526 id=3526 data-nosnippet>3526</a> }
-<a href=#3527 id=3527 data-nosnippet>3527</a>
-<a href=#3528 id=3528 data-nosnippet>3528</a> <span class="attr">#[test]
-<a href=#3529 id=3529 data-nosnippet>3529</a> </span><span class="kw">fn </span>avro_convert_test_record() {
-<a href=#3530 id=3530 data-nosnippet>3530</a> check_convert_with_avro(
-<a href=#3531 id=3531 data-nosnippet>3531</a> Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[
-<a href=#3532 id=3532 data-nosnippet>3532</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3533 id=3533 data-nosnippet>3533</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::String(
-<a href=#3534 id=3534 data-nosnippet>3534</a> <span class="string">"bar"</span>.to_string(),
-<a href=#3535 id=3535 data-nosnippet>3535</a> ))),
-<a href=#3536 id=3536 data-nosnippet>3536</a> <span class="prelude-val">None</span>,
-<a href=#3537 id=3537 data-nosnippet>3537</a> ])),
-<a href=#3538 id=3538 data-nosnippet>3538</a> <span class="kw-2">&</span>Type::Struct(StructType::new(<span class="macro">vec!</span>[
-<a href=#3539 id=3539 data-nosnippet>3539</a> NestedField::required(<span class="number">2</span>, <span class="string">"id"</span>, Type::Primitive(PrimitiveType::Int)).into(),
-<a href=#3540 id=3540 data-nosnippet>3540</a> NestedField::optional(<span class="number">3</span>, <span class="string">"name"</span>, Type::Primitive(PrimitiveType::String)).into(),
-<a href=#3541 id=3541 data-nosnippet>3541</a> NestedField::optional(<span class="number">4</span>, <span class="string">"address"</span>, Type::Primitive(PrimitiveType::String)).into(),
-<a href=#3542 id=3542 data-nosnippet>3542</a> ])),
-<a href=#3543 id=3543 data-nosnippet>3543</a> );
-<a href=#3544 id=3544 data-nosnippet>3544</a> }
-<a href=#3545 id=3545 data-nosnippet>3545</a>
-<a href=#3546 id=3546 data-nosnippet>3546</a> <span class="comment">// # TODO:https://github.com/apache/iceberg-rust/issues/86
-<a href=#3547 id=3547 data-nosnippet>3547</a> // rust avro don't support deserialize any bytes representation now:
-<a href=#3548 id=3548 data-nosnippet>3548</a> // - binary
-<a href=#3549 id=3549 data-nosnippet>3549</a> // - decimal
-<a href=#3550 id=3550 data-nosnippet>3550</a> </span><span class="attr">#[test]
-<a href=#3551 id=3551 data-nosnippet>3551</a> </span><span class="kw">fn </span>avro_convert_test_binary_ser() {
-<a href=#3552 id=3552 data-nosnippet>3552</a> <span class="kw">let </span>literal = Literal::Primitive(PrimitiveLiteral::Binary(<span class="macro">vec!</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]));
-<a href=#3553 id=3553 data-nosnippet>3553</a> <span class="kw">let </span>ty = Type::Primitive(PrimitiveType::Binary);
-<a href=#3554 id=3554 data-nosnippet>3554</a> <span class="kw">let </span>expect_value = Value::Bytes(<span class="macro">vec!</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]);
-<a href=#3555 id=3555 data-nosnippet>3555</a> check_serialize_avro(literal, <span class="kw-2">&</span>ty, expect_value);
-<a href=#3556 id=3556 data-nosnippet>3556</a> }
-<a href=#3557 id=3557 data-nosnippet>3557</a>
-<a href=#3558 id=3558 data-nosnippet>3558</a> <span class="attr">#[test]
-<a href=#3559 id=3559 data-nosnippet>3559</a> </span><span class="kw">fn </span>avro_convert_test_decimal_ser() {
-<a href=#3560 id=3560 data-nosnippet>3560</a> <span class="kw">let </span>literal = Literal::decimal(<span class="number">12345</span>);
-<a href=#3561 id=3561 data-nosnippet>3561</a> <span class="kw">let </span>ty = Type::Primitive(PrimitiveType::Decimal {
-<a href=#3562 id=3562 data-nosnippet>3562</a> precision: <span class="number">9</span>,
-<a href=#3563 id=3563 data-nosnippet>3563</a> scale: <span class="number">8</span>,
-<a href=#3564 id=3564 data-nosnippet>3564</a> });
-<a href=#3565 id=3565 data-nosnippet>3565</a> <span class="kw">let </span>expect_value = Value::Decimal(apache_avro::Decimal::from(<span class="number">12345_i128</span>.to_be_bytes()));
-<a href=#3566 id=3566 data-nosnippet>3566</a> check_serialize_avro(literal, <span class="kw-2">&</span>ty, expect_value);
-<a href=#3567 id=3567 data-nosnippet>3567</a> }
-<a href=#3568 id=3568 data-nosnippet>3568</a>
-<a href=#3569 id=3569 data-nosnippet>3569</a> <span class="comment">// # TODO:https://github.com/apache/iceberg-rust/issues/86
-<a href=#3570 id=3570 data-nosnippet>3570</a> // rust avro can't support to convert any byte-like type to fixed in avro now.
-<a href=#3571 id=3571 data-nosnippet>3571</a> // - uuid ser/de
-<a href=#3572 id=3572 data-nosnippet>3572</a> // - fixed ser/de
-<a href=#3573 id=3573 data-nosnippet>3573</a>
-<a href=#3574 id=3574 data-nosnippet>3574</a> </span><span class="attr">#[test]
-<a href=#3575 id=3575 data-nosnippet>3575</a> </span><span class="kw">fn </span>test_parse_timestamp() {
-<a href=#3576 id=3576 data-nosnippet>3576</a> <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"2021-08-01T01:09:00.0899"</span>).unwrap();
-<a href=#3577 id=3577 data-nosnippet>3577</a> <span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{value}"</span>), <span class="string">"2021-08-01 01:09:00.089900"</span>);
-<a href=#3578 id=3578 data-nosnippet>3578</a>
-<a href=#3579 id=3579 data-nosnippet>3579</a> <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"2023-01-06T00:00:00"</span>).unwrap();
-<a href=#3580 id=3580 data-nosnippet>3580</a> <span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{value}"</span>), <span class="string">"2023-01-06 00:00:00"</span>);
-<a href=#3581 id=3581 data-nosnippet>3581</a>
-<a href=#3582 id=3582 data-nosnippet>3582</a> <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"2021-08-01T01:09:00.0899+0800"</span>);
-<a href=#3583 id=3583 data-nosnippet>3583</a> <span class="macro">assert!</span>(value.is_err(), <span class="string">"Parse timestamp with timezone should fail!"</span>);
-<a href=#3584 id=3584 data-nosnippet>3584</a>
-<a href=#3585 id=3585 data-nosnippet>3585</a> <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"dfa"</span>);
-<a href=#3586 id=3586 data-nosnippet>3586</a> <span class="macro">assert!</span>(
-<a href=#3587 id=3587 data-nosnippet>3587</a> value.is_err(),
-<a href=#3588 id=3588 data-nosnippet>3588</a> <span class="string">"Parse timestamp with invalid input should fail!"
-<a href=#3589 id=3589 data-nosnippet>3589</a> </span>);
-<a href=#3590 id=3590 data-nosnippet>3590</a> }
-<a href=#3591 id=3591 data-nosnippet>3591</a>
-<a href=#3592 id=3592 data-nosnippet>3592</a> <span class="attr">#[test]
-<a href=#3593 id=3593 data-nosnippet>3593</a> </span><span class="kw">fn </span>test_parse_timestamptz() {
-<a href=#3594 id=3594 data-nosnippet>3594</a> <span class="kw">let </span>value = Datum::timestamptz_from_str(<span class="string">"2021-08-01T09:09:00.0899+0800"</span>).unwrap();
-<a href=#3595 id=3595 data-nosnippet>3595</a> <span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{value}"</span>), <span class="string">"2021-08-01 01:09:00.089900 UTC"</span>);
-<a href=#3596 id=3596 data-nosnippet>3596</a>
-<a href=#3597 id=3597 data-nosnippet>3597</a> <span class="kw">let </span>value = Datum::timestamptz_from_str(<span class="string">"2021-08-01T01:09:00.0899"</span>);
-<a href=#3598 id=3598 data-nosnippet>3598</a> <span class="macro">assert!</span>(
-<a href=#3599 id=3599 data-nosnippet>3599</a> value.is_err(),
-<a href=#3600 id=3600 data-nosnippet>3600</a> <span class="string">"Parse timestamptz without timezone should fail!"
-<a href=#3601 id=3601 data-nosnippet>3601</a> </span>);
-<a href=#3602 id=3602 data-nosnippet>3602</a>
-<a href=#3603 id=3603 data-nosnippet>3603</a> <span class="kw">let </span>value = Datum::timestamptz_from_str(<span class="string">"dfa"</span>);
-<a href=#3604 id=3604 data-nosnippet>3604</a> <span class="macro">assert!</span>(
-<a href=#3605 id=3605 data-nosnippet>3605</a> value.is_err(),
-<a href=#3606 id=3606 data-nosnippet>3606</a> <span class="string">"Parse timestamptz with invalid input should fail!"
-<a href=#3607 id=3607 data-nosnippet>3607</a> </span>);
-<a href=#3608 id=3608 data-nosnippet>3608</a> }
+<a href=#3514 id=3514 data-nosnippet>3514</a> (
+<a href=#3515 id=3515 data-nosnippet>3515</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"c"</span>.to_string())),
+<a href=#3516 id=3516 data-nosnippet>3516</a> <span class="prelude-val">None</span>,
+<a href=#3517 id=3517 data-nosnippet>3517</a> ),
+<a href=#3518 id=3518 data-nosnippet>3518</a> ])),
+<a href=#3519 id=3519 data-nosnippet>3519</a> <span class="kw-2">&</span>Type::Map(MapType {
+<a href=#3520 id=3520 data-nosnippet>3520</a> key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::String))
+<a href=#3521 id=3521 data-nosnippet>3521</a> .into(),
+<a href=#3522 id=3522 data-nosnippet>3522</a> value_field: NestedField::map_value_element(
+<a href=#3523 id=3523 data-nosnippet>3523</a> <span class="number">3</span>,
+<a href=#3524 id=3524 data-nosnippet>3524</a> Type::Primitive(PrimitiveType::Int),
+<a href=#3525 id=3525 data-nosnippet>3525</a> <span class="bool-val">false</span>,
+<a href=#3526 id=3526 data-nosnippet>3526</a> )
+<a href=#3527 id=3527 data-nosnippet>3527</a> .into(),
+<a href=#3528 id=3528 data-nosnippet>3528</a> }),
+<a href=#3529 id=3529 data-nosnippet>3529</a> );
+<a href=#3530 id=3530 data-nosnippet>3530</a>
+<a href=#3531 id=3531 data-nosnippet>3531</a> check_convert_with_avro_map(
+<a href=#3532 id=3532 data-nosnippet>3532</a> Literal::Map(Map::from([
+<a href=#3533 id=3533 data-nosnippet>3533</a> (
+<a href=#3534 id=3534 data-nosnippet>3534</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"a"</span>.to_string())),
+<a href=#3535 id=3535 data-nosnippet>3535</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3536 id=3536 data-nosnippet>3536</a> ),
+<a href=#3537 id=3537 data-nosnippet>3537</a> (
+<a href=#3538 id=3538 data-nosnippet>3538</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"b"</span>.to_string())),
+<a href=#3539 id=3539 data-nosnippet>3539</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
+<a href=#3540 id=3540 data-nosnippet>3540</a> ),
+<a href=#3541 id=3541 data-nosnippet>3541</a> (
+<a href=#3542 id=3542 data-nosnippet>3542</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"c"</span>.to_string())),
+<a href=#3543 id=3543 data-nosnippet>3543</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
+<a href=#3544 id=3544 data-nosnippet>3544</a> ),
+<a href=#3545 id=3545 data-nosnippet>3545</a> ])),
+<a href=#3546 id=3546 data-nosnippet>3546</a> <span class="kw-2">&</span>Type::Map(MapType {
+<a href=#3547 id=3547 data-nosnippet>3547</a> key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::String))
+<a href=#3548 id=3548 data-nosnippet>3548</a> .into(),
+<a href=#3549 id=3549 data-nosnippet>3549</a> value_field: NestedField::map_value_element(
+<a href=#3550 id=3550 data-nosnippet>3550</a> <span class="number">3</span>,
+<a href=#3551 id=3551 data-nosnippet>3551</a> Type::Primitive(PrimitiveType::Int),
+<a href=#3552 id=3552 data-nosnippet>3552</a> <span class="bool-val">true</span>,
+<a href=#3553 id=3553 data-nosnippet>3553</a> )
+<a href=#3554 id=3554 data-nosnippet>3554</a> .into(),
+<a href=#3555 id=3555 data-nosnippet>3555</a> }),
+<a href=#3556 id=3556 data-nosnippet>3556</a> );
+<a href=#3557 id=3557 data-nosnippet>3557</a> }
+<a href=#3558 id=3558 data-nosnippet>3558</a>
+<a href=#3559 id=3559 data-nosnippet>3559</a> <span class="attr">#[test]
+<a href=#3560 id=3560 data-nosnippet>3560</a> </span><span class="kw">fn </span>avro_convert_test_record() {
+<a href=#3561 id=3561 data-nosnippet>3561</a> check_convert_with_avro(
+<a href=#3562 id=3562 data-nosnippet>3562</a> Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[
+<a href=#3563 id=3563 data-nosnippet>3563</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3564 id=3564 data-nosnippet>3564</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::String(
+<a href=#3565 id=3565 data-nosnippet>3565</a> <span class="string">"bar"</span>.to_string(),
+<a href=#3566 id=3566 data-nosnippet>3566</a> ))),
+<a href=#3567 id=3567 data-nosnippet>3567</a> <span class="prelude-val">None</span>,
+<a href=#3568 id=3568 data-nosnippet>3568</a> ])),
+<a href=#3569 id=3569 data-nosnippet>3569</a> <span class="kw-2">&</span>Type::Struct(StructType::new(<span class="macro">vec!</span>[
+<a href=#3570 id=3570 data-nosnippet>3570</a> NestedField::required(<span class="number">2</span>, <span class="string">"id"</span>, Type::Primitive(PrimitiveType::Int)).into(),
+<a href=#3571 id=3571 data-nosnippet>3571</a> NestedField::optional(<span class="number">3</span>, <span class="string">"name"</span>, Type::Primitive(PrimitiveType::String)).into(),
+<a href=#3572 id=3572 data-nosnippet>3572</a> NestedField::optional(<span class="number">4</span>, <span class="string">"address"</span>, Type::Primitive(PrimitiveType::String)).into(),
+<a href=#3573 id=3573 data-nosnippet>3573</a> ])),
+<a href=#3574 id=3574 data-nosnippet>3574</a> );
+<a href=#3575 id=3575 data-nosnippet>3575</a> }
+<a href=#3576 id=3576 data-nosnippet>3576</a>
+<a href=#3577 id=3577 data-nosnippet>3577</a> <span class="comment">// # TODO:https://github.com/apache/iceberg-rust/issues/86
+<a href=#3578 id=3578 data-nosnippet>3578</a> // rust avro don't support deserialize any bytes representation now:
+<a href=#3579 id=3579 data-nosnippet>3579</a> // - binary
+<a href=#3580 id=3580 data-nosnippet>3580</a> // - decimal
+<a href=#3581 id=3581 data-nosnippet>3581</a> </span><span class="attr">#[test]
+<a href=#3582 id=3582 data-nosnippet>3582</a> </span><span class="kw">fn </span>avro_convert_test_binary_ser() {
+<a href=#3583 id=3583 data-nosnippet>3583</a> <span class="kw">let </span>literal = Literal::Primitive(PrimitiveLiteral::Binary(<span class="macro">vec!</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]));
+<a href=#3584 id=3584 data-nosnippet>3584</a> <span class="kw">let </span>ty = Type::Primitive(PrimitiveType::Binary);
+<a href=#3585 id=3585 data-nosnippet>3585</a> <span class="kw">let </span>expect_value = Value::Bytes(<span class="macro">vec!</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]);
+<a href=#3586 id=3586 data-nosnippet>3586</a> check_serialize_avro(literal, <span class="kw-2">&</span>ty, expect_value);
+<a href=#3587 id=3587 data-nosnippet>3587</a> }
+<a href=#3588 id=3588 data-nosnippet>3588</a>
+<a href=#3589 id=3589 data-nosnippet>3589</a> <span class="attr">#[test]
+<a href=#3590 id=3590 data-nosnippet>3590</a> </span><span class="kw">fn </span>avro_convert_test_decimal_ser() {
+<a href=#3591 id=3591 data-nosnippet>3591</a> <span class="kw">let </span>literal = Literal::decimal(<span class="number">12345</span>);
+<a href=#3592 id=3592 data-nosnippet>3592</a> <span class="kw">let </span>ty = Type::Primitive(PrimitiveType::Decimal {
+<a href=#3593 id=3593 data-nosnippet>3593</a> precision: <span class="number">9</span>,
+<a href=#3594 id=3594 data-nosnippet>3594</a> scale: <span class="number">8</span>,
+<a href=#3595 id=3595 data-nosnippet>3595</a> });
+<a href=#3596 id=3596 data-nosnippet>3596</a> <span class="kw">let </span>expect_value = Value::Decimal(apache_avro::Decimal::from(<span class="number">12345_i128</span>.to_be_bytes()));
+<a href=#3597 id=3597 data-nosnippet>3597</a> check_serialize_avro(literal, <span class="kw-2">&</span>ty, expect_value);
+<a href=#3598 id=3598 data-nosnippet>3598</a> }
+<a href=#3599 id=3599 data-nosnippet>3599</a>
+<a href=#3600 id=3600 data-nosnippet>3600</a> <span class="comment">// # TODO:https://github.com/apache/iceberg-rust/issues/86
+<a href=#3601 id=3601 data-nosnippet>3601</a> // rust avro can't support to convert any byte-like type to fixed in avro now.
+<a href=#3602 id=3602 data-nosnippet>3602</a> // - uuid ser/de
+<a href=#3603 id=3603 data-nosnippet>3603</a> // - fixed ser/de
+<a href=#3604 id=3604 data-nosnippet>3604</a>
+<a href=#3605 id=3605 data-nosnippet>3605</a> </span><span class="attr">#[test]
+<a href=#3606 id=3606 data-nosnippet>3606</a> </span><span class="kw">fn </span>test_parse_timestamp() {
+<a href=#3607 id=3607 data-nosnippet>3607</a> <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"2021-08-01T01:09:00.0899"</span>).unwrap();
+<a href=#3608 id=3608 data-nosnippet>3608</a> <span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{value}"</span>), <span class="string">"2021-08-01 01:09:00.089900"</span>);
<a href=#3609 id=3609 data-nosnippet>3609</a>
-<a href=#3610 id=3610 data-nosnippet>3610</a> <span class="attr">#[test]
-<a href=#3611 id=3611 data-nosnippet>3611</a> </span><span class="kw">fn </span>test_datum_ser_deser() {
-<a href=#3612 id=3612 data-nosnippet>3612</a> <span class="kw">let </span>test_fn = |datum: Datum| {
-<a href=#3613 id=3613 data-nosnippet>3613</a> <span class="kw">let </span>json = serde_json::to_value(<span class="kw-2">&</span>datum).unwrap();
-<a href=#3614 id=3614 data-nosnippet>3614</a> <span class="kw">let </span>desered_datum: Datum = serde_json::from_value(json).unwrap();
-<a href=#3615 id=3615 data-nosnippet>3615</a> <span class="macro">assert_eq!</span>(datum, desered_datum);
-<a href=#3616 id=3616 data-nosnippet>3616</a> };
-<a href=#3617 id=3617 data-nosnippet>3617</a> <span class="kw">let </span>datum = Datum::int(<span class="number">1</span>);
-<a href=#3618 id=3618 data-nosnippet>3618</a> test_fn(datum);
-<a href=#3619 id=3619 data-nosnippet>3619</a> <span class="kw">let </span>datum = Datum::long(<span class="number">1</span>);
-<a href=#3620 id=3620 data-nosnippet>3620</a> test_fn(datum);
-<a href=#3621 id=3621 data-nosnippet>3621</a>
-<a href=#3622 id=3622 data-nosnippet>3622</a> <span class="kw">let </span>datum = Datum::float(<span class="number">1.0</span>);
-<a href=#3623 id=3623 data-nosnippet>3623</a> test_fn(datum);
-<a href=#3624 id=3624 data-nosnippet>3624</a> <span class="kw">let </span>datum = Datum::float(<span class="number">0_f32</span>);
-<a href=#3625 id=3625 data-nosnippet>3625</a> test_fn(datum);
-<a href=#3626 id=3626 data-nosnippet>3626</a> <span class="kw">let </span>datum = Datum::float(-<span class="number">0_f32</span>);
-<a href=#3627 id=3627 data-nosnippet>3627</a> test_fn(datum);
-<a href=#3628 id=3628 data-nosnippet>3628</a> <span class="kw">let </span>datum = Datum::float(f32::MAX);
-<a href=#3629 id=3629 data-nosnippet>3629</a> test_fn(datum);
-<a href=#3630 id=3630 data-nosnippet>3630</a> <span class="kw">let </span>datum = Datum::float(f32::MIN);
-<a href=#3631 id=3631 data-nosnippet>3631</a> test_fn(datum);
-<a href=#3632 id=3632 data-nosnippet>3632</a>
-<a href=#3633 id=3633 data-nosnippet>3633</a> <span class="comment">// serde_json can't serialize f32::INFINITY, f32::NEG_INFINITY, f32::NAN
-<a href=#3634 id=3634 data-nosnippet>3634</a> </span><span class="kw">let </span>datum = Datum::float(f32::INFINITY);
-<a href=#3635 id=3635 data-nosnippet>3635</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
-<a href=#3636 id=3636 data-nosnippet>3636</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
-<a href=#3637 id=3637 data-nosnippet>3637</a> <span class="kw">let </span>datum = Datum::float(f32::NEG_INFINITY);
-<a href=#3638 id=3638 data-nosnippet>3638</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
-<a href=#3639 id=3639 data-nosnippet>3639</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
-<a href=#3640 id=3640 data-nosnippet>3640</a> <span class="kw">let </span>datum = Datum::float(f32::NAN);
-<a href=#3641 id=3641 data-nosnippet>3641</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
-<a href=#3642 id=3642 data-nosnippet>3642</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
-<a href=#3643 id=3643 data-nosnippet>3643</a>
-<a href=#3644 id=3644 data-nosnippet>3644</a> <span class="kw">let </span>datum = Datum::double(<span class="number">1.0</span>);
-<a href=#3645 id=3645 data-nosnippet>3645</a> test_fn(datum);
-<a href=#3646 id=3646 data-nosnippet>3646</a> <span class="kw">let </span>datum = Datum::double(f64::MAX);
-<a href=#3647 id=3647 data-nosnippet>3647</a> test_fn(datum);
-<a href=#3648 id=3648 data-nosnippet>3648</a> <span class="kw">let </span>datum = Datum::double(f64::MIN);
+<a href=#3610 id=3610 data-nosnippet>3610</a> <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"2023-01-06T00:00:00"</span>).unwrap();
+<a href=#3611 id=3611 data-nosnippet>3611</a> <span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{value}"</span>), <span class="string">"2023-01-06 00:00:00"</span>);
+<a href=#3612 id=3612 data-nosnippet>3612</a>
+<a href=#3613 id=3613 data-nosnippet>3613</a> <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"2021-08-01T01:09:00.0899+0800"</span>);
+<a href=#3614 id=3614 data-nosnippet>3614</a> <span class="macro">assert!</span>(value.is_err(), <span class="string">"Parse timestamp with timezone should fail!"</span>);
+<a href=#3615 id=3615 data-nosnippet>3615</a>
+<a href=#3616 id=3616 data-nosnippet>3616</a> <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"dfa"</span>);
+<a href=#3617 id=3617 data-nosnippet>3617</a> <span class="macro">assert!</span>(
+<a href=#3618 id=3618 data-nosnippet>3618</a> value.is_err(),
+<a href=#3619 id=3619 data-nosnippet>3619</a> <span class="string">"Parse timestamp with invalid input should fail!"
+<a href=#3620 id=3620 data-nosnippet>3620</a> </span>);
+<a href=#3621 id=3621 data-nosnippet>3621</a> }
+<a href=#3622 id=3622 data-nosnippet>3622</a>
+<a href=#3623 id=3623 data-nosnippet>3623</a> <span class="attr">#[test]
+<a href=#3624 id=3624 data-nosnippet>3624</a> </span><span class="kw">fn </span>test_parse_timestamptz() {
+<a href=#3625 id=3625 data-nosnippet>3625</a> <span class="kw">let </span>value = Datum::timestamptz_from_str(<span class="string">"2021-08-01T09:09:00.0899+0800"</span>).unwrap();
+<a href=#3626 id=3626 data-nosnippet>3626</a> <span class="macro">assert_eq!</span>(<span class="kw-2">&</span><span class="macro">format!</span>(<span class="string">"{value}"</span>), <span class="string">"2021-08-01 01:09:00.089900 UTC"</span>);
+<a href=#3627 id=3627 data-nosnippet>3627</a>
+<a href=#3628 id=3628 data-nosnippet>3628</a> <span class="kw">let </span>value = Datum::timestamptz_from_str(<span class="string">"2021-08-01T01:09:00.0899"</span>);
+<a href=#3629 id=3629 data-nosnippet>3629</a> <span class="macro">assert!</span>(
+<a href=#3630 id=3630 data-nosnippet>3630</a> value.is_err(),
+<a href=#3631 id=3631 data-nosnippet>3631</a> <span class="string">"Parse timestamptz without timezone should fail!"
+<a href=#3632 id=3632 data-nosnippet>3632</a> </span>);
+<a href=#3633 id=3633 data-nosnippet>3633</a>
+<a href=#3634 id=3634 data-nosnippet>3634</a> <span class="kw">let </span>value = Datum::timestamptz_from_str(<span class="string">"dfa"</span>);
+<a href=#3635 id=3635 data-nosnippet>3635</a> <span class="macro">assert!</span>(
+<a href=#3636 id=3636 data-nosnippet>3636</a> value.is_err(),
+<a href=#3637 id=3637 data-nosnippet>3637</a> <span class="string">"Parse timestamptz with invalid input should fail!"
+<a href=#3638 id=3638 data-nosnippet>3638</a> </span>);
+<a href=#3639 id=3639 data-nosnippet>3639</a> }
+<a href=#3640 id=3640 data-nosnippet>3640</a>
+<a href=#3641 id=3641 data-nosnippet>3641</a> <span class="attr">#[test]
+<a href=#3642 id=3642 data-nosnippet>3642</a> </span><span class="kw">fn </span>test_datum_ser_deser() {
+<a href=#3643 id=3643 data-nosnippet>3643</a> <span class="kw">let </span>test_fn = |datum: Datum| {
+<a href=#3644 id=3644 data-nosnippet>3644</a> <span class="kw">let </span>json = serde_json::to_value(<span class="kw-2">&</span>datum).unwrap();
+<a href=#3645 id=3645 data-nosnippet>3645</a> <span class="kw">let </span>desered_datum: Datum = serde_json::from_value(json).unwrap();
+<a href=#3646 id=3646 data-nosnippet>3646</a> <span class="macro">assert_eq!</span>(datum, desered_datum);
+<a href=#3647 id=3647 data-nosnippet>3647</a> };
+<a href=#3648 id=3648 data-nosnippet>3648</a> <span class="kw">let </span>datum = Datum::int(<span class="number">1</span>);
<a href=#3649 id=3649 data-nosnippet>3649</a> test_fn(datum);
-<a href=#3650 id=3650 data-nosnippet>3650</a>
-<a href=#3651 id=3651 data-nosnippet>3651</a> <span class="comment">// serde_json can't serialize f32::INFINITY, f32::NEG_INFINITY, f32::NAN
-<a href=#3652 id=3652 data-nosnippet>3652</a> </span><span class="kw">let </span>datum = Datum::double(f64::INFINITY);
-<a href=#3653 id=3653 data-nosnippet>3653</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
-<a href=#3654 id=3654 data-nosnippet>3654</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
-<a href=#3655 id=3655 data-nosnippet>3655</a> <span class="kw">let </span>datum = Datum::double(f64::NEG_INFINITY);
-<a href=#3656 id=3656 data-nosnippet>3656</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
-<a href=#3657 id=3657 data-nosnippet>3657</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
-<a href=#3658 id=3658 data-nosnippet>3658</a> <span class="kw">let </span>datum = Datum::double(f64::NAN);
-<a href=#3659 id=3659 data-nosnippet>3659</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
-<a href=#3660 id=3660 data-nosnippet>3660</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
-<a href=#3661 id=3661 data-nosnippet>3661</a>
-<a href=#3662 id=3662 data-nosnippet>3662</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"iceberg"</span>);
-<a href=#3663 id=3663 data-nosnippet>3663</a> test_fn(datum);
-<a href=#3664 id=3664 data-nosnippet>3664</a> <span class="kw">let </span>datum = Datum::bool(<span class="bool-val">true</span>);
-<a href=#3665 id=3665 data-nosnippet>3665</a> test_fn(datum);
-<a href=#3666 id=3666 data-nosnippet>3666</a> <span class="kw">let </span>datum = Datum::date(<span class="number">17486</span>);
-<a href=#3667 id=3667 data-nosnippet>3667</a> test_fn(datum);
-<a href=#3668 id=3668 data-nosnippet>3668</a> <span class="kw">let </span>datum = Datum::time_from_hms_micro(<span class="number">22</span>, <span class="number">15</span>, <span class="number">33</span>, <span class="number">111</span>).unwrap();
-<a href=#3669 id=3669 data-nosnippet>3669</a> test_fn(datum);
-<a href=#3670 id=3670 data-nosnippet>3670</a> <span class="kw">let </span>datum = Datum::timestamp_micros(<span class="number">1510871468123456</span>);
-<a href=#3671 id=3671 data-nosnippet>3671</a> test_fn(datum);
-<a href=#3672 id=3672 data-nosnippet>3672</a> <span class="kw">let </span>datum = Datum::timestamptz_micros(<span class="number">1510871468123456</span>);
-<a href=#3673 id=3673 data-nosnippet>3673</a> test_fn(datum);
-<a href=#3674 id=3674 data-nosnippet>3674</a> <span class="kw">let </span>datum = Datum::uuid(Uuid::parse_str(<span class="string">"f79c3e09-677c-4bbd-a479-3f349cb785e7"</span>).unwrap());
-<a href=#3675 id=3675 data-nosnippet>3675</a> test_fn(datum);
-<a href=#3676 id=3676 data-nosnippet>3676</a> <span class="kw">let </span>datum = Datum::decimal(<span class="number">1420</span>).unwrap();
-<a href=#3677 id=3677 data-nosnippet>3677</a> test_fn(datum);
-<a href=#3678 id=3678 data-nosnippet>3678</a> <span class="kw">let </span>datum = Datum::binary(<span class="macro">vec!</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]);
-<a href=#3679 id=3679 data-nosnippet>3679</a> test_fn(datum);
-<a href=#3680 id=3680 data-nosnippet>3680</a> <span class="kw">let </span>datum = Datum::fixed(<span class="macro">vec!</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]);
-<a href=#3681 id=3681 data-nosnippet>3681</a> test_fn(datum);
-<a href=#3682 id=3682 data-nosnippet>3682</a> }
-<a href=#3683 id=3683 data-nosnippet>3683</a>
-<a href=#3684 id=3684 data-nosnippet>3684</a> <span class="attr">#[test]
-<a href=#3685 id=3685 data-nosnippet>3685</a> </span><span class="kw">fn </span>test_datum_date_convert_to_int() {
-<a href=#3686 id=3686 data-nosnippet>3686</a> <span class="kw">let </span>datum_date = Datum::date(<span class="number">12345</span>);
-<a href=#3687 id=3687 data-nosnippet>3687</a>
-<a href=#3688 id=3688 data-nosnippet>3688</a> <span class="kw">let </span>result = datum_date.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
-<a href=#3689 id=3689 data-nosnippet>3689</a>
-<a href=#3690 id=3690 data-nosnippet>3690</a> <span class="kw">let </span>expected = Datum::int(<span class="number">12345</span>);
-<a href=#3691 id=3691 data-nosnippet>3691</a>
-<a href=#3692 id=3692 data-nosnippet>3692</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3693 id=3693 data-nosnippet>3693</a> }
-<a href=#3694 id=3694 data-nosnippet>3694</a>
-<a href=#3695 id=3695 data-nosnippet>3695</a> <span class="attr">#[test]
-<a href=#3696 id=3696 data-nosnippet>3696</a> </span><span class="kw">fn </span>test_datum_int_convert_to_date() {
-<a href=#3697 id=3697 data-nosnippet>3697</a> <span class="kw">let </span>datum_int = Datum::int(<span class="number">12345</span>);
-<a href=#3698 id=3698 data-nosnippet>3698</a>
-<a href=#3699 id=3699 data-nosnippet>3699</a> <span class="kw">let </span>result = datum_int.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Date)).unwrap();
-<a href=#3700 id=3700 data-nosnippet>3700</a>
-<a href=#3701 id=3701 data-nosnippet>3701</a> <span class="kw">let </span>expected = Datum::date(<span class="number">12345</span>);
-<a href=#3702 id=3702 data-nosnippet>3702</a>
-<a href=#3703 id=3703 data-nosnippet>3703</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3704 id=3704 data-nosnippet>3704</a> }
-<a href=#3705 id=3705 data-nosnippet>3705</a>
-<a href=#3706 id=3706 data-nosnippet>3706</a> <span class="attr">#[test]
-<a href=#3707 id=3707 data-nosnippet>3707</a> </span><span class="kw">fn </span>test_datum_long_convert_to_int() {
-<a href=#3708 id=3708 data-nosnippet>3708</a> <span class="kw">let </span>datum = Datum::long(<span class="number">12345</span>);
-<a href=#3709 id=3709 data-nosnippet>3709</a>
-<a href=#3710 id=3710 data-nosnippet>3710</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
-<a href=#3711 id=3711 data-nosnippet>3711</a>
-<a href=#3712 id=3712 data-nosnippet>3712</a> <span class="kw">let </span>expected = Datum::int(<span class="number">12345</span>);
-<a href=#3713 id=3713 data-nosnippet>3713</a>
-<a href=#3714 id=3714 data-nosnippet>3714</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3715 id=3715 data-nosnippet>3715</a> }
-<a href=#3716 id=3716 data-nosnippet>3716</a>
-<a href=#3717 id=3717 data-nosnippet>3717</a> <span class="attr">#[test]
-<a href=#3718 id=3718 data-nosnippet>3718</a> </span><span class="kw">fn </span>test_datum_long_convert_to_int_above_max() {
-<a href=#3719 id=3719 data-nosnippet>3719</a> <span class="kw">let </span>datum = Datum::long(INT_MAX <span class="kw">as </span>i64 + <span class="number">1</span>);
+<a href=#3650 id=3650 data-nosnippet>3650</a> <span class="kw">let </span>datum = Datum::long(<span class="number">1</span>);
+<a href=#3651 id=3651 data-nosnippet>3651</a> test_fn(datum);
+<a href=#3652 id=3652 data-nosnippet>3652</a>
+<a href=#3653 id=3653 data-nosnippet>3653</a> <span class="kw">let </span>datum = Datum::float(<span class="number">1.0</span>);
+<a href=#3654 id=3654 data-nosnippet>3654</a> test_fn(datum);
+<a href=#3655 id=3655 data-nosnippet>3655</a> <span class="kw">let </span>datum = Datum::float(<span class="number">0_f32</span>);
+<a href=#3656 id=3656 data-nosnippet>3656</a> test_fn(datum);
+<a href=#3657 id=3657 data-nosnippet>3657</a> <span class="kw">let </span>datum = Datum::float(-<span class="number">0_f32</span>);
+<a href=#3658 id=3658 data-nosnippet>3658</a> test_fn(datum);
+<a href=#3659 id=3659 data-nosnippet>3659</a> <span class="kw">let </span>datum = Datum::float(f32::MAX);
+<a href=#3660 id=3660 data-nosnippet>3660</a> test_fn(datum);
+<a href=#3661 id=3661 data-nosnippet>3661</a> <span class="kw">let </span>datum = Datum::float(f32::MIN);
+<a href=#3662 id=3662 data-nosnippet>3662</a> test_fn(datum);
+<a href=#3663 id=3663 data-nosnippet>3663</a>
+<a href=#3664 id=3664 data-nosnippet>3664</a> <span class="comment">// serde_json can't serialize f32::INFINITY, f32::NEG_INFINITY, f32::NAN
+<a href=#3665 id=3665 data-nosnippet>3665</a> </span><span class="kw">let </span>datum = Datum::float(f32::INFINITY);
+<a href=#3666 id=3666 data-nosnippet>3666</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
+<a href=#3667 id=3667 data-nosnippet>3667</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
+<a href=#3668 id=3668 data-nosnippet>3668</a> <span class="kw">let </span>datum = Datum::float(f32::NEG_INFINITY);
+<a href=#3669 id=3669 data-nosnippet>3669</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
+<a href=#3670 id=3670 data-nosnippet>3670</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
+<a href=#3671 id=3671 data-nosnippet>3671</a> <span class="kw">let </span>datum = Datum::float(f32::NAN);
+<a href=#3672 id=3672 data-nosnippet>3672</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
+<a href=#3673 id=3673 data-nosnippet>3673</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
+<a href=#3674 id=3674 data-nosnippet>3674</a>
+<a href=#3675 id=3675 data-nosnippet>3675</a> <span class="kw">let </span>datum = Datum::double(<span class="number">1.0</span>);
+<a href=#3676 id=3676 data-nosnippet>3676</a> test_fn(datum);
+<a href=#3677 id=3677 data-nosnippet>3677</a> <span class="kw">let </span>datum = Datum::double(f64::MAX);
+<a href=#3678 id=3678 data-nosnippet>3678</a> test_fn(datum);
+<a href=#3679 id=3679 data-nosnippet>3679</a> <span class="kw">let </span>datum = Datum::double(f64::MIN);
+<a href=#3680 id=3680 data-nosnippet>3680</a> test_fn(datum);
+<a href=#3681 id=3681 data-nosnippet>3681</a>
+<a href=#3682 id=3682 data-nosnippet>3682</a> <span class="comment">// serde_json can't serialize f32::INFINITY, f32::NEG_INFINITY, f32::NAN
+<a href=#3683 id=3683 data-nosnippet>3683</a> </span><span class="kw">let </span>datum = Datum::double(f64::INFINITY);
+<a href=#3684 id=3684 data-nosnippet>3684</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
+<a href=#3685 id=3685 data-nosnippet>3685</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
+<a href=#3686 id=3686 data-nosnippet>3686</a> <span class="kw">let </span>datum = Datum::double(f64::NEG_INFINITY);
+<a href=#3687 id=3687 data-nosnippet>3687</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
+<a href=#3688 id=3688 data-nosnippet>3688</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
+<a href=#3689 id=3689 data-nosnippet>3689</a> <span class="kw">let </span>datum = Datum::double(f64::NAN);
+<a href=#3690 id=3690 data-nosnippet>3690</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
+<a href=#3691 id=3691 data-nosnippet>3691</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
+<a href=#3692 id=3692 data-nosnippet>3692</a>
+<a href=#3693 id=3693 data-nosnippet>3693</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"iceberg"</span>);
+<a href=#3694 id=3694 data-nosnippet>3694</a> test_fn(datum);
+<a href=#3695 id=3695 data-nosnippet>3695</a> <span class="kw">let </span>datum = Datum::bool(<span class="bool-val">true</span>);
+<a href=#3696 id=3696 data-nosnippet>3696</a> test_fn(datum);
+<a href=#3697 id=3697 data-nosnippet>3697</a> <span class="kw">let </span>datum = Datum::date(<span class="number">17486</span>);
+<a href=#3698 id=3698 data-nosnippet>3698</a> test_fn(datum);
+<a href=#3699 id=3699 data-nosnippet>3699</a> <span class="kw">let </span>datum = Datum::time_from_hms_micro(<span class="number">22</span>, <span class="number">15</span>, <span class="number">33</span>, <span class="number">111</span>).unwrap();
+<a href=#3700 id=3700 data-nosnippet>3700</a> test_fn(datum);
+<a href=#3701 id=3701 data-nosnippet>3701</a> <span class="kw">let </span>datum = Datum::timestamp_micros(<span class="number">1510871468123456</span>);
+<a href=#3702 id=3702 data-nosnippet>3702</a> test_fn(datum);
+<a href=#3703 id=3703 data-nosnippet>3703</a> <span class="kw">let </span>datum = Datum::timestamptz_micros(<span class="number">1510871468123456</span>);
+<a href=#3704 id=3704 data-nosnippet>3704</a> test_fn(datum);
+<a href=#3705 id=3705 data-nosnippet>3705</a> <span class="kw">let </span>datum = Datum::uuid(Uuid::parse_str(<span class="string">"f79c3e09-677c-4bbd-a479-3f349cb785e7"</span>).unwrap());
+<a href=#3706 id=3706 data-nosnippet>3706</a> test_fn(datum);
+<a href=#3707 id=3707 data-nosnippet>3707</a> <span class="kw">let </span>datum = Datum::decimal(<span class="number">1420</span>).unwrap();
+<a href=#3708 id=3708 data-nosnippet>3708</a> test_fn(datum);
+<a href=#3709 id=3709 data-nosnippet>3709</a> <span class="kw">let </span>datum = Datum::binary(<span class="macro">vec!</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]);
+<a href=#3710 id=3710 data-nosnippet>3710</a> test_fn(datum);
+<a href=#3711 id=3711 data-nosnippet>3711</a> <span class="kw">let </span>datum = Datum::fixed(<span class="macro">vec!</span>[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]);
+<a href=#3712 id=3712 data-nosnippet>3712</a> test_fn(datum);
+<a href=#3713 id=3713 data-nosnippet>3713</a> }
+<a href=#3714 id=3714 data-nosnippet>3714</a>
+<a href=#3715 id=3715 data-nosnippet>3715</a> <span class="attr">#[test]
+<a href=#3716 id=3716 data-nosnippet>3716</a> </span><span class="kw">fn </span>test_datum_date_convert_to_int() {
+<a href=#3717 id=3717 data-nosnippet>3717</a> <span class="kw">let </span>datum_date = Datum::date(<span class="number">12345</span>);
+<a href=#3718 id=3718 data-nosnippet>3718</a>
+<a href=#3719 id=3719 data-nosnippet>3719</a> <span class="kw">let </span>result = datum_date.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
<a href=#3720 id=3720 data-nosnippet>3720</a>
-<a href=#3721 id=3721 data-nosnippet>3721</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
+<a href=#3721 id=3721 data-nosnippet>3721</a> <span class="kw">let </span>expected = Datum::int(<span class="number">12345</span>);
<a href=#3722 id=3722 data-nosnippet>3722</a>
-<a href=#3723 id=3723 data-nosnippet>3723</a> <span class="kw">let </span>expected = Datum::new(PrimitiveType::Int, PrimitiveLiteral::AboveMax);
-<a href=#3724 id=3724 data-nosnippet>3724</a>
-<a href=#3725 id=3725 data-nosnippet>3725</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3726 id=3726 data-nosnippet>3726</a> }
-<a href=#3727 id=3727 data-nosnippet>3727</a>
-<a href=#3728 id=3728 data-nosnippet>3728</a> <span class="attr">#[test]
-<a href=#3729 id=3729 data-nosnippet>3729</a> </span><span class="kw">fn </span>test_datum_long_convert_to_int_below_min() {
-<a href=#3730 id=3730 data-nosnippet>3730</a> <span class="kw">let </span>datum = Datum::long(INT_MIN <span class="kw">as </span>i64 - <span class="number">1</span>);
+<a href=#3723 id=3723 data-nosnippet>3723</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#3724 id=3724 data-nosnippet>3724</a> }
+<a href=#3725 id=3725 data-nosnippet>3725</a>
+<a href=#3726 id=3726 data-nosnippet>3726</a> <span class="attr">#[test]
+<a href=#3727 id=3727 data-nosnippet>3727</a> </span><span class="kw">fn </span>test_datum_int_convert_to_date() {
+<a href=#3728 id=3728 data-nosnippet>3728</a> <span class="kw">let </span>datum_int = Datum::int(<span class="number">12345</span>);
+<a href=#3729 id=3729 data-nosnippet>3729</a>
+<a href=#3730 id=3730 data-nosnippet>3730</a> <span class="kw">let </span>result = datum_int.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Date)).unwrap();
<a href=#3731 id=3731 data-nosnippet>3731</a>
-<a href=#3732 id=3732 data-nosnippet>3732</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
+<a href=#3732 id=3732 data-nosnippet>3732</a> <span class="kw">let </span>expected = Datum::date(<span class="number">12345</span>);
<a href=#3733 id=3733 data-nosnippet>3733</a>
-<a href=#3734 id=3734 data-nosnippet>3734</a> <span class="kw">let </span>expected = Datum::new(PrimitiveType::Int, PrimitiveLiteral::BelowMin);
-<a href=#3735 id=3735 data-nosnippet>3735</a>
-<a href=#3736 id=3736 data-nosnippet>3736</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3737 id=3737 data-nosnippet>3737</a> }
-<a href=#3738 id=3738 data-nosnippet>3738</a>
-<a href=#3739 id=3739 data-nosnippet>3739</a> <span class="attr">#[test]
-<a href=#3740 id=3740 data-nosnippet>3740</a> </span><span class="kw">fn </span>test_datum_long_convert_to_timestamp() {
-<a href=#3741 id=3741 data-nosnippet>3741</a> <span class="kw">let </span>datum = Datum::long(<span class="number">12345</span>);
+<a href=#3734 id=3734 data-nosnippet>3734</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#3735 id=3735 data-nosnippet>3735</a> }
+<a href=#3736 id=3736 data-nosnippet>3736</a>
+<a href=#3737 id=3737 data-nosnippet>3737</a> <span class="attr">#[test]
+<a href=#3738 id=3738 data-nosnippet>3738</a> </span><span class="kw">fn </span>test_datum_long_convert_to_int() {
+<a href=#3739 id=3739 data-nosnippet>3739</a> <span class="kw">let </span>datum = Datum::long(<span class="number">12345</span>);
+<a href=#3740 id=3740 data-nosnippet>3740</a>
+<a href=#3741 id=3741 data-nosnippet>3741</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
<a href=#3742 id=3742 data-nosnippet>3742</a>
-<a href=#3743 id=3743 data-nosnippet>3743</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Timestamp)).unwrap();
+<a href=#3743 id=3743 data-nosnippet>3743</a> <span class="kw">let </span>expected = Datum::int(<span class="number">12345</span>);
<a href=#3744 id=3744 data-nosnippet>3744</a>
-<a href=#3745 id=3745 data-nosnippet>3745</a> <span class="kw">let </span>expected = Datum::timestamp_micros(<span class="number">12345</span>);
-<a href=#3746 id=3746 data-nosnippet>3746</a>
-<a href=#3747 id=3747 data-nosnippet>3747</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3748 id=3748 data-nosnippet>3748</a> }
-<a href=#3749 id=3749 data-nosnippet>3749</a>
-<a href=#3750 id=3750 data-nosnippet>3750</a> <span class="attr">#[test]
-<a href=#3751 id=3751 data-nosnippet>3751</a> </span><span class="kw">fn </span>test_datum_long_convert_to_timestamptz() {
-<a href=#3752 id=3752 data-nosnippet>3752</a> <span class="kw">let </span>datum = Datum::long(<span class="number">12345</span>);
+<a href=#3745 id=3745 data-nosnippet>3745</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#3746 id=3746 data-nosnippet>3746</a> }
+<a href=#3747 id=3747 data-nosnippet>3747</a>
+<a href=#3748 id=3748 data-nosnippet>3748</a> <span class="attr">#[test]
+<a href=#3749 id=3749 data-nosnippet>3749</a> </span><span class="kw">fn </span>test_datum_long_convert_to_int_above_max() {
+<a href=#3750 id=3750 data-nosnippet>3750</a> <span class="kw">let </span>datum = Datum::long(INT_MAX <span class="kw">as </span>i64 + <span class="number">1</span>);
+<a href=#3751 id=3751 data-nosnippet>3751</a>
+<a href=#3752 id=3752 data-nosnippet>3752</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
<a href=#3753 id=3753 data-nosnippet>3753</a>
-<a href=#3754 id=3754 data-nosnippet>3754</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Timestamptz)).unwrap();
+<a href=#3754 id=3754 data-nosnippet>3754</a> <span class="kw">let </span>expected = Datum::new(PrimitiveType::Int, PrimitiveLiteral::AboveMax);
<a href=#3755 id=3755 data-nosnippet>3755</a>
-<a href=#3756 id=3756 data-nosnippet>3756</a> <span class="kw">let </span>expected = Datum::timestamptz_micros(<span class="number">12345</span>);
-<a href=#3757 id=3757 data-nosnippet>3757</a>
-<a href=#3758 id=3758 data-nosnippet>3758</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3759 id=3759 data-nosnippet>3759</a> }
-<a href=#3760 id=3760 data-nosnippet>3760</a>
-<a href=#3761 id=3761 data-nosnippet>3761</a> <span class="attr">#[test]
-<a href=#3762 id=3762 data-nosnippet>3762</a> </span><span class="kw">fn </span>test_datum_decimal_convert_to_long() {
-<a href=#3763 id=3763 data-nosnippet>3763</a> <span class="kw">let </span>datum = Datum::decimal(<span class="number">12345</span>).unwrap();
+<a href=#3756 id=3756 data-nosnippet>3756</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#3757 id=3757 data-nosnippet>3757</a> }
+<a href=#3758 id=3758 data-nosnippet>3758</a>
+<a href=#3759 id=3759 data-nosnippet>3759</a> <span class="attr">#[test]
+<a href=#3760 id=3760 data-nosnippet>3760</a> </span><span class="kw">fn </span>test_datum_long_convert_to_int_below_min() {
+<a href=#3761 id=3761 data-nosnippet>3761</a> <span class="kw">let </span>datum = Datum::long(INT_MIN <span class="kw">as </span>i64 - <span class="number">1</span>);
+<a href=#3762 id=3762 data-nosnippet>3762</a>
+<a href=#3763 id=3763 data-nosnippet>3763</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
<a href=#3764 id=3764 data-nosnippet>3764</a>
-<a href=#3765 id=3765 data-nosnippet>3765</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Long)).unwrap();
+<a href=#3765 id=3765 data-nosnippet>3765</a> <span class="kw">let </span>expected = Datum::new(PrimitiveType::Int, PrimitiveLiteral::BelowMin);
<a href=#3766 id=3766 data-nosnippet>3766</a>
-<a href=#3767 id=3767 data-nosnippet>3767</a> <span class="kw">let </span>expected = Datum::long(<span class="number">12345</span>);
-<a href=#3768 id=3768 data-nosnippet>3768</a>
-<a href=#3769 id=3769 data-nosnippet>3769</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3770 id=3770 data-nosnippet>3770</a> }
-<a href=#3771 id=3771 data-nosnippet>3771</a>
-<a href=#3772 id=3772 data-nosnippet>3772</a> <span class="attr">#[test]
-<a href=#3773 id=3773 data-nosnippet>3773</a> </span><span class="kw">fn </span>test_datum_decimal_convert_to_long_above_max() {
-<a href=#3774 id=3774 data-nosnippet>3774</a> <span class="kw">let </span>datum = Datum::decimal(LONG_MAX <span class="kw">as </span>i128 + <span class="number">1</span>).unwrap();
+<a href=#3767 id=3767 data-nosnippet>3767</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#3768 id=3768 data-nosnippet>3768</a> }
+<a href=#3769 id=3769 data-nosnippet>3769</a>
+<a href=#3770 id=3770 data-nosnippet>3770</a> <span class="attr">#[test]
+<a href=#3771 id=3771 data-nosnippet>3771</a> </span><span class="kw">fn </span>test_datum_long_convert_to_timestamp() {
+<a href=#3772 id=3772 data-nosnippet>3772</a> <span class="kw">let </span>datum = Datum::long(<span class="number">12345</span>);
+<a href=#3773 id=3773 data-nosnippet>3773</a>
+<a href=#3774 id=3774 data-nosnippet>3774</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Timestamp)).unwrap();
<a href=#3775 id=3775 data-nosnippet>3775</a>
-<a href=#3776 id=3776 data-nosnippet>3776</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Long)).unwrap();
+<a href=#3776 id=3776 data-nosnippet>3776</a> <span class="kw">let </span>expected = Datum::timestamp_micros(<span class="number">12345</span>);
<a href=#3777 id=3777 data-nosnippet>3777</a>
-<a href=#3778 id=3778 data-nosnippet>3778</a> <span class="kw">let </span>expected = Datum::new(PrimitiveType::Long, PrimitiveLiteral::AboveMax);
-<a href=#3779 id=3779 data-nosnippet>3779</a>
-<a href=#3780 id=3780 data-nosnippet>3780</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3781 id=3781 data-nosnippet>3781</a> }
-<a href=#3782 id=3782 data-nosnippet>3782</a>
-<a href=#3783 id=3783 data-nosnippet>3783</a> <span class="attr">#[test]
-<a href=#3784 id=3784 data-nosnippet>3784</a> </span><span class="kw">fn </span>test_datum_decimal_convert_to_long_below_min() {
-<a href=#3785 id=3785 data-nosnippet>3785</a> <span class="kw">let </span>datum = Datum::decimal(LONG_MIN <span class="kw">as </span>i128 - <span class="number">1</span>).unwrap();
+<a href=#3778 id=3778 data-nosnippet>3778</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#3779 id=3779 data-nosnippet>3779</a> }
+<a href=#3780 id=3780 data-nosnippet>3780</a>
+<a href=#3781 id=3781 data-nosnippet>3781</a> <span class="attr">#[test]
+<a href=#3782 id=3782 data-nosnippet>3782</a> </span><span class="kw">fn </span>test_datum_long_convert_to_timestamptz() {
+<a href=#3783 id=3783 data-nosnippet>3783</a> <span class="kw">let </span>datum = Datum::long(<span class="number">12345</span>);
+<a href=#3784 id=3784 data-nosnippet>3784</a>
+<a href=#3785 id=3785 data-nosnippet>3785</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Timestamptz)).unwrap();
<a href=#3786 id=3786 data-nosnippet>3786</a>
-<a href=#3787 id=3787 data-nosnippet>3787</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Long)).unwrap();
+<a href=#3787 id=3787 data-nosnippet>3787</a> <span class="kw">let </span>expected = Datum::timestamptz_micros(<span class="number">12345</span>);
<a href=#3788 id=3788 data-nosnippet>3788</a>
-<a href=#3789 id=3789 data-nosnippet>3789</a> <span class="kw">let </span>expected = Datum::new(PrimitiveType::Long, PrimitiveLiteral::BelowMin);
-<a href=#3790 id=3790 data-nosnippet>3790</a>
-<a href=#3791 id=3791 data-nosnippet>3791</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3792 id=3792 data-nosnippet>3792</a> }
-<a href=#3793 id=3793 data-nosnippet>3793</a>
-<a href=#3794 id=3794 data-nosnippet>3794</a> <span class="attr">#[test]
-<a href=#3795 id=3795 data-nosnippet>3795</a> </span><span class="kw">fn </span>test_datum_string_convert_to_boolean() {
-<a href=#3796 id=3796 data-nosnippet>3796</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"true"</span>);
+<a href=#3789 id=3789 data-nosnippet>3789</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#3790 id=3790 data-nosnippet>3790</a> }
+<a href=#3791 id=3791 data-nosnippet>3791</a>
+<a href=#3792 id=3792 data-nosnippet>3792</a> <span class="attr">#[test]
+<a href=#3793 id=3793 data-nosnippet>3793</a> </span><span class="kw">fn </span>test_datum_decimal_convert_to_long() {
+<a href=#3794 id=3794 data-nosnippet>3794</a> <span class="kw">let </span>datum = Datum::decimal(<span class="number">12345</span>).unwrap();
+<a href=#3795 id=3795 data-nosnippet>3795</a>
+<a href=#3796 id=3796 data-nosnippet>3796</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Long)).unwrap();
<a href=#3797 id=3797 data-nosnippet>3797</a>
-<a href=#3798 id=3798 data-nosnippet>3798</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Boolean)).unwrap();
+<a href=#3798 id=3798 data-nosnippet>3798</a> <span class="kw">let </span>expected = Datum::long(<span class="number">12345</span>);
<a href=#3799 id=3799 data-nosnippet>3799</a>
-<a href=#3800 id=3800 data-nosnippet>3800</a> <span class="kw">let </span>expected = Datum::bool(<span class="bool-val">true</span>);
-<a href=#3801 id=3801 data-nosnippet>3801</a>
-<a href=#3802 id=3802 data-nosnippet>3802</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3803 id=3803 data-nosnippet>3803</a> }
-<a href=#3804 id=3804 data-nosnippet>3804</a>
-<a href=#3805 id=3805 data-nosnippet>3805</a> <span class="attr">#[test]
-<a href=#3806 id=3806 data-nosnippet>3806</a> </span><span class="kw">fn </span>test_datum_string_convert_to_int() {
-<a href=#3807 id=3807 data-nosnippet>3807</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"12345"</span>);
+<a href=#3800 id=3800 data-nosnippet>3800</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#3801 id=3801 data-nosnippet>3801</a> }
+<a href=#3802 id=3802 data-nosnippet>3802</a>
+<a href=#3803 id=3803 data-nosnippet>3803</a> <span class="attr">#[test]
+<a href=#3804 id=3804 data-nosnippet>3804</a> </span><span class="kw">fn </span>test_datum_decimal_convert_to_long_above_max() {
+<a href=#3805 id=3805 data-nosnippet>3805</a> <span class="kw">let </span>datum = Datum::decimal(LONG_MAX <span class="kw">as </span>i128 + <span class="number">1</span>).unwrap();
+<a href=#3806 id=3806 data-nosnippet>3806</a>
+<a href=#3807 id=3807 data-nosnippet>3807</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Long)).unwrap();
<a href=#3808 id=3808 data-nosnippet>3808</a>
-<a href=#3809 id=3809 data-nosnippet>3809</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
+<a href=#3809 id=3809 data-nosnippet>3809</a> <span class="kw">let </span>expected = Datum::new(PrimitiveType::Long, PrimitiveLiteral::AboveMax);
<a href=#3810 id=3810 data-nosnippet>3810</a>
-<a href=#3811 id=3811 data-nosnippet>3811</a> <span class="kw">let </span>expected = Datum::int(<span class="number">12345</span>);
-<a href=#3812 id=3812 data-nosnippet>3812</a>
-<a href=#3813 id=3813 data-nosnippet>3813</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3814 id=3814 data-nosnippet>3814</a> }
-<a href=#3815 id=3815 data-nosnippet>3815</a>
-<a href=#3816 id=3816 data-nosnippet>3816</a> <span class="attr">#[test]
-<a href=#3817 id=3817 data-nosnippet>3817</a> </span><span class="kw">fn </span>test_datum_string_convert_to_long() {
-<a href=#3818 id=3818 data-nosnippet>3818</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"12345"</span>);
+<a href=#3811 id=3811 data-nosnippet>3811</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#3812 id=3812 data-nosnippet>3812</a> }
+<a href=#3813 id=3813 data-nosnippet>3813</a>
+<a href=#3814 id=3814 data-nosnippet>3814</a> <span class="attr">#[test]
+<a href=#3815 id=3815 data-nosnippet>3815</a> </span><span class="kw">fn </span>test_datum_decimal_convert_to_long_below_min() {
+<a href=#3816 id=3816 data-nosnippet>3816</a> <span class="kw">let </span>datum = Datum::decimal(LONG_MIN <span class="kw">as </span>i128 - <span class="number">1</span>).unwrap();
+<a href=#3817 id=3817 data-nosnippet>3817</a>
+<a href=#3818 id=3818 data-nosnippet>3818</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Long)).unwrap();
<a href=#3819 id=3819 data-nosnippet>3819</a>
-<a href=#3820 id=3820 data-nosnippet>3820</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Long)).unwrap();
+<a href=#3820 id=3820 data-nosnippet>3820</a> <span class="kw">let </span>expected = Datum::new(PrimitiveType::Long, PrimitiveLiteral::BelowMin);
<a href=#3821 id=3821 data-nosnippet>3821</a>
-<a href=#3822 id=3822 data-nosnippet>3822</a> <span class="kw">let </span>expected = Datum::long(<span class="number">12345</span>);
-<a href=#3823 id=3823 data-nosnippet>3823</a>
-<a href=#3824 id=3824 data-nosnippet>3824</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3825 id=3825 data-nosnippet>3825</a> }
-<a href=#3826 id=3826 data-nosnippet>3826</a>
-<a href=#3827 id=3827 data-nosnippet>3827</a> <span class="attr">#[test]
-<a href=#3828 id=3828 data-nosnippet>3828</a> </span><span class="kw">fn </span>test_datum_string_convert_to_timestamp() {
-<a href=#3829 id=3829 data-nosnippet>3829</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"1925-05-20T19:25:00.000"</span>);
+<a href=#3822 id=3822 data-nosnippet>3822</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#3823 id=3823 data-nosnippet>3823</a> }
+<a href=#3824 id=3824 data-nosnippet>3824</a>
+<a href=#3825 id=3825 data-nosnippet>3825</a> <span class="attr">#[test]
+<a href=#3826 id=3826 data-nosnippet>3826</a> </span><span class="kw">fn </span>test_datum_string_convert_to_boolean() {
+<a href=#3827 id=3827 data-nosnippet>3827</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"true"</span>);
+<a href=#3828 id=3828 data-nosnippet>3828</a>
+<a href=#3829 id=3829 data-nosnippet>3829</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Boolean)).unwrap();
<a href=#3830 id=3830 data-nosnippet>3830</a>
-<a href=#3831 id=3831 data-nosnippet>3831</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Timestamp)).unwrap();
+<a href=#3831 id=3831 data-nosnippet>3831</a> <span class="kw">let </span>expected = Datum::bool(<span class="bool-val">true</span>);
<a href=#3832 id=3832 data-nosnippet>3832</a>
-<a href=#3833 id=3833 data-nosnippet>3833</a> <span class="kw">let </span>expected = Datum::timestamp_micros(-<span class="number">1407990900000000</span>);
-<a href=#3834 id=3834 data-nosnippet>3834</a>
-<a href=#3835 id=3835 data-nosnippet>3835</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3836 id=3836 data-nosnippet>3836</a> }
-<a href=#3837 id=3837 data-nosnippet>3837</a>
-<a href=#3838 id=3838 data-nosnippet>3838</a> <span class="attr">#[test]
-<a href=#3839 id=3839 data-nosnippet>3839</a> </span><span class="kw">fn </span>test_datum_string_convert_to_timestamptz() {
-<a href=#3840 id=3840 data-nosnippet>3840</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"1925-05-20T19:25:00.000 UTC"</span>);
+<a href=#3833 id=3833 data-nosnippet>3833</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#3834 id=3834 data-nosnippet>3834</a> }
+<a href=#3835 id=3835 data-nosnippet>3835</a>
+<a href=#3836 id=3836 data-nosnippet>3836</a> <span class="attr">#[test]
+<a href=#3837 id=3837 data-nosnippet>3837</a> </span><span class="kw">fn </span>test_datum_string_convert_to_int() {
+<a href=#3838 id=3838 data-nosnippet>3838</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"12345"</span>);
+<a href=#3839 id=3839 data-nosnippet>3839</a>
+<a href=#3840 id=3840 data-nosnippet>3840</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
<a href=#3841 id=3841 data-nosnippet>3841</a>
-<a href=#3842 id=3842 data-nosnippet>3842</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Timestamptz)).unwrap();
+<a href=#3842 id=3842 data-nosnippet>3842</a> <span class="kw">let </span>expected = Datum::int(<span class="number">12345</span>);
<a href=#3843 id=3843 data-nosnippet>3843</a>
-<a href=#3844 id=3844 data-nosnippet>3844</a> <span class="kw">let </span>expected = Datum::timestamptz_micros(-<span class="number">1407990900000000</span>);
-<a href=#3845 id=3845 data-nosnippet>3845</a>
-<a href=#3846 id=3846 data-nosnippet>3846</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3847 id=3847 data-nosnippet>3847</a> }
-<a href=#3848 id=3848 data-nosnippet>3848</a>}</code></pre></div></section></main></body></html>
\ No newline at end of file
+<a href=#3844 id=3844 data-nosnippet>3844</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#3845 id=3845 data-nosnippet>3845</a> }
+<a href=#3846 id=3846 data-nosnippet>3846</a>
+<a href=#3847 id=3847 data-nosnippet>3847</a> <span class="attr">#[test]
+<a href=#3848 id=3848 data-nosnippet>3848</a> </span><span class="kw">fn </span>test_datum_string_convert_to_long() {
+<a href=#3849 id=3849 data-nosnippet>3849</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"12345"</span>);
+<a href=#3850 id=3850 data-nosnippet>3850</a>
+<a href=#3851 id=3851 data-nosnippet>3851</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Long)).unwrap();
+<a href=#3852 id=3852 data-nosnippet>3852</a>
+<a href=#3853 id=3853 data-nosnippet>3853</a> <span class="kw">let </span>expected = Datum::long(<span class="number">12345</span>);
+<a href=#3854 id=3854 data-nosnippet>3854</a>
+<a href=#3855 id=3855 data-nosnippet>3855</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#3856 id=3856 data-nosnippet>3856</a> }
+<a href=#3857 id=3857 data-nosnippet>3857</a>
+<a href=#3858 id=3858 data-nosnippet>3858</a> <span class="attr">#[test]
+<a href=#3859 id=3859 data-nosnippet>3859</a> </span><span class="kw">fn </span>test_datum_string_convert_to_timestamp() {
+<a href=#3860 id=3860 data-nosnippet>3860</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"1925-05-20T19:25:00.000"</span>);
+<a href=#3861 id=3861 data-nosnippet>3861</a>
+<a href=#3862 id=3862 data-nosnippet>3862</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Timestamp)).unwrap();
+<a href=#3863 id=3863 data-nosnippet>3863</a>
+<a href=#3864 id=3864 data-nosnippet>3864</a> <span class="kw">let </span>expected = Datum::timestamp_micros(-<span class="number">1407990900000000</span>);
+<a href=#3865 id=3865 data-nosnippet>3865</a>
+<a href=#3866 id=3866 data-nosnippet>3866</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#3867 id=3867 data-nosnippet>3867</a> }
+<a href=#3868 id=3868 data-nosnippet>3868</a>
+<a href=#3869 id=3869 data-nosnippet>3869</a> <span class="attr">#[test]
+<a href=#3870 id=3870 data-nosnippet>3870</a> </span><span class="kw">fn </span>test_datum_string_convert_to_timestamptz() {
+<a href=#3871 id=3871 data-nosnippet>3871</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"1925-05-20T19:25:00.000 UTC"</span>);
+<a href=#3872 id=3872 data-nosnippet>3872</a>
+<a href=#3873 id=3873 data-nosnippet>3873</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Timestamptz)).unwrap();
+<a href=#3874 id=3874 data-nosnippet>3874</a>
+<a href=#3875 id=3875 data-nosnippet>3875</a> <span class="kw">let </span>expected = Datum::timestamptz_micros(-<span class="number">1407990900000000</span>);
+<a href=#3876 id=3876 data-nosnippet>3876</a>
+<a href=#3877 id=3877 data-nosnippet>3877</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#3878 id=3878 data-nosnippet>3878</a> }
+<a href=#3879 id=3879 data-nosnippet>3879</a>
+<a href=#3880 id=3880 data-nosnippet>3880</a> <span class="attr">#[test]
+<a href=#3881 id=3881 data-nosnippet>3881</a> </span><span class="kw">fn </span>test_iceberg_float_order() {
+<a href=#3882 id=3882 data-nosnippet>3882</a> <span class="comment">// Test float ordering
+<a href=#3883 id=3883 data-nosnippet>3883</a> </span><span class="kw">let </span>float_values = <span class="macro">vec!</span>[
+<a href=#3884 id=3884 data-nosnippet>3884</a> Datum::float(f32::NAN),
+<a href=#3885 id=3885 data-nosnippet>3885</a> Datum::float(-f32::NAN),
+<a href=#3886 id=3886 data-nosnippet>3886</a> Datum::float(f32::MAX),
+<a href=#3887 id=3887 data-nosnippet>3887</a> Datum::float(f32::MIN),
+<a href=#3888 id=3888 data-nosnippet>3888</a> Datum::float(f32::INFINITY),
+<a href=#3889 id=3889 data-nosnippet>3889</a> Datum::float(-f32::INFINITY),
+<a href=#3890 id=3890 data-nosnippet>3890</a> Datum::float(<span class="number">1.0</span>),
+<a href=#3891 id=3891 data-nosnippet>3891</a> Datum::float(-<span class="number">1.0</span>),
+<a href=#3892 id=3892 data-nosnippet>3892</a> Datum::float(<span class="number">0.0</span>),
+<a href=#3893 id=3893 data-nosnippet>3893</a> Datum::float(-<span class="number">0.0</span>),
+<a href=#3894 id=3894 data-nosnippet>3894</a> ];
+<a href=#3895 id=3895 data-nosnippet>3895</a>
+<a href=#3896 id=3896 data-nosnippet>3896</a> <span class="kw">let </span><span class="kw-2">mut </span>float_sorted = float_values.clone();
+<a href=#3897 id=3897 data-nosnippet>3897</a> float_sorted.sort_by(|a, b| a.partial_cmp(b).unwrap());
+<a href=#3898 id=3898 data-nosnippet>3898</a>
+<a href=#3899 id=3899 data-nosnippet>3899</a> <span class="kw">let </span>float_expected = <span class="macro">vec!</span>[
+<a href=#3900 id=3900 data-nosnippet>3900</a> Datum::float(-f32::NAN),
+<a href=#3901 id=3901 data-nosnippet>3901</a> Datum::float(-f32::INFINITY),
+<a href=#3902 id=3902 data-nosnippet>3902</a> Datum::float(f32::MIN),
+<a href=#3903 id=3903 data-nosnippet>3903</a> Datum::float(-<span class="number">1.0</span>),
+<a href=#3904 id=3904 data-nosnippet>3904</a> Datum::float(-<span class="number">0.0</span>),
+<a href=#3905 id=3905 data-nosnippet>3905</a> Datum::float(<span class="number">0.0</span>),
+<a href=#3906 id=3906 data-nosnippet>3906</a> Datum::float(<span class="number">1.0</span>),
+<a href=#3907 id=3907 data-nosnippet>3907</a> Datum::float(f32::MAX),
+<a href=#3908 id=3908 data-nosnippet>3908</a> Datum::float(f32::INFINITY),
+<a href=#3909 id=3909 data-nosnippet>3909</a> Datum::float(f32::NAN),
+<a href=#3910 id=3910 data-nosnippet>3910</a> ];
+<a href=#3911 id=3911 data-nosnippet>3911</a>
+<a href=#3912 id=3912 data-nosnippet>3912</a> <span class="macro">assert_eq!</span>(float_sorted, float_expected);
+<a href=#3913 id=3913 data-nosnippet>3913</a>
+<a href=#3914 id=3914 data-nosnippet>3914</a> <span class="comment">// Test double ordering
+<a href=#3915 id=3915 data-nosnippet>3915</a> </span><span class="kw">let </span>double_values = <span class="macro">vec!</span>[
+<a href=#3916 id=3916 data-nosnippet>3916</a> Datum::double(f64::NAN),
+<a href=#3917 id=3917 data-nosnippet>3917</a> Datum::double(-f64::NAN),
+<a href=#3918 id=3918 data-nosnippet>3918</a> Datum::double(f64::INFINITY),
+<a href=#3919 id=3919 data-nosnippet>3919</a> Datum::double(-f64::INFINITY),
+<a href=#3920 id=3920 data-nosnippet>3920</a> Datum::double(f64::MAX),
+<a href=#3921 id=3921 data-nosnippet>3921</a> Datum::double(f64::MIN),
+<a href=#3922 id=3922 data-nosnippet>3922</a> Datum::double(<span class="number">1.0</span>),
+<a href=#3923 id=3923 data-nosnippet>3923</a> Datum::double(-<span class="number">1.0</span>),
+<a href=#3924 id=3924 data-nosnippet>3924</a> Datum::double(<span class="number">0.0</span>),
+<a href=#3925 id=3925 data-nosnippet>3925</a> Datum::double(-<span class="number">0.0</span>),
+<a href=#3926 id=3926 data-nosnippet>3926</a> ];
+<a href=#3927 id=3927 data-nosnippet>3927</a>
+<a href=#3928 id=3928 data-nosnippet>3928</a> <span class="kw">let </span><span class="kw-2">mut </span>double_sorted = double_values.clone();
+<a href=#3929 id=3929 data-nosnippet>3929</a> double_sorted.sort_by(|a, b| a.partial_cmp(b).unwrap());
+<a href=#3930 id=3930 data-nosnippet>3930</a>
+<a href=#3931 id=3931 data-nosnippet>3931</a> <span class="kw">let </span>double_expected = <span class="macro">vec!</span>[
+<a href=#3932 id=3932 data-nosnippet>3932</a> Datum::double(-f64::NAN),
+<a href=#3933 id=3933 data-nosnippet>3933</a> Datum::double(-f64::INFINITY),
+<a href=#3934 id=3934 data-nosnippet>3934</a> Datum::double(f64::MIN),
+<a href=#3935 id=3935 data-nosnippet>3935</a> Datum::double(-<span class="number">1.0</span>),
+<a href=#3936 id=3936 data-nosnippet>3936</a> Datum::double(-<span class="number">0.0</span>),
+<a href=#3937 id=3937 data-nosnippet>3937</a> Datum::double(<span class="number">0.0</span>),
+<a href=#3938 id=3938 data-nosnippet>3938</a> Datum::double(<span class="number">1.0</span>),
+<a href=#3939 id=3939 data-nosnippet>3939</a> Datum::double(f64::MAX),
+<a href=#3940 id=3940 data-nosnippet>3940</a> Datum::double(f64::INFINITY),
+<a href=#3941 id=3941 data-nosnippet>3941</a> Datum::double(f64::NAN),
+<a href=#3942 id=3942 data-nosnippet>3942</a> ];
+<a href=#3943 id=3943 data-nosnippet>3943</a>
+<a href=#3944 id=3944 data-nosnippet>3944</a> <span class="macro">assert_eq!</span>(double_sorted, double_expected);
+<a href=#3945 id=3945 data-nosnippet>3945</a> }
+<a href=#3946 id=3946 data-nosnippet>3946</a>}</code></pre></div></section></main></body></html>
\ No newline at end of file