1use std::convert::TryInto;
2use std::path::Path;
3
4use crate::error::Error;
5use crate::format::Format;
6use crate::schema;
7
8#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
9#[derive(serde::Deserialize, serde::Serialize)]
10pub struct Metadata {
11 input_path: String,
12 input_md5: [u8; 16],
13 input_sha256: [u8; 32],
14 input_format: Format,
15 file_size: u32,
16 exporter: String,
17}
18
19impl Default for Metadata {
20 fn default() -> Self {
21 Self {
22 input_path: Default::default(),
23 input_md5: Default::default(),
24 input_sha256: Default::default(),
25 input_format: Format::Raw,
26 file_size: Default::default(),
27 exporter: Default::default(),
28 }
29 }
30}
31
32impl Metadata {
33 pub fn input_path(&self) -> &Path {
34 self.input_path.as_ref()
35 }
36
37 pub fn input_md5(&self) -> [u8; 16] {
38 self.input_md5.clone()
39 }
40
41 pub fn input_sha256(&self) -> [u8; 32] {
42 self.input_sha256.clone()
43 }
44
45 pub fn input_format(&self) -> Format {
46 self.input_format
47 }
48
49 pub fn file_size(&self) -> u32 {
50 self.file_size
51 }
52
53 pub fn exporter(&self) -> &str {
54 &self.exporter
55 }
56
57 pub(crate) fn from_reader(reader: schema::Metadata) -> Result<Self, Error> {
58 let mut input_md5 = [0u8; 16];
59 let mut input_sha256 = [0u8; 32];
60 input_md5.copy_from_slice(reader.input_md5().ok_or(Error::DeserialiseField("input_md5"))?.bytes());
61 input_sha256.copy_from_slice(reader.input_sha256().ok_or(Error::DeserialiseField("input_sha256"))?.bytes());
62
63 Ok(Self {
64 input_path: reader.input_path().ok_or(Error::DeserialiseField("input_path"))?.to_string(),
65 input_format: reader.input_format().ok_or(Error::DeserialiseField("input_format"))?.try_into()?,
66 input_md5,
67 input_sha256,
68 file_size: reader.input_size(),
69 exporter: reader.exporter().ok_or(Error::DeserialiseField("exporter"))?.to_string(),
70 })
71 }
72
73 pub(crate) fn to_builder<'a: 'b, 'b>(
74 &self,
75 builder: &'b mut flatbuffers::FlatBufferBuilder<'a>
76 ) -> Result<flatbuffers::WIPOffset<schema::Metadata<'a>>, Error> {
77 let input_path = builder.create_string(&self.input_path);
78 let input_md5 = builder.create_vector(&self.input_md5[..]);
79 let input_sha256 = builder.create_vector(&self.input_sha256[..]);
80 let input_format = builder.create_string(self.input_format.into());
81 let exporter = builder.create_string(self.exporter());
82
83 let mut mbuilder = schema::MetadataBuilder::new(builder);
84
85 mbuilder.add_input_path(input_path);
86 mbuilder.add_input_md5(input_md5);
87 mbuilder.add_input_sha256(input_sha256);
88 mbuilder.add_input_format(input_format);
89 mbuilder.add_input_size(self.file_size);
90 mbuilder.add_exporter(exporter);
91
92 Ok(mbuilder.finish())
93 }
94}