ancs 0.2.0

A set of types for representing Apple Notification Center Service requests and responses.
Documentation
pub use crate::attributes::category::*;
pub use crate::attributes::event::*;

use nom::{multi::count, number::complete::le_u8, IResult};

pub const NOTIFICATION_SOURCE_UUID: &str = "9FBF120D-6301-42D9-8C58-25E699A21DBD";

#[derive(Debug, PartialEq, Clone)]
pub struct GattNotification {
    pub event_id: EventID,
    pub event_flags: EventFlag,
    pub category_id: CategoryID,
    pub category_count: u8,
    pub notification_uid: u32,
}

impl GattNotification {
    pub fn parse(i: &[u8]) -> IResult<&[u8], GattNotification> {
        let (i, event_id) = le_u8(i)?;
        let (i, event_flags) = le_u8(i)?;
        let (i, category_id) = le_u8(i)?;
        let (i, category_count) = le_u8(i)?;
        let (i, notification_uid) = count(le_u8, 4)(i)?;

        Ok((
            i,
            GattNotification {
                event_id: EventID::try_from(event_id).unwrap(),
                event_flags: EventFlag::try_from(event_flags).unwrap(),
                category_id: CategoryID::try_from(category_id).unwrap(),
                category_count,
                notification_uid: u32::from_le_bytes(notification_uid.try_into().unwrap()),
            },
        ))
    }
}

impl From<GattNotification> for [u8; 8] {
    fn from(original: GattNotification) -> [u8; 8] {
        let mut bytes: [u8; 8] = [0; 8];
        let uid_as_u8 = original.notification_uid.to_le_bytes();

        bytes[0] = original.event_id as u8;
        bytes[1] = original.event_flags as u8;
        bytes[2] = original.category_id as u8;
        bytes[3] = original.category_count as u8;

        bytes[4] = uid_as_u8[0];
        bytes[5] = uid_as_u8[1];
        bytes[6] = uid_as_u8[2];
        bytes[7] = uid_as_u8[3];

        return bytes;
    }
}