iab_gpp 0.1.2

IAB GPP Consent String implementation
Documentation
use crate::sections::SectionDecodeError;
use bitstream_io::{BitRead, FromBitStream};
use num_derive::{FromPrimitive, ToPrimitive};
use num_traits::FromPrimitive;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use std::io;

#[derive(Debug, Eq, PartialEq, FromPrimitive, ToPrimitive)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Notice {
    NotApplicable = 0,
    Provided = 1,
    NotProvided = 2,
}

impl FromBitStream for Notice {
    type Error = io::Error;

    fn from_reader<R: BitRead + ?Sized>(r: &mut R) -> Result<Self, Self::Error>
    where
        Self: Sized,
    {
        Ok(Self::from_u8(r.read_unsigned::<2, u8>()?).unwrap_or(Self::NotApplicable))
    }
}

#[derive(Debug, Eq, PartialEq, FromPrimitive, ToPrimitive)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum OptOut {
    NotApplicable = 0,
    OptedOut = 1,
    DidNotOptOut = 2,
}

impl FromBitStream for OptOut {
    type Error = io::Error;

    fn from_reader<R: BitRead + ?Sized>(r: &mut R) -> Result<Self, Self::Error>
    where
        Self: Sized,
    {
        Ok(Self::from_u8(r.read_unsigned::<2, u8>()?).unwrap_or(Self::NotApplicable))
    }
}

#[derive(Debug, Eq, PartialEq, FromPrimitive, ToPrimitive)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Consent {
    NotApplicable = 0,
    NoConsent = 1,
    Consent = 2,
}

impl FromBitStream for Consent {
    type Error = io::Error;

    fn from_reader<R: BitRead + ?Sized>(r: &mut R) -> Result<Self, Self::Error>
    where
        Self: Sized,
    {
        Ok(Self::from_u8(r.read_unsigned::<2, u8>()?).unwrap_or(Self::NotApplicable))
    }
}

#[derive(Debug, Eq, PartialEq, FromPrimitive, ToPrimitive)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum MspaMode {
    NotApplicable = 0,
    Yes = 1,
    No = 2,
}

impl FromBitStream for MspaMode {
    type Error = io::Error;

    fn from_reader<R: BitRead + ?Sized>(r: &mut R) -> Result<Self, Self::Error>
    where
        Self: Sized,
    {
        Ok(Self::from_u8(r.read_unsigned::<2, u8>()?).unwrap_or(Self::NotApplicable))
    }
}

pub(crate) fn parse_mspa_covered_transaction<R: BitRead + ?Sized>(
    r: &mut R,
) -> Result<bool, SectionDecodeError> {
    let val = r.read_unsigned::<2, u8>()?;
    match val {
        1 => Ok(true),
        2 => Ok(false),
        v => Err(SectionDecodeError::InvalidFieldValue {
            expected: "1 or 2".to_string(),
            found: v.to_string(),
        }),
    }
}