fugue_db/
metadata.rs

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}