fugue-db 0.2.16

A binary analysis framework written in Rust
Documentation
use crate::error::Error;
use crate::schema;
use crate::Id;

use fugue_bytes::Endian;

#[derive(
    Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, serde::Deserialize, serde::Serialize,
)]
pub struct Segment {
    id: Id<Self>,
    name: String,
    address: u64,
    length: usize,
    alignment: usize,
    address_size: usize,
    endian: Endian,
    bits: usize,
    code: bool,
    data: bool,
    external: bool,
    executable: bool,
    readable: bool,
    writable: bool,
    bytes: Vec<u8>,
}

impl Segment {
    pub fn id(&self) -> Id<Self> {
        self.id.clone()
    }

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

    pub fn address(&self) -> u64 {
        self.address
    }

    pub fn len(&self) -> usize {
        self.length
    }

    pub fn alignment(&self) -> usize {
        self.alignment
    }

    pub fn address_size(&self) -> usize {
        self.address_size
    }

    pub fn endian(&self) -> Endian {
        self.endian
    }

    pub fn bits(&self) -> usize {
        self.bits
    }

    pub fn is_code(&self) -> bool {
        self.code
    }

    pub fn is_data(&self) -> bool {
        self.data
    }

    pub fn is_external(&self) -> bool {
        self.external
    }

    pub fn is_executable(&self) -> bool {
        self.executable
    }

    pub fn is_readable(&self) -> bool {
        self.readable
    }

    pub fn is_writable(&self) -> bool {
        self.writable
    }

    pub fn bytes(&self) -> &[u8] {
        &self.bytes
    }

    pub(crate) fn from_reader(id: Id<Self>, reader: &schema::Segment) -> Result<Self, Error> {
        Ok(Self {
            id,
            name: reader
                .name()
                .ok_or(Error::DeserialiseField("name"))?
                .to_string(),
            address: reader.address(),
            length: reader.size_() as usize,
            alignment: reader.alignment_() as usize,
            endian: if reader.endian() {
                Endian::Big
            } else {
                Endian::Little
            },
            bits: reader.bits() as usize,
            address_size: reader.address_size() as usize,
            code: reader.code(),
            data: reader.data(),
            external: reader.external(),
            executable: reader.executable(),
            readable: reader.readable(),
            writable: reader.writable(),
            bytes: reader
                .bytes()
                .ok_or(Error::DeserialiseField("bytes"))?
                .bytes()
                .to_vec(),
        })
    }

    pub(crate) fn to_builder<'a: 'b, 'b>(
        &self,
        builder: &'b mut flatbuffers::FlatBufferBuilder<'a>,
    ) -> Result<flatbuffers::WIPOffset<schema::Segment<'a>>, Error> {
        let name = builder.create_string(self.name());
        let bytes = builder.create_vector(&self.bytes);

        let mut sbuilder = schema::SegmentBuilder::new(builder);

        sbuilder.add_name(name);
        sbuilder.add_address(self.address());
        sbuilder.add_size_(self.len() as u32);
        sbuilder.add_alignment_(self.alignment() as u32);
        sbuilder.add_address_size(self.address_size() as u32);
        sbuilder.add_endian(self.endian.is_big());
        sbuilder.add_bits(self.bits as u32);
        sbuilder.add_code(self.is_code());
        sbuilder.add_data(self.is_data());
        sbuilder.add_external(self.is_external());
        sbuilder.add_executable(self.is_executable());
        sbuilder.add_readable(self.is_readable());
        sbuilder.add_writable(self.is_writable());
        sbuilder.add_bytes(bytes);

        Ok(sbuilder.finish())
    }
}