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/11/10 01:41:54 UTC
(iceberg-rust) branch gh-pages updated: deploy: bb607dc5f550b694dc1741b1d95294500b5959c6
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 d100cff3 deploy: bb607dc5f550b694dc1741b1d95294500b5959c6
d100cff3 is described below
commit d100cff3a93bbebfc62e6541b2f85509d26392d7
Author: liurenjie1024 <li...@users.noreply.github.com>
AuthorDate: Mon Nov 10 01:41:50 2025 +0000
deploy: bb607dc5f550b694dc1741b1d95294500b5959c6
---
api/src/iceberg/spec/values.rs.html | 2823 +++++++++++++++++++----------------
1 file changed, 1557 insertions(+), 1266 deletions(-)
diff --git a/api/src/iceberg/spec/values.rs.html b/api/src/iceberg/spec/values.rs.html
index fc894ee8..d7d1950f 100644
--- a/api/src/iceberg/spec/values.rs.html
+++ b/api/src/iceberg/spec/values.rs.html
@@ -2682,1315 +2682,1606 @@
<a href=#2682 id=2682 data-nosnippet>2682</a> Type::Primitive(PrimitiveType::String) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::string(v))),
<a href=#2683 id=2683 data-nosnippet>2683</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"string"</span>)),
<a href=#2684 id=2684 data-nosnippet>2684</a> },
-<a href=#2685 id=2685 data-nosnippet>2685</a> <span class="comment">// # TODO:https://github.com/apache/iceberg-rust/issues/86
-<a href=#2686 id=2686 data-nosnippet>2686</a> // rust avro don't support deserialize any bytes representation now.
-<a href=#2687 id=2687 data-nosnippet>2687</a> </span>RawLiteralEnum::Bytes(<span class="kw">_</span>) => <span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2688 id=2688 data-nosnippet>2688</a> <span class="string">"bytes"</span>,
-<a href=#2689 id=2689 data-nosnippet>2689</a> <span class="string">"todo: rust avro doesn't support deserialize any bytes representation now"</span>,
-<a href=#2690 id=2690 data-nosnippet>2690</a> )),
-<a href=#2691 id=2691 data-nosnippet>2691</a> RawLiteralEnum::List(v) => <span class="kw">match </span>ty {
-<a href=#2692 id=2692 data-nosnippet>2692</a> Type::List(ty) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::List(
-<a href=#2693 id=2693 data-nosnippet>2693</a> v.list
-<a href=#2694 id=2694 data-nosnippet>2694</a> .into_iter()
-<a href=#2695 id=2695 data-nosnippet>2695</a> .map(|v| {
-<a href=#2696 id=2696 data-nosnippet>2696</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(v) = v {
-<a href=#2697 id=2697 data-nosnippet>2697</a> v.try_into(<span class="kw-2">&</span>ty.element_field.field_type)
-<a href=#2698 id=2698 data-nosnippet>2698</a> } <span class="kw">else </span>{
-<a href=#2699 id=2699 data-nosnippet>2699</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>)
-<a href=#2700 id=2700 data-nosnippet>2700</a> }
-<a href=#2701 id=2701 data-nosnippet>2701</a> })
-<a href=#2702 id=2702 data-nosnippet>2702</a> .collect::<<span class="prelude-ty">Result</span><<span class="kw">_</span>, Error>>()<span class="question-mark">?</span>,
-<a href=#2703 id=2703 data-nosnippet>2703</a> ))),
-<a href=#2704 id=2704 data-nosnippet>2704</a> Type::Map(map_ty) => {
-<a href=#2705 id=2705 data-nosnippet>2705</a> <span class="kw">let </span>key_ty = map_ty.key_field.field_type.as_ref();
-<a href=#2706 id=2706 data-nosnippet>2706</a> <span class="kw">let </span>value_ty = map_ty.value_field.field_type.as_ref();
-<a href=#2707 id=2707 data-nosnippet>2707</a> <span class="kw">let </span><span class="kw-2">mut </span>map = Map::new();
-<a href=#2708 id=2708 data-nosnippet>2708</a> <span class="kw">for </span>k_v <span class="kw">in </span>v.list {
-<a href=#2709 id=2709 data-nosnippet>2709</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=#2710 id=2710 data-nosnippet>2710</a> <span class="kw">if let </span>RawLiteralEnum::Record(Record {
-<a href=#2711 id=2711 data-nosnippet>2711</a> required,
-<a href=#2712 id=2712 data-nosnippet>2712</a> optional: <span class="kw">_</span>,
-<a href=#2713 id=2713 data-nosnippet>2713</a> }) = k_v
-<a href=#2714 id=2714 data-nosnippet>2714</a> {
-<a href=#2715 id=2715 data-nosnippet>2715</a> <span class="kw">if </span>required.len() != <span class="number">2 </span>{
-<a href=#2716 id=2716 data-nosnippet>2716</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2717 id=2717 data-nosnippet>2717</a> <span class="string">"list"</span>,
-<a href=#2718 id=2718 data-nosnippet>2718</a> <span class="string">"Record must contains two element(key and value) of array"</span>,
-<a href=#2719 id=2719 data-nosnippet>2719</a> ));
-<a href=#2720 id=2720 data-nosnippet>2720</a> }
-<a href=#2721 id=2721 data-nosnippet>2721</a> <span class="kw">let </span><span class="kw-2">mut </span>key = <span class="prelude-val">None</span>;
-<a href=#2722 id=2722 data-nosnippet>2722</a> <span class="kw">let </span><span class="kw-2">mut </span>value = <span class="prelude-val">None</span>;
-<a href=#2723 id=2723 data-nosnippet>2723</a> required.into_iter().for_each(|(k, v)| {
-<a href=#2724 id=2724 data-nosnippet>2724</a> <span class="kw">if </span>k == MAP_KEY_FIELD_NAME {
-<a href=#2725 id=2725 data-nosnippet>2725</a> key = <span class="prelude-val">Some</span>(v);
-<a href=#2726 id=2726 data-nosnippet>2726</a> } <span class="kw">else if </span>k == MAP_VALUE_FIELD_NAME {
-<a href=#2727 id=2727 data-nosnippet>2727</a> value = <span class="prelude-val">Some</span>(v);
-<a href=#2728 id=2728 data-nosnippet>2728</a> }
-<a href=#2729 id=2729 data-nosnippet>2729</a> });
-<a href=#2730 id=2730 data-nosnippet>2730</a> <span class="kw">match </span>(key, value) {
-<a href=#2731 id=2731 data-nosnippet>2731</a> (<span class="prelude-val">Some</span>(k), <span class="prelude-val">Some</span>(v)) => {
-<a href=#2732 id=2732 data-nosnippet>2732</a> <span class="kw">let </span>key = k.try_into(key_ty)<span class="question-mark">?</span>.ok_or_else(|| {
-<a href=#2733 id=2733 data-nosnippet>2733</a> invalid_err_with_reason(
-<a href=#2734 id=2734 data-nosnippet>2734</a> <span class="string">"list"</span>,
-<a href=#2735 id=2735 data-nosnippet>2735</a> <span class="string">"Key element in Map must be valid"</span>,
-<a href=#2736 id=2736 data-nosnippet>2736</a> )
-<a href=#2737 id=2737 data-nosnippet>2737</a> })<span class="question-mark">?</span>;
-<a href=#2738 id=2738 data-nosnippet>2738</a> <span class="kw">let </span>value = v.try_into(value_ty)<span class="question-mark">?</span>;
-<a href=#2739 id=2739 data-nosnippet>2739</a> <span class="kw">if </span>map_ty.value_field.required && value.is_none() {
-<a href=#2740 id=2740 data-nosnippet>2740</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2741 id=2741 data-nosnippet>2741</a> <span class="string">"list"</span>,
-<a href=#2742 id=2742 data-nosnippet>2742</a> <span class="string">"Value element is required in this Map"</span>,
-<a href=#2743 id=2743 data-nosnippet>2743</a> ));
-<a href=#2744 id=2744 data-nosnippet>2744</a> }
-<a href=#2745 id=2745 data-nosnippet>2745</a> map.insert(key, value);
-<a href=#2746 id=2746 data-nosnippet>2746</a> }
-<a href=#2747 id=2747 data-nosnippet>2747</a> <span class="kw">_ </span>=> {
-<a href=#2748 id=2748 data-nosnippet>2748</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2749 id=2749 data-nosnippet>2749</a> <span class="string">"list"</span>,
-<a href=#2750 id=2750 data-nosnippet>2750</a> <span class="string">"The elements of record in list are not key and value"</span>,
-<a href=#2751 id=2751 data-nosnippet>2751</a> ));
-<a href=#2752 id=2752 data-nosnippet>2752</a> }
-<a href=#2753 id=2753 data-nosnippet>2753</a> }
-<a href=#2754 id=2754 data-nosnippet>2754</a> } <span class="kw">else </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">"Map should represented as record array."</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> }
-<a href=#2761 id=2761 data-nosnippet>2761</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Map(map)))
-<a href=#2762 id=2762 data-nosnippet>2762</a> }
-<a href=#2763 id=2763 data-nosnippet>2763</a> Type::Primitive(PrimitiveType::Uuid) => {
-<a href=#2764 id=2764 data-nosnippet>2764</a> <span class="kw">if </span>v.list.len() != <span class="number">16 </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 length of list should be 16"</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> <span class="kw">let </span><span class="kw-2">mut </span>bytes = [<span class="number">0u8</span>; <span class="number">16</span>];
-<a href=#2771 id=2771 data-nosnippet>2771</a> <span class="kw">for </span>(i, v) <span class="kw">in </span>v.list.iter().enumerate() {
-<a href=#2772 id=2772 data-nosnippet>2772</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
-<a href=#2773 id=2773 data-nosnippet>2773</a> bytes[i] = <span class="kw-2">*</span>v <span class="kw">as </span>u8;
-<a href=#2774 id=2774 data-nosnippet>2774</a> } <span class="kw">else </span>{
-<a href=#2775 id=2775 data-nosnippet>2775</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2776 id=2776 data-nosnippet>2776</a> <span class="string">"list"</span>,
-<a href=#2777 id=2777 data-nosnippet>2777</a> <span class="string">"The element of list should be int"</span>,
-<a href=#2778 id=2778 data-nosnippet>2778</a> ));
-<a href=#2779 id=2779 data-nosnippet>2779</a> }
-<a href=#2780 id=2780 data-nosnippet>2780</a> }
-<a href=#2781 id=2781 data-nosnippet>2781</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::uuid(uuid::Uuid::from_bytes(bytes))))
-<a href=#2782 id=2782 data-nosnippet>2782</a> }
-<a href=#2783 id=2783 data-nosnippet>2783</a> Type::Primitive(PrimitiveType::Decimal {
-<a href=#2784 id=2784 data-nosnippet>2784</a> precision: <span class="kw">_</span>,
-<a href=#2785 id=2785 data-nosnippet>2785</a> scale: <span class="kw">_</span>,
-<a href=#2786 id=2786 data-nosnippet>2786</a> }) => {
-<a href=#2787 id=2787 data-nosnippet>2787</a> <span class="kw">if </span>v.list.len() != <span class="number">16 </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 length of list should be 16"</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> <span class="kw">let </span><span class="kw-2">mut </span>bytes = [<span class="number">0u8</span>; <span class="number">16</span>];
-<a href=#2794 id=2794 data-nosnippet>2794</a> <span class="kw">for </span>(i, v) <span class="kw">in </span>v.list.iter().enumerate() {
-<a href=#2795 id=2795 data-nosnippet>2795</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
-<a href=#2796 id=2796 data-nosnippet>2796</a> bytes[i] = <span class="kw-2">*</span>v <span class="kw">as </span>u8;
-<a href=#2797 id=2797 data-nosnippet>2797</a> } <span class="kw">else </span>{
-<a href=#2798 id=2798 data-nosnippet>2798</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2799 id=2799 data-nosnippet>2799</a> <span class="string">"list"</span>,
-<a href=#2800 id=2800 data-nosnippet>2800</a> <span class="string">"The element of list should be int"</span>,
-<a href=#2801 id=2801 data-nosnippet>2801</a> ));
-<a href=#2802 id=2802 data-nosnippet>2802</a> }
-<a href=#2803 id=2803 data-nosnippet>2803</a> }
-<a href=#2804 id=2804 data-nosnippet>2804</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::decimal(i128::from_be_bytes(bytes))))
-<a href=#2805 id=2805 data-nosnippet>2805</a> }
-<a href=#2806 id=2806 data-nosnippet>2806</a> Type::Primitive(PrimitiveType::Binary) => {
-<a href=#2807 id=2807 data-nosnippet>2807</a> <span class="kw">let </span>bytes = v
-<a href=#2808 id=2808 data-nosnippet>2808</a> .list
-<a href=#2809 id=2809 data-nosnippet>2809</a> .into_iter()
-<a href=#2810 id=2810 data-nosnippet>2810</a> .map(|v| {
-<a href=#2811 id=2811 data-nosnippet>2811</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
-<a href=#2812 id=2812 data-nosnippet>2812</a> <span class="prelude-val">Ok</span>(v <span class="kw">as </span>u8)
-<a href=#2813 id=2813 data-nosnippet>2813</a> } <span class="kw">else </span>{
-<a href=#2814 id=2814 data-nosnippet>2814</a> <span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2815 id=2815 data-nosnippet>2815</a> <span class="string">"list"</span>,
-<a href=#2816 id=2816 data-nosnippet>2816</a> <span class="string">"The element of list should be int"</span>,
-<a href=#2817 id=2817 data-nosnippet>2817</a> ))
-<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> .collect::<<span class="prelude-ty">Result</span><Vec<<span class="kw">_</span>>, Error>>()<span class="question-mark">?</span>;
-<a href=#2821 id=2821 data-nosnippet>2821</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::binary(bytes)))
-<a href=#2822 id=2822 data-nosnippet>2822</a> }
-<a href=#2823 id=2823 data-nosnippet>2823</a> Type::Primitive(PrimitiveType::Fixed(size)) => {
-<a href=#2824 id=2824 data-nosnippet>2824</a> <span class="kw">if </span>v.list.len() != <span class="kw-2">*</span>size <span class="kw">as </span>usize {
-<a href=#2825 id=2825 data-nosnippet>2825</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2826 id=2826 data-nosnippet>2826</a> <span class="string">"list"</span>,
-<a href=#2827 id=2827 data-nosnippet>2827</a> <span class="string">"The length of list should be equal to size"</span>,
-<a href=#2828 id=2828 data-nosnippet>2828</a> ));
-<a href=#2829 id=2829 data-nosnippet>2829</a> }
-<a href=#2830 id=2830 data-nosnippet>2830</a> <span class="kw">let </span>bytes = v
-<a href=#2831 id=2831 data-nosnippet>2831</a> .list
-<a href=#2832 id=2832 data-nosnippet>2832</a> .into_iter()
-<a href=#2833 id=2833 data-nosnippet>2833</a> .map(|v| {
-<a href=#2834 id=2834 data-nosnippet>2834</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
-<a href=#2835 id=2835 data-nosnippet>2835</a> <span class="prelude-val">Ok</span>(v <span class="kw">as </span>u8)
-<a href=#2836 id=2836 data-nosnippet>2836</a> } <span class="kw">else </span>{
-<a href=#2837 id=2837 data-nosnippet>2837</a> <span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2838 id=2838 data-nosnippet>2838</a> <span class="string">"list"</span>,
-<a href=#2839 id=2839 data-nosnippet>2839</a> <span class="string">"The element of list should be int"</span>,
-<a href=#2840 id=2840 data-nosnippet>2840</a> ))
-<a href=#2841 id=2841 data-nosnippet>2841</a> }
-<a href=#2842 id=2842 data-nosnippet>2842</a> })
-<a href=#2843 id=2843 data-nosnippet>2843</a> .collect::<<span class="prelude-ty">Result</span><Vec<<span class="kw">_</span>>, Error>>()<span class="question-mark">?</span>;
-<a href=#2844 id=2844 data-nosnippet>2844</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::fixed(bytes)))
-<a href=#2845 id=2845 data-nosnippet>2845</a> }
-<a href=#2846 id=2846 data-nosnippet>2846</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"list"</span>)),
-<a href=#2847 id=2847 data-nosnippet>2847</a> },
-<a href=#2848 id=2848 data-nosnippet>2848</a> RawLiteralEnum::Record(Record {
-<a href=#2849 id=2849 data-nosnippet>2849</a> required,
-<a href=#2850 id=2850 data-nosnippet>2850</a> optional: <span class="kw">_</span>,
-<a href=#2851 id=2851 data-nosnippet>2851</a> }) => <span class="kw">match </span>ty {
-<a href=#2852 id=2852 data-nosnippet>2852</a> Type::Struct(struct_ty) => {
-<a href=#2853 id=2853 data-nosnippet>2853</a> <span class="kw">let </span>iters: Vec<<span class="prelude-ty">Option</span><Literal>> = required
-<a href=#2854 id=2854 data-nosnippet>2854</a> .into_iter()
-<a href=#2855 id=2855 data-nosnippet>2855</a> .map(|(field_name, value)| {
-<a href=#2856 id=2856 data-nosnippet>2856</a> <span class="kw">let </span>field = struct_ty
-<a href=#2857 id=2857 data-nosnippet>2857</a> .field_by_name(field_name.as_str())
-<a href=#2858 id=2858 data-nosnippet>2858</a> .ok_or_else(|| {
-<a href=#2859 id=2859 data-nosnippet>2859</a> invalid_err_with_reason(
-<a href=#2860 id=2860 data-nosnippet>2860</a> <span class="string">"record"</span>,
-<a href=#2861 id=2861 data-nosnippet>2861</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=#2862 id=2862 data-nosnippet>2862</a> )
-<a href=#2863 id=2863 data-nosnippet>2863</a> })<span class="question-mark">?</span>;
-<a href=#2864 id=2864 data-nosnippet>2864</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=#2865 id=2865 data-nosnippet>2865</a> <span class="prelude-val">Ok</span>(value)
-<a href=#2866 id=2866 data-nosnippet>2866</a> })
-<a href=#2867 id=2867 data-nosnippet>2867</a> .collect::<<span class="prelude-ty">Result</span><<span class="kw">_</span>, Error>>()<span class="question-mark">?</span>;
-<a href=#2868 id=2868 data-nosnippet>2868</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=#2869 id=2869 data-nosnippet>2869</a> }
-<a href=#2870 id=2870 data-nosnippet>2870</a> Type::Map(map_ty) => {
-<a href=#2871 id=2871 data-nosnippet>2871</a> <span class="kw">if </span><span class="kw-2">*</span>map_ty.key_field.field_type != Type::Primitive(PrimitiveType::String) {
-<a href=#2872 id=2872 data-nosnippet>2872</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2873 id=2873 data-nosnippet>2873</a> <span class="string">"record"</span>,
-<a href=#2874 id=2874 data-nosnippet>2874</a> <span class="string">"Map key must be string"</span>,
-<a href=#2875 id=2875 data-nosnippet>2875</a> ));
-<a href=#2876 id=2876 data-nosnippet>2876</a> }
-<a href=#2877 id=2877 data-nosnippet>2877</a> <span class="kw">let </span><span class="kw-2">mut </span>map = Map::new();
-<a href=#2878 id=2878 data-nosnippet>2878</a> <span class="kw">for </span>(k, v) <span class="kw">in </span>required {
-<a href=#2879 id=2879 data-nosnippet>2879</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=#2880 id=2880 data-nosnippet>2880</a> <span class="kw">if </span>map_ty.value_field.required && value.is_none() {
-<a href=#2881 id=2881 data-nosnippet>2881</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
-<a href=#2882 id=2882 data-nosnippet>2882</a> <span class="string">"record"</span>,
-<a href=#2883 id=2883 data-nosnippet>2883</a> <span class="string">"Value element is required in this Map"</span>,
-<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> map.insert(Literal::string(k), value);
-<a href=#2887 id=2887 data-nosnippet>2887</a> }
-<a href=#2888 id=2888 data-nosnippet>2888</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Map(map)))
-<a href=#2889 id=2889 data-nosnippet>2889</a> }
-<a href=#2890 id=2890 data-nosnippet>2890</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"record"</span>)),
-<a href=#2891 id=2891 data-nosnippet>2891</a> },
-<a href=#2892 id=2892 data-nosnippet>2892</a> RawLiteralEnum::StringMap(<span class="kw">_</span>) => <span class="prelude-val">Err</span>(invalid_err(<span class="string">"string map"</span>)),
-<a href=#2893 id=2893 data-nosnippet>2893</a> }
-<a href=#2894 id=2894 data-nosnippet>2894</a> }
-<a href=#2895 id=2895 data-nosnippet>2895</a> }
-<a href=#2896 id=2896 data-nosnippet>2896</a>}
-<a href=#2897 id=2897 data-nosnippet>2897</a>
-<a href=#2898 id=2898 data-nosnippet>2898</a><span class="attr">#[cfg(test)]
-<a href=#2899 id=2899 data-nosnippet>2899</a></span><span class="kw">mod </span>tests {
-<a href=#2900 id=2900 data-nosnippet>2900</a> <span class="kw">use </span>apache_avro::to_value;
-<a href=#2901 id=2901 data-nosnippet>2901</a> <span class="kw">use </span>apache_avro::types::Value;
-<a href=#2902 id=2902 data-nosnippet>2902</a>
-<a href=#2903 id=2903 data-nosnippet>2903</a> <span class="kw">use super</span>::<span class="kw-2">*</span>;
-<a href=#2904 id=2904 data-nosnippet>2904</a> <span class="kw">use </span><span class="kw">crate</span>::avro::schema_to_avro_schema;
-<a href=#2905 id=2905 data-nosnippet>2905</a> <span class="kw">use </span><span class="kw">crate</span>::spec::Schema;
-<a href=#2906 id=2906 data-nosnippet>2906</a> <span class="kw">use </span><span class="kw">crate</span>::spec::Type::Primitive;
-<a href=#2907 id=2907 data-nosnippet>2907</a> <span class="kw">use </span><span class="kw">crate</span>::spec::datatypes::{ListType, MapType, NestedField, StructType};
-<a href=#2908 id=2908 data-nosnippet>2908</a>
-<a href=#2909 id=2909 data-nosnippet>2909</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=#2910 id=2910 data-nosnippet>2910</a> <span class="kw">let </span>raw_json_value = serde_json::from_str::<JsonValue>(json).unwrap();
-<a href=#2911 id=2911 data-nosnippet>2911</a> <span class="kw">let </span>desered_literal =
-<a href=#2912 id=2912 data-nosnippet>2912</a> Literal::try_from_json(raw_json_value.clone(), expected_type).unwrap();
-<a href=#2913 id=2913 data-nosnippet>2913</a> <span class="macro">assert_eq!</span>(desered_literal, <span class="prelude-val">Some</span>(expected_literal.clone()));
-<a href=#2914 id=2914 data-nosnippet>2914</a>
-<a href=#2915 id=2915 data-nosnippet>2915</a> <span class="kw">let </span>expected_json_value: JsonValue = expected_literal.try_into_json(expected_type).unwrap();
-<a href=#2916 id=2916 data-nosnippet>2916</a> <span class="kw">let </span>sered_json = serde_json::to_string(<span class="kw-2">&</span>expected_json_value).unwrap();
-<a href=#2917 id=2917 data-nosnippet>2917</a> <span class="kw">let </span>parsed_json_value = serde_json::from_str::<JsonValue>(<span class="kw-2">&</span>sered_json).unwrap();
-<a href=#2918 id=2918 data-nosnippet>2918</a>
-<a href=#2919 id=2919 data-nosnippet>2919</a> <span class="macro">assert_eq!</span>(parsed_json_value, raw_json_value);
-<a href=#2920 id=2920 data-nosnippet>2920</a> }
-<a href=#2921 id=2921 data-nosnippet>2921</a>
-<a href=#2922 id=2922 data-nosnippet>2922</a> <span class="kw">fn </span>check_avro_bytes_serde(
-<a href=#2923 id=2923 data-nosnippet>2923</a> input: Vec<u8>,
-<a href=#2924 id=2924 data-nosnippet>2924</a> expected_datum: Datum,
-<a href=#2925 id=2925 data-nosnippet>2925</a> expected_type: <span class="kw-2">&</span>PrimitiveType,
-<a href=#2926 id=2926 data-nosnippet>2926</a> ) {
-<a href=#2927 id=2927 data-nosnippet>2927</a> <span class="kw">let </span>raw_schema = <span class="string">r#""bytes""#</span>;
-<a href=#2928 id=2928 data-nosnippet>2928</a> <span class="kw">let </span>schema = apache_avro::Schema::parse_str(raw_schema).unwrap();
-<a href=#2929 id=2929 data-nosnippet>2929</a>
-<a href=#2930 id=2930 data-nosnippet>2930</a> <span class="kw">let </span>bytes = ByteBuf::from(input);
-<a href=#2931 id=2931 data-nosnippet>2931</a> <span class="kw">let </span>datum = Datum::try_from_bytes(<span class="kw-2">&</span>bytes, expected_type.clone()).unwrap();
-<a href=#2932 id=2932 data-nosnippet>2932</a> <span class="macro">assert_eq!</span>(datum, expected_datum);
-<a href=#2933 id=2933 data-nosnippet>2933</a>
-<a href=#2934 id=2934 data-nosnippet>2934</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=#2935 id=2935 data-nosnippet>2935</a> writer.append_ser(datum.to_bytes().unwrap()).unwrap();
-<a href=#2936 id=2936 data-nosnippet>2936</a> <span class="kw">let </span>encoded = writer.into_inner().unwrap();
-<a href=#2937 id=2937 data-nosnippet>2937</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=#2938 id=2938 data-nosnippet>2938</a>
-<a href=#2939 id=2939 data-nosnippet>2939</a> <span class="kw">for </span>record <span class="kw">in </span>reader {
-<a href=#2940 id=2940 data-nosnippet>2940</a> <span class="kw">let </span>result = apache_avro::from_value::<ByteBuf>(<span class="kw-2">&</span>record.unwrap()).unwrap();
-<a href=#2941 id=2941 data-nosnippet>2941</a> <span class="kw">let </span>desered_datum = Datum::try_from_bytes(<span class="kw-2">&</span>result, expected_type.clone()).unwrap();
-<a href=#2942 id=2942 data-nosnippet>2942</a> <span class="macro">assert_eq!</span>(desered_datum, expected_datum);
-<a href=#2943 id=2943 data-nosnippet>2943</a> }
-<a href=#2944 id=2944 data-nosnippet>2944</a> }
-<a href=#2945 id=2945 data-nosnippet>2945</a>
-<a href=#2946 id=2946 data-nosnippet>2946</a> <span class="kw">fn </span>check_convert_with_avro(expected_literal: Literal, expected_type: <span class="kw-2">&</span>Type) {
-<a href=#2947 id=2947 data-nosnippet>2947</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=#2948 id=2948 data-nosnippet>2948</a> <span class="kw">let </span>schema = Schema::builder()
-<a href=#2949 id=2949 data-nosnippet>2949</a> .with_fields(fields.clone())
-<a href=#2950 id=2950 data-nosnippet>2950</a> .build()
-<a href=#2951 id=2951 data-nosnippet>2951</a> .unwrap();
-<a href=#2952 id=2952 data-nosnippet>2952</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=#2953 id=2953 data-nosnippet>2953</a> <span class="kw">let </span>struct_type = Type::Struct(StructType::new(fields));
-<a href=#2954 id=2954 data-nosnippet>2954</a> <span class="kw">let </span>struct_literal =
-<a href=#2955 id=2955 data-nosnippet>2955</a> Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[<span class="prelude-val">Some</span>(expected_literal.clone())]));
+<a href=#2685 id=2685 data-nosnippet>2685</a> RawLiteralEnum::Bytes(v) => <span class="kw">match </span>ty {
+<a href=#2686 id=2686 data-nosnippet>2686</a> Type::Primitive(PrimitiveType::Binary) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::binary(v.to_vec()))),
+<a href=#2687 id=2687 data-nosnippet>2687</a> Type::Primitive(PrimitiveType::Fixed(expected_len)) => {
+<a href=#2688 id=2688 data-nosnippet>2688</a> <span class="kw">if </span>v.len() == <span class="kw-2">*</span>expected_len <span class="kw">as </span>usize {
+<a href=#2689 id=2689 data-nosnippet>2689</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::fixed(v.to_vec())))
+<a href=#2690 id=2690 data-nosnippet>2690</a> } <span class="kw">else </span>{
+<a href=#2691 id=2691 data-nosnippet>2691</a> <span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2692 id=2692 data-nosnippet>2692</a> <span class="string">"bytes"</span>,
+<a href=#2693 id=2693 data-nosnippet>2693</a> <span class="kw-2">&</span><span class="macro">format!</span>(
+<a href=#2694 id=2694 data-nosnippet>2694</a> <span class="string">"Fixed type must be exactly {} bytes, got {}"</span>,
+<a href=#2695 id=2695 data-nosnippet>2695</a> expected_len,
+<a href=#2696 id=2696 data-nosnippet>2696</a> v.len()
+<a href=#2697 id=2697 data-nosnippet>2697</a> ),
+<a href=#2698 id=2698 data-nosnippet>2698</a> ))
+<a href=#2699 id=2699 data-nosnippet>2699</a> }
+<a href=#2700 id=2700 data-nosnippet>2700</a> }
+<a href=#2701 id=2701 data-nosnippet>2701</a> Type::Primitive(PrimitiveType::Uuid) => {
+<a href=#2702 id=2702 data-nosnippet>2702</a> <span class="kw">if </span>v.len() == <span class="number">16 </span>{
+<a href=#2703 id=2703 data-nosnippet>2703</a> <span class="kw">let </span>bytes: [u8; <span class="number">16</span>] = v.as_slice().try_into().map_err(|<span class="kw">_</span>| {
+<a href=#2704 id=2704 data-nosnippet>2704</a> invalid_err_with_reason(<span class="string">"bytes"</span>, <span class="string">"UUID must be exactly 16 bytes"</span>)
+<a href=#2705 id=2705 data-nosnippet>2705</a> })<span class="question-mark">?</span>;
+<a href=#2706 id=2706 data-nosnippet>2706</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::uuid(uuid::Uuid::from_bytes(bytes))))
+<a href=#2707 id=2707 data-nosnippet>2707</a> } <span class="kw">else </span>{
+<a href=#2708 id=2708 data-nosnippet>2708</a> <span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2709 id=2709 data-nosnippet>2709</a> <span class="string">"bytes"</span>,
+<a href=#2710 id=2710 data-nosnippet>2710</a> <span class="string">"UUID must be exactly 16 bytes"</span>,
+<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> }
+<a href=#2714 id=2714 data-nosnippet>2714</a> Type::Primitive(PrimitiveType::Decimal { precision, .. }) => {
+<a href=#2715 id=2715 data-nosnippet>2715</a> <span class="kw">let </span>required_bytes = Type::decimal_required_bytes(<span class="kw-2">*</span>precision)<span class="question-mark">? </span><span class="kw">as </span>usize;
+<a href=#2716 id=2716 data-nosnippet>2716</a>
+<a href=#2717 id=2717 data-nosnippet>2717</a> <span class="kw">if </span>v.len() == required_bytes {
+<a href=#2718 id=2718 data-nosnippet>2718</a> <span class="comment">// Pad the bytes to 16 bytes (i128 size) with sign extension
+<a href=#2719 id=2719 data-nosnippet>2719</a> </span><span class="kw">let </span><span class="kw-2">mut </span>padded_bytes = [<span class="number">0u8</span>; <span class="number">16</span>];
+<a href=#2720 id=2720 data-nosnippet>2720</a> <span class="kw">let </span>start_idx = <span class="number">16 </span>- v.len();
+<a href=#2721 id=2721 data-nosnippet>2721</a>
+<a href=#2722 id=2722 data-nosnippet>2722</a> <span class="comment">// Copy the input bytes to the end of the array
+<a href=#2723 id=2723 data-nosnippet>2723</a> </span>padded_bytes[start_idx..].copy_from_slice(<span class="kw-2">&</span>v);
+<a href=#2724 id=2724 data-nosnippet>2724</a>
+<a href=#2725 id=2725 data-nosnippet>2725</a> <span class="comment">// Sign extend if the number is negative (MSB is 1)
+<a href=#2726 id=2726 data-nosnippet>2726</a> </span><span class="kw">if </span>!v.is_empty() && (v[<span class="number">0</span>] & <span class="number">0x80</span>) != <span class="number">0 </span>{
+<a href=#2727 id=2727 data-nosnippet>2727</a> <span class="comment">// Fill the padding with 0xFF for negative numbers
+<a href=#2728 id=2728 data-nosnippet>2728</a> </span><span class="kw">for </span>byte <span class="kw">in </span><span class="kw-2">&mut </span>padded_bytes[..start_idx] {
+<a href=#2729 id=2729 data-nosnippet>2729</a> <span class="kw-2">*</span>byte = <span class="number">0xFF</span>;
+<a href=#2730 id=2730 data-nosnippet>2730</a> }
+<a href=#2731 id=2731 data-nosnippet>2731</a> }
+<a href=#2732 id=2732 data-nosnippet>2732</a>
+<a href=#2733 id=2733 data-nosnippet>2733</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int128(
+<a href=#2734 id=2734 data-nosnippet>2734</a> i128::from_be_bytes(padded_bytes),
+<a href=#2735 id=2735 data-nosnippet>2735</a> ))))
+<a href=#2736 id=2736 data-nosnippet>2736</a> } <span class="kw">else </span>{
+<a href=#2737 id=2737 data-nosnippet>2737</a> <span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2738 id=2738 data-nosnippet>2738</a> <span class="string">"bytes"</span>,
+<a href=#2739 id=2739 data-nosnippet>2739</a> <span class="kw-2">&</span><span class="macro">format!</span>(
+<a href=#2740 id=2740 data-nosnippet>2740</a> <span class="string">"Decimal with precision {} must be exactly {} bytes, got {}"</span>,
+<a href=#2741 id=2741 data-nosnippet>2741</a> precision,
+<a href=#2742 id=2742 data-nosnippet>2742</a> required_bytes,
+<a href=#2743 id=2743 data-nosnippet>2743</a> v.len()
+<a href=#2744 id=2744 data-nosnippet>2744</a> ),
+<a href=#2745 id=2745 data-nosnippet>2745</a> ))
+<a href=#2746 id=2746 data-nosnippet>2746</a> }
+<a href=#2747 id=2747 data-nosnippet>2747</a> }
+<a href=#2748 id=2748 data-nosnippet>2748</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"bytes"</span>)),
+<a href=#2749 id=2749 data-nosnippet>2749</a> },
+<a href=#2750 id=2750 data-nosnippet>2750</a> RawLiteralEnum::List(v) => <span class="kw">match </span>ty {
+<a href=#2751 id=2751 data-nosnippet>2751</a> Type::List(ty) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::List(
+<a href=#2752 id=2752 data-nosnippet>2752</a> v.list
+<a href=#2753 id=2753 data-nosnippet>2753</a> .into_iter()
+<a href=#2754 id=2754 data-nosnippet>2754</a> .map(|v| {
+<a href=#2755 id=2755 data-nosnippet>2755</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(v) = v {
+<a href=#2756 id=2756 data-nosnippet>2756</a> v.try_into(<span class="kw-2">&</span>ty.element_field.field_type)
+<a href=#2757 id=2757 data-nosnippet>2757</a> } <span class="kw">else </span>{
+<a href=#2758 id=2758 data-nosnippet>2758</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>)
+<a href=#2759 id=2759 data-nosnippet>2759</a> }
+<a href=#2760 id=2760 data-nosnippet>2760</a> })
+<a href=#2761 id=2761 data-nosnippet>2761</a> .collect::<<span class="prelude-ty">Result</span><<span class="kw">_</span>, Error>>()<span class="question-mark">?</span>,
+<a href=#2762 id=2762 data-nosnippet>2762</a> ))),
+<a href=#2763 id=2763 data-nosnippet>2763</a> Type::Map(map_ty) => {
+<a href=#2764 id=2764 data-nosnippet>2764</a> <span class="kw">let </span>key_ty = map_ty.key_field.field_type.as_ref();
+<a href=#2765 id=2765 data-nosnippet>2765</a> <span class="kw">let </span>value_ty = map_ty.value_field.field_type.as_ref();
+<a href=#2766 id=2766 data-nosnippet>2766</a> <span class="kw">let </span><span class="kw-2">mut </span>map = Map::new();
+<a href=#2767 id=2767 data-nosnippet>2767</a> <span class="kw">for </span>k_v <span class="kw">in </span>v.list {
+<a href=#2768 id=2768 data-nosnippet>2768</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=#2769 id=2769 data-nosnippet>2769</a> <span class="kw">if let </span>RawLiteralEnum::Record(Record {
+<a href=#2770 id=2770 data-nosnippet>2770</a> required,
+<a href=#2771 id=2771 data-nosnippet>2771</a> optional: <span class="kw">_</span>,
+<a href=#2772 id=2772 data-nosnippet>2772</a> }) = k_v
+<a href=#2773 id=2773 data-nosnippet>2773</a> {
+<a href=#2774 id=2774 data-nosnippet>2774</a> <span class="kw">if </span>required.len() != <span class="number">2 </span>{
+<a href=#2775 id=2775 data-nosnippet>2775</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2776 id=2776 data-nosnippet>2776</a> <span class="string">"list"</span>,
+<a href=#2777 id=2777 data-nosnippet>2777</a> <span class="string">"Record must contains two element(key and value) of array"</span>,
+<a href=#2778 id=2778 data-nosnippet>2778</a> ));
+<a href=#2779 id=2779 data-nosnippet>2779</a> }
+<a href=#2780 id=2780 data-nosnippet>2780</a> <span class="kw">let </span><span class="kw-2">mut </span>key = <span class="prelude-val">None</span>;
+<a href=#2781 id=2781 data-nosnippet>2781</a> <span class="kw">let </span><span class="kw-2">mut </span>value = <span class="prelude-val">None</span>;
+<a href=#2782 id=2782 data-nosnippet>2782</a> required.into_iter().for_each(|(k, v)| {
+<a href=#2783 id=2783 data-nosnippet>2783</a> <span class="kw">if </span>k == MAP_KEY_FIELD_NAME {
+<a href=#2784 id=2784 data-nosnippet>2784</a> key = <span class="prelude-val">Some</span>(v);
+<a href=#2785 id=2785 data-nosnippet>2785</a> } <span class="kw">else if </span>k == MAP_VALUE_FIELD_NAME {
+<a href=#2786 id=2786 data-nosnippet>2786</a> value = <span class="prelude-val">Some</span>(v);
+<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">match </span>(key, value) {
+<a href=#2790 id=2790 data-nosnippet>2790</a> (<span class="prelude-val">Some</span>(k), <span class="prelude-val">Some</span>(v)) => {
+<a href=#2791 id=2791 data-nosnippet>2791</a> <span class="kw">let </span>key = k.try_into(key_ty)<span class="question-mark">?</span>.ok_or_else(|| {
+<a href=#2792 id=2792 data-nosnippet>2792</a> invalid_err_with_reason(
+<a href=#2793 id=2793 data-nosnippet>2793</a> <span class="string">"list"</span>,
+<a href=#2794 id=2794 data-nosnippet>2794</a> <span class="string">"Key element in Map must be valid"</span>,
+<a href=#2795 id=2795 data-nosnippet>2795</a> )
+<a href=#2796 id=2796 data-nosnippet>2796</a> })<span class="question-mark">?</span>;
+<a href=#2797 id=2797 data-nosnippet>2797</a> <span class="kw">let </span>value = v.try_into(value_ty)<span class="question-mark">?</span>;
+<a href=#2798 id=2798 data-nosnippet>2798</a> <span class="kw">if </span>map_ty.value_field.required && value.is_none() {
+<a href=#2799 id=2799 data-nosnippet>2799</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2800 id=2800 data-nosnippet>2800</a> <span class="string">"list"</span>,
+<a href=#2801 id=2801 data-nosnippet>2801</a> <span class="string">"Value element is required in this Map"</span>,
+<a href=#2802 id=2802 data-nosnippet>2802</a> ));
+<a href=#2803 id=2803 data-nosnippet>2803</a> }
+<a href=#2804 id=2804 data-nosnippet>2804</a> map.insert(key, value);
+<a href=#2805 id=2805 data-nosnippet>2805</a> }
+<a href=#2806 id=2806 data-nosnippet>2806</a> <span class="kw">_ </span>=> {
+<a href=#2807 id=2807 data-nosnippet>2807</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2808 id=2808 data-nosnippet>2808</a> <span class="string">"list"</span>,
+<a href=#2809 id=2809 data-nosnippet>2809</a> <span class="string">"The elements of record in list are not key and value"</span>,
+<a href=#2810 id=2810 data-nosnippet>2810</a> ));
+<a href=#2811 id=2811 data-nosnippet>2811</a> }
+<a href=#2812 id=2812 data-nosnippet>2812</a> }
+<a href=#2813 id=2813 data-nosnippet>2813</a> } <span class="kw">else </span>{
+<a href=#2814 id=2814 data-nosnippet>2814</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2815 id=2815 data-nosnippet>2815</a> <span class="string">"list"</span>,
+<a href=#2816 id=2816 data-nosnippet>2816</a> <span class="string">"Map should represented as record array."</span>,
+<a href=#2817 id=2817 data-nosnippet>2817</a> ));
+<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="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Map(map)))
+<a href=#2821 id=2821 data-nosnippet>2821</a> }
+<a href=#2822 id=2822 data-nosnippet>2822</a> Type::Primitive(PrimitiveType::Uuid) => {
+<a href=#2823 id=2823 data-nosnippet>2823</a> <span class="kw">if </span>v.list.len() != <span class="number">16 </span>{
+<a href=#2824 id=2824 data-nosnippet>2824</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2825 id=2825 data-nosnippet>2825</a> <span class="string">"list"</span>,
+<a href=#2826 id=2826 data-nosnippet>2826</a> <span class="string">"The length of list should be 16"</span>,
+<a href=#2827 id=2827 data-nosnippet>2827</a> ));
+<a href=#2828 id=2828 data-nosnippet>2828</a> }
+<a href=#2829 id=2829 data-nosnippet>2829</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=#2830 id=2830 data-nosnippet>2830</a> <span class="kw">for </span>(i, v) <span class="kw">in </span>v.list.iter().enumerate() {
+<a href=#2831 id=2831 data-nosnippet>2831</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
+<a href=#2832 id=2832 data-nosnippet>2832</a> bytes[i] = <span class="kw-2">*</span>v <span class="kw">as </span>u8;
+<a href=#2833 id=2833 data-nosnippet>2833</a> } <span class="kw">else </span>{
+<a href=#2834 id=2834 data-nosnippet>2834</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2835 id=2835 data-nosnippet>2835</a> <span class="string">"list"</span>,
+<a href=#2836 id=2836 data-nosnippet>2836</a> <span class="string">"The element of list should be int"</span>,
+<a href=#2837 id=2837 data-nosnippet>2837</a> ));
+<a href=#2838 id=2838 data-nosnippet>2838</a> }
+<a href=#2839 id=2839 data-nosnippet>2839</a> }
+<a href=#2840 id=2840 data-nosnippet>2840</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::uuid(uuid::Uuid::from_bytes(bytes))))
+<a href=#2841 id=2841 data-nosnippet>2841</a> }
+<a href=#2842 id=2842 data-nosnippet>2842</a> Type::Primitive(PrimitiveType::Decimal {
+<a href=#2843 id=2843 data-nosnippet>2843</a> precision: <span class="kw">_</span>,
+<a href=#2844 id=2844 data-nosnippet>2844</a> scale: <span class="kw">_</span>,
+<a href=#2845 id=2845 data-nosnippet>2845</a> }) => {
+<a href=#2846 id=2846 data-nosnippet>2846</a> <span class="kw">if </span>v.list.len() != <span class="number">16 </span>{
+<a href=#2847 id=2847 data-nosnippet>2847</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2848 id=2848 data-nosnippet>2848</a> <span class="string">"list"</span>,
+<a href=#2849 id=2849 data-nosnippet>2849</a> <span class="string">"The length of list should be 16"</span>,
+<a href=#2850 id=2850 data-nosnippet>2850</a> ));
+<a href=#2851 id=2851 data-nosnippet>2851</a> }
+<a href=#2852 id=2852 data-nosnippet>2852</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=#2853 id=2853 data-nosnippet>2853</a> <span class="kw">for </span>(i, v) <span class="kw">in </span>v.list.iter().enumerate() {
+<a href=#2854 id=2854 data-nosnippet>2854</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
+<a href=#2855 id=2855 data-nosnippet>2855</a> bytes[i] = <span class="kw-2">*</span>v <span class="kw">as </span>u8;
+<a href=#2856 id=2856 data-nosnippet>2856</a> } <span class="kw">else </span>{
+<a href=#2857 id=2857 data-nosnippet>2857</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2858 id=2858 data-nosnippet>2858</a> <span class="string">"list"</span>,
+<a href=#2859 id=2859 data-nosnippet>2859</a> <span class="string">"The element of list should be int"</span>,
+<a href=#2860 id=2860 data-nosnippet>2860</a> ));
+<a href=#2861 id=2861 data-nosnippet>2861</a> }
+<a href=#2862 id=2862 data-nosnippet>2862</a> }
+<a href=#2863 id=2863 data-nosnippet>2863</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::decimal(i128::from_be_bytes(bytes))))
+<a href=#2864 id=2864 data-nosnippet>2864</a> }
+<a href=#2865 id=2865 data-nosnippet>2865</a> Type::Primitive(PrimitiveType::Binary) => {
+<a href=#2866 id=2866 data-nosnippet>2866</a> <span class="kw">let </span>bytes = v
+<a href=#2867 id=2867 data-nosnippet>2867</a> .list
+<a href=#2868 id=2868 data-nosnippet>2868</a> .into_iter()
+<a href=#2869 id=2869 data-nosnippet>2869</a> .map(|v| {
+<a href=#2870 id=2870 data-nosnippet>2870</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
+<a href=#2871 id=2871 data-nosnippet>2871</a> <span class="prelude-val">Ok</span>(v <span class="kw">as </span>u8)
+<a href=#2872 id=2872 data-nosnippet>2872</a> } <span class="kw">else </span>{
+<a href=#2873 id=2873 data-nosnippet>2873</a> <span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2874 id=2874 data-nosnippet>2874</a> <span class="string">"list"</span>,
+<a href=#2875 id=2875 data-nosnippet>2875</a> <span class="string">"The element of list should be int"</span>,
+<a href=#2876 id=2876 data-nosnippet>2876</a> ))
+<a href=#2877 id=2877 data-nosnippet>2877</a> }
+<a href=#2878 id=2878 data-nosnippet>2878</a> })
+<a href=#2879 id=2879 data-nosnippet>2879</a> .collect::<<span class="prelude-ty">Result</span><Vec<<span class="kw">_</span>>, Error>>()<span class="question-mark">?</span>;
+<a href=#2880 id=2880 data-nosnippet>2880</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::binary(bytes)))
+<a href=#2881 id=2881 data-nosnippet>2881</a> }
+<a href=#2882 id=2882 data-nosnippet>2882</a> Type::Primitive(PrimitiveType::Fixed(size)) => {
+<a href=#2883 id=2883 data-nosnippet>2883</a> <span class="kw">if </span>v.list.len() != <span class="kw-2">*</span>size <span class="kw">as </span>usize {
+<a href=#2884 id=2884 data-nosnippet>2884</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2885 id=2885 data-nosnippet>2885</a> <span class="string">"list"</span>,
+<a href=#2886 id=2886 data-nosnippet>2886</a> <span class="string">"The length of list should be equal to size"</span>,
+<a href=#2887 id=2887 data-nosnippet>2887</a> ));
+<a href=#2888 id=2888 data-nosnippet>2888</a> }
+<a href=#2889 id=2889 data-nosnippet>2889</a> <span class="kw">let </span>bytes = v
+<a href=#2890 id=2890 data-nosnippet>2890</a> .list
+<a href=#2891 id=2891 data-nosnippet>2891</a> .into_iter()
+<a href=#2892 id=2892 data-nosnippet>2892</a> .map(|v| {
+<a href=#2893 id=2893 data-nosnippet>2893</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(RawLiteralEnum::Long(v)) = v {
+<a href=#2894 id=2894 data-nosnippet>2894</a> <span class="prelude-val">Ok</span>(v <span class="kw">as </span>u8)
+<a href=#2895 id=2895 data-nosnippet>2895</a> } <span class="kw">else </span>{
+<a href=#2896 id=2896 data-nosnippet>2896</a> <span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2897 id=2897 data-nosnippet>2897</a> <span class="string">"list"</span>,
+<a href=#2898 id=2898 data-nosnippet>2898</a> <span class="string">"The element of list should be int"</span>,
+<a href=#2899 id=2899 data-nosnippet>2899</a> ))
+<a href=#2900 id=2900 data-nosnippet>2900</a> }
+<a href=#2901 id=2901 data-nosnippet>2901</a> })
+<a href=#2902 id=2902 data-nosnippet>2902</a> .collect::<<span class="prelude-ty">Result</span><Vec<<span class="kw">_</span>>, Error>>()<span class="question-mark">?</span>;
+<a href=#2903 id=2903 data-nosnippet>2903</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::fixed(bytes)))
+<a href=#2904 id=2904 data-nosnippet>2904</a> }
+<a href=#2905 id=2905 data-nosnippet>2905</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"list"</span>)),
+<a href=#2906 id=2906 data-nosnippet>2906</a> },
+<a href=#2907 id=2907 data-nosnippet>2907</a> RawLiteralEnum::Record(Record {
+<a href=#2908 id=2908 data-nosnippet>2908</a> required,
+<a href=#2909 id=2909 data-nosnippet>2909</a> optional: <span class="kw">_</span>,
+<a href=#2910 id=2910 data-nosnippet>2910</a> }) => <span class="kw">match </span>ty {
+<a href=#2911 id=2911 data-nosnippet>2911</a> Type::Struct(struct_ty) => {
+<a href=#2912 id=2912 data-nosnippet>2912</a> <span class="kw">let </span>iters: Vec<<span class="prelude-ty">Option</span><Literal>> = required
+<a href=#2913 id=2913 data-nosnippet>2913</a> .into_iter()
+<a href=#2914 id=2914 data-nosnippet>2914</a> .map(|(field_name, value)| {
+<a href=#2915 id=2915 data-nosnippet>2915</a> <span class="kw">let </span>field = struct_ty
+<a href=#2916 id=2916 data-nosnippet>2916</a> .field_by_name(field_name.as_str())
+<a href=#2917 id=2917 data-nosnippet>2917</a> .ok_or_else(|| {
+<a href=#2918 id=2918 data-nosnippet>2918</a> invalid_err_with_reason(
+<a href=#2919 id=2919 data-nosnippet>2919</a> <span class="string">"record"</span>,
+<a href=#2920 id=2920 data-nosnippet>2920</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=#2921 id=2921 data-nosnippet>2921</a> )
+<a href=#2922 id=2922 data-nosnippet>2922</a> })<span class="question-mark">?</span>;
+<a href=#2923 id=2923 data-nosnippet>2923</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=#2924 id=2924 data-nosnippet>2924</a> <span class="prelude-val">Ok</span>(value)
+<a href=#2925 id=2925 data-nosnippet>2925</a> })
+<a href=#2926 id=2926 data-nosnippet>2926</a> .collect::<<span class="prelude-ty">Result</span><<span class="kw">_</span>, Error>>()<span class="question-mark">?</span>;
+<a href=#2927 id=2927 data-nosnippet>2927</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=#2928 id=2928 data-nosnippet>2928</a> }
+<a href=#2929 id=2929 data-nosnippet>2929</a> Type::Map(map_ty) => {
+<a href=#2930 id=2930 data-nosnippet>2930</a> <span class="kw">if </span><span class="kw-2">*</span>map_ty.key_field.field_type != Type::Primitive(PrimitiveType::String) {
+<a href=#2931 id=2931 data-nosnippet>2931</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2932 id=2932 data-nosnippet>2932</a> <span class="string">"record"</span>,
+<a href=#2933 id=2933 data-nosnippet>2933</a> <span class="string">"Map key must be string"</span>,
+<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">let </span><span class="kw-2">mut </span>map = Map::new();
+<a href=#2937 id=2937 data-nosnippet>2937</a> <span class="kw">for </span>(k, v) <span class="kw">in </span>required {
+<a href=#2938 id=2938 data-nosnippet>2938</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=#2939 id=2939 data-nosnippet>2939</a> <span class="kw">if </span>map_ty.value_field.required && value.is_none() {
+<a href=#2940 id=2940 data-nosnippet>2940</a> <span class="kw">return </span><span class="prelude-val">Err</span>(invalid_err_with_reason(
+<a href=#2941 id=2941 data-nosnippet>2941</a> <span class="string">"record"</span>,
+<a href=#2942 id=2942 data-nosnippet>2942</a> <span class="string">"Value element is required in this Map"</span>,
+<a href=#2943 id=2943 data-nosnippet>2943</a> ));
+<a href=#2944 id=2944 data-nosnippet>2944</a> }
+<a href=#2945 id=2945 data-nosnippet>2945</a> map.insert(Literal::string(k), value);
+<a href=#2946 id=2946 data-nosnippet>2946</a> }
+<a href=#2947 id=2947 data-nosnippet>2947</a> <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(Literal::Map(map)))
+<a href=#2948 id=2948 data-nosnippet>2948</a> }
+<a href=#2949 id=2949 data-nosnippet>2949</a> <span class="kw">_ </span>=> <span class="prelude-val">Err</span>(invalid_err(<span class="string">"record"</span>)),
+<a href=#2950 id=2950 data-nosnippet>2950</a> },
+<a href=#2951 id=2951 data-nosnippet>2951</a> RawLiteralEnum::StringMap(<span class="kw">_</span>) => <span class="prelude-val">Err</span>(invalid_err(<span class="string">"string map"</span>)),
+<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>}
<a href=#2956 id=2956 data-nosnippet>2956</a>
-<a href=#2957 id=2957 data-nosnippet>2957</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=#2958 id=2958 data-nosnippet>2958</a> <span class="kw">let </span>raw_literal = RawLiteral::try_from(struct_literal.clone(), <span class="kw-2">&</span>struct_type).unwrap();
-<a href=#2959 id=2959 data-nosnippet>2959</a> writer.append_ser(raw_literal).unwrap();
-<a href=#2960 id=2960 data-nosnippet>2960</a> <span class="kw">let </span>encoded = writer.into_inner().unwrap();
+<a href=#2957 id=2957 data-nosnippet>2957</a><span class="attr">#[cfg(test)]
+<a href=#2958 id=2958 data-nosnippet>2958</a></span><span class="kw">mod </span>tests {
+<a href=#2959 id=2959 data-nosnippet>2959</a> <span class="kw">use </span>apache_avro::to_value;
+<a href=#2960 id=2960 data-nosnippet>2960</a> <span class="kw">use </span>apache_avro::types::Value;
<a href=#2961 id=2961 data-nosnippet>2961</a>
-<a href=#2962 id=2962 data-nosnippet>2962</a> <span class="kw">let </span>reader = apache_avro::Reader::new(<span class="kw-2">&*</span>encoded).unwrap();
-<a href=#2963 id=2963 data-nosnippet>2963</a> <span class="kw">for </span>record <span class="kw">in </span>reader {
-<a href=#2964 id=2964 data-nosnippet>2964</a> <span class="kw">let </span>result = apache_avro::from_value::<RawLiteral>(<span class="kw-2">&</span>record.unwrap()).unwrap();
-<a href=#2965 id=2965 data-nosnippet>2965</a> <span class="kw">let </span>desered_literal = result.try_into(<span class="kw-2">&</span>struct_type).unwrap().unwrap();
-<a href=#2966 id=2966 data-nosnippet>2966</a> <span class="macro">assert_eq!</span>(desered_literal, struct_literal);
-<a href=#2967 id=2967 data-nosnippet>2967</a> }
-<a href=#2968 id=2968 data-nosnippet>2968</a> }
-<a href=#2969 id=2969 data-nosnippet>2969</a>
-<a href=#2970 id=2970 data-nosnippet>2970</a> <span class="kw">fn </span>check_serialize_avro(literal: Literal, ty: <span class="kw-2">&</span>Type, expect_value: Value) {
-<a href=#2971 id=2971 data-nosnippet>2971</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=#2972 id=2972 data-nosnippet>2972</a>
-<a href=#2973 id=2973 data-nosnippet>2973</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=#2974 id=2974 data-nosnippet>2974</a> <span class="kw">let </span>schema = Schema::builder()
-<a href=#2975 id=2975 data-nosnippet>2975</a> .with_fields(fields.clone())
-<a href=#2976 id=2976 data-nosnippet>2976</a> .build()
-<a href=#2977 id=2977 data-nosnippet>2977</a> .unwrap();
-<a href=#2978 id=2978 data-nosnippet>2978</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=#2979 id=2979 data-nosnippet>2979</a> <span class="kw">let </span>struct_type = Type::Struct(StructType::new(fields));
-<a href=#2980 id=2980 data-nosnippet>2980</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=#2981 id=2981 data-nosnippet>2981</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=#2982 id=2982 data-nosnippet>2982</a> <span class="kw">let </span>raw_literal = RawLiteral::try_from(struct_literal.clone(), <span class="kw-2">&</span>struct_type).unwrap();
-<a href=#2983 id=2983 data-nosnippet>2983</a> <span class="kw">let </span>value = to_value(raw_literal)
-<a href=#2984 id=2984 data-nosnippet>2984</a> .unwrap()
-<a href=#2985 id=2985 data-nosnippet>2985</a> .resolve(<span class="kw-2">&</span>avro_schema)
-<a href=#2986 id=2986 data-nosnippet>2986</a> .unwrap();
-<a href=#2987 id=2987 data-nosnippet>2987</a> writer.append_value_ref(<span class="kw-2">&</span>value).unwrap();
-<a href=#2988 id=2988 data-nosnippet>2988</a> <span class="kw">let </span>encoded = writer.into_inner().unwrap();
-<a href=#2989 id=2989 data-nosnippet>2989</a>
-<a href=#2990 id=2990 data-nosnippet>2990</a> <span class="kw">let </span>reader = apache_avro::Reader::new(<span class="kw-2">&*</span>encoded).unwrap();
-<a href=#2991 id=2991 data-nosnippet>2991</a> <span class="kw">for </span>record <span class="kw">in </span>reader {
-<a href=#2992 id=2992 data-nosnippet>2992</a> <span class="macro">assert_eq!</span>(record.unwrap(), expect_value);
-<a href=#2993 id=2993 data-nosnippet>2993</a> }
-<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> <span class="attr">#[test]
-<a href=#2997 id=2997 data-nosnippet>2997</a> </span><span class="kw">fn </span>json_boolean() {
-<a href=#2998 id=2998 data-nosnippet>2998</a> <span class="kw">let </span>record = <span class="string">r#"true"#</span>;
-<a href=#2999 id=2999 data-nosnippet>2999</a>
-<a href=#3000 id=3000 data-nosnippet>3000</a> check_json_serde(
-<a href=#3001 id=3001 data-nosnippet>3001</a> record,
-<a href=#3002 id=3002 data-nosnippet>3002</a> Literal::Primitive(PrimitiveLiteral::Boolean(<span class="bool-val">true</span>)),
-<a href=#3003 id=3003 data-nosnippet>3003</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Boolean),
-<a href=#3004 id=3004 data-nosnippet>3004</a> );
-<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> <span class="attr">#[test]
-<a href=#3008 id=3008 data-nosnippet>3008</a> </span><span class="kw">fn </span>json_int() {
-<a href=#3009 id=3009 data-nosnippet>3009</a> <span class="kw">let </span>record = <span class="string">r#"32"#</span>;
-<a href=#3010 id=3010 data-nosnippet>3010</a>
-<a href=#3011 id=3011 data-nosnippet>3011</a> check_json_serde(
-<a href=#3012 id=3012 data-nosnippet>3012</a> record,
-<a href=#3013 id=3013 data-nosnippet>3013</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">32</span>)),
-<a href=#3014 id=3014 data-nosnippet>3014</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Int),
-<a href=#3015 id=3015 data-nosnippet>3015</a> );
-<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> <span class="attr">#[test]
-<a href=#3019 id=3019 data-nosnippet>3019</a> </span><span class="kw">fn </span>json_long() {
-<a href=#3020 id=3020 data-nosnippet>3020</a> <span class="kw">let </span>record = <span class="string">r#"32"#</span>;
-<a href=#3021 id=3021 data-nosnippet>3021</a>
-<a href=#3022 id=3022 data-nosnippet>3022</a> check_json_serde(
-<a href=#3023 id=3023 data-nosnippet>3023</a> record,
-<a href=#3024 id=3024 data-nosnippet>3024</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">32</span>)),
-<a href=#3025 id=3025 data-nosnippet>3025</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Long),
-<a href=#3026 id=3026 data-nosnippet>3026</a> );
+<a href=#2962 id=2962 data-nosnippet>2962</a> <span class="kw">use super</span>::<span class="kw-2">*</span>;
+<a href=#2963 id=2963 data-nosnippet>2963</a> <span class="kw">use </span><span class="kw">crate</span>::avro::schema_to_avro_schema;
+<a href=#2964 id=2964 data-nosnippet>2964</a> <span class="kw">use </span><span class="kw">crate</span>::spec::Schema;
+<a href=#2965 id=2965 data-nosnippet>2965</a> <span class="kw">use </span><span class="kw">crate</span>::spec::Type::Primitive;
+<a href=#2966 id=2966 data-nosnippet>2966</a> <span class="kw">use </span><span class="kw">crate</span>::spec::datatypes::{ListType, MapType, NestedField, StructType};
+<a href=#2967 id=2967 data-nosnippet>2967</a>
+<a href=#2968 id=2968 data-nosnippet>2968</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=#2969 id=2969 data-nosnippet>2969</a> <span class="kw">let </span>raw_json_value = serde_json::from_str::<JsonValue>(json).unwrap();
+<a href=#2970 id=2970 data-nosnippet>2970</a> <span class="kw">let </span>desered_literal =
+<a href=#2971 id=2971 data-nosnippet>2971</a> Literal::try_from_json(raw_json_value.clone(), expected_type).unwrap();
+<a href=#2972 id=2972 data-nosnippet>2972</a> <span class="macro">assert_eq!</span>(desered_literal, <span class="prelude-val">Some</span>(expected_literal.clone()));
+<a href=#2973 id=2973 data-nosnippet>2973</a>
+<a href=#2974 id=2974 data-nosnippet>2974</a> <span class="kw">let </span>expected_json_value: JsonValue = expected_literal.try_into_json(expected_type).unwrap();
+<a href=#2975 id=2975 data-nosnippet>2975</a> <span class="kw">let </span>sered_json = serde_json::to_string(<span class="kw-2">&</span>expected_json_value).unwrap();
+<a href=#2976 id=2976 data-nosnippet>2976</a> <span class="kw">let </span>parsed_json_value = serde_json::from_str::<JsonValue>(<span class="kw-2">&</span>sered_json).unwrap();
+<a href=#2977 id=2977 data-nosnippet>2977</a>
+<a href=#2978 id=2978 data-nosnippet>2978</a> <span class="macro">assert_eq!</span>(parsed_json_value, raw_json_value);
+<a href=#2979 id=2979 data-nosnippet>2979</a> }
+<a href=#2980 id=2980 data-nosnippet>2980</a>
+<a href=#2981 id=2981 data-nosnippet>2981</a> <span class="kw">fn </span>check_avro_bytes_serde(
+<a href=#2982 id=2982 data-nosnippet>2982</a> input: Vec<u8>,
+<a href=#2983 id=2983 data-nosnippet>2983</a> expected_datum: Datum,
+<a href=#2984 id=2984 data-nosnippet>2984</a> expected_type: <span class="kw-2">&</span>PrimitiveType,
+<a href=#2985 id=2985 data-nosnippet>2985</a> ) {
+<a href=#2986 id=2986 data-nosnippet>2986</a> <span class="kw">let </span>raw_schema = <span class="string">r#""bytes""#</span>;
+<a href=#2987 id=2987 data-nosnippet>2987</a> <span class="kw">let </span>schema = apache_avro::Schema::parse_str(raw_schema).unwrap();
+<a href=#2988 id=2988 data-nosnippet>2988</a>
+<a href=#2989 id=2989 data-nosnippet>2989</a> <span class="kw">let </span>bytes = ByteBuf::from(input);
+<a href=#2990 id=2990 data-nosnippet>2990</a> <span class="kw">let </span>datum = Datum::try_from_bytes(<span class="kw-2">&</span>bytes, expected_type.clone()).unwrap();
+<a href=#2991 id=2991 data-nosnippet>2991</a> <span class="macro">assert_eq!</span>(datum, expected_datum);
+<a href=#2992 id=2992 data-nosnippet>2992</a>
+<a href=#2993 id=2993 data-nosnippet>2993</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=#2994 id=2994 data-nosnippet>2994</a> writer.append_ser(datum.to_bytes().unwrap()).unwrap();
+<a href=#2995 id=2995 data-nosnippet>2995</a> <span class="kw">let </span>encoded = writer.into_inner().unwrap();
+<a href=#2996 id=2996 data-nosnippet>2996</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=#2997 id=2997 data-nosnippet>2997</a>
+<a href=#2998 id=2998 data-nosnippet>2998</a> <span class="kw">for </span>record <span class="kw">in </span>reader {
+<a href=#2999 id=2999 data-nosnippet>2999</a> <span class="kw">let </span>result = apache_avro::from_value::<ByteBuf>(<span class="kw-2">&</span>record.unwrap()).unwrap();
+<a href=#3000 id=3000 data-nosnippet>3000</a> <span class="kw">let </span>desered_datum = Datum::try_from_bytes(<span class="kw-2">&</span>result, expected_type.clone()).unwrap();
+<a href=#3001 id=3001 data-nosnippet>3001</a> <span class="macro">assert_eq!</span>(desered_datum, expected_datum);
+<a href=#3002 id=3002 data-nosnippet>3002</a> }
+<a href=#3003 id=3003 data-nosnippet>3003</a> }
+<a href=#3004 id=3004 data-nosnippet>3004</a>
+<a href=#3005 id=3005 data-nosnippet>3005</a> <span class="kw">fn </span>check_convert_with_avro(expected_literal: Literal, expected_type: <span class="kw-2">&</span>Type) {
+<a href=#3006 id=3006 data-nosnippet>3006</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=#3007 id=3007 data-nosnippet>3007</a> <span class="kw">let </span>schema = Schema::builder()
+<a href=#3008 id=3008 data-nosnippet>3008</a> .with_fields(fields.clone())
+<a href=#3009 id=3009 data-nosnippet>3009</a> .build()
+<a href=#3010 id=3010 data-nosnippet>3010</a> .unwrap();
+<a href=#3011 id=3011 data-nosnippet>3011</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=#3012 id=3012 data-nosnippet>3012</a> <span class="kw">let </span>struct_type = Type::Struct(StructType::new(fields));
+<a href=#3013 id=3013 data-nosnippet>3013</a> <span class="kw">let </span>struct_literal =
+<a href=#3014 id=3014 data-nosnippet>3014</a> Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[<span class="prelude-val">Some</span>(expected_literal.clone())]));
+<a href=#3015 id=3015 data-nosnippet>3015</a>
+<a href=#3016 id=3016 data-nosnippet>3016</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=#3017 id=3017 data-nosnippet>3017</a> <span class="kw">let </span>raw_literal = RawLiteral::try_from(struct_literal.clone(), <span class="kw-2">&</span>struct_type).unwrap();
+<a href=#3018 id=3018 data-nosnippet>3018</a> writer.append_ser(raw_literal).unwrap();
+<a href=#3019 id=3019 data-nosnippet>3019</a> <span class="kw">let </span>encoded = writer.into_inner().unwrap();
+<a href=#3020 id=3020 data-nosnippet>3020</a>
+<a href=#3021 id=3021 data-nosnippet>3021</a> <span class="kw">let </span>reader = apache_avro::Reader::new(<span class="kw-2">&*</span>encoded).unwrap();
+<a href=#3022 id=3022 data-nosnippet>3022</a> <span class="kw">for </span>record <span class="kw">in </span>reader {
+<a href=#3023 id=3023 data-nosnippet>3023</a> <span class="kw">let </span>result = apache_avro::from_value::<RawLiteral>(<span class="kw-2">&</span>record.unwrap()).unwrap();
+<a href=#3024 id=3024 data-nosnippet>3024</a> <span class="kw">let </span>desered_literal = result.try_into(<span class="kw-2">&</span>struct_type).unwrap().unwrap();
+<a href=#3025 id=3025 data-nosnippet>3025</a> <span class="macro">assert_eq!</span>(desered_literal, struct_literal);
+<a href=#3026 id=3026 data-nosnippet>3026</a> }
<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> <span class="attr">#[test]
-<a href=#3030 id=3030 data-nosnippet>3030</a> </span><span class="kw">fn </span>json_float() {
-<a href=#3031 id=3031 data-nosnippet>3031</a> <span class="kw">let </span>record = <span class="string">r#"1.0"#</span>;
-<a href=#3032 id=3032 data-nosnippet>3032</a>
-<a href=#3033 id=3033 data-nosnippet>3033</a> check_json_serde(
-<a href=#3034 id=3034 data-nosnippet>3034</a> record,
-<a href=#3035 id=3035 data-nosnippet>3035</a> Literal::Primitive(PrimitiveLiteral::Float(OrderedFloat(<span class="number">1.0</span>))),
-<a href=#3036 id=3036 data-nosnippet>3036</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Float),
-<a href=#3037 id=3037 data-nosnippet>3037</a> );
-<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> <span class="attr">#[test]
-<a href=#3041 id=3041 data-nosnippet>3041</a> </span><span class="kw">fn </span>json_double() {
-<a href=#3042 id=3042 data-nosnippet>3042</a> <span class="kw">let </span>record = <span class="string">r#"1.0"#</span>;
-<a href=#3043 id=3043 data-nosnippet>3043</a>
-<a href=#3044 id=3044 data-nosnippet>3044</a> check_json_serde(
-<a href=#3045 id=3045 data-nosnippet>3045</a> record,
-<a href=#3046 id=3046 data-nosnippet>3046</a> Literal::Primitive(PrimitiveLiteral::Double(OrderedFloat(<span class="number">1.0</span>))),
-<a href=#3047 id=3047 data-nosnippet>3047</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Double),
-<a href=#3048 id=3048 data-nosnippet>3048</a> );
-<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> <span class="attr">#[test]
-<a href=#3052 id=3052 data-nosnippet>3052</a> </span><span class="kw">fn </span>json_date() {
-<a href=#3053 id=3053 data-nosnippet>3053</a> <span class="kw">let </span>record = <span class="string">r#""2017-11-16""#</span>;
+<a href=#3029 id=3029 data-nosnippet>3029</a> <span class="kw">fn </span>check_serialize_avro(literal: Literal, ty: <span class="kw-2">&</span>Type, expect_value: Value) {
+<a href=#3030 id=3030 data-nosnippet>3030</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=#3031 id=3031 data-nosnippet>3031</a>
+<a href=#3032 id=3032 data-nosnippet>3032</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=#3033 id=3033 data-nosnippet>3033</a> <span class="kw">let </span>schema = Schema::builder()
+<a href=#3034 id=3034 data-nosnippet>3034</a> .with_fields(fields.clone())
+<a href=#3035 id=3035 data-nosnippet>3035</a> .build()
+<a href=#3036 id=3036 data-nosnippet>3036</a> .unwrap();
+<a href=#3037 id=3037 data-nosnippet>3037</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=#3038 id=3038 data-nosnippet>3038</a> <span class="kw">let </span>struct_type = Type::Struct(StructType::new(fields));
+<a href=#3039 id=3039 data-nosnippet>3039</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=#3040 id=3040 data-nosnippet>3040</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=#3041 id=3041 data-nosnippet>3041</a> <span class="kw">let </span>raw_literal = RawLiteral::try_from(struct_literal.clone(), <span class="kw-2">&</span>struct_type).unwrap();
+<a href=#3042 id=3042 data-nosnippet>3042</a> <span class="kw">let </span>value = to_value(raw_literal)
+<a href=#3043 id=3043 data-nosnippet>3043</a> .unwrap()
+<a href=#3044 id=3044 data-nosnippet>3044</a> .resolve(<span class="kw-2">&</span>avro_schema)
+<a href=#3045 id=3045 data-nosnippet>3045</a> .unwrap();
+<a href=#3046 id=3046 data-nosnippet>3046</a> writer.append_value_ref(<span class="kw-2">&</span>value).unwrap();
+<a href=#3047 id=3047 data-nosnippet>3047</a> <span class="kw">let </span>encoded = writer.into_inner().unwrap();
+<a href=#3048 id=3048 data-nosnippet>3048</a>
+<a href=#3049 id=3049 data-nosnippet>3049</a> <span class="kw">let </span>reader = apache_avro::Reader::new(<span class="kw-2">&*</span>encoded).unwrap();
+<a href=#3050 id=3050 data-nosnippet>3050</a> <span class="kw">for </span>record <span class="kw">in </span>reader {
+<a href=#3051 id=3051 data-nosnippet>3051</a> <span class="macro">assert_eq!</span>(record.unwrap(), expect_value);
+<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>
-<a href=#3055 id=3055 data-nosnippet>3055</a> check_json_serde(
-<a href=#3056 id=3056 data-nosnippet>3056</a> record,
-<a href=#3057 id=3057 data-nosnippet>3057</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">17486</span>)),
-<a href=#3058 id=3058 data-nosnippet>3058</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Date),
-<a href=#3059 id=3059 data-nosnippet>3059</a> );
-<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> <span class="attr">#[test]
-<a href=#3063 id=3063 data-nosnippet>3063</a> </span><span class="kw">fn </span>json_time() {
-<a href=#3064 id=3064 data-nosnippet>3064</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> <span class="attr">#[test]
+<a href=#3056 id=3056 data-nosnippet>3056</a> </span><span class="kw">fn </span>json_boolean() {
+<a href=#3057 id=3057 data-nosnippet>3057</a> <span class="kw">let </span>record = <span class="string">r#"true"#</span>;
+<a href=#3058 id=3058 data-nosnippet>3058</a>
+<a href=#3059 id=3059 data-nosnippet>3059</a> check_json_serde(
+<a href=#3060 id=3060 data-nosnippet>3060</a> record,
+<a href=#3061 id=3061 data-nosnippet>3061</a> Literal::Primitive(PrimitiveLiteral::Boolean(<span class="bool-val">true</span>)),
+<a href=#3062 id=3062 data-nosnippet>3062</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Boolean),
+<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>
-<a href=#3066 id=3066 data-nosnippet>3066</a> check_json_serde(
-<a href=#3067 id=3067 data-nosnippet>3067</a> record,
-<a href=#3068 id=3068 data-nosnippet>3068</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">81068123456</span>)),
-<a href=#3069 id=3069 data-nosnippet>3069</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Time),
-<a href=#3070 id=3070 data-nosnippet>3070</a> );
-<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> <span class="attr">#[test]
-<a href=#3074 id=3074 data-nosnippet>3074</a> </span><span class="kw">fn </span>json_timestamp() {
-<a href=#3075 id=3075 data-nosnippet>3075</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> <span class="attr">#[test]
+<a href=#3067 id=3067 data-nosnippet>3067</a> </span><span class="kw">fn </span>json_int() {
+<a href=#3068 id=3068 data-nosnippet>3068</a> <span class="kw">let </span>record = <span class="string">r#"32"#</span>;
+<a href=#3069 id=3069 data-nosnippet>3069</a>
+<a href=#3070 id=3070 data-nosnippet>3070</a> check_json_serde(
+<a href=#3071 id=3071 data-nosnippet>3071</a> record,
+<a href=#3072 id=3072 data-nosnippet>3072</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">32</span>)),
+<a href=#3073 id=3073 data-nosnippet>3073</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Int),
+<a href=#3074 id=3074 data-nosnippet>3074</a> );
+<a href=#3075 id=3075 data-nosnippet>3075</a> }
<a href=#3076 id=3076 data-nosnippet>3076</a>
-<a href=#3077 id=3077 data-nosnippet>3077</a> check_json_serde(
-<a href=#3078 id=3078 data-nosnippet>3078</a> record,
-<a href=#3079 id=3079 data-nosnippet>3079</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
-<a href=#3080 id=3080 data-nosnippet>3080</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Timestamp),
-<a href=#3081 id=3081 data-nosnippet>3081</a> );
-<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> <span class="attr">#[test]
-<a href=#3085 id=3085 data-nosnippet>3085</a> </span><span class="kw">fn </span>json_timestamptz() {
-<a href=#3086 id=3086 data-nosnippet>3086</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> <span class="attr">#[test]
+<a href=#3078 id=3078 data-nosnippet>3078</a> </span><span class="kw">fn </span>json_long() {
+<a href=#3079 id=3079 data-nosnippet>3079</a> <span class="kw">let </span>record = <span class="string">r#"32"#</span>;
+<a href=#3080 id=3080 data-nosnippet>3080</a>
+<a href=#3081 id=3081 data-nosnippet>3081</a> check_json_serde(
+<a href=#3082 id=3082 data-nosnippet>3082</a> record,
+<a href=#3083 id=3083 data-nosnippet>3083</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">32</span>)),
+<a href=#3084 id=3084 data-nosnippet>3084</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Long),
+<a href=#3085 id=3085 data-nosnippet>3085</a> );
+<a href=#3086 id=3086 data-nosnippet>3086</a> }
<a href=#3087 id=3087 data-nosnippet>3087</a>
-<a href=#3088 id=3088 data-nosnippet>3088</a> check_json_serde(
-<a href=#3089 id=3089 data-nosnippet>3089</a> record,
-<a href=#3090 id=3090 data-nosnippet>3090</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
-<a href=#3091 id=3091 data-nosnippet>3091</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Timestamptz),
-<a href=#3092 id=3092 data-nosnippet>3092</a> );
-<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> <span class="attr">#[test]
-<a href=#3096 id=3096 data-nosnippet>3096</a> </span><span class="kw">fn </span>json_string() {
-<a href=#3097 id=3097 data-nosnippet>3097</a> <span class="kw">let </span>record = <span class="string">r#""iceberg""#</span>;
+<a href=#3088 id=3088 data-nosnippet>3088</a> <span class="attr">#[test]
+<a href=#3089 id=3089 data-nosnippet>3089</a> </span><span class="kw">fn </span>json_float() {
+<a href=#3090 id=3090 data-nosnippet>3090</a> <span class="kw">let </span>record = <span class="string">r#"1.0"#</span>;
+<a href=#3091 id=3091 data-nosnippet>3091</a>
+<a href=#3092 id=3092 data-nosnippet>3092</a> check_json_serde(
+<a href=#3093 id=3093 data-nosnippet>3093</a> record,
+<a href=#3094 id=3094 data-nosnippet>3094</a> Literal::Primitive(PrimitiveLiteral::Float(OrderedFloat(<span class="number">1.0</span>))),
+<a href=#3095 id=3095 data-nosnippet>3095</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Float),
+<a href=#3096 id=3096 data-nosnippet>3096</a> );
+<a href=#3097 id=3097 data-nosnippet>3097</a> }
<a href=#3098 id=3098 data-nosnippet>3098</a>
-<a href=#3099 id=3099 data-nosnippet>3099</a> check_json_serde(
-<a href=#3100 id=3100 data-nosnippet>3100</a> record,
-<a href=#3101 id=3101 data-nosnippet>3101</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"iceberg"</span>.to_string())),
-<a href=#3102 id=3102 data-nosnippet>3102</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::String),
-<a href=#3103 id=3103 data-nosnippet>3103</a> );
-<a href=#3104 id=3104 data-nosnippet>3104</a> }
-<a href=#3105 id=3105 data-nosnippet>3105</a>
-<a href=#3106 id=3106 data-nosnippet>3106</a> <span class="attr">#[test]
-<a href=#3107 id=3107 data-nosnippet>3107</a> </span><span class="kw">fn </span>json_uuid() {
-<a href=#3108 id=3108 data-nosnippet>3108</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> <span class="attr">#[test]
+<a href=#3100 id=3100 data-nosnippet>3100</a> </span><span class="kw">fn </span>json_double() {
+<a href=#3101 id=3101 data-nosnippet>3101</a> <span class="kw">let </span>record = <span class="string">r#"1.0"#</span>;
+<a href=#3102 id=3102 data-nosnippet>3102</a>
+<a href=#3103 id=3103 data-nosnippet>3103</a> check_json_serde(
+<a href=#3104 id=3104 data-nosnippet>3104</a> record,
+<a href=#3105 id=3105 data-nosnippet>3105</a> Literal::Primitive(PrimitiveLiteral::Double(OrderedFloat(<span class="number">1.0</span>))),
+<a href=#3106 id=3106 data-nosnippet>3106</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Double),
+<a href=#3107 id=3107 data-nosnippet>3107</a> );
+<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> check_json_serde(
-<a href=#3111 id=3111 data-nosnippet>3111</a> record,
-<a href=#3112 id=3112 data-nosnippet>3112</a> Literal::Primitive(PrimitiveLiteral::UInt128(
-<a href=#3113 id=3113 data-nosnippet>3113</a> Uuid::parse_str(<span class="string">"f79c3e09-677c-4bbd-a479-3f349cb785e7"</span>)
-<a href=#3114 id=3114 data-nosnippet>3114</a> .unwrap()
-<a href=#3115 id=3115 data-nosnippet>3115</a> .as_u128(),
-<a href=#3116 id=3116 data-nosnippet>3116</a> )),
-<a href=#3117 id=3117 data-nosnippet>3117</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Uuid),
+<a href=#3110 id=3110 data-nosnippet>3110</a> <span class="attr">#[test]
+<a href=#3111 id=3111 data-nosnippet>3111</a> </span><span class="kw">fn </span>json_date() {
+<a href=#3112 id=3112 data-nosnippet>3112</a> <span class="kw">let </span>record = <span class="string">r#""2017-11-16""#</span>;
+<a href=#3113 id=3113 data-nosnippet>3113</a>
+<a href=#3114 id=3114 data-nosnippet>3114</a> check_json_serde(
+<a href=#3115 id=3115 data-nosnippet>3115</a> record,
+<a href=#3116 id=3116 data-nosnippet>3116</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">17486</span>)),
+<a href=#3117 id=3117 data-nosnippet>3117</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Date),
<a href=#3118 id=3118 data-nosnippet>3118</a> );
<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> <span class="attr">#[test]
-<a href=#3122 id=3122 data-nosnippet>3122</a> </span><span class="kw">fn </span>json_decimal() {
-<a href=#3123 id=3123 data-nosnippet>3123</a> <span class="kw">let </span>record = <span class="string">r#""14.20""#</span>;
+<a href=#3122 id=3122 data-nosnippet>3122</a> </span><span class="kw">fn </span>json_time() {
+<a href=#3123 id=3123 data-nosnippet>3123</a> <span class="kw">let </span>record = <span class="string">r#""22:31:08.123456""#</span>;
<a href=#3124 id=3124 data-nosnippet>3124</a>
<a href=#3125 id=3125 data-nosnippet>3125</a> check_json_serde(
<a href=#3126 id=3126 data-nosnippet>3126</a> record,
-<a href=#3127 id=3127 data-nosnippet>3127</a> Literal::Primitive(PrimitiveLiteral::Int128(<span class="number">1420</span>)),
-<a href=#3128 id=3128 data-nosnippet>3128</a> <span class="kw-2">&</span>Type::decimal(<span class="number">28</span>, <span class="number">2</span>).unwrap(),
+<a href=#3127 id=3127 data-nosnippet>3127</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">81068123456</span>)),
+<a href=#3128 id=3128 data-nosnippet>3128</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Time),
<a href=#3129 id=3129 data-nosnippet>3129</a> );
<a href=#3130 id=3130 data-nosnippet>3130</a> }
<a href=#3131 id=3131 data-nosnippet>3131</a>
<a href=#3132 id=3132 data-nosnippet>3132</a> <span class="attr">#[test]
-<a href=#3133 id=3133 data-nosnippet>3133</a> </span><span class="kw">fn </span>json_struct() {
-<a href=#3134 id=3134 data-nosnippet>3134</a> <span class="kw">let </span>record = <span class="string">r#"{"1": 1, "2": "bar", "3": null}"#</span>;
+<a href=#3133 id=3133 data-nosnippet>3133</a> </span><span class="kw">fn </span>json_timestamp() {
+<a href=#3134 id=3134 data-nosnippet>3134</a> <span class="kw">let </span>record = <span class="string">r#""2017-11-16T22:31:08.123456""#</span>;
<a href=#3135 id=3135 data-nosnippet>3135</a>
<a href=#3136 id=3136 data-nosnippet>3136</a> check_json_serde(
<a href=#3137 id=3137 data-nosnippet>3137</a> record,
-<a href=#3138 id=3138 data-nosnippet>3138</a> Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[
-<a href=#3139 id=3139 data-nosnippet>3139</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3140 id=3140 data-nosnippet>3140</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::String(
-<a href=#3141 id=3141 data-nosnippet>3141</a> <span class="string">"bar"</span>.to_string(),
-<a href=#3142 id=3142 data-nosnippet>3142</a> ))),
-<a href=#3143 id=3143 data-nosnippet>3143</a> <span class="prelude-val">None</span>,
-<a href=#3144 id=3144 data-nosnippet>3144</a> ])),
-<a href=#3145 id=3145 data-nosnippet>3145</a> <span class="kw-2">&</span>Type::Struct(StructType::new(<span class="macro">vec!</span>[
-<a href=#3146 id=3146 data-nosnippet>3146</a> NestedField::required(<span class="number">1</span>, <span class="string">"id"</span>, Type::Primitive(PrimitiveType::Int)).into(),
-<a href=#3147 id=3147 data-nosnippet>3147</a> NestedField::optional(<span class="number">2</span>, <span class="string">"name"</span>, Type::Primitive(PrimitiveType::String)).into(),
-<a href=#3148 id=3148 data-nosnippet>3148</a> NestedField::optional(<span class="number">3</span>, <span class="string">"address"</span>, Type::Primitive(PrimitiveType::String)).into(),
-<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> }
-<a href=#3152 id=3152 data-nosnippet>3152</a>
-<a href=#3153 id=3153 data-nosnippet>3153</a> <span class="attr">#[test]
-<a href=#3154 id=3154 data-nosnippet>3154</a> </span><span class="kw">fn </span>json_list() {
-<a href=#3155 id=3155 data-nosnippet>3155</a> <span class="kw">let </span>record = <span class="string">r#"[1, 2, 3, null]"#</span>;
-<a href=#3156 id=3156 data-nosnippet>3156</a>
-<a href=#3157 id=3157 data-nosnippet>3157</a> check_json_serde(
-<a href=#3158 id=3158 data-nosnippet>3158</a> record,
-<a href=#3159 id=3159 data-nosnippet>3159</a> Literal::List(<span class="macro">vec!</span>[
-<a href=#3160 id=3160 data-nosnippet>3160</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3161 id=3161 data-nosnippet>3161</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
-<a href=#3162 id=3162 data-nosnippet>3162</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
-<a href=#3163 id=3163 data-nosnippet>3163</a> <span class="prelude-val">None</span>,
-<a href=#3164 id=3164 data-nosnippet>3164</a> ]),
-<a href=#3165 id=3165 data-nosnippet>3165</a> <span class="kw-2">&</span>Type::List(ListType {
-<a href=#3166 id=3166 data-nosnippet>3166</a> element_field: NestedField::list_element(
-<a href=#3167 id=3167 data-nosnippet>3167</a> <span class="number">0</span>,
-<a href=#3168 id=3168 data-nosnippet>3168</a> Type::Primitive(PrimitiveType::Int),
-<a href=#3169 id=3169 data-nosnippet>3169</a> <span class="bool-val">true</span>,
-<a href=#3170 id=3170 data-nosnippet>3170</a> )
-<a href=#3171 id=3171 data-nosnippet>3171</a> .into(),
-<a href=#3172 id=3172 data-nosnippet>3172</a> }),
-<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>
-<a href=#3176 id=3176 data-nosnippet>3176</a> <span class="attr">#[test]
-<a href=#3177 id=3177 data-nosnippet>3177</a> </span><span class="kw">fn </span>json_map() {
-<a href=#3178 id=3178 data-nosnippet>3178</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> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
+<a href=#3139 id=3139 data-nosnippet>3139</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Timestamp),
+<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_timestamptz() {
+<a href=#3145 id=3145 data-nosnippet>3145</a> <span class="kw">let </span>record = <span class="string">r#""2017-11-16T22:31:08.123456+00:00""#</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::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
+<a href=#3150 id=3150 data-nosnippet>3150</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Timestamptz),
+<a href=#3151 id=3151 data-nosnippet>3151</a> );
+<a href=#3152 id=3152 data-nosnippet>3152</a> }
+<a href=#3153 id=3153 data-nosnippet>3153</a>
+<a href=#3154 id=3154 data-nosnippet>3154</a> <span class="attr">#[test]
+<a href=#3155 id=3155 data-nosnippet>3155</a> </span><span class="kw">fn </span>json_string() {
+<a href=#3156 id=3156 data-nosnippet>3156</a> <span class="kw">let </span>record = <span class="string">r#""iceberg""#</span>;
+<a href=#3157 id=3157 data-nosnippet>3157</a>
+<a href=#3158 id=3158 data-nosnippet>3158</a> check_json_serde(
+<a href=#3159 id=3159 data-nosnippet>3159</a> record,
+<a href=#3160 id=3160 data-nosnippet>3160</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"iceberg"</span>.to_string())),
+<a href=#3161 id=3161 data-nosnippet>3161</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::String),
+<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> <span class="attr">#[test]
+<a href=#3166 id=3166 data-nosnippet>3166</a> </span><span class="kw">fn </span>json_uuid() {
+<a href=#3167 id=3167 data-nosnippet>3167</a> <span class="kw">let </span>record = <span class="string">r#""f79c3e09-677c-4bbd-a479-3f349cb785e7""#</span>;
+<a href=#3168 id=3168 data-nosnippet>3168</a>
+<a href=#3169 id=3169 data-nosnippet>3169</a> check_json_serde(
+<a href=#3170 id=3170 data-nosnippet>3170</a> record,
+<a href=#3171 id=3171 data-nosnippet>3171</a> Literal::Primitive(PrimitiveLiteral::UInt128(
+<a href=#3172 id=3172 data-nosnippet>3172</a> Uuid::parse_str(<span class="string">"f79c3e09-677c-4bbd-a479-3f349cb785e7"</span>)
+<a href=#3173 id=3173 data-nosnippet>3173</a> .unwrap()
+<a href=#3174 id=3174 data-nosnippet>3174</a> .as_u128(),
+<a href=#3175 id=3175 data-nosnippet>3175</a> )),
+<a href=#3176 id=3176 data-nosnippet>3176</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Uuid),
+<a href=#3177 id=3177 data-nosnippet>3177</a> );
+<a href=#3178 id=3178 data-nosnippet>3178</a> }
<a href=#3179 id=3179 data-nosnippet>3179</a>
-<a href=#3180 id=3180 data-nosnippet>3180</a> check_json_serde(
-<a href=#3181 id=3181 data-nosnippet>3181</a> record,
-<a href=#3182 id=3182 data-nosnippet>3182</a> Literal::Map(Map::from([
-<a href=#3183 id=3183 data-nosnippet>3183</a> (
-<a href=#3184 id=3184 data-nosnippet>3184</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"a"</span>.to_string())),
-<a href=#3185 id=3185 data-nosnippet>3185</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3186 id=3186 data-nosnippet>3186</a> ),
-<a href=#3187 id=3187 data-nosnippet>3187</a> (
-<a href=#3188 id=3188 data-nosnippet>3188</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"b"</span>.to_string())),
-<a href=#3189 id=3189 data-nosnippet>3189</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
-<a href=#3190 id=3190 data-nosnippet>3190</a> ),
-<a href=#3191 id=3191 data-nosnippet>3191</a> (
-<a href=#3192 id=3192 data-nosnippet>3192</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"c"</span>.to_string())),
-<a href=#3193 id=3193 data-nosnippet>3193</a> <span class="prelude-val">None</span>,
-<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="kw-2">&</span>Type::Map(MapType {
-<a href=#3197 id=3197 data-nosnippet>3197</a> key_field: NestedField::map_key_element(<span class="number">0</span>, Type::Primitive(PrimitiveType::String))
-<a href=#3198 id=3198 data-nosnippet>3198</a> .into(),
-<a href=#3199 id=3199 data-nosnippet>3199</a> value_field: NestedField::map_value_element(
-<a href=#3200 id=3200 data-nosnippet>3200</a> <span class="number">1</span>,
-<a href=#3201 id=3201 data-nosnippet>3201</a> Type::Primitive(PrimitiveType::Int),
-<a href=#3202 id=3202 data-nosnippet>3202</a> <span class="bool-val">true</span>,
-<a href=#3203 id=3203 data-nosnippet>3203</a> )
-<a href=#3204 id=3204 data-nosnippet>3204</a> .into(),
-<a href=#3205 id=3205 data-nosnippet>3205</a> }),
-<a href=#3206 id=3206 data-nosnippet>3206</a> );
-<a href=#3207 id=3207 data-nosnippet>3207</a> }
-<a href=#3208 id=3208 data-nosnippet>3208</a>
-<a href=#3209 id=3209 data-nosnippet>3209</a> <span class="attr">#[test]
-<a href=#3210 id=3210 data-nosnippet>3210</a> </span><span class="kw">fn </span>avro_bytes_boolean() {
-<a href=#3211 id=3211 data-nosnippet>3211</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">1u8</span>];
-<a href=#3212 id=3212 data-nosnippet>3212</a>
-<a href=#3213 id=3213 data-nosnippet>3213</a> check_avro_bytes_serde(bytes, Datum::bool(<span class="bool-val">true</span>), <span class="kw-2">&</span>PrimitiveType::Boolean);
-<a href=#3214 id=3214 data-nosnippet>3214</a> }
+<a href=#3180 id=3180 data-nosnippet>3180</a> <span class="attr">#[test]
+<a href=#3181 id=3181 data-nosnippet>3181</a> </span><span class="kw">fn </span>json_decimal() {
+<a href=#3182 id=3182 data-nosnippet>3182</a> <span class="kw">let </span>record = <span class="string">r#""14.20""#</span>;
+<a href=#3183 id=3183 data-nosnippet>3183</a>
+<a href=#3184 id=3184 data-nosnippet>3184</a> check_json_serde(
+<a href=#3185 id=3185 data-nosnippet>3185</a> record,
+<a href=#3186 id=3186 data-nosnippet>3186</a> Literal::Primitive(PrimitiveLiteral::Int128(<span class="number">1420</span>)),
+<a href=#3187 id=3187 data-nosnippet>3187</a> <span class="kw-2">&</span>Type::decimal(<span class="number">28</span>, <span class="number">2</span>).unwrap(),
+<a href=#3188 id=3188 data-nosnippet>3188</a> );
+<a href=#3189 id=3189 data-nosnippet>3189</a> }
+<a href=#3190 id=3190 data-nosnippet>3190</a>
+<a href=#3191 id=3191 data-nosnippet>3191</a> <span class="attr">#[test]
+<a href=#3192 id=3192 data-nosnippet>3192</a> </span><span class="kw">fn </span>json_struct() {
+<a href=#3193 id=3193 data-nosnippet>3193</a> <span class="kw">let </span>record = <span class="string">r#"{"1": 1, "2": "bar", "3": null}"#</span>;
+<a href=#3194 id=3194 data-nosnippet>3194</a>
+<a href=#3195 id=3195 data-nosnippet>3195</a> check_json_serde(
+<a href=#3196 id=3196 data-nosnippet>3196</a> record,
+<a href=#3197 id=3197 data-nosnippet>3197</a> Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[
+<a href=#3198 id=3198 data-nosnippet>3198</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3199 id=3199 data-nosnippet>3199</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::String(
+<a href=#3200 id=3200 data-nosnippet>3200</a> <span class="string">"bar"</span>.to_string(),
+<a href=#3201 id=3201 data-nosnippet>3201</a> ))),
+<a href=#3202 id=3202 data-nosnippet>3202</a> <span class="prelude-val">None</span>,
+<a href=#3203 id=3203 data-nosnippet>3203</a> ])),
+<a href=#3204 id=3204 data-nosnippet>3204</a> <span class="kw-2">&</span>Type::Struct(StructType::new(<span class="macro">vec!</span>[
+<a href=#3205 id=3205 data-nosnippet>3205</a> NestedField::required(<span class="number">1</span>, <span class="string">"id"</span>, Type::Primitive(PrimitiveType::Int)).into(),
+<a href=#3206 id=3206 data-nosnippet>3206</a> NestedField::optional(<span class="number">2</span>, <span class="string">"name"</span>, Type::Primitive(PrimitiveType::String)).into(),
+<a href=#3207 id=3207 data-nosnippet>3207</a> NestedField::optional(<span class="number">3</span>, <span class="string">"address"</span>, Type::Primitive(PrimitiveType::String)).into(),
+<a href=#3208 id=3208 data-nosnippet>3208</a> ])),
+<a href=#3209 id=3209 data-nosnippet>3209</a> );
+<a href=#3210 id=3210 data-nosnippet>3210</a> }
+<a href=#3211 id=3211 data-nosnippet>3211</a>
+<a href=#3212 id=3212 data-nosnippet>3212</a> <span class="attr">#[test]
+<a href=#3213 id=3213 data-nosnippet>3213</a> </span><span class="kw">fn </span>json_list() {
+<a href=#3214 id=3214 data-nosnippet>3214</a> <span class="kw">let </span>record = <span class="string">r#"[1, 2, 3, null]"#</span>;
<a href=#3215 id=3215 data-nosnippet>3215</a>
-<a href=#3216 id=3216 data-nosnippet>3216</a> <span class="attr">#[test]
-<a href=#3217 id=3217 data-nosnippet>3217</a> </span><span class="kw">fn </span>avro_bytes_int() {
-<a href=#3218 id=3218 data-nosnippet>3218</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=#3219 id=3219 data-nosnippet>3219</a>
-<a href=#3220 id=3220 data-nosnippet>3220</a> check_avro_bytes_serde(bytes, Datum::int(<span class="number">32</span>), <span class="kw-2">&</span>PrimitiveType::Int);
-<a href=#3221 id=3221 data-nosnippet>3221</a> }
-<a href=#3222 id=3222 data-nosnippet>3222</a>
-<a href=#3223 id=3223 data-nosnippet>3223</a> <span class="attr">#[test]
-<a href=#3224 id=3224 data-nosnippet>3224</a> </span><span class="kw">fn </span>avro_bytes_long() {
-<a href=#3225 id=3225 data-nosnippet>3225</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=#3226 id=3226 data-nosnippet>3226</a>
-<a href=#3227 id=3227 data-nosnippet>3227</a> check_avro_bytes_serde(bytes, Datum::long(<span class="number">32</span>), <span class="kw-2">&</span>PrimitiveType::Long);
-<a href=#3228 id=3228 data-nosnippet>3228</a> }
-<a href=#3229 id=3229 data-nosnippet>3229</a>
-<a href=#3230 id=3230 data-nosnippet>3230</a> <span class="attr">#[test]
-<a href=#3231 id=3231 data-nosnippet>3231</a> </span><span class="kw">fn </span>avro_bytes_long_from_int() {
-<a href=#3232 id=3232 data-nosnippet>3232</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=#3233 id=3233 data-nosnippet>3233</a>
-<a href=#3234 id=3234 data-nosnippet>3234</a> check_avro_bytes_serde(bytes, Datum::long(<span class="number">32</span>), <span class="kw-2">&</span>PrimitiveType::Long);
-<a href=#3235 id=3235 data-nosnippet>3235</a> }
-<a href=#3236 id=3236 data-nosnippet>3236</a>
-<a href=#3237 id=3237 data-nosnippet>3237</a> <span class="attr">#[test]
-<a href=#3238 id=3238 data-nosnippet>3238</a> </span><span class="kw">fn </span>avro_bytes_float() {
-<a href=#3239 id=3239 data-nosnippet>3239</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=#3240 id=3240 data-nosnippet>3240</a>
-<a href=#3241 id=3241 data-nosnippet>3241</a> check_avro_bytes_serde(bytes, Datum::float(<span class="number">1.0</span>), <span class="kw-2">&</span>PrimitiveType::Float);
-<a href=#3242 id=3242 data-nosnippet>3242</a> }
-<a href=#3243 id=3243 data-nosnippet>3243</a>
-<a href=#3244 id=3244 data-nosnippet>3244</a> <span class="attr">#[test]
-<a href=#3245 id=3245 data-nosnippet>3245</a> </span><span class="kw">fn </span>avro_bytes_double() {
-<a href=#3246 id=3246 data-nosnippet>3246</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=#3247 id=3247 data-nosnippet>3247</a>
-<a href=#3248 id=3248 data-nosnippet>3248</a> check_avro_bytes_serde(bytes, Datum::double(<span class="number">1.0</span>), <span class="kw-2">&</span>PrimitiveType::Double);
-<a href=#3249 id=3249 data-nosnippet>3249</a> }
-<a href=#3250 id=3250 data-nosnippet>3250</a>
-<a href=#3251 id=3251 data-nosnippet>3251</a> <span class="attr">#[test]
-<a href=#3252 id=3252 data-nosnippet>3252</a> </span><span class="kw">fn </span>avro_bytes_double_from_float() {
-<a href=#3253 id=3253 data-nosnippet>3253</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=#3254 id=3254 data-nosnippet>3254</a>
-<a href=#3255 id=3255 data-nosnippet>3255</a> check_avro_bytes_serde(bytes, Datum::double(<span class="number">1.0</span>), <span class="kw-2">&</span>PrimitiveType::Double);
-<a href=#3256 id=3256 data-nosnippet>3256</a> }
-<a href=#3257 id=3257 data-nosnippet>3257</a>
-<a href=#3258 id=3258 data-nosnippet>3258</a> <span class="attr">#[test]
-<a href=#3259 id=3259 data-nosnippet>3259</a> </span><span class="kw">fn </span>avro_bytes_string() {
-<a href=#3260 id=3260 data-nosnippet>3260</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=#3261 id=3261 data-nosnippet>3261</a>
-<a href=#3262 id=3262 data-nosnippet>3262</a> check_avro_bytes_serde(bytes, Datum::string(<span class="string">"iceberg"</span>), <span class="kw-2">&</span>PrimitiveType::String);
-<a href=#3263 id=3263 data-nosnippet>3263</a> }
-<a href=#3264 id=3264 data-nosnippet>3264</a>
-<a href=#3265 id=3265 data-nosnippet>3265</a> <span class="attr">#[test]
-<a href=#3266 id=3266 data-nosnippet>3266</a> </span><span class="kw">fn </span>avro_bytes_decimal() {
-<a href=#3267 id=3267 data-nosnippet>3267</a> <span class="comment">// (input_bytes, decimal_num, expect_scale, expect_precision)
-<a href=#3268 id=3268 data-nosnippet>3268</a> </span><span class="kw">let </span>cases = <span class="macro">vec!</span>[
-<a href=#3269 id=3269 data-nosnippet>3269</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=#3270 id=3270 data-nosnippet>3270</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=#3271 id=3271 data-nosnippet>3271</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=#3272 id=3272 data-nosnippet>3272</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=#3273 id=3273 data-nosnippet>3273</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=#3274 id=3274 data-nosnippet>3274</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=#3275 id=3275 data-nosnippet>3275</a> ];
-<a href=#3276 id=3276 data-nosnippet>3276</a>
-<a href=#3277 id=3277 data-nosnippet>3277</a> <span class="kw">for </span>(input_bytes, decimal_num, expect_scale, expect_precision) <span class="kw">in </span>cases {
-<a href=#3278 id=3278 data-nosnippet>3278</a> check_avro_bytes_serde(
-<a href=#3279 id=3279 data-nosnippet>3279</a> input_bytes,
-<a href=#3280 id=3280 data-nosnippet>3280</a> Datum::decimal_with_precision(
-<a href=#3281 id=3281 data-nosnippet>3281</a> Decimal::new(decimal_num, expect_scale),
-<a href=#3282 id=3282 data-nosnippet>3282</a> expect_precision,
-<a href=#3283 id=3283 data-nosnippet>3283</a> )
-<a href=#3284 id=3284 data-nosnippet>3284</a> .unwrap(),
-<a href=#3285 id=3285 data-nosnippet>3285</a> <span class="kw-2">&</span>PrimitiveType::Decimal {
-<a href=#3286 id=3286 data-nosnippet>3286</a> precision: expect_precision,
-<a href=#3287 id=3287 data-nosnippet>3287</a> scale: expect_scale,
-<a href=#3288 id=3288 data-nosnippet>3288</a> },
-<a href=#3289 id=3289 data-nosnippet>3289</a> );
-<a href=#3290 id=3290 data-nosnippet>3290</a> }
-<a href=#3291 id=3291 data-nosnippet>3291</a> }
+<a href=#3216 id=3216 data-nosnippet>3216</a> check_json_serde(
+<a href=#3217 id=3217 data-nosnippet>3217</a> record,
+<a href=#3218 id=3218 data-nosnippet>3218</a> Literal::List(<span class="macro">vec!</span>[
+<a href=#3219 id=3219 data-nosnippet>3219</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3220 id=3220 data-nosnippet>3220</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
+<a href=#3221 id=3221 data-nosnippet>3221</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
+<a href=#3222 id=3222 data-nosnippet>3222</a> <span class="prelude-val">None</span>,
+<a href=#3223 id=3223 data-nosnippet>3223</a> ]),
+<a href=#3224 id=3224 data-nosnippet>3224</a> <span class="kw-2">&</span>Type::List(ListType {
+<a href=#3225 id=3225 data-nosnippet>3225</a> element_field: NestedField::list_element(
+<a href=#3226 id=3226 data-nosnippet>3226</a> <span class="number">0</span>,
+<a href=#3227 id=3227 data-nosnippet>3227</a> Type::Primitive(PrimitiveType::Int),
+<a href=#3228 id=3228 data-nosnippet>3228</a> <span class="bool-val">true</span>,
+<a href=#3229 id=3229 data-nosnippet>3229</a> )
+<a href=#3230 id=3230 data-nosnippet>3230</a> .into(),
+<a href=#3231 id=3231 data-nosnippet>3231</a> }),
+<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>
+<a href=#3235 id=3235 data-nosnippet>3235</a> <span class="attr">#[test]
+<a href=#3236 id=3236 data-nosnippet>3236</a> </span><span class="kw">fn </span>json_map() {
+<a href=#3237 id=3237 data-nosnippet>3237</a> <span class="kw">let </span>record = <span class="string">r#"{ "keys": ["a", "b", "c"], "values": [1, 2, null] }"#</span>;
+<a href=#3238 id=3238 data-nosnippet>3238</a>
+<a href=#3239 id=3239 data-nosnippet>3239</a> check_json_serde(
+<a href=#3240 id=3240 data-nosnippet>3240</a> record,
+<a href=#3241 id=3241 data-nosnippet>3241</a> Literal::Map(Map::from([
+<a href=#3242 id=3242 data-nosnippet>3242</a> (
+<a href=#3243 id=3243 data-nosnippet>3243</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"a"</span>.to_string())),
+<a href=#3244 id=3244 data-nosnippet>3244</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3245 id=3245 data-nosnippet>3245</a> ),
+<a href=#3246 id=3246 data-nosnippet>3246</a> (
+<a href=#3247 id=3247 data-nosnippet>3247</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"b"</span>.to_string())),
+<a href=#3248 id=3248 data-nosnippet>3248</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
+<a href=#3249 id=3249 data-nosnippet>3249</a> ),
+<a href=#3250 id=3250 data-nosnippet>3250</a> (
+<a href=#3251 id=3251 data-nosnippet>3251</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"c"</span>.to_string())),
+<a href=#3252 id=3252 data-nosnippet>3252</a> <span class="prelude-val">None</span>,
+<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="kw-2">&</span>Type::Map(MapType {
+<a href=#3256 id=3256 data-nosnippet>3256</a> key_field: NestedField::map_key_element(<span class="number">0</span>, Type::Primitive(PrimitiveType::String))
+<a href=#3257 id=3257 data-nosnippet>3257</a> .into(),
+<a href=#3258 id=3258 data-nosnippet>3258</a> value_field: NestedField::map_value_element(
+<a href=#3259 id=3259 data-nosnippet>3259</a> <span class="number">1</span>,
+<a href=#3260 id=3260 data-nosnippet>3260</a> Type::Primitive(PrimitiveType::Int),
+<a href=#3261 id=3261 data-nosnippet>3261</a> <span class="bool-val">true</span>,
+<a href=#3262 id=3262 data-nosnippet>3262</a> )
+<a href=#3263 id=3263 data-nosnippet>3263</a> .into(),
+<a href=#3264 id=3264 data-nosnippet>3264</a> }),
+<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>
+<a href=#3268 id=3268 data-nosnippet>3268</a> <span class="attr">#[test]
+<a href=#3269 id=3269 data-nosnippet>3269</a> </span><span class="kw">fn </span>avro_bytes_boolean() {
+<a href=#3270 id=3270 data-nosnippet>3270</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">1u8</span>];
+<a href=#3271 id=3271 data-nosnippet>3271</a>
+<a href=#3272 id=3272 data-nosnippet>3272</a> check_avro_bytes_serde(bytes, Datum::bool(<span class="bool-val">true</span>), <span class="kw-2">&</span>PrimitiveType::Boolean);
+<a href=#3273 id=3273 data-nosnippet>3273</a> }
+<a href=#3274 id=3274 data-nosnippet>3274</a>
+<a href=#3275 id=3275 data-nosnippet>3275</a> <span class="attr">#[test]
+<a href=#3276 id=3276 data-nosnippet>3276</a> </span><span class="kw">fn </span>avro_bytes_int() {
+<a href=#3277 id=3277 data-nosnippet>3277</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=#3278 id=3278 data-nosnippet>3278</a>
+<a href=#3279 id=3279 data-nosnippet>3279</a> check_avro_bytes_serde(bytes, Datum::int(<span class="number">32</span>), <span class="kw-2">&</span>PrimitiveType::Int);
+<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> <span class="attr">#[test]
+<a href=#3283 id=3283 data-nosnippet>3283</a> </span><span class="kw">fn </span>avro_bytes_long() {
+<a href=#3284 id=3284 data-nosnippet>3284</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=#3285 id=3285 data-nosnippet>3285</a>
+<a href=#3286 id=3286 data-nosnippet>3286</a> check_avro_bytes_serde(bytes, Datum::long(<span class="number">32</span>), <span class="kw-2">&</span>PrimitiveType::Long);
+<a href=#3287 id=3287 data-nosnippet>3287</a> }
+<a href=#3288 id=3288 data-nosnippet>3288</a>
+<a href=#3289 id=3289 data-nosnippet>3289</a> <span class="attr">#[test]
+<a href=#3290 id=3290 data-nosnippet>3290</a> </span><span class="kw">fn </span>avro_bytes_long_from_int() {
+<a href=#3291 id=3291 data-nosnippet>3291</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=#3292 id=3292 data-nosnippet>3292</a>
-<a href=#3293 id=3293 data-nosnippet>3293</a> <span class="attr">#[test]
-<a href=#3294 id=3294 data-nosnippet>3294</a> </span><span class="kw">fn </span>avro_bytes_decimal_expect_error() {
-<a href=#3295 id=3295 data-nosnippet>3295</a> <span class="comment">// (decimal_num, expect_scale, expect_precision)
-<a href=#3296 id=3296 data-nosnippet>3296</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=#3297 id=3297 data-nosnippet>3297</a>
-<a href=#3298 id=3298 data-nosnippet>3298</a> <span class="kw">for </span>(decimal_num, expect_scale, expect_precision) <span class="kw">in </span>cases {
-<a href=#3299 id=3299 data-nosnippet>3299</a> <span class="kw">let </span>result = Datum::decimal_with_precision(
-<a href=#3300 id=3300 data-nosnippet>3300</a> Decimal::new(decimal_num, expect_scale),
-<a href=#3301 id=3301 data-nosnippet>3301</a> expect_precision,
-<a href=#3302 id=3302 data-nosnippet>3302</a> );
-<a href=#3303 id=3303 data-nosnippet>3303</a> <span class="macro">assert!</span>(result.is_err(), <span class="string">"expect error but got {result:?}"</span>);
-<a href=#3304 id=3304 data-nosnippet>3304</a> <span class="macro">assert_eq!</span>(
-<a href=#3305 id=3305 data-nosnippet>3305</a> result.unwrap_err().kind(),
-<a href=#3306 id=3306 data-nosnippet>3306</a> ErrorKind::DataInvalid,
-<a href=#3307 id=3307 data-nosnippet>3307</a> <span class="string">"expect error DataInvalid"</span>,
-<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>
-<a href=#3312 id=3312 data-nosnippet>3312</a> <span class="attr">#[test]
-<a href=#3313 id=3313 data-nosnippet>3313</a> </span><span class="kw">fn </span>avro_convert_test_int() {
-<a href=#3314 id=3314 data-nosnippet>3314</a> check_convert_with_avro(
-<a href=#3315 id=3315 data-nosnippet>3315</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">32</span>)),
-<a href=#3316 id=3316 data-nosnippet>3316</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Int),
-<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>
-<a href=#3320 id=3320 data-nosnippet>3320</a> <span class="attr">#[test]
-<a href=#3321 id=3321 data-nosnippet>3321</a> </span><span class="kw">fn </span>avro_convert_test_long() {
-<a href=#3322 id=3322 data-nosnippet>3322</a> check_convert_with_avro(
-<a href=#3323 id=3323 data-nosnippet>3323</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">32</span>)),
-<a href=#3324 id=3324 data-nosnippet>3324</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Long),
-<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>
-<a href=#3328 id=3328 data-nosnippet>3328</a> <span class="attr">#[test]
-<a href=#3329 id=3329 data-nosnippet>3329</a> </span><span class="kw">fn </span>avro_convert_test_float() {
-<a href=#3330 id=3330 data-nosnippet>3330</a> check_convert_with_avro(
-<a href=#3331 id=3331 data-nosnippet>3331</a> Literal::Primitive(PrimitiveLiteral::Float(OrderedFloat(<span class="number">1.0</span>))),
-<a href=#3332 id=3332 data-nosnippet>3332</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Float),
-<a href=#3333 id=3333 data-nosnippet>3333</a> );
-<a href=#3334 id=3334 data-nosnippet>3334</a> }
+<a href=#3293 id=3293 data-nosnippet>3293</a> check_avro_bytes_serde(bytes, Datum::long(<span class="number">32</span>), <span class="kw-2">&</span>PrimitiveType::Long);
+<a href=#3294 id=3294 data-nosnippet>3294</a> }
+<a href=#3295 id=3295 data-nosnippet>3295</a>
+<a href=#3296 id=3296 data-nosnippet>3296</a> <span class="attr">#[test]
+<a href=#3297 id=3297 data-nosnippet>3297</a> </span><span class="kw">fn </span>avro_bytes_float() {
+<a href=#3298 id=3298 data-nosnippet>3298</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=#3299 id=3299 data-nosnippet>3299</a>
+<a href=#3300 id=3300 data-nosnippet>3300</a> check_avro_bytes_serde(bytes, Datum::float(<span class="number">1.0</span>), <span class="kw-2">&</span>PrimitiveType::Float);
+<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_bytes_double() {
+<a href=#3305 id=3305 data-nosnippet>3305</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=#3306 id=3306 data-nosnippet>3306</a>
+<a href=#3307 id=3307 data-nosnippet>3307</a> check_avro_bytes_serde(bytes, Datum::double(<span class="number">1.0</span>), <span class="kw-2">&</span>PrimitiveType::Double);
+<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_bytes_double_from_float() {
+<a href=#3312 id=3312 data-nosnippet>3312</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=#3313 id=3313 data-nosnippet>3313</a>
+<a href=#3314 id=3314 data-nosnippet>3314</a> check_avro_bytes_serde(bytes, Datum::double(<span class="number">1.0</span>), <span class="kw-2">&</span>PrimitiveType::Double);
+<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> <span class="attr">#[test]
+<a href=#3318 id=3318 data-nosnippet>3318</a> </span><span class="kw">fn </span>avro_bytes_string() {
+<a href=#3319 id=3319 data-nosnippet>3319</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=#3320 id=3320 data-nosnippet>3320</a>
+<a href=#3321 id=3321 data-nosnippet>3321</a> check_avro_bytes_serde(bytes, Datum::string(<span class="string">"iceberg"</span>), <span class="kw-2">&</span>PrimitiveType::String);
+<a href=#3322 id=3322 data-nosnippet>3322</a> }
+<a href=#3323 id=3323 data-nosnippet>3323</a>
+<a href=#3324 id=3324 data-nosnippet>3324</a> <span class="attr">#[test]
+<a href=#3325 id=3325 data-nosnippet>3325</a> </span><span class="kw">fn </span>avro_bytes_decimal() {
+<a href=#3326 id=3326 data-nosnippet>3326</a> <span class="comment">// (input_bytes, decimal_num, expect_scale, expect_precision)
+<a href=#3327 id=3327 data-nosnippet>3327</a> </span><span class="kw">let </span>cases = <span class="macro">vec!</span>[
+<a href=#3328 id=3328 data-nosnippet>3328</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=#3329 id=3329 data-nosnippet>3329</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=#3330 id=3330 data-nosnippet>3330</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=#3331 id=3331 data-nosnippet>3331</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=#3332 id=3332 data-nosnippet>3332</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=#3333 id=3333 data-nosnippet>3333</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=#3334 id=3334 data-nosnippet>3334</a> ];
<a href=#3335 id=3335 data-nosnippet>3335</a>
-<a href=#3336 id=3336 data-nosnippet>3336</a> <span class="attr">#[test]
-<a href=#3337 id=3337 data-nosnippet>3337</a> </span><span class="kw">fn </span>avro_convert_test_double() {
-<a href=#3338 id=3338 data-nosnippet>3338</a> check_convert_with_avro(
-<a href=#3339 id=3339 data-nosnippet>3339</a> Literal::Primitive(PrimitiveLiteral::Double(OrderedFloat(<span class="number">1.0</span>))),
-<a href=#3340 id=3340 data-nosnippet>3340</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Double),
-<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>
-<a href=#3344 id=3344 data-nosnippet>3344</a> <span class="attr">#[test]
-<a href=#3345 id=3345 data-nosnippet>3345</a> </span><span class="kw">fn </span>avro_convert_test_string() {
-<a href=#3346 id=3346 data-nosnippet>3346</a> check_convert_with_avro(
-<a href=#3347 id=3347 data-nosnippet>3347</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"iceberg"</span>.to_string())),
-<a href=#3348 id=3348 data-nosnippet>3348</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::String),
-<a href=#3349 id=3349 data-nosnippet>3349</a> );
+<a href=#3336 id=3336 data-nosnippet>3336</a> <span class="kw">for </span>(input_bytes, decimal_num, expect_scale, expect_precision) <span class="kw">in </span>cases {
+<a href=#3337 id=3337 data-nosnippet>3337</a> check_avro_bytes_serde(
+<a href=#3338 id=3338 data-nosnippet>3338</a> input_bytes,
+<a href=#3339 id=3339 data-nosnippet>3339</a> Datum::decimal_with_precision(
+<a href=#3340 id=3340 data-nosnippet>3340</a> Decimal::new(decimal_num, expect_scale),
+<a href=#3341 id=3341 data-nosnippet>3341</a> expect_precision,
+<a href=#3342 id=3342 data-nosnippet>3342</a> )
+<a href=#3343 id=3343 data-nosnippet>3343</a> .unwrap(),
+<a href=#3344 id=3344 data-nosnippet>3344</a> <span class="kw-2">&</span>PrimitiveType::Decimal {
+<a href=#3345 id=3345 data-nosnippet>3345</a> precision: expect_precision,
+<a href=#3346 id=3346 data-nosnippet>3346</a> scale: expect_scale,
+<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> }
<a href=#3351 id=3351 data-nosnippet>3351</a>
<a href=#3352 id=3352 data-nosnippet>3352</a> <span class="attr">#[test]
-<a href=#3353 id=3353 data-nosnippet>3353</a> </span><span class="kw">fn </span>avro_convert_test_date() {
-<a href=#3354 id=3354 data-nosnippet>3354</a> check_convert_with_avro(
-<a href=#3355 id=3355 data-nosnippet>3355</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">17486</span>)),
-<a href=#3356 id=3356 data-nosnippet>3356</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Date),
-<a href=#3357 id=3357 data-nosnippet>3357</a> );
-<a href=#3358 id=3358 data-nosnippet>3358</a> }
-<a href=#3359 id=3359 data-nosnippet>3359</a>
-<a href=#3360 id=3360 data-nosnippet>3360</a> <span class="attr">#[test]
-<a href=#3361 id=3361 data-nosnippet>3361</a> </span><span class="kw">fn </span>avro_convert_test_time() {
-<a href=#3362 id=3362 data-nosnippet>3362</a> check_convert_with_avro(
-<a href=#3363 id=3363 data-nosnippet>3363</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">81068123456</span>)),
-<a href=#3364 id=3364 data-nosnippet>3364</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Time),
-<a href=#3365 id=3365 data-nosnippet>3365</a> );
-<a href=#3366 id=3366 data-nosnippet>3366</a> }
-<a href=#3367 id=3367 data-nosnippet>3367</a>
-<a href=#3368 id=3368 data-nosnippet>3368</a> <span class="attr">#[test]
-<a href=#3369 id=3369 data-nosnippet>3369</a> </span><span class="kw">fn </span>avro_convert_test_timestamp() {
-<a href=#3370 id=3370 data-nosnippet>3370</a> check_convert_with_avro(
-<a href=#3371 id=3371 data-nosnippet>3371</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
-<a href=#3372 id=3372 data-nosnippet>3372</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Timestamp),
-<a href=#3373 id=3373 data-nosnippet>3373</a> );
-<a href=#3374 id=3374 data-nosnippet>3374</a> }
-<a href=#3375 id=3375 data-nosnippet>3375</a>
-<a href=#3376 id=3376 data-nosnippet>3376</a> <span class="attr">#[test]
-<a href=#3377 id=3377 data-nosnippet>3377</a> </span><span class="kw">fn </span>avro_convert_test_timestamptz() {
-<a href=#3378 id=3378 data-nosnippet>3378</a> check_convert_with_avro(
-<a href=#3379 id=3379 data-nosnippet>3379</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
-<a href=#3380 id=3380 data-nosnippet>3380</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Timestamptz),
-<a href=#3381 id=3381 data-nosnippet>3381</a> );
-<a href=#3382 id=3382 data-nosnippet>3382</a> }
-<a href=#3383 id=3383 data-nosnippet>3383</a>
-<a href=#3384 id=3384 data-nosnippet>3384</a> <span class="attr">#[test]
-<a href=#3385 id=3385 data-nosnippet>3385</a> </span><span class="kw">fn </span>avro_convert_test_list() {
-<a href=#3386 id=3386 data-nosnippet>3386</a> check_convert_with_avro(
-<a href=#3387 id=3387 data-nosnippet>3387</a> Literal::List(<span class="macro">vec!</span>[
-<a href=#3388 id=3388 data-nosnippet>3388</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3389 id=3389 data-nosnippet>3389</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
-<a href=#3390 id=3390 data-nosnippet>3390</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
-<a href=#3391 id=3391 data-nosnippet>3391</a> <span class="prelude-val">None</span>,
-<a href=#3392 id=3392 data-nosnippet>3392</a> ]),
-<a href=#3393 id=3393 data-nosnippet>3393</a> <span class="kw-2">&</span>Type::List(ListType {
-<a href=#3394 id=3394 data-nosnippet>3394</a> element_field: NestedField::list_element(
-<a href=#3395 id=3395 data-nosnippet>3395</a> <span class="number">0</span>,
-<a href=#3396 id=3396 data-nosnippet>3396</a> Type::Primitive(PrimitiveType::Int),
-<a href=#3397 id=3397 data-nosnippet>3397</a> <span class="bool-val">false</span>,
-<a href=#3398 id=3398 data-nosnippet>3398</a> )
-<a href=#3399 id=3399 data-nosnippet>3399</a> .into(),
-<a href=#3400 id=3400 data-nosnippet>3400</a> }),
+<a href=#3353 id=3353 data-nosnippet>3353</a> </span><span class="kw">fn </span>avro_bytes_decimal_expect_error() {
+<a href=#3354 id=3354 data-nosnippet>3354</a> <span class="comment">// (decimal_num, expect_scale, expect_precision)
+<a href=#3355 id=3355 data-nosnippet>3355</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=#3356 id=3356 data-nosnippet>3356</a>
+<a href=#3357 id=3357 data-nosnippet>3357</a> <span class="kw">for </span>(decimal_num, expect_scale, expect_precision) <span class="kw">in </span>cases {
+<a href=#3358 id=3358 data-nosnippet>3358</a> <span class="kw">let </span>result = Datum::decimal_with_precision(
+<a href=#3359 id=3359 data-nosnippet>3359</a> Decimal::new(decimal_num, expect_scale),
+<a href=#3360 id=3360 data-nosnippet>3360</a> expect_precision,
+<a href=#3361 id=3361 data-nosnippet>3361</a> );
+<a href=#3362 id=3362 data-nosnippet>3362</a> <span class="macro">assert!</span>(result.is_err(), <span class="string">"expect error but got {result:?}"</span>);
+<a href=#3363 id=3363 data-nosnippet>3363</a> <span class="macro">assert_eq!</span>(
+<a href=#3364 id=3364 data-nosnippet>3364</a> result.unwrap_err().kind(),
+<a href=#3365 id=3365 data-nosnippet>3365</a> ErrorKind::DataInvalid,
+<a href=#3366 id=3366 data-nosnippet>3366</a> <span class="string">"expect error DataInvalid"</span>,
+<a href=#3367 id=3367 data-nosnippet>3367</a> );
+<a href=#3368 id=3368 data-nosnippet>3368</a> }
+<a href=#3369 id=3369 data-nosnippet>3369</a> }
+<a href=#3370 id=3370 data-nosnippet>3370</a>
+<a href=#3371 id=3371 data-nosnippet>3371</a> <span class="kw">fn </span>check_raw_literal_bytes_serde_via_avro(
+<a href=#3372 id=3372 data-nosnippet>3372</a> input_bytes: Vec<u8>,
+<a href=#3373 id=3373 data-nosnippet>3373</a> expected_literal: Literal,
+<a href=#3374 id=3374 data-nosnippet>3374</a> expected_type: <span class="kw-2">&</span>Type,
+<a href=#3375 id=3375 data-nosnippet>3375</a> ) {
+<a href=#3376 id=3376 data-nosnippet>3376</a> <span class="kw">use </span>apache_avro::types::Value;
+<a href=#3377 id=3377 data-nosnippet>3377</a>
+<a href=#3378 id=3378 data-nosnippet>3378</a> <span class="comment">// Create an Avro bytes value and deserialize it through the RawLiteral path
+<a href=#3379 id=3379 data-nosnippet>3379</a> </span><span class="kw">let </span>avro_value = Value::Bytes(input_bytes);
+<a href=#3380 id=3380 data-nosnippet>3380</a> <span class="kw">let </span>raw_literal: _serde::RawLiteral = apache_avro::from_value(<span class="kw-2">&</span>avro_value).unwrap();
+<a href=#3381 id=3381 data-nosnippet>3381</a> <span class="kw">let </span>result = raw_literal.try_into(expected_type).unwrap();
+<a href=#3382 id=3382 data-nosnippet>3382</a> <span class="macro">assert_eq!</span>(result, <span class="prelude-val">Some</span>(expected_literal));
+<a href=#3383 id=3383 data-nosnippet>3383</a> }
+<a href=#3384 id=3384 data-nosnippet>3384</a>
+<a href=#3385 id=3385 data-nosnippet>3385</a> <span class="kw">fn </span>check_raw_literal_bytes_error_via_avro(input_bytes: Vec<u8>, expected_type: <span class="kw-2">&</span>Type) {
+<a href=#3386 id=3386 data-nosnippet>3386</a> <span class="kw">use </span>apache_avro::types::Value;
+<a href=#3387 id=3387 data-nosnippet>3387</a>
+<a href=#3388 id=3388 data-nosnippet>3388</a> <span class="kw">let </span>avro_value = Value::Bytes(input_bytes);
+<a href=#3389 id=3389 data-nosnippet>3389</a> <span class="kw">let </span>raw_literal: _serde::RawLiteral = apache_avro::from_value(<span class="kw-2">&</span>avro_value).unwrap();
+<a href=#3390 id=3390 data-nosnippet>3390</a> <span class="kw">let </span>result = raw_literal.try_into(expected_type);
+<a href=#3391 id=3391 data-nosnippet>3391</a> <span class="macro">assert!</span>(result.is_err(), <span class="string">"Expected error but got: {:?}"</span>, result);
+<a href=#3392 id=3392 data-nosnippet>3392</a> }
+<a href=#3393 id=3393 data-nosnippet>3393</a>
+<a href=#3394 id=3394 data-nosnippet>3394</a> <span class="attr">#[test]
+<a href=#3395 id=3395 data-nosnippet>3395</a> </span><span class="kw">fn </span>test_raw_literal_bytes_binary() {
+<a href=#3396 id=3396 data-nosnippet>3396</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">1u8</span>, <span class="number">2u8</span>, <span class="number">3u8</span>, <span class="number">4u8</span>, <span class="number">5u8</span>];
+<a href=#3397 id=3397 data-nosnippet>3397</a> check_raw_literal_bytes_serde_via_avro(
+<a href=#3398 id=3398 data-nosnippet>3398</a> bytes.clone(),
+<a href=#3399 id=3399 data-nosnippet>3399</a> Literal::binary(bytes),
+<a href=#3400 id=3400 data-nosnippet>3400</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Binary),
<a href=#3401 id=3401 data-nosnippet>3401</a> );
-<a href=#3402 id=3402 data-nosnippet>3402</a>
-<a href=#3403 id=3403 data-nosnippet>3403</a> check_convert_with_avro(
-<a href=#3404 id=3404 data-nosnippet>3404</a> Literal::List(<span class="macro">vec!</span>[
-<a href=#3405 id=3405 data-nosnippet>3405</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3406 id=3406 data-nosnippet>3406</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
-<a href=#3407 id=3407 data-nosnippet>3407</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
-<a href=#3408 id=3408 data-nosnippet>3408</a> ]),
-<a href=#3409 id=3409 data-nosnippet>3409</a> <span class="kw-2">&</span>Type::List(ListType {
-<a href=#3410 id=3410 data-nosnippet>3410</a> element_field: NestedField::list_element(
-<a href=#3411 id=3411 data-nosnippet>3411</a> <span class="number">0</span>,
-<a href=#3412 id=3412 data-nosnippet>3412</a> Type::Primitive(PrimitiveType::Int),
-<a href=#3413 id=3413 data-nosnippet>3413</a> <span class="bool-val">true</span>,
-<a href=#3414 id=3414 data-nosnippet>3414</a> )
-<a href=#3415 id=3415 data-nosnippet>3415</a> .into(),
-<a href=#3416 id=3416 data-nosnippet>3416</a> }),
-<a href=#3417 id=3417 data-nosnippet>3417</a> );
-<a href=#3418 id=3418 data-nosnippet>3418</a> }
-<a href=#3419 id=3419 data-nosnippet>3419</a>
-<a href=#3420 id=3420 data-nosnippet>3420</a> <span class="kw">fn </span>check_convert_with_avro_map(expected_literal: Literal, expected_type: <span class="kw-2">&</span>Type) {
-<a href=#3421 id=3421 data-nosnippet>3421</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=#3422 id=3422 data-nosnippet>3422</a> <span class="kw">let </span>schema = Schema::builder()
-<a href=#3423 id=3423 data-nosnippet>3423</a> .with_fields(fields.clone())
-<a href=#3424 id=3424 data-nosnippet>3424</a> .build()
-<a href=#3425 id=3425 data-nosnippet>3425</a> .unwrap();
-<a href=#3426 id=3426 data-nosnippet>3426</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=#3427 id=3427 data-nosnippet>3427</a> <span class="kw">let </span>struct_type = Type::Struct(StructType::new(fields));
-<a href=#3428 id=3428 data-nosnippet>3428</a> <span class="kw">let </span>struct_literal =
-<a href=#3429 id=3429 data-nosnippet>3429</a> Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[<span class="prelude-val">Some</span>(expected_literal.clone())]));
-<a href=#3430 id=3430 data-nosnippet>3430</a>
-<a href=#3431 id=3431 data-nosnippet>3431</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=#3432 id=3432 data-nosnippet>3432</a> <span class="kw">let </span>raw_literal = RawLiteral::try_from(struct_literal.clone(), <span class="kw-2">&</span>struct_type).unwrap();
-<a href=#3433 id=3433 data-nosnippet>3433</a> writer.append_ser(raw_literal).unwrap();
-<a href=#3434 id=3434 data-nosnippet>3434</a> <span class="kw">let </span>encoded = writer.into_inner().unwrap();
-<a href=#3435 id=3435 data-nosnippet>3435</a>
-<a href=#3436 id=3436 data-nosnippet>3436</a> <span class="kw">let </span>reader = apache_avro::Reader::new(<span class="kw-2">&*</span>encoded).unwrap();
-<a href=#3437 id=3437 data-nosnippet>3437</a> <span class="kw">for </span>record <span class="kw">in </span>reader {
-<a href=#3438 id=3438 data-nosnippet>3438</a> <span class="kw">let </span>result = apache_avro::from_value::<RawLiteral>(<span class="kw-2">&</span>record.unwrap()).unwrap();
-<a href=#3439 id=3439 data-nosnippet>3439</a> <span class="kw">let </span>desered_literal = result.try_into(<span class="kw-2">&</span>struct_type).unwrap().unwrap();
-<a href=#3440 id=3440 data-nosnippet>3440</a> <span class="kw">match </span>(<span class="kw-2">&</span>desered_literal, <span class="kw-2">&</span>struct_literal) {
-<a href=#3441 id=3441 data-nosnippet>3441</a> (Literal::Struct(desered), Literal::Struct(expected)) => {
-<a href=#3442 id=3442 data-nosnippet>3442</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=#3443 id=3443 data-nosnippet>3443</a> (<span class="prelude-val">Some</span>(Literal::Map(desered)), <span class="prelude-val">Some</span>(Literal::Map(expected))) => {
-<a href=#3444 id=3444 data-nosnippet>3444</a> <span class="macro">assert!</span>(desered.has_same_content(expected))
-<a href=#3445 id=3445 data-nosnippet>3445</a> }
-<a href=#3446 id=3446 data-nosnippet>3446</a> <span class="kw">_ </span>=> {
-<a href=#3447 id=3447 data-nosnippet>3447</a> <span class="macro">unreachable!</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> }
-<a href=#3451 id=3451 data-nosnippet>3451</a> <span class="kw">_ </span>=> {
-<a href=#3452 id=3452 data-nosnippet>3452</a> <span class="macro">panic!</span>(<span class="string">"unexpected literal type"</span>);
-<a href=#3453 id=3453 data-nosnippet>3453</a> }
-<a href=#3454 id=3454 data-nosnippet>3454</a> }
-<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>
-<a href=#3458 id=3458 data-nosnippet>3458</a> <span class="attr">#[test]
-<a href=#3459 id=3459 data-nosnippet>3459</a> </span><span class="kw">fn </span>avro_convert_test_map() {
-<a href=#3460 id=3460 data-nosnippet>3460</a> check_convert_with_avro_map(
-<a href=#3461 id=3461 data-nosnippet>3461</a> Literal::Map(Map::from([
-<a href=#3462 id=3462 data-nosnippet>3462</a> (
-<a href=#3463 id=3463 data-nosnippet>3463</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>)),
-<a href=#3464 id=3464 data-nosnippet>3464</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1</span>))),
-<a href=#3465 id=3465 data-nosnippet>3465</a> ),
-<a href=#3466 id=3466 data-nosnippet>3466</a> (
-<a href=#3467 id=3467 data-nosnippet>3467</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>)),
-<a href=#3468 id=3468 data-nosnippet>3468</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">2</span>))),
-<a href=#3469 id=3469 data-nosnippet>3469</a> ),
-<a href=#3470 id=3470 data-nosnippet>3470</a> (Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>)), <span class="prelude-val">None</span>),
-<a href=#3471 id=3471 data-nosnippet>3471</a> ])),
-<a href=#3472 id=3472 data-nosnippet>3472</a> <span class="kw-2">&</span>Type::Map(MapType {
-<a href=#3473 id=3473 data-nosnippet>3473</a> key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::Int))
-<a href=#3474 id=3474 data-nosnippet>3474</a> .into(),
-<a href=#3475 id=3475 data-nosnippet>3475</a> value_field: NestedField::map_value_element(
-<a href=#3476 id=3476 data-nosnippet>3476</a> <span class="number">3</span>,
-<a href=#3477 id=3477 data-nosnippet>3477</a> Type::Primitive(PrimitiveType::Long),
-<a href=#3478 id=3478 data-nosnippet>3478</a> <span class="bool-val">false</span>,
-<a href=#3479 id=3479 data-nosnippet>3479</a> )
-<a href=#3480 id=3480 data-nosnippet>3480</a> .into(),
-<a href=#3481 id=3481 data-nosnippet>3481</a> }),
-<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> check_convert_with_avro_map(
-<a href=#3485 id=3485 data-nosnippet>3485</a> Literal::Map(Map::from([
-<a href=#3486 id=3486 data-nosnippet>3486</a> (
-<a href=#3487 id=3487 data-nosnippet>3487</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>)),
-<a href=#3488 id=3488 data-nosnippet>3488</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1</span>))),
-<a href=#3489 id=3489 data-nosnippet>3489</a> ),
-<a href=#3490 id=3490 data-nosnippet>3490</a> (
-<a href=#3491 id=3491 data-nosnippet>3491</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>)),
-<a href=#3492 id=3492 data-nosnippet>3492</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">2</span>))),
-<a href=#3493 id=3493 data-nosnippet>3493</a> ),
-<a href=#3494 id=3494 data-nosnippet>3494</a> (
-<a href=#3495 id=3495 data-nosnippet>3495</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>)),
-<a href=#3496 id=3496 data-nosnippet>3496</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">3</span>))),
-<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> <span class="kw-2">&</span>Type::Map(MapType {
-<a href=#3500 id=3500 data-nosnippet>3500</a> key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::Int))
-<a href=#3501 id=3501 data-nosnippet>3501</a> .into(),
-<a href=#3502 id=3502 data-nosnippet>3502</a> value_field: NestedField::map_value_element(
-<a href=#3503 id=3503 data-nosnippet>3503</a> <span class="number">3</span>,
-<a href=#3504 id=3504 data-nosnippet>3504</a> Type::Primitive(PrimitiveType::Long),
-<a href=#3505 id=3505 data-nosnippet>3505</a> <span class="bool-val">true</span>,
-<a href=#3506 id=3506 data-nosnippet>3506</a> )
-<a href=#3507 id=3507 data-nosnippet>3507</a> .into(),
-<a href=#3508 id=3508 data-nosnippet>3508</a> }),
-<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>
-<a href=#3512 id=3512 data-nosnippet>3512</a> <span class="attr">#[test]
-<a href=#3513 id=3513 data-nosnippet>3513</a> </span><span class="kw">fn </span>avro_convert_test_string_map() {
-<a href=#3514 id=3514 data-nosnippet>3514</a> check_convert_with_avro_map(
-<a href=#3515 id=3515 data-nosnippet>3515</a> Literal::Map(Map::from([
-<a href=#3516 id=3516 data-nosnippet>3516</a> (
-<a href=#3517 id=3517 data-nosnippet>3517</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"a"</span>.to_string())),
-<a href=#3518 id=3518 data-nosnippet>3518</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3519 id=3519 data-nosnippet>3519</a> ),
-<a href=#3520 id=3520 data-nosnippet>3520</a> (
-<a href=#3521 id=3521 data-nosnippet>3521</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"b"</span>.to_string())),
-<a href=#3522 id=3522 data-nosnippet>3522</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
-<a href=#3523 id=3523 data-nosnippet>3523</a> ),
-<a href=#3524 id=3524 data-nosnippet>3524</a> (
-<a href=#3525 id=3525 data-nosnippet>3525</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"c"</span>.to_string())),
-<a href=#3526 id=3526 data-nosnippet>3526</a> <span class="prelude-val">None</span>,
-<a href=#3527 id=3527 data-nosnippet>3527</a> ),
-<a href=#3528 id=3528 data-nosnippet>3528</a> ])),
-<a href=#3529 id=3529 data-nosnippet>3529</a> <span class="kw-2">&</span>Type::Map(MapType {
-<a href=#3530 id=3530 data-nosnippet>3530</a> key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::String))
-<a href=#3531 id=3531 data-nosnippet>3531</a> .into(),
-<a href=#3532 id=3532 data-nosnippet>3532</a> value_field: NestedField::map_value_element(
-<a href=#3533 id=3533 data-nosnippet>3533</a> <span class="number">3</span>,
-<a href=#3534 id=3534 data-nosnippet>3534</a> Type::Primitive(PrimitiveType::Int),
-<a href=#3535 id=3535 data-nosnippet>3535</a> <span class="bool-val">false</span>,
-<a href=#3536 id=3536 data-nosnippet>3536</a> )
-<a href=#3537 id=3537 data-nosnippet>3537</a> .into(),
-<a href=#3538 id=3538 data-nosnippet>3538</a> }),
-<a href=#3539 id=3539 data-nosnippet>3539</a> );
+<a href=#3402 id=3402 data-nosnippet>3402</a> }
+<a href=#3403 id=3403 data-nosnippet>3403</a>
+<a href=#3404 id=3404 data-nosnippet>3404</a> <span class="attr">#[test]
+<a href=#3405 id=3405 data-nosnippet>3405</a> </span><span class="kw">fn </span>test_raw_literal_bytes_binary_empty() {
+<a href=#3406 id=3406 data-nosnippet>3406</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[];
+<a href=#3407 id=3407 data-nosnippet>3407</a> check_raw_literal_bytes_serde_via_avro(
+<a href=#3408 id=3408 data-nosnippet>3408</a> bytes.clone(),
+<a href=#3409 id=3409 data-nosnippet>3409</a> Literal::binary(bytes),
+<a href=#3410 id=3410 data-nosnippet>3410</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Binary),
+<a href=#3411 id=3411 data-nosnippet>3411</a> );
+<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> <span class="attr">#[test]
+<a href=#3415 id=3415 data-nosnippet>3415</a> </span><span class="kw">fn </span>test_raw_literal_bytes_fixed_correct_length() {
+<a href=#3416 id=3416 data-nosnippet>3416</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">1u8</span>, <span class="number">2u8</span>, <span class="number">3u8</span>, <span class="number">4u8</span>];
+<a href=#3417 id=3417 data-nosnippet>3417</a> check_raw_literal_bytes_serde_via_avro(
+<a href=#3418 id=3418 data-nosnippet>3418</a> bytes.clone(),
+<a href=#3419 id=3419 data-nosnippet>3419</a> Literal::fixed(bytes),
+<a href=#3420 id=3420 data-nosnippet>3420</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Fixed(<span class="number">4</span>)),
+<a href=#3421 id=3421 data-nosnippet>3421</a> );
+<a href=#3422 id=3422 data-nosnippet>3422</a> }
+<a href=#3423 id=3423 data-nosnippet>3423</a>
+<a href=#3424 id=3424 data-nosnippet>3424</a> <span class="attr">#[test]
+<a href=#3425 id=3425 data-nosnippet>3425</a> </span><span class="kw">fn </span>test_raw_literal_bytes_fixed_wrong_length() {
+<a href=#3426 id=3426 data-nosnippet>3426</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">1u8</span>, <span class="number">2u8</span>, <span class="number">3u8</span>]; <span class="comment">// 3 bytes, but expecting 4
+<a href=#3427 id=3427 data-nosnippet>3427</a> </span>check_raw_literal_bytes_error_via_avro(bytes, <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Fixed(<span class="number">4</span>)));
+<a href=#3428 id=3428 data-nosnippet>3428</a> }
+<a href=#3429 id=3429 data-nosnippet>3429</a>
+<a href=#3430 id=3430 data-nosnippet>3430</a> <span class="attr">#[test]
+<a href=#3431 id=3431 data-nosnippet>3431</a> </span><span class="kw">fn </span>test_raw_literal_bytes_fixed_empty_correct_length() {
+<a href=#3432 id=3432 data-nosnippet>3432</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[];
+<a href=#3433 id=3433 data-nosnippet>3433</a> check_raw_literal_bytes_serde_via_avro(
+<a href=#3434 id=3434 data-nosnippet>3434</a> bytes.clone(),
+<a href=#3435 id=3435 data-nosnippet>3435</a> Literal::fixed(bytes),
+<a href=#3436 id=3436 data-nosnippet>3436</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Fixed(<span class="number">0</span>)),
+<a href=#3437 id=3437 data-nosnippet>3437</a> );
+<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> <span class="attr">#[test]
+<a href=#3441 id=3441 data-nosnippet>3441</a> </span><span class="kw">fn </span>test_raw_literal_bytes_uuid_correct_length() {
+<a href=#3442 id=3442 data-nosnippet>3442</a> <span class="kw">let </span>uuid_bytes = <span class="macro">vec!</span>[
+<a href=#3443 id=3443 data-nosnippet>3443</a> <span class="number">0x01</span>, <span class="number">0x23</span>, <span class="number">0x45</span>, <span class="number">0x67</span>, <span class="number">0x89</span>, <span class="number">0xab</span>, <span class="number">0xcd</span>, <span class="number">0xef</span>, <span class="number">0x01</span>, <span class="number">0x23</span>, <span class="number">0x45</span>, <span class="number">0x67</span>, <span class="number">0x89</ [...]
+<a href=#3444 id=3444 data-nosnippet>3444</a> <span class="number">0xcd</span>, <span class="number">0xef</span>,
+<a href=#3445 id=3445 data-nosnippet>3445</a> ];
+<a href=#3446 id=3446 data-nosnippet>3446</a> <span class="kw">let </span>expected_uuid = u128::from_be_bytes([
+<a href=#3447 id=3447 data-nosnippet>3447</a> <span class="number">0x01</span>, <span class="number">0x23</span>, <span class="number">0x45</span>, <span class="number">0x67</span>, <span class="number">0x89</span>, <span class="number">0xab</span>, <span class="number">0xcd</span>, <span class="number">0xef</span>, <span class="number">0x01</span>, <span class="number">0x23</span>, <span class="number">0x45</span>, <span class="number">0x67</span>, <span class="number">0x89</ [...]
+<a href=#3448 id=3448 data-nosnippet>3448</a> <span class="number">0xcd</span>, <span class="number">0xef</span>,
+<a href=#3449 id=3449 data-nosnippet>3449</a> ]);
+<a href=#3450 id=3450 data-nosnippet>3450</a> check_raw_literal_bytes_serde_via_avro(
+<a href=#3451 id=3451 data-nosnippet>3451</a> uuid_bytes,
+<a href=#3452 id=3452 data-nosnippet>3452</a> Literal::Primitive(PrimitiveLiteral::UInt128(expected_uuid)),
+<a href=#3453 id=3453 data-nosnippet>3453</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Uuid),
+<a href=#3454 id=3454 data-nosnippet>3454</a> );
+<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> <span class="attr">#[test]
+<a href=#3458 id=3458 data-nosnippet>3458</a> </span><span class="kw">fn </span>test_raw_literal_bytes_uuid_wrong_length() {
+<a href=#3459 id=3459 data-nosnippet>3459</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">1u8</span>, <span class="number">2u8</span>, <span class="number">3u8</span>]; <span class="comment">// 3 bytes, but UUID needs 16
+<a href=#3460 id=3460 data-nosnippet>3460</a> </span>check_raw_literal_bytes_error_via_avro(bytes, <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Uuid));
+<a href=#3461 id=3461 data-nosnippet>3461</a> }
+<a href=#3462 id=3462 data-nosnippet>3462</a>
+<a href=#3463 id=3463 data-nosnippet>3463</a> <span class="attr">#[test]
+<a href=#3464 id=3464 data-nosnippet>3464</a> </span><span class="kw">fn </span>test_raw_literal_bytes_decimal_precision_4_scale_2() {
+<a href=#3465 id=3465 data-nosnippet>3465</a> <span class="comment">// Precision 4 requires 2 bytes
+<a href=#3466 id=3466 data-nosnippet>3466</a> </span><span class="kw">let </span>decimal_bytes = <span class="macro">vec!</span>[<span class="number">0x04</span>, <span class="number">0xd2</span>]; <span class="comment">// 1234 in 2 bytes
+<a href=#3467 id=3467 data-nosnippet>3467</a> </span><span class="kw">let </span>expected_decimal = <span class="number">1234i128</span>;
+<a href=#3468 id=3468 data-nosnippet>3468</a> check_raw_literal_bytes_serde_via_avro(
+<a href=#3469 id=3469 data-nosnippet>3469</a> decimal_bytes,
+<a href=#3470 id=3470 data-nosnippet>3470</a> Literal::Primitive(PrimitiveLiteral::Int128(expected_decimal)),
+<a href=#3471 id=3471 data-nosnippet>3471</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Decimal {
+<a href=#3472 id=3472 data-nosnippet>3472</a> precision: <span class="number">4</span>,
+<a href=#3473 id=3473 data-nosnippet>3473</a> scale: <span class="number">2</span>,
+<a href=#3474 id=3474 data-nosnippet>3474</a> }),
+<a href=#3475 id=3475 data-nosnippet>3475</a> );
+<a href=#3476 id=3476 data-nosnippet>3476</a> }
+<a href=#3477 id=3477 data-nosnippet>3477</a>
+<a href=#3478 id=3478 data-nosnippet>3478</a> <span class="attr">#[test]
+<a href=#3479 id=3479 data-nosnippet>3479</a> </span><span class="kw">fn </span>test_raw_literal_bytes_decimal_precision_4_negative() {
+<a href=#3480 id=3480 data-nosnippet>3480</a> <span class="comment">// Precision 4 requires 2 bytes, negative number
+<a href=#3481 id=3481 data-nosnippet>3481</a> </span><span class="kw">let </span>decimal_bytes = <span class="macro">vec!</span>[<span class="number">0xfb</span>, <span class="number">0x2e</span>]; <span class="comment">// -1234 in 2 bytes
+<a href=#3482 id=3482 data-nosnippet>3482</a> </span><span class="kw">let </span>expected_decimal = -<span class="number">1234i128</span>;
+<a href=#3483 id=3483 data-nosnippet>3483</a> check_raw_literal_bytes_serde_via_avro(
+<a href=#3484 id=3484 data-nosnippet>3484</a> decimal_bytes,
+<a href=#3485 id=3485 data-nosnippet>3485</a> Literal::Primitive(PrimitiveLiteral::Int128(expected_decimal)),
+<a href=#3486 id=3486 data-nosnippet>3486</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Decimal {
+<a href=#3487 id=3487 data-nosnippet>3487</a> precision: <span class="number">4</span>,
+<a href=#3488 id=3488 data-nosnippet>3488</a> scale: <span class="number">2</span>,
+<a href=#3489 id=3489 data-nosnippet>3489</a> }),
+<a href=#3490 id=3490 data-nosnippet>3490</a> );
+<a href=#3491 id=3491 data-nosnippet>3491</a> }
+<a href=#3492 id=3492 data-nosnippet>3492</a>
+<a href=#3493 id=3493 data-nosnippet>3493</a> <span class="attr">#[test]
+<a href=#3494 id=3494 data-nosnippet>3494</a> </span><span class="kw">fn </span>test_raw_literal_bytes_decimal_precision_9_scale_2() {
+<a href=#3495 id=3495 data-nosnippet>3495</a> <span class="comment">// Precision 9 requires 4 bytes
+<a href=#3496 id=3496 data-nosnippet>3496</a> </span><span class="kw">let </span>decimal_bytes = <span class="macro">vec!</span>[<span class="number">0x00</span>, <span class="number">0x12</span>, <span class="number">0xd6</span>, <span class="number">0x87</span>]; <span class="comment">// 1234567 in 4 bytes
+<a href=#3497 id=3497 data-nosnippet>3497</a> </span><span class="kw">let </span>expected_decimal = <span class="number">1234567i128</span>;
+<a href=#3498 id=3498 data-nosnippet>3498</a> check_raw_literal_bytes_serde_via_avro(
+<a href=#3499 id=3499 data-nosnippet>3499</a> decimal_bytes,
+<a href=#3500 id=3500 data-nosnippet>3500</a> Literal::Primitive(PrimitiveLiteral::Int128(expected_decimal)),
+<a href=#3501 id=3501 data-nosnippet>3501</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Decimal {
+<a href=#3502 id=3502 data-nosnippet>3502</a> precision: <span class="number">9</span>,
+<a href=#3503 id=3503 data-nosnippet>3503</a> scale: <span class="number">2</span>,
+<a href=#3504 id=3504 data-nosnippet>3504</a> }),
+<a href=#3505 id=3505 data-nosnippet>3505</a> );
+<a href=#3506 id=3506 data-nosnippet>3506</a> }
+<a href=#3507 id=3507 data-nosnippet>3507</a>
+<a href=#3508 id=3508 data-nosnippet>3508</a> <span class="attr">#[test]
+<a href=#3509 id=3509 data-nosnippet>3509</a> </span><span class="kw">fn </span>test_raw_literal_bytes_decimal_precision_18_scale_2() {
+<a href=#3510 id=3510 data-nosnippet>3510</a> <span class="comment">// Precision 18 requires 8 bytes
+<a href=#3511 id=3511 data-nosnippet>3511</a> </span><span class="kw">let </span>decimal_bytes = <span class="macro">vec!</span>[<span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x04</span>, <span class="number">0xd2</span>]; <span class="comment">// 1234 in 8 bytes
+<a href=#3512 id=3512 data-nosnippet>3512</a> </span><span class="kw">let </span>expected_decimal = <span class="number">1234i128</span>;
+<a href=#3513 id=3513 data-nosnippet>3513</a> check_raw_literal_bytes_serde_via_avro(
+<a href=#3514 id=3514 data-nosnippet>3514</a> decimal_bytes,
+<a href=#3515 id=3515 data-nosnippet>3515</a> Literal::Primitive(PrimitiveLiteral::Int128(expected_decimal)),
+<a href=#3516 id=3516 data-nosnippet>3516</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Decimal {
+<a href=#3517 id=3517 data-nosnippet>3517</a> precision: <span class="number">18</span>,
+<a href=#3518 id=3518 data-nosnippet>3518</a> scale: <span class="number">2</span>,
+<a href=#3519 id=3519 data-nosnippet>3519</a> }),
+<a href=#3520 id=3520 data-nosnippet>3520</a> );
+<a href=#3521 id=3521 data-nosnippet>3521</a> }
+<a href=#3522 id=3522 data-nosnippet>3522</a>
+<a href=#3523 id=3523 data-nosnippet>3523</a> <span class="attr">#[test]
+<a href=#3524 id=3524 data-nosnippet>3524</a> </span><span class="kw">fn </span>test_raw_literal_bytes_decimal_precision_38_scale_2() {
+<a href=#3525 id=3525 data-nosnippet>3525</a> <span class="comment">// Precision 38 requires 16 bytes (maximum precision)
+<a href=#3526 id=3526 data-nosnippet>3526</a> </span><span class="kw">let </span>decimal_bytes = <span class="macro">vec!</span>[
+<a href=#3527 id=3527 data-nosnippet>3527</a> <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</span>, <span class="number">0x00</ [...]
+<a href=#3528 id=3528 data-nosnippet>3528</a> <span class="number">0x04</span>, <span class="number">0xd2</span>, <span class="comment">// 1234 in 16 bytes
+<a href=#3529 id=3529 data-nosnippet>3529</a> </span>];
+<a href=#3530 id=3530 data-nosnippet>3530</a> <span class="kw">let </span>expected_decimal = <span class="number">1234i128</span>;
+<a href=#3531 id=3531 data-nosnippet>3531</a> check_raw_literal_bytes_serde_via_avro(
+<a href=#3532 id=3532 data-nosnippet>3532</a> decimal_bytes,
+<a href=#3533 id=3533 data-nosnippet>3533</a> Literal::Primitive(PrimitiveLiteral::Int128(expected_decimal)),
+<a href=#3534 id=3534 data-nosnippet>3534</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Decimal {
+<a href=#3535 id=3535 data-nosnippet>3535</a> precision: <span class="number">38</span>,
+<a href=#3536 id=3536 data-nosnippet>3536</a> scale: <span class="number">2</span>,
+<a href=#3537 id=3537 data-nosnippet>3537</a> }),
+<a href=#3538 id=3538 data-nosnippet>3538</a> );
+<a href=#3539 id=3539 data-nosnippet>3539</a> }
<a href=#3540 id=3540 data-nosnippet>3540</a>
-<a href=#3541 id=3541 data-nosnippet>3541</a> check_convert_with_avro_map(
-<a href=#3542 id=3542 data-nosnippet>3542</a> Literal::Map(Map::from([
-<a href=#3543 id=3543 data-nosnippet>3543</a> (
-<a href=#3544 id=3544 data-nosnippet>3544</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"a"</span>.to_string())),
-<a href=#3545 id=3545 data-nosnippet>3545</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3546 id=3546 data-nosnippet>3546</a> ),
-<a href=#3547 id=3547 data-nosnippet>3547</a> (
-<a href=#3548 id=3548 data-nosnippet>3548</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"b"</span>.to_string())),
-<a href=#3549 id=3549 data-nosnippet>3549</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
-<a href=#3550 id=3550 data-nosnippet>3550</a> ),
-<a href=#3551 id=3551 data-nosnippet>3551</a> (
-<a href=#3552 id=3552 data-nosnippet>3552</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"c"</span>.to_string())),
-<a href=#3553 id=3553 data-nosnippet>3553</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
-<a href=#3554 id=3554 data-nosnippet>3554</a> ),
-<a href=#3555 id=3555 data-nosnippet>3555</a> ])),
-<a href=#3556 id=3556 data-nosnippet>3556</a> <span class="kw-2">&</span>Type::Map(MapType {
-<a href=#3557 id=3557 data-nosnippet>3557</a> key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::String))
-<a href=#3558 id=3558 data-nosnippet>3558</a> .into(),
-<a href=#3559 id=3559 data-nosnippet>3559</a> value_field: NestedField::map_value_element(
-<a href=#3560 id=3560 data-nosnippet>3560</a> <span class="number">3</span>,
-<a href=#3561 id=3561 data-nosnippet>3561</a> Type::Primitive(PrimitiveType::Int),
-<a href=#3562 id=3562 data-nosnippet>3562</a> <span class="bool-val">true</span>,
-<a href=#3563 id=3563 data-nosnippet>3563</a> )
-<a href=#3564 id=3564 data-nosnippet>3564</a> .into(),
-<a href=#3565 id=3565 data-nosnippet>3565</a> }),
-<a href=#3566 id=3566 data-nosnippet>3566</a> );
-<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="attr">#[test]
-<a href=#3570 id=3570 data-nosnippet>3570</a> </span><span class="kw">fn </span>avro_convert_test_record() {
-<a href=#3571 id=3571 data-nosnippet>3571</a> check_convert_with_avro(
-<a href=#3572 id=3572 data-nosnippet>3572</a> Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[
-<a href=#3573 id=3573 data-nosnippet>3573</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
-<a href=#3574 id=3574 data-nosnippet>3574</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::String(
-<a href=#3575 id=3575 data-nosnippet>3575</a> <span class="string">"bar"</span>.to_string(),
-<a href=#3576 id=3576 data-nosnippet>3576</a> ))),
-<a href=#3577 id=3577 data-nosnippet>3577</a> <span class="prelude-val">None</span>,
-<a href=#3578 id=3578 data-nosnippet>3578</a> ])),
-<a href=#3579 id=3579 data-nosnippet>3579</a> <span class="kw-2">&</span>Type::Struct(StructType::new(<span class="macro">vec!</span>[
-<a href=#3580 id=3580 data-nosnippet>3580</a> NestedField::required(<span class="number">2</span>, <span class="string">"id"</span>, Type::Primitive(PrimitiveType::Int)).into(),
-<a href=#3581 id=3581 data-nosnippet>3581</a> NestedField::optional(<span class="number">3</span>, <span class="string">"name"</span>, Type::Primitive(PrimitiveType::String)).into(),
-<a href=#3582 id=3582 data-nosnippet>3582</a> NestedField::optional(<span class="number">4</span>, <span class="string">"address"</span>, Type::Primitive(PrimitiveType::String)).into(),
-<a href=#3583 id=3583 data-nosnippet>3583</a> ])),
-<a href=#3584 id=3584 data-nosnippet>3584</a> );
-<a href=#3585 id=3585 data-nosnippet>3585</a> }
-<a href=#3586 id=3586 data-nosnippet>3586</a>
-<a href=#3587 id=3587 data-nosnippet>3587</a> <span class="comment">// # TODO:https://github.com/apache/iceberg-rust/issues/86
-<a href=#3588 id=3588 data-nosnippet>3588</a> // rust avro don't support deserialize any bytes representation now:
-<a href=#3589 id=3589 data-nosnippet>3589</a> // - binary
-<a href=#3590 id=3590 data-nosnippet>3590</a> // - decimal
-<a href=#3591 id=3591 data-nosnippet>3591</a> </span><span class="attr">#[test]
-<a href=#3592 id=3592 data-nosnippet>3592</a> </span><span class="kw">fn </span>avro_convert_test_binary_ser() {
-<a href=#3593 id=3593 data-nosnippet>3593</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=#3594 id=3594 data-nosnippet>3594</a> <span class="kw">let </span>ty = Type::Primitive(PrimitiveType::Binary);
-<a href=#3595 id=3595 data-nosnippet>3595</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=#3596 id=3596 data-nosnippet>3596</a> check_serialize_avro(literal, <span class="kw-2">&</span>ty, expect_value);
-<a href=#3597 id=3597 data-nosnippet>3597</a> }
-<a href=#3598 id=3598 data-nosnippet>3598</a>
-<a href=#3599 id=3599 data-nosnippet>3599</a> <span class="attr">#[test]
-<a href=#3600 id=3600 data-nosnippet>3600</a> </span><span class="kw">fn </span>avro_convert_test_decimal_ser() {
-<a href=#3601 id=3601 data-nosnippet>3601</a> <span class="kw">let </span>literal = Literal::decimal(<span class="number">12345</span>);
-<a href=#3602 id=3602 data-nosnippet>3602</a> <span class="kw">let </span>ty = Type::Primitive(PrimitiveType::Decimal {
-<a href=#3603 id=3603 data-nosnippet>3603</a> precision: <span class="number">9</span>,
-<a href=#3604 id=3604 data-nosnippet>3604</a> scale: <span class="number">8</span>,
-<a href=#3605 id=3605 data-nosnippet>3605</a> });
-<a href=#3606 id=3606 data-nosnippet>3606</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=#3607 id=3607 data-nosnippet>3607</a> check_serialize_avro(literal, <span class="kw-2">&</span>ty, expect_value);
-<a href=#3608 id=3608 data-nosnippet>3608</a> }
-<a href=#3609 id=3609 data-nosnippet>3609</a>
-<a href=#3610 id=3610 data-nosnippet>3610</a> <span class="comment">// # TODO:https://github.com/apache/iceberg-rust/issues/86
-<a href=#3611 id=3611 data-nosnippet>3611</a> // rust avro can't support to convert any byte-like type to fixed in avro now.
-<a href=#3612 id=3612 data-nosnippet>3612</a> // - uuid ser/de
-<a href=#3613 id=3613 data-nosnippet>3613</a> // - fixed ser/de
-<a href=#3614 id=3614 data-nosnippet>3614</a>
-<a href=#3615 id=3615 data-nosnippet>3615</a> </span><span class="attr">#[test]
-<a href=#3616 id=3616 data-nosnippet>3616</a> </span><span class="kw">fn </span>test_parse_timestamp() {
-<a href=#3617 id=3617 data-nosnippet>3617</a> <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"2021-08-01T01:09:00.0899"</span>).unwrap();
-<a href=#3618 id=3618 data-nosnippet>3618</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=#3619 id=3619 data-nosnippet>3619</a>
-<a href=#3620 id=3620 data-nosnippet>3620</a> <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"2023-01-06T00:00:00"</span>).unwrap();
-<a href=#3621 id=3621 data-nosnippet>3621</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=#3622 id=3622 data-nosnippet>3622</a>
-<a href=#3623 id=3623 data-nosnippet>3623</a> <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"2021-08-01T01:09:00.0899+0800"</span>);
-<a href=#3624 id=3624 data-nosnippet>3624</a> <span class="macro">assert!</span>(value.is_err(), <span class="string">"Parse timestamp with timezone should fail!"</span>);
-<a href=#3625 id=3625 data-nosnippet>3625</a>
-<a href=#3626 id=3626 data-nosnippet>3626</a> <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"dfa"</span>);
-<a href=#3627 id=3627 data-nosnippet>3627</a> <span class="macro">assert!</span>(
-<a href=#3628 id=3628 data-nosnippet>3628</a> value.is_err(),
-<a href=#3629 id=3629 data-nosnippet>3629</a> <span class="string">"Parse timestamp with invalid input should fail!"
-<a href=#3630 id=3630 data-nosnippet>3630</a> </span>);
-<a href=#3631 id=3631 data-nosnippet>3631</a> }
-<a href=#3632 id=3632 data-nosnippet>3632</a>
-<a href=#3633 id=3633 data-nosnippet>3633</a> <span class="attr">#[test]
-<a href=#3634 id=3634 data-nosnippet>3634</a> </span><span class="kw">fn </span>test_parse_timestamptz() {
-<a href=#3635 id=3635 data-nosnippet>3635</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=#3636 id=3636 data-nosnippet>3636</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=#3637 id=3637 data-nosnippet>3637</a>
-<a href=#3638 id=3638 data-nosnippet>3638</a> <span class="kw">let </span>value = Datum::timestamptz_from_str(<span class="string">"2021-08-01T01:09:00.0899"</span>);
-<a href=#3639 id=3639 data-nosnippet>3639</a> <span class="macro">assert!</span>(
-<a href=#3640 id=3640 data-nosnippet>3640</a> value.is_err(),
-<a href=#3641 id=3641 data-nosnippet>3641</a> <span class="string">"Parse timestamptz without timezone should fail!"
-<a href=#3642 id=3642 data-nosnippet>3642</a> </span>);
-<a href=#3643 id=3643 data-nosnippet>3643</a>
-<a href=#3644 id=3644 data-nosnippet>3644</a> <span class="kw">let </span>value = Datum::timestamptz_from_str(<span class="string">"dfa"</span>);
-<a href=#3645 id=3645 data-nosnippet>3645</a> <span class="macro">assert!</span>(
-<a href=#3646 id=3646 data-nosnippet>3646</a> value.is_err(),
-<a href=#3647 id=3647 data-nosnippet>3647</a> <span class="string">"Parse timestamptz with invalid input should fail!"
-<a href=#3648 id=3648 data-nosnippet>3648</a> </span>);
+<a href=#3541 id=3541 data-nosnippet>3541</a> <span class="attr">#[test]
+<a href=#3542 id=3542 data-nosnippet>3542</a> </span><span class="kw">fn </span>test_raw_literal_bytes_decimal_precision_1_scale_0() {
+<a href=#3543 id=3543 data-nosnippet>3543</a> <span class="comment">// Precision 1 requires 1 byte
+<a href=#3544 id=3544 data-nosnippet>3544</a> </span><span class="kw">let </span>decimal_bytes = <span class="macro">vec!</span>[<span class="number">0x07</span>]; <span class="comment">// 7 in 1 byte
+<a href=#3545 id=3545 data-nosnippet>3545</a> </span><span class="kw">let </span>expected_decimal = <span class="number">7i128</span>;
+<a href=#3546 id=3546 data-nosnippet>3546</a> check_raw_literal_bytes_serde_via_avro(
+<a href=#3547 id=3547 data-nosnippet>3547</a> decimal_bytes,
+<a href=#3548 id=3548 data-nosnippet>3548</a> Literal::Primitive(PrimitiveLiteral::Int128(expected_decimal)),
+<a href=#3549 id=3549 data-nosnippet>3549</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Decimal {
+<a href=#3550 id=3550 data-nosnippet>3550</a> precision: <span class="number">1</span>,
+<a href=#3551 id=3551 data-nosnippet>3551</a> scale: <span class="number">0</span>,
+<a href=#3552 id=3552 data-nosnippet>3552</a> }),
+<a href=#3553 id=3553 data-nosnippet>3553</a> );
+<a href=#3554 id=3554 data-nosnippet>3554</a> }
+<a href=#3555 id=3555 data-nosnippet>3555</a>
+<a href=#3556 id=3556 data-nosnippet>3556</a> <span class="attr">#[test]
+<a href=#3557 id=3557 data-nosnippet>3557</a> </span><span class="kw">fn </span>test_raw_literal_bytes_decimal_precision_1_negative() {
+<a href=#3558 id=3558 data-nosnippet>3558</a> <span class="comment">// Precision 1 requires 1 byte, negative number
+<a href=#3559 id=3559 data-nosnippet>3559</a> </span><span class="kw">let </span>decimal_bytes = <span class="macro">vec!</span>[<span class="number">0xf9</span>]; <span class="comment">// -7 in 1 byte (two's complement)
+<a href=#3560 id=3560 data-nosnippet>3560</a> </span><span class="kw">let </span>expected_decimal = -<span class="number">7i128</span>;
+<a href=#3561 id=3561 data-nosnippet>3561</a> check_raw_literal_bytes_serde_via_avro(
+<a href=#3562 id=3562 data-nosnippet>3562</a> decimal_bytes,
+<a href=#3563 id=3563 data-nosnippet>3563</a> Literal::Primitive(PrimitiveLiteral::Int128(expected_decimal)),
+<a href=#3564 id=3564 data-nosnippet>3564</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Decimal {
+<a href=#3565 id=3565 data-nosnippet>3565</a> precision: <span class="number">1</span>,
+<a href=#3566 id=3566 data-nosnippet>3566</a> scale: <span class="number">0</span>,
+<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> }
+<a href=#3570 id=3570 data-nosnippet>3570</a>
+<a href=#3571 id=3571 data-nosnippet>3571</a> <span class="attr">#[test]
+<a href=#3572 id=3572 data-nosnippet>3572</a> </span><span class="kw">fn </span>test_raw_literal_bytes_decimal_wrong_length() {
+<a href=#3573 id=3573 data-nosnippet>3573</a> <span class="comment">// 3 bytes provided, but precision 4 requires 2 bytes
+<a href=#3574 id=3574 data-nosnippet>3574</a> </span><span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">1u8</span>, <span class="number">2u8</span>, <span class="number">3u8</span>];
+<a href=#3575 id=3575 data-nosnippet>3575</a> check_raw_literal_bytes_error_via_avro(
+<a href=#3576 id=3576 data-nosnippet>3576</a> bytes,
+<a href=#3577 id=3577 data-nosnippet>3577</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Decimal {
+<a href=#3578 id=3578 data-nosnippet>3578</a> precision: <span class="number">4</span>,
+<a href=#3579 id=3579 data-nosnippet>3579</a> scale: <span class="number">2</span>,
+<a href=#3580 id=3580 data-nosnippet>3580</a> }),
+<a href=#3581 id=3581 data-nosnippet>3581</a> );
+<a href=#3582 id=3582 data-nosnippet>3582</a> }
+<a href=#3583 id=3583 data-nosnippet>3583</a>
+<a href=#3584 id=3584 data-nosnippet>3584</a> <span class="attr">#[test]
+<a href=#3585 id=3585 data-nosnippet>3585</a> </span><span class="kw">fn </span>test_raw_literal_bytes_decimal_wrong_length_too_few() {
+<a href=#3586 id=3586 data-nosnippet>3586</a> <span class="comment">// 1 byte provided, but precision 9 requires 4 bytes
+<a href=#3587 id=3587 data-nosnippet>3587</a> </span><span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">0x42</span>];
+<a href=#3588 id=3588 data-nosnippet>3588</a> check_raw_literal_bytes_error_via_avro(
+<a href=#3589 id=3589 data-nosnippet>3589</a> bytes,
+<a href=#3590 id=3590 data-nosnippet>3590</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Decimal {
+<a href=#3591 id=3591 data-nosnippet>3591</a> precision: <span class="number">9</span>,
+<a href=#3592 id=3592 data-nosnippet>3592</a> scale: <span class="number">2</span>,
+<a href=#3593 id=3593 data-nosnippet>3593</a> }),
+<a href=#3594 id=3594 data-nosnippet>3594</a> );
+<a href=#3595 id=3595 data-nosnippet>3595</a> }
+<a href=#3596 id=3596 data-nosnippet>3596</a>
+<a href=#3597 id=3597 data-nosnippet>3597</a> <span class="attr">#[test]
+<a href=#3598 id=3598 data-nosnippet>3598</a> </span><span class="kw">fn </span>test_raw_literal_bytes_unsupported_type() {
+<a href=#3599 id=3599 data-nosnippet>3599</a> <span class="kw">let </span>bytes = <span class="macro">vec!</span>[<span class="number">1u8</span>, <span class="number">2u8</span>, <span class="number">3u8</span>, <span class="number">4u8</span>];
+<a href=#3600 id=3600 data-nosnippet>3600</a> check_raw_literal_bytes_error_via_avro(bytes, <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Int));
+<a href=#3601 id=3601 data-nosnippet>3601</a> }
+<a href=#3602 id=3602 data-nosnippet>3602</a>
+<a href=#3603 id=3603 data-nosnippet>3603</a> <span class="attr">#[test]
+<a href=#3604 id=3604 data-nosnippet>3604</a> </span><span class="kw">fn </span>avro_convert_test_int() {
+<a href=#3605 id=3605 data-nosnippet>3605</a> check_convert_with_avro(
+<a href=#3606 id=3606 data-nosnippet>3606</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">32</span>)),
+<a href=#3607 id=3607 data-nosnippet>3607</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Int),
+<a href=#3608 id=3608 data-nosnippet>3608</a> );
+<a href=#3609 id=3609 data-nosnippet>3609</a> }
+<a href=#3610 id=3610 data-nosnippet>3610</a>
+<a href=#3611 id=3611 data-nosnippet>3611</a> <span class="attr">#[test]
+<a href=#3612 id=3612 data-nosnippet>3612</a> </span><span class="kw">fn </span>avro_convert_test_long() {
+<a href=#3613 id=3613 data-nosnippet>3613</a> check_convert_with_avro(
+<a href=#3614 id=3614 data-nosnippet>3614</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">32</span>)),
+<a href=#3615 id=3615 data-nosnippet>3615</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Long),
+<a href=#3616 id=3616 data-nosnippet>3616</a> );
+<a href=#3617 id=3617 data-nosnippet>3617</a> }
+<a href=#3618 id=3618 data-nosnippet>3618</a>
+<a href=#3619 id=3619 data-nosnippet>3619</a> <span class="attr">#[test]
+<a href=#3620 id=3620 data-nosnippet>3620</a> </span><span class="kw">fn </span>avro_convert_test_float() {
+<a href=#3621 id=3621 data-nosnippet>3621</a> check_convert_with_avro(
+<a href=#3622 id=3622 data-nosnippet>3622</a> Literal::Primitive(PrimitiveLiteral::Float(OrderedFloat(<span class="number">1.0</span>))),
+<a href=#3623 id=3623 data-nosnippet>3623</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Float),
+<a href=#3624 id=3624 data-nosnippet>3624</a> );
+<a href=#3625 id=3625 data-nosnippet>3625</a> }
+<a href=#3626 id=3626 data-nosnippet>3626</a>
+<a href=#3627 id=3627 data-nosnippet>3627</a> <span class="attr">#[test]
+<a href=#3628 id=3628 data-nosnippet>3628</a> </span><span class="kw">fn </span>avro_convert_test_double() {
+<a href=#3629 id=3629 data-nosnippet>3629</a> check_convert_with_avro(
+<a href=#3630 id=3630 data-nosnippet>3630</a> Literal::Primitive(PrimitiveLiteral::Double(OrderedFloat(<span class="number">1.0</span>))),
+<a href=#3631 id=3631 data-nosnippet>3631</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Double),
+<a href=#3632 id=3632 data-nosnippet>3632</a> );
+<a href=#3633 id=3633 data-nosnippet>3633</a> }
+<a href=#3634 id=3634 data-nosnippet>3634</a>
+<a href=#3635 id=3635 data-nosnippet>3635</a> <span class="attr">#[test]
+<a href=#3636 id=3636 data-nosnippet>3636</a> </span><span class="kw">fn </span>avro_convert_test_string() {
+<a href=#3637 id=3637 data-nosnippet>3637</a> check_convert_with_avro(
+<a href=#3638 id=3638 data-nosnippet>3638</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"iceberg"</span>.to_string())),
+<a href=#3639 id=3639 data-nosnippet>3639</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::String),
+<a href=#3640 id=3640 data-nosnippet>3640</a> );
+<a href=#3641 id=3641 data-nosnippet>3641</a> }
+<a href=#3642 id=3642 data-nosnippet>3642</a>
+<a href=#3643 id=3643 data-nosnippet>3643</a> <span class="attr">#[test]
+<a href=#3644 id=3644 data-nosnippet>3644</a> </span><span class="kw">fn </span>avro_convert_test_date() {
+<a href=#3645 id=3645 data-nosnippet>3645</a> check_convert_with_avro(
+<a href=#3646 id=3646 data-nosnippet>3646</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">17486</span>)),
+<a href=#3647 id=3647 data-nosnippet>3647</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Date),
+<a href=#3648 id=3648 data-nosnippet>3648</a> );
<a href=#3649 id=3649 data-nosnippet>3649</a> }
<a href=#3650 id=3650 data-nosnippet>3650</a>
<a href=#3651 id=3651 data-nosnippet>3651</a> <span class="attr">#[test]
-<a href=#3652 id=3652 data-nosnippet>3652</a> </span><span class="kw">fn </span>test_datum_ser_deser() {
-<a href=#3653 id=3653 data-nosnippet>3653</a> <span class="kw">let </span>test_fn = |datum: Datum| {
-<a href=#3654 id=3654 data-nosnippet>3654</a> <span class="kw">let </span>json = serde_json::to_value(<span class="kw-2">&</span>datum).unwrap();
-<a href=#3655 id=3655 data-nosnippet>3655</a> <span class="kw">let </span>desered_datum: Datum = serde_json::from_value(json).unwrap();
-<a href=#3656 id=3656 data-nosnippet>3656</a> <span class="macro">assert_eq!</span>(datum, desered_datum);
-<a href=#3657 id=3657 data-nosnippet>3657</a> };
-<a href=#3658 id=3658 data-nosnippet>3658</a> <span class="kw">let </span>datum = Datum::int(<span class="number">1</span>);
-<a href=#3659 id=3659 data-nosnippet>3659</a> test_fn(datum);
-<a href=#3660 id=3660 data-nosnippet>3660</a> <span class="kw">let </span>datum = Datum::long(<span class="number">1</span>);
-<a href=#3661 id=3661 data-nosnippet>3661</a> test_fn(datum);
-<a href=#3662 id=3662 data-nosnippet>3662</a>
-<a href=#3663 id=3663 data-nosnippet>3663</a> <span class="kw">let </span>datum = Datum::float(<span class="number">1.0</span>);
-<a href=#3664 id=3664 data-nosnippet>3664</a> test_fn(datum);
-<a href=#3665 id=3665 data-nosnippet>3665</a> <span class="kw">let </span>datum = Datum::float(<span class="number">0_f32</span>);
-<a href=#3666 id=3666 data-nosnippet>3666</a> test_fn(datum);
-<a href=#3667 id=3667 data-nosnippet>3667</a> <span class="kw">let </span>datum = Datum::float(-<span class="number">0_f32</span>);
-<a href=#3668 id=3668 data-nosnippet>3668</a> test_fn(datum);
-<a href=#3669 id=3669 data-nosnippet>3669</a> <span class="kw">let </span>datum = Datum::float(f32::MAX);
-<a href=#3670 id=3670 data-nosnippet>3670</a> test_fn(datum);
-<a href=#3671 id=3671 data-nosnippet>3671</a> <span class="kw">let </span>datum = Datum::float(f32::MIN);
-<a href=#3672 id=3672 data-nosnippet>3672</a> test_fn(datum);
-<a href=#3673 id=3673 data-nosnippet>3673</a>
-<a href=#3674 id=3674 data-nosnippet>3674</a> <span class="comment">// serde_json can't serialize f32::INFINITY, f32::NEG_INFINITY, f32::NAN
-<a href=#3675 id=3675 data-nosnippet>3675</a> </span><span class="kw">let </span>datum = Datum::float(f32::INFINITY);
-<a href=#3676 id=3676 data-nosnippet>3676</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
-<a href=#3677 id=3677 data-nosnippet>3677</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
-<a href=#3678 id=3678 data-nosnippet>3678</a> <span class="kw">let </span>datum = Datum::float(f32::NEG_INFINITY);
-<a href=#3679 id=3679 data-nosnippet>3679</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
-<a href=#3680 id=3680 data-nosnippet>3680</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
-<a href=#3681 id=3681 data-nosnippet>3681</a> <span class="kw">let </span>datum = Datum::float(f32::NAN);
-<a href=#3682 id=3682 data-nosnippet>3682</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
-<a href=#3683 id=3683 data-nosnippet>3683</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
-<a href=#3684 id=3684 data-nosnippet>3684</a>
-<a href=#3685 id=3685 data-nosnippet>3685</a> <span class="kw">let </span>datum = Datum::double(<span class="number">1.0</span>);
-<a href=#3686 id=3686 data-nosnippet>3686</a> test_fn(datum);
-<a href=#3687 id=3687 data-nosnippet>3687</a> <span class="kw">let </span>datum = Datum::double(f64::MAX);
-<a href=#3688 id=3688 data-nosnippet>3688</a> test_fn(datum);
-<a href=#3689 id=3689 data-nosnippet>3689</a> <span class="kw">let </span>datum = Datum::double(f64::MIN);
-<a href=#3690 id=3690 data-nosnippet>3690</a> test_fn(datum);
-<a href=#3691 id=3691 data-nosnippet>3691</a>
-<a href=#3692 id=3692 data-nosnippet>3692</a> <span class="comment">// serde_json can't serialize f32::INFINITY, f32::NEG_INFINITY, f32::NAN
-<a href=#3693 id=3693 data-nosnippet>3693</a> </span><span class="kw">let </span>datum = Datum::double(f64::INFINITY);
-<a href=#3694 id=3694 data-nosnippet>3694</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
-<a href=#3695 id=3695 data-nosnippet>3695</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
-<a href=#3696 id=3696 data-nosnippet>3696</a> <span class="kw">let </span>datum = Datum::double(f64::NEG_INFINITY);
-<a href=#3697 id=3697 data-nosnippet>3697</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
-<a href=#3698 id=3698 data-nosnippet>3698</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
-<a href=#3699 id=3699 data-nosnippet>3699</a> <span class="kw">let </span>datum = Datum::double(f64::NAN);
-<a href=#3700 id=3700 data-nosnippet>3700</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
-<a href=#3701 id=3701 data-nosnippet>3701</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
-<a href=#3702 id=3702 data-nosnippet>3702</a>
-<a href=#3703 id=3703 data-nosnippet>3703</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"iceberg"</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::bool(<span class="bool-val">true</span>);
-<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::date(<span class="number">17486</span>);
-<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::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=#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::timestamp_micros(<span class="number">1510871468123456</span>);
-<a href=#3712 id=3712 data-nosnippet>3712</a> test_fn(datum);
-<a href=#3713 id=3713 data-nosnippet>3713</a> <span class="kw">let </span>datum = Datum::timestamptz_micros(<span class="number">1510871468123456</span>);
-<a href=#3714 id=3714 data-nosnippet>3714</a> test_fn(datum);
-<a href=#3715 id=3715 data-nosnippet>3715</a> <span class="kw">let </span>datum = Datum::uuid(Uuid::parse_str(<span class="string">"f79c3e09-677c-4bbd-a479-3f349cb785e7"</span>).unwrap());
-<a href=#3716 id=3716 data-nosnippet>3716</a> test_fn(datum);
-<a href=#3717 id=3717 data-nosnippet>3717</a> <span class="kw">let </span>datum = Datum::decimal(<span class="number">1420</span>).unwrap();
-<a href=#3718 id=3718 data-nosnippet>3718</a> test_fn(datum);
-<a href=#3719 id=3719 data-nosnippet>3719</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=#3720 id=3720 data-nosnippet>3720</a> test_fn(datum);
-<a href=#3721 id=3721 data-nosnippet>3721</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=#3722 id=3722 data-nosnippet>3722</a> test_fn(datum);
-<a href=#3723 id=3723 data-nosnippet>3723</a> }
-<a href=#3724 id=3724 data-nosnippet>3724</a>
-<a href=#3725 id=3725 data-nosnippet>3725</a> <span class="attr">#[test]
-<a href=#3726 id=3726 data-nosnippet>3726</a> </span><span class="kw">fn </span>test_datum_date_convert_to_int() {
-<a href=#3727 id=3727 data-nosnippet>3727</a> <span class="kw">let </span>datum_date = Datum::date(<span class="number">12345</span>);
-<a href=#3728 id=3728 data-nosnippet>3728</a>
-<a href=#3729 id=3729 data-nosnippet>3729</a> <span class="kw">let </span>result = datum_date.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
-<a href=#3730 id=3730 data-nosnippet>3730</a>
-<a href=#3731 id=3731 data-nosnippet>3731</a> <span class="kw">let </span>expected = Datum::int(<span class="number">12345</span>);
-<a href=#3732 id=3732 data-nosnippet>3732</a>
-<a href=#3733 id=3733 data-nosnippet>3733</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3734 id=3734 data-nosnippet>3734</a> }
-<a href=#3735 id=3735 data-nosnippet>3735</a>
-<a href=#3736 id=3736 data-nosnippet>3736</a> <span class="attr">#[test]
-<a href=#3737 id=3737 data-nosnippet>3737</a> </span><span class="kw">fn </span>test_datum_int_convert_to_date() {
-<a href=#3738 id=3738 data-nosnippet>3738</a> <span class="kw">let </span>datum_int = Datum::int(<span class="number">12345</span>);
-<a href=#3739 id=3739 data-nosnippet>3739</a>
-<a href=#3740 id=3740 data-nosnippet>3740</a> <span class="kw">let </span>result = datum_int.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Date)).unwrap();
-<a href=#3741 id=3741 data-nosnippet>3741</a>
-<a href=#3742 id=3742 data-nosnippet>3742</a> <span class="kw">let </span>expected = Datum::date(<span class="number">12345</span>);
-<a href=#3743 id=3743 data-nosnippet>3743</a>
-<a href=#3744 id=3744 data-nosnippet>3744</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3745 id=3745 data-nosnippet>3745</a> }
-<a href=#3746 id=3746 data-nosnippet>3746</a>
-<a href=#3747 id=3747 data-nosnippet>3747</a> <span class="attr">#[test]
-<a href=#3748 id=3748 data-nosnippet>3748</a> </span><span class="kw">fn </span>test_datum_long_convert_to_int() {
-<a href=#3749 id=3749 data-nosnippet>3749</a> <span class="kw">let </span>datum = Datum::long(<span class="number">12345</span>);
-<a href=#3750 id=3750 data-nosnippet>3750</a>
-<a href=#3751 id=3751 data-nosnippet>3751</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
-<a href=#3752 id=3752 data-nosnippet>3752</a>
-<a href=#3753 id=3753 data-nosnippet>3753</a> <span class="kw">let </span>expected = Datum::int(<span class="number">12345</span>);
-<a href=#3754 id=3754 data-nosnippet>3754</a>
-<a href=#3755 id=3755 data-nosnippet>3755</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3756 id=3756 data-nosnippet>3756</a> }
-<a href=#3757 id=3757 data-nosnippet>3757</a>
-<a href=#3758 id=3758 data-nosnippet>3758</a> <span class="attr">#[test]
-<a href=#3759 id=3759 data-nosnippet>3759</a> </span><span class="kw">fn </span>test_datum_long_convert_to_int_above_max() {
-<a href=#3760 id=3760 data-nosnippet>3760</a> <span class="kw">let </span>datum = Datum::long(INT_MAX <span class="kw">as </span>i64 + <span class="number">1</span>);
-<a href=#3761 id=3761 data-nosnippet>3761</a>
-<a href=#3762 id=3762 data-nosnippet>3762</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
-<a href=#3763 id=3763 data-nosnippet>3763</a>
-<a href=#3764 id=3764 data-nosnippet>3764</a> <span class="kw">let </span>expected = Datum::new(PrimitiveType::Int, PrimitiveLiteral::AboveMax);
-<a href=#3765 id=3765 data-nosnippet>3765</a>
-<a href=#3766 id=3766 data-nosnippet>3766</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3767 id=3767 data-nosnippet>3767</a> }
-<a href=#3768 id=3768 data-nosnippet>3768</a>
-<a href=#3769 id=3769 data-nosnippet>3769</a> <span class="attr">#[test]
-<a href=#3770 id=3770 data-nosnippet>3770</a> </span><span class="kw">fn </span>test_datum_long_convert_to_int_below_min() {
-<a href=#3771 id=3771 data-nosnippet>3771</a> <span class="kw">let </span>datum = Datum::long(INT_MIN <span class="kw">as </span>i64 - <span class="number">1</span>);
-<a href=#3772 id=3772 data-nosnippet>3772</a>
-<a href=#3773 id=3773 data-nosnippet>3773</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
+<a href=#3652 id=3652 data-nosnippet>3652</a> </span><span class="kw">fn </span>avro_convert_test_time() {
+<a href=#3653 id=3653 data-nosnippet>3653</a> check_convert_with_avro(
+<a href=#3654 id=3654 data-nosnippet>3654</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">81068123456</span>)),
+<a href=#3655 id=3655 data-nosnippet>3655</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Time),
+<a href=#3656 id=3656 data-nosnippet>3656</a> );
+<a href=#3657 id=3657 data-nosnippet>3657</a> }
+<a href=#3658 id=3658 data-nosnippet>3658</a>
+<a href=#3659 id=3659 data-nosnippet>3659</a> <span class="attr">#[test]
+<a href=#3660 id=3660 data-nosnippet>3660</a> </span><span class="kw">fn </span>avro_convert_test_timestamp() {
+<a href=#3661 id=3661 data-nosnippet>3661</a> check_convert_with_avro(
+<a href=#3662 id=3662 data-nosnippet>3662</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
+<a href=#3663 id=3663 data-nosnippet>3663</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Timestamp),
+<a href=#3664 id=3664 data-nosnippet>3664</a> );
+<a href=#3665 id=3665 data-nosnippet>3665</a> }
+<a href=#3666 id=3666 data-nosnippet>3666</a>
+<a href=#3667 id=3667 data-nosnippet>3667</a> <span class="attr">#[test]
+<a href=#3668 id=3668 data-nosnippet>3668</a> </span><span class="kw">fn </span>avro_convert_test_timestamptz() {
+<a href=#3669 id=3669 data-nosnippet>3669</a> check_convert_with_avro(
+<a href=#3670 id=3670 data-nosnippet>3670</a> Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1510871468123456</span>)),
+<a href=#3671 id=3671 data-nosnippet>3671</a> <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Timestamptz),
+<a href=#3672 id=3672 data-nosnippet>3672</a> );
+<a href=#3673 id=3673 data-nosnippet>3673</a> }
+<a href=#3674 id=3674 data-nosnippet>3674</a>
+<a href=#3675 id=3675 data-nosnippet>3675</a> <span class="attr">#[test]
+<a href=#3676 id=3676 data-nosnippet>3676</a> </span><span class="kw">fn </span>avro_convert_test_list() {
+<a href=#3677 id=3677 data-nosnippet>3677</a> check_convert_with_avro(
+<a href=#3678 id=3678 data-nosnippet>3678</a> Literal::List(<span class="macro">vec!</span>[
+<a href=#3679 id=3679 data-nosnippet>3679</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3680 id=3680 data-nosnippet>3680</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
+<a href=#3681 id=3681 data-nosnippet>3681</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
+<a href=#3682 id=3682 data-nosnippet>3682</a> <span class="prelude-val">None</span>,
+<a href=#3683 id=3683 data-nosnippet>3683</a> ]),
+<a href=#3684 id=3684 data-nosnippet>3684</a> <span class="kw-2">&</span>Type::List(ListType {
+<a href=#3685 id=3685 data-nosnippet>3685</a> element_field: NestedField::list_element(
+<a href=#3686 id=3686 data-nosnippet>3686</a> <span class="number">0</span>,
+<a href=#3687 id=3687 data-nosnippet>3687</a> Type::Primitive(PrimitiveType::Int),
+<a href=#3688 id=3688 data-nosnippet>3688</a> <span class="bool-val">false</span>,
+<a href=#3689 id=3689 data-nosnippet>3689</a> )
+<a href=#3690 id=3690 data-nosnippet>3690</a> .into(),
+<a href=#3691 id=3691 data-nosnippet>3691</a> }),
+<a href=#3692 id=3692 data-nosnippet>3692</a> );
+<a href=#3693 id=3693 data-nosnippet>3693</a>
+<a href=#3694 id=3694 data-nosnippet>3694</a> check_convert_with_avro(
+<a href=#3695 id=3695 data-nosnippet>3695</a> Literal::List(<span class="macro">vec!</span>[
+<a href=#3696 id=3696 data-nosnippet>3696</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3697 id=3697 data-nosnippet>3697</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
+<a href=#3698 id=3698 data-nosnippet>3698</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
+<a href=#3699 id=3699 data-nosnippet>3699</a> ]),
+<a href=#3700 id=3700 data-nosnippet>3700</a> <span class="kw-2">&</span>Type::List(ListType {
+<a href=#3701 id=3701 data-nosnippet>3701</a> element_field: NestedField::list_element(
+<a href=#3702 id=3702 data-nosnippet>3702</a> <span class="number">0</span>,
+<a href=#3703 id=3703 data-nosnippet>3703</a> Type::Primitive(PrimitiveType::Int),
+<a href=#3704 id=3704 data-nosnippet>3704</a> <span class="bool-val">true</span>,
+<a href=#3705 id=3705 data-nosnippet>3705</a> )
+<a href=#3706 id=3706 data-nosnippet>3706</a> .into(),
+<a href=#3707 id=3707 data-nosnippet>3707</a> }),
+<a href=#3708 id=3708 data-nosnippet>3708</a> );
+<a href=#3709 id=3709 data-nosnippet>3709</a> }
+<a href=#3710 id=3710 data-nosnippet>3710</a>
+<a href=#3711 id=3711 data-nosnippet>3711</a> <span class="kw">fn </span>check_convert_with_avro_map(expected_literal: Literal, expected_type: <span class="kw-2">&</span>Type) {
+<a href=#3712 id=3712 data-nosnippet>3712</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=#3713 id=3713 data-nosnippet>3713</a> <span class="kw">let </span>schema = Schema::builder()
+<a href=#3714 id=3714 data-nosnippet>3714</a> .with_fields(fields.clone())
+<a href=#3715 id=3715 data-nosnippet>3715</a> .build()
+<a href=#3716 id=3716 data-nosnippet>3716</a> .unwrap();
+<a href=#3717 id=3717 data-nosnippet>3717</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=#3718 id=3718 data-nosnippet>3718</a> <span class="kw">let </span>struct_type = Type::Struct(StructType::new(fields));
+<a href=#3719 id=3719 data-nosnippet>3719</a> <span class="kw">let </span>struct_literal =
+<a href=#3720 id=3720 data-nosnippet>3720</a> Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[<span class="prelude-val">Some</span>(expected_literal.clone())]));
+<a href=#3721 id=3721 data-nosnippet>3721</a>
+<a href=#3722 id=3722 data-nosnippet>3722</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=#3723 id=3723 data-nosnippet>3723</a> <span class="kw">let </span>raw_literal = RawLiteral::try_from(struct_literal.clone(), <span class="kw-2">&</span>struct_type).unwrap();
+<a href=#3724 id=3724 data-nosnippet>3724</a> writer.append_ser(raw_literal).unwrap();
+<a href=#3725 id=3725 data-nosnippet>3725</a> <span class="kw">let </span>encoded = writer.into_inner().unwrap();
+<a href=#3726 id=3726 data-nosnippet>3726</a>
+<a href=#3727 id=3727 data-nosnippet>3727</a> <span class="kw">let </span>reader = apache_avro::Reader::new(<span class="kw-2">&*</span>encoded).unwrap();
+<a href=#3728 id=3728 data-nosnippet>3728</a> <span class="kw">for </span>record <span class="kw">in </span>reader {
+<a href=#3729 id=3729 data-nosnippet>3729</a> <span class="kw">let </span>result = apache_avro::from_value::<RawLiteral>(<span class="kw-2">&</span>record.unwrap()).unwrap();
+<a href=#3730 id=3730 data-nosnippet>3730</a> <span class="kw">let </span>desered_literal = result.try_into(<span class="kw-2">&</span>struct_type).unwrap().unwrap();
+<a href=#3731 id=3731 data-nosnippet>3731</a> <span class="kw">match </span>(<span class="kw-2">&</span>desered_literal, <span class="kw-2">&</span>struct_literal) {
+<a href=#3732 id=3732 data-nosnippet>3732</a> (Literal::Struct(desered), Literal::Struct(expected)) => {
+<a href=#3733 id=3733 data-nosnippet>3733</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=#3734 id=3734 data-nosnippet>3734</a> (<span class="prelude-val">Some</span>(Literal::Map(desered)), <span class="prelude-val">Some</span>(Literal::Map(expected))) => {
+<a href=#3735 id=3735 data-nosnippet>3735</a> <span class="macro">assert!</span>(desered.has_same_content(expected))
+<a href=#3736 id=3736 data-nosnippet>3736</a> }
+<a href=#3737 id=3737 data-nosnippet>3737</a> <span class="kw">_ </span>=> {
+<a href=#3738 id=3738 data-nosnippet>3738</a> <span class="macro">unreachable!</span>()
+<a href=#3739 id=3739 data-nosnippet>3739</a> }
+<a href=#3740 id=3740 data-nosnippet>3740</a> }
+<a href=#3741 id=3741 data-nosnippet>3741</a> }
+<a href=#3742 id=3742 data-nosnippet>3742</a> <span class="kw">_ </span>=> {
+<a href=#3743 id=3743 data-nosnippet>3743</a> <span class="macro">panic!</span>(<span class="string">"unexpected literal type"</span>);
+<a href=#3744 id=3744 data-nosnippet>3744</a> }
+<a href=#3745 id=3745 data-nosnippet>3745</a> }
+<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>
+<a href=#3749 id=3749 data-nosnippet>3749</a> <span class="attr">#[test]
+<a href=#3750 id=3750 data-nosnippet>3750</a> </span><span class="kw">fn </span>avro_convert_test_map() {
+<a href=#3751 id=3751 data-nosnippet>3751</a> check_convert_with_avro_map(
+<a href=#3752 id=3752 data-nosnippet>3752</a> Literal::Map(Map::from([
+<a href=#3753 id=3753 data-nosnippet>3753</a> (
+<a href=#3754 id=3754 data-nosnippet>3754</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>)),
+<a href=#3755 id=3755 data-nosnippet>3755</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1</span>))),
+<a href=#3756 id=3756 data-nosnippet>3756</a> ),
+<a href=#3757 id=3757 data-nosnippet>3757</a> (
+<a href=#3758 id=3758 data-nosnippet>3758</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>)),
+<a href=#3759 id=3759 data-nosnippet>3759</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">2</span>))),
+<a href=#3760 id=3760 data-nosnippet>3760</a> ),
+<a href=#3761 id=3761 data-nosnippet>3761</a> (Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>)), <span class="prelude-val">None</span>),
+<a href=#3762 id=3762 data-nosnippet>3762</a> ])),
+<a href=#3763 id=3763 data-nosnippet>3763</a> <span class="kw-2">&</span>Type::Map(MapType {
+<a href=#3764 id=3764 data-nosnippet>3764</a> key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::Int))
+<a href=#3765 id=3765 data-nosnippet>3765</a> .into(),
+<a href=#3766 id=3766 data-nosnippet>3766</a> value_field: NestedField::map_value_element(
+<a href=#3767 id=3767 data-nosnippet>3767</a> <span class="number">3</span>,
+<a href=#3768 id=3768 data-nosnippet>3768</a> Type::Primitive(PrimitiveType::Long),
+<a href=#3769 id=3769 data-nosnippet>3769</a> <span class="bool-val">false</span>,
+<a href=#3770 id=3770 data-nosnippet>3770</a> )
+<a href=#3771 id=3771 data-nosnippet>3771</a> .into(),
+<a href=#3772 id=3772 data-nosnippet>3772</a> }),
+<a href=#3773 id=3773 data-nosnippet>3773</a> );
<a href=#3774 id=3774 data-nosnippet>3774</a>
-<a href=#3775 id=3775 data-nosnippet>3775</a> <span class="kw">let </span>expected = Datum::new(PrimitiveType::Int, PrimitiveLiteral::BelowMin);
-<a href=#3776 id=3776 data-nosnippet>3776</a>
-<a href=#3777 id=3777 data-nosnippet>3777</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3778 id=3778 data-nosnippet>3778</a> }
-<a href=#3779 id=3779 data-nosnippet>3779</a>
-<a href=#3780 id=3780 data-nosnippet>3780</a> <span class="attr">#[test]
-<a href=#3781 id=3781 data-nosnippet>3781</a> </span><span class="kw">fn </span>test_datum_long_convert_to_timestamp() {
-<a href=#3782 id=3782 data-nosnippet>3782</a> <span class="kw">let </span>datum = Datum::long(<span class="number">12345</span>);
-<a href=#3783 id=3783 data-nosnippet>3783</a>
-<a href=#3784 id=3784 data-nosnippet>3784</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Timestamp)).unwrap();
-<a href=#3785 id=3785 data-nosnippet>3785</a>
-<a href=#3786 id=3786 data-nosnippet>3786</a> <span class="kw">let </span>expected = Datum::timestamp_micros(<span class="number">12345</span>);
-<a href=#3787 id=3787 data-nosnippet>3787</a>
-<a href=#3788 id=3788 data-nosnippet>3788</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3789 id=3789 data-nosnippet>3789</a> }
-<a href=#3790 id=3790 data-nosnippet>3790</a>
-<a href=#3791 id=3791 data-nosnippet>3791</a> <span class="attr">#[test]
-<a href=#3792 id=3792 data-nosnippet>3792</a> </span><span class="kw">fn </span>test_datum_long_convert_to_timestamptz() {
-<a href=#3793 id=3793 data-nosnippet>3793</a> <span class="kw">let </span>datum = Datum::long(<span class="number">12345</span>);
-<a href=#3794 id=3794 data-nosnippet>3794</a>
-<a href=#3795 id=3795 data-nosnippet>3795</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Timestamptz)).unwrap();
-<a href=#3796 id=3796 data-nosnippet>3796</a>
-<a href=#3797 id=3797 data-nosnippet>3797</a> <span class="kw">let </span>expected = Datum::timestamptz_micros(<span class="number">12345</span>);
-<a href=#3798 id=3798 data-nosnippet>3798</a>
-<a href=#3799 id=3799 data-nosnippet>3799</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3800 id=3800 data-nosnippet>3800</a> }
-<a href=#3801 id=3801 data-nosnippet>3801</a>
-<a href=#3802 id=3802 data-nosnippet>3802</a> <span class="attr">#[test]
-<a href=#3803 id=3803 data-nosnippet>3803</a> </span><span class="kw">fn </span>test_datum_decimal_convert_to_long() {
-<a href=#3804 id=3804 data-nosnippet>3804</a> <span class="kw">let </span>datum = Datum::decimal(<span class="number">12345</span>).unwrap();
-<a href=#3805 id=3805 data-nosnippet>3805</a>
-<a href=#3806 id=3806 data-nosnippet>3806</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Long)).unwrap();
-<a href=#3807 id=3807 data-nosnippet>3807</a>
-<a href=#3808 id=3808 data-nosnippet>3808</a> <span class="kw">let </span>expected = Datum::long(<span class="number">12345</span>);
-<a href=#3809 id=3809 data-nosnippet>3809</a>
-<a href=#3810 id=3810 data-nosnippet>3810</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3811 id=3811 data-nosnippet>3811</a> }
-<a href=#3812 id=3812 data-nosnippet>3812</a>
-<a href=#3813 id=3813 data-nosnippet>3813</a> <span class="attr">#[test]
-<a href=#3814 id=3814 data-nosnippet>3814</a> </span><span class="kw">fn </span>test_datum_decimal_convert_to_long_above_max() {
-<a href=#3815 id=3815 data-nosnippet>3815</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=#3816 id=3816 data-nosnippet>3816</a>
-<a href=#3817 id=3817 data-nosnippet>3817</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Long)).unwrap();
-<a href=#3818 id=3818 data-nosnippet>3818</a>
-<a href=#3819 id=3819 data-nosnippet>3819</a> <span class="kw">let </span>expected = Datum::new(PrimitiveType::Long, PrimitiveLiteral::AboveMax);
-<a href=#3820 id=3820 data-nosnippet>3820</a>
-<a href=#3821 id=3821 data-nosnippet>3821</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3822 id=3822 data-nosnippet>3822</a> }
-<a href=#3823 id=3823 data-nosnippet>3823</a>
-<a href=#3824 id=3824 data-nosnippet>3824</a> <span class="attr">#[test]
-<a href=#3825 id=3825 data-nosnippet>3825</a> </span><span class="kw">fn </span>test_datum_decimal_convert_to_long_below_min() {
-<a href=#3826 id=3826 data-nosnippet>3826</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=#3827 id=3827 data-nosnippet>3827</a>
-<a href=#3828 id=3828 data-nosnippet>3828</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Long)).unwrap();
-<a href=#3829 id=3829 data-nosnippet>3829</a>
-<a href=#3830 id=3830 data-nosnippet>3830</a> <span class="kw">let </span>expected = Datum::new(PrimitiveType::Long, PrimitiveLiteral::BelowMin);
+<a href=#3775 id=3775 data-nosnippet>3775</a> check_convert_with_avro_map(
+<a href=#3776 id=3776 data-nosnippet>3776</a> Literal::Map(Map::from([
+<a href=#3777 id=3777 data-nosnippet>3777</a> (
+<a href=#3778 id=3778 data-nosnippet>3778</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>)),
+<a href=#3779 id=3779 data-nosnippet>3779</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">1</span>))),
+<a href=#3780 id=3780 data-nosnippet>3780</a> ),
+<a href=#3781 id=3781 data-nosnippet>3781</a> (
+<a href=#3782 id=3782 data-nosnippet>3782</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>)),
+<a href=#3783 id=3783 data-nosnippet>3783</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">2</span>))),
+<a href=#3784 id=3784 data-nosnippet>3784</a> ),
+<a href=#3785 id=3785 data-nosnippet>3785</a> (
+<a href=#3786 id=3786 data-nosnippet>3786</a> Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>)),
+<a href=#3787 id=3787 data-nosnippet>3787</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Long(<span class="number">3</span>))),
+<a href=#3788 id=3788 data-nosnippet>3788</a> ),
+<a href=#3789 id=3789 data-nosnippet>3789</a> ])),
+<a href=#3790 id=3790 data-nosnippet>3790</a> <span class="kw-2">&</span>Type::Map(MapType {
+<a href=#3791 id=3791 data-nosnippet>3791</a> key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::Int))
+<a href=#3792 id=3792 data-nosnippet>3792</a> .into(),
+<a href=#3793 id=3793 data-nosnippet>3793</a> value_field: NestedField::map_value_element(
+<a href=#3794 id=3794 data-nosnippet>3794</a> <span class="number">3</span>,
+<a href=#3795 id=3795 data-nosnippet>3795</a> Type::Primitive(PrimitiveType::Long),
+<a href=#3796 id=3796 data-nosnippet>3796</a> <span class="bool-val">true</span>,
+<a href=#3797 id=3797 data-nosnippet>3797</a> )
+<a href=#3798 id=3798 data-nosnippet>3798</a> .into(),
+<a href=#3799 id=3799 data-nosnippet>3799</a> }),
+<a href=#3800 id=3800 data-nosnippet>3800</a> );
+<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>avro_convert_test_string_map() {
+<a href=#3805 id=3805 data-nosnippet>3805</a> check_convert_with_avro_map(
+<a href=#3806 id=3806 data-nosnippet>3806</a> Literal::Map(Map::from([
+<a href=#3807 id=3807 data-nosnippet>3807</a> (
+<a href=#3808 id=3808 data-nosnippet>3808</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"a"</span>.to_string())),
+<a href=#3809 id=3809 data-nosnippet>3809</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3810 id=3810 data-nosnippet>3810</a> ),
+<a href=#3811 id=3811 data-nosnippet>3811</a> (
+<a href=#3812 id=3812 data-nosnippet>3812</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"b"</span>.to_string())),
+<a href=#3813 id=3813 data-nosnippet>3813</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
+<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> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"c"</span>.to_string())),
+<a href=#3817 id=3817 data-nosnippet>3817</a> <span class="prelude-val">None</span>,
+<a href=#3818 id=3818 data-nosnippet>3818</a> ),
+<a href=#3819 id=3819 data-nosnippet>3819</a> ])),
+<a href=#3820 id=3820 data-nosnippet>3820</a> <span class="kw-2">&</span>Type::Map(MapType {
+<a href=#3821 id=3821 data-nosnippet>3821</a> key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::String))
+<a href=#3822 id=3822 data-nosnippet>3822</a> .into(),
+<a href=#3823 id=3823 data-nosnippet>3823</a> value_field: NestedField::map_value_element(
+<a href=#3824 id=3824 data-nosnippet>3824</a> <span class="number">3</span>,
+<a href=#3825 id=3825 data-nosnippet>3825</a> Type::Primitive(PrimitiveType::Int),
+<a href=#3826 id=3826 data-nosnippet>3826</a> <span class="bool-val">false</span>,
+<a href=#3827 id=3827 data-nosnippet>3827</a> )
+<a href=#3828 id=3828 data-nosnippet>3828</a> .into(),
+<a href=#3829 id=3829 data-nosnippet>3829</a> }),
+<a href=#3830 id=3830 data-nosnippet>3830</a> );
<a href=#3831 id=3831 data-nosnippet>3831</a>
-<a href=#3832 id=3832 data-nosnippet>3832</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3833 id=3833 data-nosnippet>3833</a> }
-<a href=#3834 id=3834 data-nosnippet>3834</a>
-<a href=#3835 id=3835 data-nosnippet>3835</a> <span class="attr">#[test]
-<a href=#3836 id=3836 data-nosnippet>3836</a> </span><span class="kw">fn </span>test_datum_string_convert_to_boolean() {
-<a href=#3837 id=3837 data-nosnippet>3837</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"true"</span>);
-<a href=#3838 id=3838 data-nosnippet>3838</a>
-<a href=#3839 id=3839 data-nosnippet>3839</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Boolean)).unwrap();
-<a href=#3840 id=3840 data-nosnippet>3840</a>
-<a href=#3841 id=3841 data-nosnippet>3841</a> <span class="kw">let </span>expected = Datum::bool(<span class="bool-val">true</span>);
-<a href=#3842 id=3842 data-nosnippet>3842</a>
-<a href=#3843 id=3843 data-nosnippet>3843</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3844 id=3844 data-nosnippet>3844</a> }
-<a href=#3845 id=3845 data-nosnippet>3845</a>
-<a href=#3846 id=3846 data-nosnippet>3846</a> <span class="attr">#[test]
-<a href=#3847 id=3847 data-nosnippet>3847</a> </span><span class="kw">fn </span>test_datum_string_convert_to_int() {
-<a href=#3848 id=3848 data-nosnippet>3848</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"12345"</span>);
-<a href=#3849 id=3849 data-nosnippet>3849</a>
-<a href=#3850 id=3850 data-nosnippet>3850</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
-<a href=#3851 id=3851 data-nosnippet>3851</a>
-<a href=#3852 id=3852 data-nosnippet>3852</a> <span class="kw">let </span>expected = Datum::int(<span class="number">12345</span>);
-<a href=#3853 id=3853 data-nosnippet>3853</a>
-<a href=#3854 id=3854 data-nosnippet>3854</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3855 id=3855 data-nosnippet>3855</a> }
-<a href=#3856 id=3856 data-nosnippet>3856</a>
-<a href=#3857 id=3857 data-nosnippet>3857</a> <span class="attr">#[test]
-<a href=#3858 id=3858 data-nosnippet>3858</a> </span><span class="kw">fn </span>test_datum_string_convert_to_long() {
-<a href=#3859 id=3859 data-nosnippet>3859</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"12345"</span>);
-<a href=#3860 id=3860 data-nosnippet>3860</a>
-<a href=#3861 id=3861 data-nosnippet>3861</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Long)).unwrap();
-<a href=#3862 id=3862 data-nosnippet>3862</a>
-<a href=#3863 id=3863 data-nosnippet>3863</a> <span class="kw">let </span>expected = Datum::long(<span class="number">12345</span>);
-<a href=#3864 id=3864 data-nosnippet>3864</a>
-<a href=#3865 id=3865 data-nosnippet>3865</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3866 id=3866 data-nosnippet>3866</a> }
-<a href=#3867 id=3867 data-nosnippet>3867</a>
-<a href=#3868 id=3868 data-nosnippet>3868</a> <span class="attr">#[test]
-<a href=#3869 id=3869 data-nosnippet>3869</a> </span><span class="kw">fn </span>test_datum_string_convert_to_timestamp() {
-<a href=#3870 id=3870 data-nosnippet>3870</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"1925-05-20T19:25:00.000"</span>);
-<a href=#3871 id=3871 data-nosnippet>3871</a>
-<a href=#3872 id=3872 data-nosnippet>3872</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Timestamp)).unwrap();
-<a href=#3873 id=3873 data-nosnippet>3873</a>
-<a href=#3874 id=3874 data-nosnippet>3874</a> <span class="kw">let </span>expected = Datum::timestamp_micros(-<span class="number">1407990900000000</span>);
-<a href=#3875 id=3875 data-nosnippet>3875</a>
-<a href=#3876 id=3876 data-nosnippet>3876</a> <span class="macro">assert_eq!</span>(result, expected);
-<a href=#3877 id=3877 data-nosnippet>3877</a> }
-<a href=#3878 id=3878 data-nosnippet>3878</a>
-<a href=#3879 id=3879 data-nosnippet>3879</a> <span class="attr">#[test]
-<a href=#3880 id=3880 data-nosnippet>3880</a> </span><span class="kw">fn </span>test_datum_string_convert_to_timestamptz() {
-<a href=#3881 id=3881 data-nosnippet>3881</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"1925-05-20T19:25:00.000 UTC"</span>);
-<a href=#3882 id=3882 data-nosnippet>3882</a>
-<a href=#3883 id=3883 data-nosnippet>3883</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Timestamptz)).unwrap();
-<a href=#3884 id=3884 data-nosnippet>3884</a>
-<a href=#3885 id=3885 data-nosnippet>3885</a> <span class="kw">let </span>expected = Datum::timestamptz_micros(-<span class="number">1407990900000000</span>);
-<a href=#3886 id=3886 data-nosnippet>3886</a>
-<a href=#3887 id=3887 data-nosnippet>3887</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#3832 id=3832 data-nosnippet>3832</a> check_convert_with_avro_map(
+<a href=#3833 id=3833 data-nosnippet>3833</a> Literal::Map(Map::from([
+<a href=#3834 id=3834 data-nosnippet>3834</a> (
+<a href=#3835 id=3835 data-nosnippet>3835</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"a"</span>.to_string())),
+<a href=#3836 id=3836 data-nosnippet>3836</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3837 id=3837 data-nosnippet>3837</a> ),
+<a href=#3838 id=3838 data-nosnippet>3838</a> (
+<a href=#3839 id=3839 data-nosnippet>3839</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"b"</span>.to_string())),
+<a href=#3840 id=3840 data-nosnippet>3840</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">2</span>))),
+<a href=#3841 id=3841 data-nosnippet>3841</a> ),
+<a href=#3842 id=3842 data-nosnippet>3842</a> (
+<a href=#3843 id=3843 data-nosnippet>3843</a> Literal::Primitive(PrimitiveLiteral::String(<span class="string">"c"</span>.to_string())),
+<a href=#3844 id=3844 data-nosnippet>3844</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">3</span>))),
+<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="kw-2">&</span>Type::Map(MapType {
+<a href=#3848 id=3848 data-nosnippet>3848</a> key_field: NestedField::map_key_element(<span class="number">2</span>, Type::Primitive(PrimitiveType::String))
+<a href=#3849 id=3849 data-nosnippet>3849</a> .into(),
+<a href=#3850 id=3850 data-nosnippet>3850</a> value_field: NestedField::map_value_element(
+<a href=#3851 id=3851 data-nosnippet>3851</a> <span class="number">3</span>,
+<a href=#3852 id=3852 data-nosnippet>3852</a> Type::Primitive(PrimitiveType::Int),
+<a href=#3853 id=3853 data-nosnippet>3853</a> <span class="bool-val">true</span>,
+<a href=#3854 id=3854 data-nosnippet>3854</a> )
+<a href=#3855 id=3855 data-nosnippet>3855</a> .into(),
+<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> }
+<a href=#3859 id=3859 data-nosnippet>3859</a>
+<a href=#3860 id=3860 data-nosnippet>3860</a> <span class="attr">#[test]
+<a href=#3861 id=3861 data-nosnippet>3861</a> </span><span class="kw">fn </span>avro_convert_test_record() {
+<a href=#3862 id=3862 data-nosnippet>3862</a> check_convert_with_avro(
+<a href=#3863 id=3863 data-nosnippet>3863</a> Literal::Struct(Struct::from_iter(<span class="macro">vec!</span>[
+<a href=#3864 id=3864 data-nosnippet>3864</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">1</span>))),
+<a href=#3865 id=3865 data-nosnippet>3865</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::String(
+<a href=#3866 id=3866 data-nosnippet>3866</a> <span class="string">"bar"</span>.to_string(),
+<a href=#3867 id=3867 data-nosnippet>3867</a> ))),
+<a href=#3868 id=3868 data-nosnippet>3868</a> <span class="prelude-val">None</span>,
+<a href=#3869 id=3869 data-nosnippet>3869</a> ])),
+<a href=#3870 id=3870 data-nosnippet>3870</a> <span class="kw-2">&</span>Type::Struct(StructType::new(<span class="macro">vec!</span>[
+<a href=#3871 id=3871 data-nosnippet>3871</a> NestedField::required(<span class="number">2</span>, <span class="string">"id"</span>, Type::Primitive(PrimitiveType::Int)).into(),
+<a href=#3872 id=3872 data-nosnippet>3872</a> NestedField::optional(<span class="number">3</span>, <span class="string">"name"</span>, Type::Primitive(PrimitiveType::String)).into(),
+<a href=#3873 id=3873 data-nosnippet>3873</a> NestedField::optional(<span class="number">4</span>, <span class="string">"address"</span>, Type::Primitive(PrimitiveType::String)).into(),
+<a href=#3874 id=3874 data-nosnippet>3874</a> ])),
+<a href=#3875 id=3875 data-nosnippet>3875</a> );
+<a href=#3876 id=3876 data-nosnippet>3876</a> }
+<a href=#3877 id=3877 data-nosnippet>3877</a>
+<a href=#3878 id=3878 data-nosnippet>3878</a> <span class="comment">// # TODO:https://github.com/apache/iceberg-rust/issues/86
+<a href=#3879 id=3879 data-nosnippet>3879</a> // rust avro don't support deserialize any bytes representation now:
+<a href=#3880 id=3880 data-nosnippet>3880</a> // - binary
+<a href=#3881 id=3881 data-nosnippet>3881</a> // - decimal
+<a href=#3882 id=3882 data-nosnippet>3882</a> </span><span class="attr">#[test]
+<a href=#3883 id=3883 data-nosnippet>3883</a> </span><span class="kw">fn </span>avro_convert_test_binary_ser() {
+<a href=#3884 id=3884 data-nosnippet>3884</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=#3885 id=3885 data-nosnippet>3885</a> <span class="kw">let </span>ty = Type::Primitive(PrimitiveType::Binary);
+<a href=#3886 id=3886 data-nosnippet>3886</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=#3887 id=3887 data-nosnippet>3887</a> check_serialize_avro(literal, <span class="kw-2">&</span>ty, expect_value);
<a href=#3888 id=3888 data-nosnippet>3888</a> }
<a href=#3889 id=3889 data-nosnippet>3889</a>
<a href=#3890 id=3890 data-nosnippet>3890</a> <span class="attr">#[test]
-<a href=#3891 id=3891 data-nosnippet>3891</a> </span><span class="kw">fn </span>test_iceberg_float_order() {
-<a href=#3892 id=3892 data-nosnippet>3892</a> <span class="comment">// Test float ordering
-<a href=#3893 id=3893 data-nosnippet>3893</a> </span><span class="kw">let </span>float_values = <span class="macro">vec!</span>[
-<a href=#3894 id=3894 data-nosnippet>3894</a> Datum::float(f32::NAN),
-<a href=#3895 id=3895 data-nosnippet>3895</a> Datum::float(-f32::NAN),
-<a href=#3896 id=3896 data-nosnippet>3896</a> Datum::float(f32::MAX),
-<a href=#3897 id=3897 data-nosnippet>3897</a> Datum::float(f32::MIN),
-<a href=#3898 id=3898 data-nosnippet>3898</a> Datum::float(f32::INFINITY),
-<a href=#3899 id=3899 data-nosnippet>3899</a> Datum::float(-f32::INFINITY),
-<a href=#3900 id=3900 data-nosnippet>3900</a> Datum::float(<span class="number">1.0</span>),
-<a href=#3901 id=3901 data-nosnippet>3901</a> Datum::float(-<span class="number">1.0</span>),
-<a href=#3902 id=3902 data-nosnippet>3902</a> Datum::float(<span class="number">0.0</span>),
-<a href=#3903 id=3903 data-nosnippet>3903</a> Datum::float(-<span class="number">0.0</span>),
-<a href=#3904 id=3904 data-nosnippet>3904</a> ];
+<a href=#3891 id=3891 data-nosnippet>3891</a> </span><span class="kw">fn </span>avro_convert_test_decimal_ser() {
+<a href=#3892 id=3892 data-nosnippet>3892</a> <span class="kw">let </span>literal = Literal::decimal(<span class="number">12345</span>);
+<a href=#3893 id=3893 data-nosnippet>3893</a> <span class="kw">let </span>ty = Type::Primitive(PrimitiveType::Decimal {
+<a href=#3894 id=3894 data-nosnippet>3894</a> precision: <span class="number">9</span>,
+<a href=#3895 id=3895 data-nosnippet>3895</a> scale: <span class="number">8</span>,
+<a href=#3896 id=3896 data-nosnippet>3896</a> });
+<a href=#3897 id=3897 data-nosnippet>3897</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=#3898 id=3898 data-nosnippet>3898</a> check_serialize_avro(literal, <span class="kw-2">&</span>ty, expect_value);
+<a href=#3899 id=3899 data-nosnippet>3899</a> }
+<a href=#3900 id=3900 data-nosnippet>3900</a>
+<a href=#3901 id=3901 data-nosnippet>3901</a> <span class="comment">// # TODO:https://github.com/apache/iceberg-rust/issues/86
+<a href=#3902 id=3902 data-nosnippet>3902</a> // rust avro can't support to convert any byte-like type to fixed in avro now.
+<a href=#3903 id=3903 data-nosnippet>3903</a> // - uuid ser/de
+<a href=#3904 id=3904 data-nosnippet>3904</a> // - fixed ser/de
<a href=#3905 id=3905 data-nosnippet>3905</a>
-<a href=#3906 id=3906 data-nosnippet>3906</a> <span class="kw">let </span><span class="kw-2">mut </span>float_sorted = float_values.clone();
-<a href=#3907 id=3907 data-nosnippet>3907</a> float_sorted.sort_by(|a, b| a.partial_cmp(b).unwrap());
-<a href=#3908 id=3908 data-nosnippet>3908</a>
-<a href=#3909 id=3909 data-nosnippet>3909</a> <span class="kw">let </span>float_expected = <span class="macro">vec!</span>[
-<a href=#3910 id=3910 data-nosnippet>3910</a> Datum::float(-f32::NAN),
-<a href=#3911 id=3911 data-nosnippet>3911</a> Datum::float(-f32::INFINITY),
-<a href=#3912 id=3912 data-nosnippet>3912</a> Datum::float(f32::MIN),
-<a href=#3913 id=3913 data-nosnippet>3913</a> Datum::float(-<span class="number">1.0</span>),
-<a href=#3914 id=3914 data-nosnippet>3914</a> Datum::float(-<span class="number">0.0</span>),
-<a href=#3915 id=3915 data-nosnippet>3915</a> Datum::float(<span class="number">0.0</span>),
-<a href=#3916 id=3916 data-nosnippet>3916</a> Datum::float(<span class="number">1.0</span>),
-<a href=#3917 id=3917 data-nosnippet>3917</a> Datum::float(f32::MAX),
-<a href=#3918 id=3918 data-nosnippet>3918</a> Datum::float(f32::INFINITY),
-<a href=#3919 id=3919 data-nosnippet>3919</a> Datum::float(f32::NAN),
-<a href=#3920 id=3920 data-nosnippet>3920</a> ];
-<a href=#3921 id=3921 data-nosnippet>3921</a>
-<a href=#3922 id=3922 data-nosnippet>3922</a> <span class="macro">assert_eq!</span>(float_sorted, float_expected);
+<a href=#3906 id=3906 data-nosnippet>3906</a> </span><span class="attr">#[test]
+<a href=#3907 id=3907 data-nosnippet>3907</a> </span><span class="kw">fn </span>test_parse_timestamp() {
+<a href=#3908 id=3908 data-nosnippet>3908</a> <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"2021-08-01T01:09:00.0899"</span>).unwrap();
+<a href=#3909 id=3909 data-nosnippet>3909</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=#3910 id=3910 data-nosnippet>3910</a>
+<a href=#3911 id=3911 data-nosnippet>3911</a> <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"2023-01-06T00:00:00"</span>).unwrap();
+<a href=#3912 id=3912 data-nosnippet>3912</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=#3913 id=3913 data-nosnippet>3913</a>
+<a href=#3914 id=3914 data-nosnippet>3914</a> <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"2021-08-01T01:09:00.0899+0800"</span>);
+<a href=#3915 id=3915 data-nosnippet>3915</a> <span class="macro">assert!</span>(value.is_err(), <span class="string">"Parse timestamp with timezone should fail!"</span>);
+<a href=#3916 id=3916 data-nosnippet>3916</a>
+<a href=#3917 id=3917 data-nosnippet>3917</a> <span class="kw">let </span>value = Datum::timestamp_from_str(<span class="string">"dfa"</span>);
+<a href=#3918 id=3918 data-nosnippet>3918</a> <span class="macro">assert!</span>(
+<a href=#3919 id=3919 data-nosnippet>3919</a> value.is_err(),
+<a href=#3920 id=3920 data-nosnippet>3920</a> <span class="string">"Parse timestamp with invalid input should fail!"
+<a href=#3921 id=3921 data-nosnippet>3921</a> </span>);
+<a href=#3922 id=3922 data-nosnippet>3922</a> }
<a href=#3923 id=3923 data-nosnippet>3923</a>
-<a href=#3924 id=3924 data-nosnippet>3924</a> <span class="comment">// Test double ordering
-<a href=#3925 id=3925 data-nosnippet>3925</a> </span><span class="kw">let </span>double_values = <span class="macro">vec!</span>[
-<a href=#3926 id=3926 data-nosnippet>3926</a> Datum::double(f64::NAN),
-<a href=#3927 id=3927 data-nosnippet>3927</a> Datum::double(-f64::NAN),
-<a href=#3928 id=3928 data-nosnippet>3928</a> Datum::double(f64::INFINITY),
-<a href=#3929 id=3929 data-nosnippet>3929</a> Datum::double(-f64::INFINITY),
-<a href=#3930 id=3930 data-nosnippet>3930</a> Datum::double(f64::MAX),
-<a href=#3931 id=3931 data-nosnippet>3931</a> Datum::double(f64::MIN),
-<a href=#3932 id=3932 data-nosnippet>3932</a> Datum::double(<span class="number">1.0</span>),
-<a href=#3933 id=3933 data-nosnippet>3933</a> Datum::double(-<span class="number">1.0</span>),
-<a href=#3934 id=3934 data-nosnippet>3934</a> Datum::double(<span class="number">0.0</span>),
-<a href=#3935 id=3935 data-nosnippet>3935</a> Datum::double(-<span class="number">0.0</span>),
-<a href=#3936 id=3936 data-nosnippet>3936</a> ];
-<a href=#3937 id=3937 data-nosnippet>3937</a>
-<a href=#3938 id=3938 data-nosnippet>3938</a> <span class="kw">let </span><span class="kw-2">mut </span>double_sorted = double_values.clone();
-<a href=#3939 id=3939 data-nosnippet>3939</a> double_sorted.sort_by(|a, b| a.partial_cmp(b).unwrap());
-<a href=#3940 id=3940 data-nosnippet>3940</a>
-<a href=#3941 id=3941 data-nosnippet>3941</a> <span class="kw">let </span>double_expected = <span class="macro">vec!</span>[
-<a href=#3942 id=3942 data-nosnippet>3942</a> Datum::double(-f64::NAN),
-<a href=#3943 id=3943 data-nosnippet>3943</a> Datum::double(-f64::INFINITY),
-<a href=#3944 id=3944 data-nosnippet>3944</a> Datum::double(f64::MIN),
-<a href=#3945 id=3945 data-nosnippet>3945</a> Datum::double(-<span class="number">1.0</span>),
-<a href=#3946 id=3946 data-nosnippet>3946</a> Datum::double(-<span class="number">0.0</span>),
-<a href=#3947 id=3947 data-nosnippet>3947</a> Datum::double(<span class="number">0.0</span>),
-<a href=#3948 id=3948 data-nosnippet>3948</a> Datum::double(<span class="number">1.0</span>),
-<a href=#3949 id=3949 data-nosnippet>3949</a> Datum::double(f64::MAX),
-<a href=#3950 id=3950 data-nosnippet>3950</a> Datum::double(f64::INFINITY),
-<a href=#3951 id=3951 data-nosnippet>3951</a> Datum::double(f64::NAN),
-<a href=#3952 id=3952 data-nosnippet>3952</a> ];
+<a href=#3924 id=3924 data-nosnippet>3924</a> <span class="attr">#[test]
+<a href=#3925 id=3925 data-nosnippet>3925</a> </span><span class="kw">fn </span>test_parse_timestamptz() {
+<a href=#3926 id=3926 data-nosnippet>3926</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=#3927 id=3927 data-nosnippet>3927</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=#3928 id=3928 data-nosnippet>3928</a>
+<a href=#3929 id=3929 data-nosnippet>3929</a> <span class="kw">let </span>value = Datum::timestamptz_from_str(<span class="string">"2021-08-01T01:09:00.0899"</span>);
+<a href=#3930 id=3930 data-nosnippet>3930</a> <span class="macro">assert!</span>(
+<a href=#3931 id=3931 data-nosnippet>3931</a> value.is_err(),
+<a href=#3932 id=3932 data-nosnippet>3932</a> <span class="string">"Parse timestamptz without timezone should fail!"
+<a href=#3933 id=3933 data-nosnippet>3933</a> </span>);
+<a href=#3934 id=3934 data-nosnippet>3934</a>
+<a href=#3935 id=3935 data-nosnippet>3935</a> <span class="kw">let </span>value = Datum::timestamptz_from_str(<span class="string">"dfa"</span>);
+<a href=#3936 id=3936 data-nosnippet>3936</a> <span class="macro">assert!</span>(
+<a href=#3937 id=3937 data-nosnippet>3937</a> value.is_err(),
+<a href=#3938 id=3938 data-nosnippet>3938</a> <span class="string">"Parse timestamptz with invalid input should fail!"
+<a href=#3939 id=3939 data-nosnippet>3939</a> </span>);
+<a href=#3940 id=3940 data-nosnippet>3940</a> }
+<a href=#3941 id=3941 data-nosnippet>3941</a>
+<a href=#3942 id=3942 data-nosnippet>3942</a> <span class="attr">#[test]
+<a href=#3943 id=3943 data-nosnippet>3943</a> </span><span class="kw">fn </span>test_datum_ser_deser() {
+<a href=#3944 id=3944 data-nosnippet>3944</a> <span class="kw">let </span>test_fn = |datum: Datum| {
+<a href=#3945 id=3945 data-nosnippet>3945</a> <span class="kw">let </span>json = serde_json::to_value(<span class="kw-2">&</span>datum).unwrap();
+<a href=#3946 id=3946 data-nosnippet>3946</a> <span class="kw">let </span>desered_datum: Datum = serde_json::from_value(json).unwrap();
+<a href=#3947 id=3947 data-nosnippet>3947</a> <span class="macro">assert_eq!</span>(datum, desered_datum);
+<a href=#3948 id=3948 data-nosnippet>3948</a> };
+<a href=#3949 id=3949 data-nosnippet>3949</a> <span class="kw">let </span>datum = Datum::int(<span class="number">1</span>);
+<a href=#3950 id=3950 data-nosnippet>3950</a> test_fn(datum);
+<a href=#3951 id=3951 data-nosnippet>3951</a> <span class="kw">let </span>datum = Datum::long(<span class="number">1</span>);
+<a href=#3952 id=3952 data-nosnippet>3952</a> test_fn(datum);
<a href=#3953 id=3953 data-nosnippet>3953</a>
-<a href=#3954 id=3954 data-nosnippet>3954</a> <span class="macro">assert_eq!</span>(double_sorted, double_expected);
-<a href=#3955 id=3955 data-nosnippet>3955</a> }
-<a href=#3956 id=3956 data-nosnippet>3956</a>
-<a href=#3957 id=3957 data-nosnippet>3957</a> <span class="doccomment">/// Test Date deserialization from JSON as number (days since epoch).
-<a href=#3958 id=3958 data-nosnippet>3958</a> ///
-<a href=#3959 id=3959 data-nosnippet>3959</a> /// This reproduces the scenario from Iceberg Java's TestAddFilesProcedure where:
-<a href=#3960 id=3960 data-nosnippet>3960</a> /// - Date partition columns have initial_default values in manifests
-<a href=#3961 id=3961 data-nosnippet>3961</a> /// - These values are serialized as days since epoch (e.g., 18628 for 2021-01-01)
-<a href=#3962 id=3962 data-nosnippet>3962</a> /// - The JSON schema includes: {"type":"date","initial-default":18628}
-<a href=#3963 id=3963 data-nosnippet>3963</a> ///
-<a href=#3964 id=3964 data-nosnippet>3964</a> /// Prior to this fix, Date values in JSON were only parsed from String format ("2021-01-01"),
-<a href=#3965 id=3965 data-nosnippet>3965</a> /// causing initial_default values to be lost during schema deserialization.
-<a href=#3966 id=3966 data-nosnippet>3966</a> ///
-<a href=#3967 id=3967 data-nosnippet>3967</a> /// This test ensures both formats are supported:
-<a href=#3968 id=3968 data-nosnippet>3968</a> /// - String format: "2021-01-01" (used in table metadata)
-<a href=#3969 id=3969 data-nosnippet>3969</a> /// - Number format: 18628 (used in initial-default values from add_files)
-<a href=#3970 id=3970 data-nosnippet>3970</a> ///
-<a href=#3971 id=3971 data-nosnippet>3971</a> /// See: Iceberg Java TestAddFilesProcedure.addDataPartitionedByDateToPartitioned()
-<a href=#3972 id=3972 data-nosnippet>3972</a> </span><span class="attr">#[test]
-<a href=#3973 id=3973 data-nosnippet>3973</a> </span><span class="kw">fn </span>test_date_from_json_as_number() {
-<a href=#3974 id=3974 data-nosnippet>3974</a> <span class="kw">use </span>serde_json::json;
+<a href=#3954 id=3954 data-nosnippet>3954</a> <span class="kw">let </span>datum = Datum::float(<span class="number">1.0</span>);
+<a href=#3955 id=3955 data-nosnippet>3955</a> test_fn(datum);
+<a href=#3956 id=3956 data-nosnippet>3956</a> <span class="kw">let </span>datum = Datum::float(<span class="number">0_f32</span>);
+<a href=#3957 id=3957 data-nosnippet>3957</a> test_fn(datum);
+<a href=#3958 id=3958 data-nosnippet>3958</a> <span class="kw">let </span>datum = Datum::float(-<span class="number">0_f32</span>);
+<a href=#3959 id=3959 data-nosnippet>3959</a> test_fn(datum);
+<a href=#3960 id=3960 data-nosnippet>3960</a> <span class="kw">let </span>datum = Datum::float(f32::MAX);
+<a href=#3961 id=3961 data-nosnippet>3961</a> test_fn(datum);
+<a href=#3962 id=3962 data-nosnippet>3962</a> <span class="kw">let </span>datum = Datum::float(f32::MIN);
+<a href=#3963 id=3963 data-nosnippet>3963</a> test_fn(datum);
+<a href=#3964 id=3964 data-nosnippet>3964</a>
+<a href=#3965 id=3965 data-nosnippet>3965</a> <span class="comment">// serde_json can't serialize f32::INFINITY, f32::NEG_INFINITY, f32::NAN
+<a href=#3966 id=3966 data-nosnippet>3966</a> </span><span class="kw">let </span>datum = Datum::float(f32::INFINITY);
+<a href=#3967 id=3967 data-nosnippet>3967</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
+<a href=#3968 id=3968 data-nosnippet>3968</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
+<a href=#3969 id=3969 data-nosnippet>3969</a> <span class="kw">let </span>datum = Datum::float(f32::NEG_INFINITY);
+<a href=#3970 id=3970 data-nosnippet>3970</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
+<a href=#3971 id=3971 data-nosnippet>3971</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
+<a href=#3972 id=3972 data-nosnippet>3972</a> <span class="kw">let </span>datum = Datum::float(f32::NAN);
+<a href=#3973 id=3973 data-nosnippet>3973</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
+<a href=#3974 id=3974 data-nosnippet>3974</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
<a href=#3975 id=3975 data-nosnippet>3975</a>
-<a href=#3976 id=3976 data-nosnippet>3976</a> <span class="comment">// Test Date as number (days since epoch) - used in initial-default from add_files
-<a href=#3977 id=3977 data-nosnippet>3977</a> </span><span class="kw">let </span>date_number = <span class="macro">json!</span>(<span class="number">18628</span>); <span class="comment">// 2021-01-01 is 18628 days since 1970-01-01
-<a href=#3978 id=3978 data-nosnippet>3978</a> </span><span class="kw">let </span>result =
-<a href=#3979 id=3979 data-nosnippet>3979</a> Literal::try_from_json(date_number, <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Date)).unwrap();
-<a href=#3980 id=3980 data-nosnippet>3980</a> <span class="macro">assert_eq!</span>(
-<a href=#3981 id=3981 data-nosnippet>3981</a> result,
-<a href=#3982 id=3982 data-nosnippet>3982</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">18628</span>)))
-<a href=#3983 id=3983 data-nosnippet>3983</a> );
-<a href=#3984 id=3984 data-nosnippet>3984</a>
-<a href=#3985 id=3985 data-nosnippet>3985</a> <span class="comment">// Test Date as string - traditional format
-<a href=#3986 id=3986 data-nosnippet>3986</a> </span><span class="kw">let </span>date_string = <span class="macro">json!</span>(<span class="string">"2021-01-01"</span>);
-<a href=#3987 id=3987 data-nosnippet>3987</a> <span class="kw">let </span>result =
-<a href=#3988 id=3988 data-nosnippet>3988</a> Literal::try_from_json(date_string, <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Date)).unwrap();
-<a href=#3989 id=3989 data-nosnippet>3989</a> <span class="macro">assert_eq!</span>(
-<a href=#3990 id=3990 data-nosnippet>3990</a> result,
-<a href=#3991 id=3991 data-nosnippet>3991</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">18628</span>)))
-<a href=#3992 id=3992 data-nosnippet>3992</a> );
+<a href=#3976 id=3976 data-nosnippet>3976</a> <span class="kw">let </span>datum = Datum::double(<span class="number">1.0</span>);
+<a href=#3977 id=3977 data-nosnippet>3977</a> test_fn(datum);
+<a href=#3978 id=3978 data-nosnippet>3978</a> <span class="kw">let </span>datum = Datum::double(f64::MAX);
+<a href=#3979 id=3979 data-nosnippet>3979</a> test_fn(datum);
+<a href=#3980 id=3980 data-nosnippet>3980</a> <span class="kw">let </span>datum = Datum::double(f64::MIN);
+<a href=#3981 id=3981 data-nosnippet>3981</a> test_fn(datum);
+<a href=#3982 id=3982 data-nosnippet>3982</a>
+<a href=#3983 id=3983 data-nosnippet>3983</a> <span class="comment">// serde_json can't serialize f32::INFINITY, f32::NEG_INFINITY, f32::NAN
+<a href=#3984 id=3984 data-nosnippet>3984</a> </span><span class="kw">let </span>datum = Datum::double(f64::INFINITY);
+<a href=#3985 id=3985 data-nosnippet>3985</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
+<a href=#3986 id=3986 data-nosnippet>3986</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
+<a href=#3987 id=3987 data-nosnippet>3987</a> <span class="kw">let </span>datum = Datum::double(f64::NEG_INFINITY);
+<a href=#3988 id=3988 data-nosnippet>3988</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
+<a href=#3989 id=3989 data-nosnippet>3989</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
+<a href=#3990 id=3990 data-nosnippet>3990</a> <span class="kw">let </span>datum = Datum::double(f64::NAN);
+<a href=#3991 id=3991 data-nosnippet>3991</a> <span class="kw">let </span>json = serde_json::to_string(<span class="kw-2">&</span>datum).unwrap();
+<a href=#3992 id=3992 data-nosnippet>3992</a> <span class="macro">assert!</span>(serde_json::from_str::<Datum>(<span class="kw-2">&</span>json).is_err());
<a href=#3993 id=3993 data-nosnippet>3993</a>
-<a href=#3994 id=3994 data-nosnippet>3994</a> <span class="comment">// Both formats should produce the same Literal value
-<a href=#3995 id=3995 data-nosnippet>3995</a> </span>}
-<a href=#3996 id=3996 data-nosnippet>3996</a>}</code></pre></div></section></main></body></html>
\ No newline at end of file
+<a href=#3994 id=3994 data-nosnippet>3994</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"iceberg"</span>);
+<a href=#3995 id=3995 data-nosnippet>3995</a> test_fn(datum);
+<a href=#3996 id=3996 data-nosnippet>3996</a> <span class="kw">let </span>datum = Datum::bool(<span class="bool-val">true</span>);
+<a href=#3997 id=3997 data-nosnippet>3997</a> test_fn(datum);
+<a href=#3998 id=3998 data-nosnippet>3998</a> <span class="kw">let </span>datum = Datum::date(<span class="number">17486</span>);
+<a href=#3999 id=3999 data-nosnippet>3999</a> test_fn(datum);
+<a href=#4000 id=4000 data-nosnippet>4000</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=#4001 id=4001 data-nosnippet>4001</a> test_fn(datum);
+<a href=#4002 id=4002 data-nosnippet>4002</a> <span class="kw">let </span>datum = Datum::timestamp_micros(<span class="number">1510871468123456</span>);
+<a href=#4003 id=4003 data-nosnippet>4003</a> test_fn(datum);
+<a href=#4004 id=4004 data-nosnippet>4004</a> <span class="kw">let </span>datum = Datum::timestamptz_micros(<span class="number">1510871468123456</span>);
+<a href=#4005 id=4005 data-nosnippet>4005</a> test_fn(datum);
+<a href=#4006 id=4006 data-nosnippet>4006</a> <span class="kw">let </span>datum = Datum::uuid(Uuid::parse_str(<span class="string">"f79c3e09-677c-4bbd-a479-3f349cb785e7"</span>).unwrap());
+<a href=#4007 id=4007 data-nosnippet>4007</a> test_fn(datum);
+<a href=#4008 id=4008 data-nosnippet>4008</a> <span class="kw">let </span>datum = Datum::decimal(<span class="number">1420</span>).unwrap();
+<a href=#4009 id=4009 data-nosnippet>4009</a> test_fn(datum);
+<a href=#4010 id=4010 data-nosnippet>4010</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=#4011 id=4011 data-nosnippet>4011</a> test_fn(datum);
+<a href=#4012 id=4012 data-nosnippet>4012</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=#4013 id=4013 data-nosnippet>4013</a> test_fn(datum);
+<a href=#4014 id=4014 data-nosnippet>4014</a> }
+<a href=#4015 id=4015 data-nosnippet>4015</a>
+<a href=#4016 id=4016 data-nosnippet>4016</a> <span class="attr">#[test]
+<a href=#4017 id=4017 data-nosnippet>4017</a> </span><span class="kw">fn </span>test_datum_date_convert_to_int() {
+<a href=#4018 id=4018 data-nosnippet>4018</a> <span class="kw">let </span>datum_date = Datum::date(<span class="number">12345</span>);
+<a href=#4019 id=4019 data-nosnippet>4019</a>
+<a href=#4020 id=4020 data-nosnippet>4020</a> <span class="kw">let </span>result = datum_date.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
+<a href=#4021 id=4021 data-nosnippet>4021</a>
+<a href=#4022 id=4022 data-nosnippet>4022</a> <span class="kw">let </span>expected = Datum::int(<span class="number">12345</span>);
+<a href=#4023 id=4023 data-nosnippet>4023</a>
+<a href=#4024 id=4024 data-nosnippet>4024</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4025 id=4025 data-nosnippet>4025</a> }
+<a href=#4026 id=4026 data-nosnippet>4026</a>
+<a href=#4027 id=4027 data-nosnippet>4027</a> <span class="attr">#[test]
+<a href=#4028 id=4028 data-nosnippet>4028</a> </span><span class="kw">fn </span>test_datum_int_convert_to_date() {
+<a href=#4029 id=4029 data-nosnippet>4029</a> <span class="kw">let </span>datum_int = Datum::int(<span class="number">12345</span>);
+<a href=#4030 id=4030 data-nosnippet>4030</a>
+<a href=#4031 id=4031 data-nosnippet>4031</a> <span class="kw">let </span>result = datum_int.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Date)).unwrap();
+<a href=#4032 id=4032 data-nosnippet>4032</a>
+<a href=#4033 id=4033 data-nosnippet>4033</a> <span class="kw">let </span>expected = Datum::date(<span class="number">12345</span>);
+<a href=#4034 id=4034 data-nosnippet>4034</a>
+<a href=#4035 id=4035 data-nosnippet>4035</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4036 id=4036 data-nosnippet>4036</a> }
+<a href=#4037 id=4037 data-nosnippet>4037</a>
+<a href=#4038 id=4038 data-nosnippet>4038</a> <span class="attr">#[test]
+<a href=#4039 id=4039 data-nosnippet>4039</a> </span><span class="kw">fn </span>test_datum_long_convert_to_int() {
+<a href=#4040 id=4040 data-nosnippet>4040</a> <span class="kw">let </span>datum = Datum::long(<span class="number">12345</span>);
+<a href=#4041 id=4041 data-nosnippet>4041</a>
+<a href=#4042 id=4042 data-nosnippet>4042</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
+<a href=#4043 id=4043 data-nosnippet>4043</a>
+<a href=#4044 id=4044 data-nosnippet>4044</a> <span class="kw">let </span>expected = Datum::int(<span class="number">12345</span>);
+<a href=#4045 id=4045 data-nosnippet>4045</a>
+<a href=#4046 id=4046 data-nosnippet>4046</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4047 id=4047 data-nosnippet>4047</a> }
+<a href=#4048 id=4048 data-nosnippet>4048</a>
+<a href=#4049 id=4049 data-nosnippet>4049</a> <span class="attr">#[test]
+<a href=#4050 id=4050 data-nosnippet>4050</a> </span><span class="kw">fn </span>test_datum_long_convert_to_int_above_max() {
+<a href=#4051 id=4051 data-nosnippet>4051</a> <span class="kw">let </span>datum = Datum::long(INT_MAX <span class="kw">as </span>i64 + <span class="number">1</span>);
+<a href=#4052 id=4052 data-nosnippet>4052</a>
+<a href=#4053 id=4053 data-nosnippet>4053</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
+<a href=#4054 id=4054 data-nosnippet>4054</a>
+<a href=#4055 id=4055 data-nosnippet>4055</a> <span class="kw">let </span>expected = Datum::new(PrimitiveType::Int, PrimitiveLiteral::AboveMax);
+<a href=#4056 id=4056 data-nosnippet>4056</a>
+<a href=#4057 id=4057 data-nosnippet>4057</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4058 id=4058 data-nosnippet>4058</a> }
+<a href=#4059 id=4059 data-nosnippet>4059</a>
+<a href=#4060 id=4060 data-nosnippet>4060</a> <span class="attr">#[test]
+<a href=#4061 id=4061 data-nosnippet>4061</a> </span><span class="kw">fn </span>test_datum_long_convert_to_int_below_min() {
+<a href=#4062 id=4062 data-nosnippet>4062</a> <span class="kw">let </span>datum = Datum::long(INT_MIN <span class="kw">as </span>i64 - <span class="number">1</span>);
+<a href=#4063 id=4063 data-nosnippet>4063</a>
+<a href=#4064 id=4064 data-nosnippet>4064</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
+<a href=#4065 id=4065 data-nosnippet>4065</a>
+<a href=#4066 id=4066 data-nosnippet>4066</a> <span class="kw">let </span>expected = Datum::new(PrimitiveType::Int, PrimitiveLiteral::BelowMin);
+<a href=#4067 id=4067 data-nosnippet>4067</a>
+<a href=#4068 id=4068 data-nosnippet>4068</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4069 id=4069 data-nosnippet>4069</a> }
+<a href=#4070 id=4070 data-nosnippet>4070</a>
+<a href=#4071 id=4071 data-nosnippet>4071</a> <span class="attr">#[test]
+<a href=#4072 id=4072 data-nosnippet>4072</a> </span><span class="kw">fn </span>test_datum_long_convert_to_timestamp() {
+<a href=#4073 id=4073 data-nosnippet>4073</a> <span class="kw">let </span>datum = Datum::long(<span class="number">12345</span>);
+<a href=#4074 id=4074 data-nosnippet>4074</a>
+<a href=#4075 id=4075 data-nosnippet>4075</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Timestamp)).unwrap();
+<a href=#4076 id=4076 data-nosnippet>4076</a>
+<a href=#4077 id=4077 data-nosnippet>4077</a> <span class="kw">let </span>expected = Datum::timestamp_micros(<span class="number">12345</span>);
+<a href=#4078 id=4078 data-nosnippet>4078</a>
+<a href=#4079 id=4079 data-nosnippet>4079</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4080 id=4080 data-nosnippet>4080</a> }
+<a href=#4081 id=4081 data-nosnippet>4081</a>
+<a href=#4082 id=4082 data-nosnippet>4082</a> <span class="attr">#[test]
+<a href=#4083 id=4083 data-nosnippet>4083</a> </span><span class="kw">fn </span>test_datum_long_convert_to_timestamptz() {
+<a href=#4084 id=4084 data-nosnippet>4084</a> <span class="kw">let </span>datum = Datum::long(<span class="number">12345</span>);
+<a href=#4085 id=4085 data-nosnippet>4085</a>
+<a href=#4086 id=4086 data-nosnippet>4086</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Timestamptz)).unwrap();
+<a href=#4087 id=4087 data-nosnippet>4087</a>
+<a href=#4088 id=4088 data-nosnippet>4088</a> <span class="kw">let </span>expected = Datum::timestamptz_micros(<span class="number">12345</span>);
+<a href=#4089 id=4089 data-nosnippet>4089</a>
+<a href=#4090 id=4090 data-nosnippet>4090</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4091 id=4091 data-nosnippet>4091</a> }
+<a href=#4092 id=4092 data-nosnippet>4092</a>
+<a href=#4093 id=4093 data-nosnippet>4093</a> <span class="attr">#[test]
+<a href=#4094 id=4094 data-nosnippet>4094</a> </span><span class="kw">fn </span>test_datum_decimal_convert_to_long() {
+<a href=#4095 id=4095 data-nosnippet>4095</a> <span class="kw">let </span>datum = Datum::decimal(<span class="number">12345</span>).unwrap();
+<a href=#4096 id=4096 data-nosnippet>4096</a>
+<a href=#4097 id=4097 data-nosnippet>4097</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Long)).unwrap();
+<a href=#4098 id=4098 data-nosnippet>4098</a>
+<a href=#4099 id=4099 data-nosnippet>4099</a> <span class="kw">let </span>expected = Datum::long(<span class="number">12345</span>);
+<a href=#4100 id=4100 data-nosnippet>4100</a>
+<a href=#4101 id=4101 data-nosnippet>4101</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4102 id=4102 data-nosnippet>4102</a> }
+<a href=#4103 id=4103 data-nosnippet>4103</a>
+<a href=#4104 id=4104 data-nosnippet>4104</a> <span class="attr">#[test]
+<a href=#4105 id=4105 data-nosnippet>4105</a> </span><span class="kw">fn </span>test_datum_decimal_convert_to_long_above_max() {
+<a href=#4106 id=4106 data-nosnippet>4106</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=#4107 id=4107 data-nosnippet>4107</a>
+<a href=#4108 id=4108 data-nosnippet>4108</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Long)).unwrap();
+<a href=#4109 id=4109 data-nosnippet>4109</a>
+<a href=#4110 id=4110 data-nosnippet>4110</a> <span class="kw">let </span>expected = Datum::new(PrimitiveType::Long, PrimitiveLiteral::AboveMax);
+<a href=#4111 id=4111 data-nosnippet>4111</a>
+<a href=#4112 id=4112 data-nosnippet>4112</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4113 id=4113 data-nosnippet>4113</a> }
+<a href=#4114 id=4114 data-nosnippet>4114</a>
+<a href=#4115 id=4115 data-nosnippet>4115</a> <span class="attr">#[test]
+<a href=#4116 id=4116 data-nosnippet>4116</a> </span><span class="kw">fn </span>test_datum_decimal_convert_to_long_below_min() {
+<a href=#4117 id=4117 data-nosnippet>4117</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=#4118 id=4118 data-nosnippet>4118</a>
+<a href=#4119 id=4119 data-nosnippet>4119</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Long)).unwrap();
+<a href=#4120 id=4120 data-nosnippet>4120</a>
+<a href=#4121 id=4121 data-nosnippet>4121</a> <span class="kw">let </span>expected = Datum::new(PrimitiveType::Long, PrimitiveLiteral::BelowMin);
+<a href=#4122 id=4122 data-nosnippet>4122</a>
+<a href=#4123 id=4123 data-nosnippet>4123</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4124 id=4124 data-nosnippet>4124</a> }
+<a href=#4125 id=4125 data-nosnippet>4125</a>
+<a href=#4126 id=4126 data-nosnippet>4126</a> <span class="attr">#[test]
+<a href=#4127 id=4127 data-nosnippet>4127</a> </span><span class="kw">fn </span>test_datum_string_convert_to_boolean() {
+<a href=#4128 id=4128 data-nosnippet>4128</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"true"</span>);
+<a href=#4129 id=4129 data-nosnippet>4129</a>
+<a href=#4130 id=4130 data-nosnippet>4130</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Boolean)).unwrap();
+<a href=#4131 id=4131 data-nosnippet>4131</a>
+<a href=#4132 id=4132 data-nosnippet>4132</a> <span class="kw">let </span>expected = Datum::bool(<span class="bool-val">true</span>);
+<a href=#4133 id=4133 data-nosnippet>4133</a>
+<a href=#4134 id=4134 data-nosnippet>4134</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4135 id=4135 data-nosnippet>4135</a> }
+<a href=#4136 id=4136 data-nosnippet>4136</a>
+<a href=#4137 id=4137 data-nosnippet>4137</a> <span class="attr">#[test]
+<a href=#4138 id=4138 data-nosnippet>4138</a> </span><span class="kw">fn </span>test_datum_string_convert_to_int() {
+<a href=#4139 id=4139 data-nosnippet>4139</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"12345"</span>);
+<a href=#4140 id=4140 data-nosnippet>4140</a>
+<a href=#4141 id=4141 data-nosnippet>4141</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Int)).unwrap();
+<a href=#4142 id=4142 data-nosnippet>4142</a>
+<a href=#4143 id=4143 data-nosnippet>4143</a> <span class="kw">let </span>expected = Datum::int(<span class="number">12345</span>);
+<a href=#4144 id=4144 data-nosnippet>4144</a>
+<a href=#4145 id=4145 data-nosnippet>4145</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4146 id=4146 data-nosnippet>4146</a> }
+<a href=#4147 id=4147 data-nosnippet>4147</a>
+<a href=#4148 id=4148 data-nosnippet>4148</a> <span class="attr">#[test]
+<a href=#4149 id=4149 data-nosnippet>4149</a> </span><span class="kw">fn </span>test_datum_string_convert_to_long() {
+<a href=#4150 id=4150 data-nosnippet>4150</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"12345"</span>);
+<a href=#4151 id=4151 data-nosnippet>4151</a>
+<a href=#4152 id=4152 data-nosnippet>4152</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Long)).unwrap();
+<a href=#4153 id=4153 data-nosnippet>4153</a>
+<a href=#4154 id=4154 data-nosnippet>4154</a> <span class="kw">let </span>expected = Datum::long(<span class="number">12345</span>);
+<a href=#4155 id=4155 data-nosnippet>4155</a>
+<a href=#4156 id=4156 data-nosnippet>4156</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4157 id=4157 data-nosnippet>4157</a> }
+<a href=#4158 id=4158 data-nosnippet>4158</a>
+<a href=#4159 id=4159 data-nosnippet>4159</a> <span class="attr">#[test]
+<a href=#4160 id=4160 data-nosnippet>4160</a> </span><span class="kw">fn </span>test_datum_string_convert_to_timestamp() {
+<a href=#4161 id=4161 data-nosnippet>4161</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"1925-05-20T19:25:00.000"</span>);
+<a href=#4162 id=4162 data-nosnippet>4162</a>
+<a href=#4163 id=4163 data-nosnippet>4163</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Timestamp)).unwrap();
+<a href=#4164 id=4164 data-nosnippet>4164</a>
+<a href=#4165 id=4165 data-nosnippet>4165</a> <span class="kw">let </span>expected = Datum::timestamp_micros(-<span class="number">1407990900000000</span>);
+<a href=#4166 id=4166 data-nosnippet>4166</a>
+<a href=#4167 id=4167 data-nosnippet>4167</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4168 id=4168 data-nosnippet>4168</a> }
+<a href=#4169 id=4169 data-nosnippet>4169</a>
+<a href=#4170 id=4170 data-nosnippet>4170</a> <span class="attr">#[test]
+<a href=#4171 id=4171 data-nosnippet>4171</a> </span><span class="kw">fn </span>test_datum_string_convert_to_timestamptz() {
+<a href=#4172 id=4172 data-nosnippet>4172</a> <span class="kw">let </span>datum = Datum::string(<span class="string">"1925-05-20T19:25:00.000 UTC"</span>);
+<a href=#4173 id=4173 data-nosnippet>4173</a>
+<a href=#4174 id=4174 data-nosnippet>4174</a> <span class="kw">let </span>result = datum.to(<span class="kw-2">&</span>Primitive(PrimitiveType::Timestamptz)).unwrap();
+<a href=#4175 id=4175 data-nosnippet>4175</a>
+<a href=#4176 id=4176 data-nosnippet>4176</a> <span class="kw">let </span>expected = Datum::timestamptz_micros(-<span class="number">1407990900000000</span>);
+<a href=#4177 id=4177 data-nosnippet>4177</a>
+<a href=#4178 id=4178 data-nosnippet>4178</a> <span class="macro">assert_eq!</span>(result, expected);
+<a href=#4179 id=4179 data-nosnippet>4179</a> }
+<a href=#4180 id=4180 data-nosnippet>4180</a>
+<a href=#4181 id=4181 data-nosnippet>4181</a> <span class="attr">#[test]
+<a href=#4182 id=4182 data-nosnippet>4182</a> </span><span class="kw">fn </span>test_iceberg_float_order() {
+<a href=#4183 id=4183 data-nosnippet>4183</a> <span class="comment">// Test float ordering
+<a href=#4184 id=4184 data-nosnippet>4184</a> </span><span class="kw">let </span>float_values = <span class="macro">vec!</span>[
+<a href=#4185 id=4185 data-nosnippet>4185</a> Datum::float(f32::NAN),
+<a href=#4186 id=4186 data-nosnippet>4186</a> Datum::float(-f32::NAN),
+<a href=#4187 id=4187 data-nosnippet>4187</a> Datum::float(f32::MAX),
+<a href=#4188 id=4188 data-nosnippet>4188</a> Datum::float(f32::MIN),
+<a href=#4189 id=4189 data-nosnippet>4189</a> Datum::float(f32::INFINITY),
+<a href=#4190 id=4190 data-nosnippet>4190</a> Datum::float(-f32::INFINITY),
+<a href=#4191 id=4191 data-nosnippet>4191</a> Datum::float(<span class="number">1.0</span>),
+<a href=#4192 id=4192 data-nosnippet>4192</a> Datum::float(-<span class="number">1.0</span>),
+<a href=#4193 id=4193 data-nosnippet>4193</a> Datum::float(<span class="number">0.0</span>),
+<a href=#4194 id=4194 data-nosnippet>4194</a> Datum::float(-<span class="number">0.0</span>),
+<a href=#4195 id=4195 data-nosnippet>4195</a> ];
+<a href=#4196 id=4196 data-nosnippet>4196</a>
+<a href=#4197 id=4197 data-nosnippet>4197</a> <span class="kw">let </span><span class="kw-2">mut </span>float_sorted = float_values.clone();
+<a href=#4198 id=4198 data-nosnippet>4198</a> float_sorted.sort_by(|a, b| a.partial_cmp(b).unwrap());
+<a href=#4199 id=4199 data-nosnippet>4199</a>
+<a href=#4200 id=4200 data-nosnippet>4200</a> <span class="kw">let </span>float_expected = <span class="macro">vec!</span>[
+<a href=#4201 id=4201 data-nosnippet>4201</a> Datum::float(-f32::NAN),
+<a href=#4202 id=4202 data-nosnippet>4202</a> Datum::float(-f32::INFINITY),
+<a href=#4203 id=4203 data-nosnippet>4203</a> Datum::float(f32::MIN),
+<a href=#4204 id=4204 data-nosnippet>4204</a> Datum::float(-<span class="number">1.0</span>),
+<a href=#4205 id=4205 data-nosnippet>4205</a> Datum::float(-<span class="number">0.0</span>),
+<a href=#4206 id=4206 data-nosnippet>4206</a> Datum::float(<span class="number">0.0</span>),
+<a href=#4207 id=4207 data-nosnippet>4207</a> Datum::float(<span class="number">1.0</span>),
+<a href=#4208 id=4208 data-nosnippet>4208</a> Datum::float(f32::MAX),
+<a href=#4209 id=4209 data-nosnippet>4209</a> Datum::float(f32::INFINITY),
+<a href=#4210 id=4210 data-nosnippet>4210</a> Datum::float(f32::NAN),
+<a href=#4211 id=4211 data-nosnippet>4211</a> ];
+<a href=#4212 id=4212 data-nosnippet>4212</a>
+<a href=#4213 id=4213 data-nosnippet>4213</a> <span class="macro">assert_eq!</span>(float_sorted, float_expected);
+<a href=#4214 id=4214 data-nosnippet>4214</a>
+<a href=#4215 id=4215 data-nosnippet>4215</a> <span class="comment">// Test double ordering
+<a href=#4216 id=4216 data-nosnippet>4216</a> </span><span class="kw">let </span>double_values = <span class="macro">vec!</span>[
+<a href=#4217 id=4217 data-nosnippet>4217</a> Datum::double(f64::NAN),
+<a href=#4218 id=4218 data-nosnippet>4218</a> Datum::double(-f64::NAN),
+<a href=#4219 id=4219 data-nosnippet>4219</a> Datum::double(f64::INFINITY),
+<a href=#4220 id=4220 data-nosnippet>4220</a> Datum::double(-f64::INFINITY),
+<a href=#4221 id=4221 data-nosnippet>4221</a> Datum::double(f64::MAX),
+<a href=#4222 id=4222 data-nosnippet>4222</a> Datum::double(f64::MIN),
+<a href=#4223 id=4223 data-nosnippet>4223</a> Datum::double(<span class="number">1.0</span>),
+<a href=#4224 id=4224 data-nosnippet>4224</a> Datum::double(-<span class="number">1.0</span>),
+<a href=#4225 id=4225 data-nosnippet>4225</a> Datum::double(<span class="number">0.0</span>),
+<a href=#4226 id=4226 data-nosnippet>4226</a> Datum::double(-<span class="number">0.0</span>),
+<a href=#4227 id=4227 data-nosnippet>4227</a> ];
+<a href=#4228 id=4228 data-nosnippet>4228</a>
+<a href=#4229 id=4229 data-nosnippet>4229</a> <span class="kw">let </span><span class="kw-2">mut </span>double_sorted = double_values.clone();
+<a href=#4230 id=4230 data-nosnippet>4230</a> double_sorted.sort_by(|a, b| a.partial_cmp(b).unwrap());
+<a href=#4231 id=4231 data-nosnippet>4231</a>
+<a href=#4232 id=4232 data-nosnippet>4232</a> <span class="kw">let </span>double_expected = <span class="macro">vec!</span>[
+<a href=#4233 id=4233 data-nosnippet>4233</a> Datum::double(-f64::NAN),
+<a href=#4234 id=4234 data-nosnippet>4234</a> Datum::double(-f64::INFINITY),
+<a href=#4235 id=4235 data-nosnippet>4235</a> Datum::double(f64::MIN),
+<a href=#4236 id=4236 data-nosnippet>4236</a> Datum::double(-<span class="number">1.0</span>),
+<a href=#4237 id=4237 data-nosnippet>4237</a> Datum::double(-<span class="number">0.0</span>),
+<a href=#4238 id=4238 data-nosnippet>4238</a> Datum::double(<span class="number">0.0</span>),
+<a href=#4239 id=4239 data-nosnippet>4239</a> Datum::double(<span class="number">1.0</span>),
+<a href=#4240 id=4240 data-nosnippet>4240</a> Datum::double(f64::MAX),
+<a href=#4241 id=4241 data-nosnippet>4241</a> Datum::double(f64::INFINITY),
+<a href=#4242 id=4242 data-nosnippet>4242</a> Datum::double(f64::NAN),
+<a href=#4243 id=4243 data-nosnippet>4243</a> ];
+<a href=#4244 id=4244 data-nosnippet>4244</a>
+<a href=#4245 id=4245 data-nosnippet>4245</a> <span class="macro">assert_eq!</span>(double_sorted, double_expected);
+<a href=#4246 id=4246 data-nosnippet>4246</a> }
+<a href=#4247 id=4247 data-nosnippet>4247</a>
+<a href=#4248 id=4248 data-nosnippet>4248</a> <span class="doccomment">/// Test Date deserialization from JSON as number (days since epoch).
+<a href=#4249 id=4249 data-nosnippet>4249</a> ///
+<a href=#4250 id=4250 data-nosnippet>4250</a> /// This reproduces the scenario from Iceberg Java's TestAddFilesProcedure where:
+<a href=#4251 id=4251 data-nosnippet>4251</a> /// - Date partition columns have initial_default values in manifests
+<a href=#4252 id=4252 data-nosnippet>4252</a> /// - These values are serialized as days since epoch (e.g., 18628 for 2021-01-01)
+<a href=#4253 id=4253 data-nosnippet>4253</a> /// - The JSON schema includes: {"type":"date","initial-default":18628}
+<a href=#4254 id=4254 data-nosnippet>4254</a> ///
+<a href=#4255 id=4255 data-nosnippet>4255</a> /// Prior to this fix, Date values in JSON were only parsed from String format ("2021-01-01"),
+<a href=#4256 id=4256 data-nosnippet>4256</a> /// causing initial_default values to be lost during schema deserialization.
+<a href=#4257 id=4257 data-nosnippet>4257</a> ///
+<a href=#4258 id=4258 data-nosnippet>4258</a> /// This test ensures both formats are supported:
+<a href=#4259 id=4259 data-nosnippet>4259</a> /// - String format: "2021-01-01" (used in table metadata)
+<a href=#4260 id=4260 data-nosnippet>4260</a> /// - Number format: 18628 (used in initial-default values from add_files)
+<a href=#4261 id=4261 data-nosnippet>4261</a> ///
+<a href=#4262 id=4262 data-nosnippet>4262</a> /// See: Iceberg Java TestAddFilesProcedure.addDataPartitionedByDateToPartitioned()
+<a href=#4263 id=4263 data-nosnippet>4263</a> </span><span class="attr">#[test]
+<a href=#4264 id=4264 data-nosnippet>4264</a> </span><span class="kw">fn </span>test_date_from_json_as_number() {
+<a href=#4265 id=4265 data-nosnippet>4265</a> <span class="kw">use </span>serde_json::json;
+<a href=#4266 id=4266 data-nosnippet>4266</a>
+<a href=#4267 id=4267 data-nosnippet>4267</a> <span class="comment">// Test Date as number (days since epoch) - used in initial-default from add_files
+<a href=#4268 id=4268 data-nosnippet>4268</a> </span><span class="kw">let </span>date_number = <span class="macro">json!</span>(<span class="number">18628</span>); <span class="comment">// 2021-01-01 is 18628 days since 1970-01-01
+<a href=#4269 id=4269 data-nosnippet>4269</a> </span><span class="kw">let </span>result =
+<a href=#4270 id=4270 data-nosnippet>4270</a> Literal::try_from_json(date_number, <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Date)).unwrap();
+<a href=#4271 id=4271 data-nosnippet>4271</a> <span class="macro">assert_eq!</span>(
+<a href=#4272 id=4272 data-nosnippet>4272</a> result,
+<a href=#4273 id=4273 data-nosnippet>4273</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">18628</span>)))
+<a href=#4274 id=4274 data-nosnippet>4274</a> );
+<a href=#4275 id=4275 data-nosnippet>4275</a>
+<a href=#4276 id=4276 data-nosnippet>4276</a> <span class="comment">// Test Date as string - traditional format
+<a href=#4277 id=4277 data-nosnippet>4277</a> </span><span class="kw">let </span>date_string = <span class="macro">json!</span>(<span class="string">"2021-01-01"</span>);
+<a href=#4278 id=4278 data-nosnippet>4278</a> <span class="kw">let </span>result =
+<a href=#4279 id=4279 data-nosnippet>4279</a> Literal::try_from_json(date_string, <span class="kw-2">&</span>Type::Primitive(PrimitiveType::Date)).unwrap();
+<a href=#4280 id=4280 data-nosnippet>4280</a> <span class="macro">assert_eq!</span>(
+<a href=#4281 id=4281 data-nosnippet>4281</a> result,
+<a href=#4282 id=4282 data-nosnippet>4282</a> <span class="prelude-val">Some</span>(Literal::Primitive(PrimitiveLiteral::Int(<span class="number">18628</span>)))
+<a href=#4283 id=4283 data-nosnippet>4283</a> );
+<a href=#4284 id=4284 data-nosnippet>4284</a>
+<a href=#4285 id=4285 data-nosnippet>4285</a> <span class="comment">// Both formats should produce the same Literal value
+<a href=#4286 id=4286 data-nosnippet>4286</a> </span>}
+<a href=#4287 id=4287 data-nosnippet>4287</a>}</code></pre></div></section></main></body></html>
\ No newline at end of file