iso14229_1/request/
write_did.rs

1//! request of Service 2E
2
3
4use crate::{Configuration, DataIdentifier, DIDData, Error, Placeholder, RequestData, Service, utils};
5
6/// Service 2E
7pub struct WriteDID(pub DIDData);
8
9impl<'a> TryFrom<&'a [u8]> for WriteDID {
10    type Error = Error;
11    fn try_from(data: &'a [u8]) -> Result<Self, Self::Error> {
12        utils::data_length_check(data.len(), 3, false)?;
13        let mut offset = 0;
14        let did = DataIdentifier::from(
15            u16::from_be_bytes([data[offset], data[offset + 1]])
16        );
17        offset += 2;
18
19        Ok(Self(DIDData { did, data: data[offset..].to_vec() }))
20    }
21}
22
23impl Into<Vec<u8>> for WriteDID {
24    #[inline]
25    fn into(self) -> Vec<u8> {
26        self.0.into()
27    }
28}
29
30impl RequestData for WriteDID {
31    type SubFunc = Placeholder;
32    #[inline]
33    fn try_parse(data: &[u8], _: Option<Self::SubFunc>, _: &Configuration) -> Result<Self, Error> {
34        Self::try_from(data)
35    }
36    #[inline]
37    fn to_vec(self, _: &Configuration) -> Vec<u8> {
38        self.into()
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use crate::{DataIdentifier, DIDData};
45    use super::WriteDID;
46
47    #[test]
48    fn new() -> anyhow::Result<()> {
49        let source = hex::decode("2ef1904441564443313030394e544c5036313338")?;
50        let request = WriteDID(
51            DIDData {
52                did: DataIdentifier::VIN,
53                data: source[3..].to_vec(),  // 17 bytes
54            }
55        );
56        let result: Vec<_> = request.into();
57        assert_eq!(result, source[1..].to_vec());
58
59        let request = WriteDID::try_from(&source[1..])?;
60        assert_eq!(request.0.did, DataIdentifier::VIN);
61        assert_eq!(request.0.data, hex::decode("4441564443313030394e544c5036313338")?);
62
63        Ok(())
64    }
65}