serde_arrow 0.14.0

Convert sequences of Rust objects to Arrow arrays and back again
Documentation
use serde::de::Visitor;

use crate::internal::error::{fail, Error, Result};

pub struct EnumAccess<'de>(pub &'de str);

impl<'de> serde::de::EnumAccess<'de> for EnumAccess<'_> {
    type Error = Error;
    type Variant = UnitVariant;

    fn variant_seed<V: serde::de::DeserializeSeed<'de>>(
        self,
        seed: V,
    ) -> Result<(V::Value, Self::Variant), Self::Error> {
        struct SeedDeserializer<'a>(&'a str);

        macro_rules! unimplemented {
            ($lifetime:lifetime, $name:ident $($tt:tt)*) => {
                fn $name<V: Visitor<$lifetime>>(self $($tt)*, _: V) -> Result<V::Value> {
                    fail!("Unsupported: EnumDeserializer does not implement {}", stringify!($name))
                }
            };
        }

        impl<'de> serde::de::Deserializer<'de> for SeedDeserializer<'_> {
            type Error = Error;

            fn deserialize_identifier<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
                self.deserialize_str(visitor)
            }

            fn deserialize_any<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
                self.deserialize_str(visitor)
            }

            fn deserialize_str<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
                visitor.visit_str(self.0)
            }

            fn deserialize_string<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
                visitor.visit_string(self.0.to_owned())
            }

            unimplemented!('de, deserialize_u64);
            unimplemented!('de, deserialize_bool);
            unimplemented!('de, deserialize_i8);
            unimplemented!('de, deserialize_i16);
            unimplemented!('de, deserialize_i32);
            unimplemented!('de, deserialize_i64);
            unimplemented!('de, deserialize_u8);
            unimplemented!('de, deserialize_u16);
            unimplemented!('de, deserialize_u32);
            unimplemented!('de, deserialize_f32);
            unimplemented!('de, deserialize_f64);
            unimplemented!('de, deserialize_char);
            unimplemented!('de, deserialize_bytes);
            unimplemented!('de, deserialize_byte_buf);
            unimplemented!('de, deserialize_option);
            unimplemented!('de, deserialize_unit);
            unimplemented!('de, deserialize_unit_struct, _: &'static str);
            unimplemented!('de, deserialize_newtype_struct, _: &'static str);
            unimplemented!('de, deserialize_seq);
            unimplemented!('de, deserialize_tuple, _: usize);
            unimplemented!('de, deserialize_tuple_struct, _: &'static str, _: usize);
            unimplemented!('de, deserialize_map);
            unimplemented!('de, deserialize_struct, _: &'static str, _: &'static [&'static str]);
            unimplemented!('de, deserialize_enum, _: &'static str, _: &'static [&'static str]);
            unimplemented!('de, deserialize_ignored_any);
        }

        Ok((seed.deserialize(SeedDeserializer(self.0))?, UnitVariant))
    }
}

pub struct UnitVariant;

impl<'de> serde::de::VariantAccess<'de> for UnitVariant {
    type Error = Error;

    fn newtype_variant_seed<T: serde::de::DeserializeSeed<'de>>(self, _: T) -> Result<T::Value> {
        fail!("Unsupported: cannot deserialize enums with data from strings")
    }

    fn struct_variant<V: Visitor<'de>>(self, _: &'static [&'static str], _: V) -> Result<V::Value> {
        fail!("Unsupported: cannot deserialize enums with data from strings")
    }

    fn tuple_variant<V: Visitor<'de>>(self, _: usize, _: V) -> Result<V::Value> {
        fail!("Unsupported: cannot deserialize enums with data from strings")
    }

    fn unit_variant(self) -> Result<(), Self::Error> {
        Ok(())
    }
}