fugue-db 0.2.16

A binary analysis framework written in Rust
Documentation
use std::convert::TryInto;
use std::path::Path;

use crate::error::Error;
use crate::format::Format;
use crate::schema;

#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[derive(serde::Deserialize, serde::Serialize)]
pub struct Metadata {
    input_path: String,
    input_md5: [u8; 16],
    input_sha256: [u8; 32],
    input_format: Format,
    file_size: u32,
    exporter: String,
}

impl Default for Metadata {
    fn default() -> Self {
        Self {
            input_path: Default::default(),
            input_md5: Default::default(),
            input_sha256: Default::default(),
            input_format: Format::Raw,
            file_size: Default::default(),
            exporter: Default::default(),
        }
    }
}

impl Metadata {
    pub fn input_path(&self) -> &Path {
        self.input_path.as_ref()
    }

    pub fn input_md5(&self) -> [u8; 16] {
        self.input_md5.clone()
    }

    pub fn input_sha256(&self) -> [u8; 32] {
        self.input_sha256.clone()
    }

    pub fn input_format(&self) -> Format {
        self.input_format
    }

    pub fn file_size(&self) -> u32 {
        self.file_size
    }

    pub fn exporter(&self) -> &str {
        &self.exporter
    }

    pub(crate) fn from_reader(reader: schema::Metadata) -> Result<Self, Error> {
        let mut input_md5 = [0u8; 16];
        let mut input_sha256 = [0u8; 32];
        input_md5.copy_from_slice(reader.input_md5().ok_or(Error::DeserialiseField("input_md5"))?.bytes());
        input_sha256.copy_from_slice(reader.input_sha256().ok_or(Error::DeserialiseField("input_sha256"))?.bytes());

        Ok(Self {
            input_path: reader.input_path().ok_or(Error::DeserialiseField("input_path"))?.to_string(),
            input_format: reader.input_format().ok_or(Error::DeserialiseField("input_format"))?.try_into()?,
            input_md5,
            input_sha256,
            file_size: reader.input_size(),
            exporter: reader.exporter().ok_or(Error::DeserialiseField("exporter"))?.to_string(),
        })
    }

    pub(crate) fn to_builder<'a: 'b, 'b>(
        &self,
        builder: &'b mut flatbuffers::FlatBufferBuilder<'a>
    ) -> Result<flatbuffers::WIPOffset<schema::Metadata<'a>>, Error> {
        let input_path = builder.create_string(&self.input_path);
        let input_md5 = builder.create_vector(&self.input_md5[..]);
        let input_sha256 = builder.create_vector(&self.input_sha256[..]);
        let input_format = builder.create_string(self.input_format.into());
        let exporter = builder.create_string(self.exporter());

        let mut mbuilder = schema::MetadataBuilder::new(builder);

        mbuilder.add_input_path(input_path);
        mbuilder.add_input_md5(input_md5);
        mbuilder.add_input_sha256(input_sha256);
        mbuilder.add_input_format(input_format);
        mbuilder.add_input_size(self.file_size);
        mbuilder.add_exporter(exporter);

        Ok(mbuilder.finish())
    }
}