midi2 0.11.1

Ergonomic, versatile, strong types wrapping MIDI 2.0 message data.
Documentation
use crate::{detail::common_properties, ump_stream, ump_stream::UMP_MESSAGE_TYPE};

pub(crate) const STATUS: u16 = 0x4;

#[midi2_proc::generate_message(Via(ump_stream::UmpStream), MinSizeUmp(4))]
struct ProductInstanceId {
    #[property(common_properties::UmpMessageTypeProperty<UMP_MESSAGE_TYPE>)]
    ump_type: (),
    #[property(ump_stream::StatusProperty<STATUS>)]
    status: (),
    #[property(ump_stream::ConsistentFormatsProperty)]
    consistent_formats: (),
    #[property(ump_stream::TextWriteStrProperty<0>)]
    #[writeonly]
    #[resize]
    id: &str,
    #[property(ump_stream::TextReadBytesProperty)]
    #[readonly]
    id_bytes: ump_stream::TextBytesIterator,
    #[property(ump_stream::TextReadStringProperty)]
    #[readonly]
    #[std]
    id: std::string::String,
}

impl<B: crate::buffer::Ump> crate::traits::Size<B> for ProductInstanceId<B> {
    fn size(&self) -> usize {
        ump_stream::message_size(&self.0)
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use pretty_assertions::assert_eq;

    #[test]
    fn set_id() {
        let mut message = ProductInstanceId::<std::vec::Vec<u32>>::new();
        message.set_id("PianoPulse");
        assert_eq!(
            message,
            ProductInstanceId(std::vec![
                0xF004_5069,
                0x616E_6F50,
                0x756C_7365,
                0x0000_0000
            ]),
        )
    }

    #[test]
    #[cfg(feature = "std")]
    fn id() {
        assert_eq!(
            ProductInstanceId::try_from(&[0xF004_5069, 0x616E_6F50, 0x756C_7365, 0x0000_0000,][..])
                .unwrap()
                .id(),
            "PianoPulse",
        )
    }
}