iso14229_1/request/
write_did.rs1use crate::{Configuration, DataIdentifier, DIDData, Error, Placeholder, RequestData, Service, utils};
5
6pub 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(), }
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}