inno 0.4.2

Library for reading Inno Setup executables
Documentation
use std::fmt;

use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout, LittleEndian, U16, U32};

#[derive(Copy, Clone, Eq, PartialEq, FromBytes, IntoBytes, Immutable, KnownLayout)]
#[repr(C)]
pub struct SectionHeader {
    name: [u8; 8],
    virtual_size: U32<LittleEndian>,
    virtual_address: U32<LittleEndian>,
    size_of_raw_data: U32<LittleEndian>,
    pointer_to_raw_data: U32<LittleEndian>,
    pointer_to_relocations: U32<LittleEndian>,
    pointer_to_line_numbers: U32<LittleEndian>,
    number_of_relocations: U16<LittleEndian>,
    number_of_line_numbers: U16<LittleEndian>,
    characteristics: U32<LittleEndian>,
}

impl SectionHeader {
    pub fn real_name(&self) -> &str {
        std::str::from_utf8(&self.name)
            .map(|name| name.trim_end_matches('\0'))
            .unwrap_or_default()
    }

    #[inline]
    pub const fn raw_name(&self) -> [u8; 8] {
        self.name
    }

    #[inline]
    pub const fn virtual_size(&self) -> u32 {
        self.virtual_size.get()
    }

    #[inline]
    pub const fn virtual_address(&self) -> u32 {
        self.virtual_address.get()
    }

    #[inline]
    pub const fn size_of_raw_data(&self) -> u32 {
        self.size_of_raw_data.get()
    }

    #[inline]
    pub const fn pointer_to_raw_data(&self) -> u32 {
        self.pointer_to_raw_data.get()
    }

    #[inline]
    pub const fn pointer_to_relocations(&self) -> u32 {
        self.pointer_to_relocations.get()
    }

    #[inline]
    pub const fn pointer_to_line_numbers(&self) -> u32 {
        self.pointer_to_line_numbers.get()
    }

    #[inline]
    pub const fn number_of_relocations(&self) -> u16 {
        self.number_of_relocations.get()
    }

    #[inline]
    pub const fn number_of_line_numbers(&self) -> u16 {
        self.number_of_line_numbers.get()
    }

    #[inline]
    pub const fn characteristics(&self) -> u32 {
        self.characteristics.get()
    }
}

impl fmt::Debug for SectionHeader {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_struct("Section")
            .field("Name", &self.real_name())
            .field("Raw name", &self.raw_name())
            .field("VirtualSize", &self.virtual_size())
            .field("VirtualAddress", &self.virtual_address())
            .field("SizeOfRawData", &self.size_of_raw_data())
            .field("PointerToRawData", &self.pointer_to_raw_data())
            .field("PointerToRelocations", &self.pointer_to_relocations())
            .field("PointerToLinenumbers", &self.pointer_to_line_numbers())
            .field("NumberOfRelocations", &self.number_of_relocations())
            .field("NumberOfLinenumbers", &self.number_of_line_numbers())
            .field("Characteristics", &self.characteristics())
            .finish()
    }
}