modio 0.7.1

Rust interface for integrating https://mod.io - a modding API for game developers
Documentation
use serde::de::{DeserializeOwned, Error, MapAccess};

pub trait DeserializeField<T: DeserializeOwned> {
    fn deserialize_value<'de, A: MapAccess<'de>>(
        &mut self,
        name: &'static str,
        map: &mut A,
    ) -> Result<(), A::Error>;
}

impl<T: DeserializeOwned> DeserializeField<T> for Option<T> {
    fn deserialize_value<'de, A>(&mut self, name: &'static str, map: &mut A) -> Result<(), A::Error>
    where
        A: MapAccess<'de>,
    {
        if self.is_some() {
            return Err(A::Error::duplicate_field(name));
        }
        self.replace(map.next_value()?);
        Ok(())
    }
}

pub trait MissingField<T> {
    fn missing_field<E: Error>(self, name: &'static str) -> Result<T, E>;
}

impl<T> MissingField<T> for Option<T> {
    fn missing_field<E: Error>(self, name: &'static str) -> Result<T, E> {
        self.ok_or_else(|| Error::missing_field(name))
    }
}