macho2 0.6.2

A better MachO parser library
Documentation
use nom::number::complete::le_u32;

use crate::{helpers::{reverse_version_string, version_string}, macho::MachOResult};

use super::{pad_to_size, LCLoadCommand, LoadCommandBase, LoadCommandParser};

#[derive(Debug, PartialEq, Eq)]
pub struct VersionMinCommand {
    pub cmd: LCLoadCommand,
    pub cmdsize: u32,
    pub version: String,
    pub sdk: String,
}

impl LoadCommandParser for VersionMinCommand {
    fn parse(ldcmd: &[u8]) -> MachOResult<Self> {
        let (cursor, base) = LoadCommandBase::parse(ldcmd)?;
        let (cursor, version) = le_u32(cursor)?;
        let (_, sdk) = le_u32(cursor)?;

        Ok(
            VersionMinCommand {
                cmd: base.cmd,
                cmdsize: base.cmdsize,
                version: version_string(version),
                sdk: version_string(sdk),
            },
        )
    }

    fn serialize(&self) -> Vec<u8> {
        let mut buf = Vec::new();
        buf.extend(self.cmd.serialize());
        buf.extend(self.cmdsize.to_le_bytes());
        buf.extend(reverse_version_string(self.version.clone()).to_le_bytes());
        buf.extend(reverse_version_string(self.sdk.clone()).to_le_bytes());
        pad_to_size(&mut buf, self.cmdsize as usize);
        buf
    }
}


#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_version_min_serialize() {
        let cmd = VersionMinCommand {
            cmd: LCLoadCommand::LcVersionMinMacosx,
            cmdsize: 16,
            version: "10.15.0".to_string(),
            sdk: "10.15.0".to_string(),
        };
        let buf = cmd.serialize();
        let deserialized_cmd = VersionMinCommand::parse(&buf).unwrap();
        assert_eq!(cmd, deserialized_cmd);
    }
}