libgm 0.5.1

A tool for modding, unpacking and decompiling GameMaker games
Documentation
use crate::prelude::*;
use crate::util::fmt::typename;
use crate::wad::elements::GMElement;
use crate::wad::serialize::builder::DataBuilder;
use crate::wad::version::GMVersionReq;

// The element fields store `Option<T>`, so passing `Option<&T>` instead
// of `&Option<T>` would require using `.as_ref()` in every call.
#[allow(clippy::ref_option)]
impl DataBuilder<'_> {
    pub fn write_if_ver<T: GMElement>(
        &mut self,
        element: &Option<T>,
        field_name: &'static str,
        ver_req: impl Into<GMVersionReq>,
    ) -> Result<()> {
        let ver_req: GMVersionReq = ver_req.into();
        if !self.is_version_at_least(ver_req.clone()) {
            return Ok(()); // Don't serialize if version requirement not met
        }

        let element: &T = element.as_ref().ok_or_else(|| {
            format!(
                "Field {:?} ({}) needs to be set since GameMaker version {} (data version is {})",
                field_name,
                typename::<T>(),
                ver_req,
                self.gm_data.general_info.version,
            )
        })?;

        element.serialize(self)
    }

    pub fn write_if_wad_ver<T: GMElement>(
        &mut self,
        element: &Option<T>,
        field_name: &'static str,
        ver_req: u8,
    ) -> Result<()> {
        if self.wad_version() < ver_req {
            return Ok(()); // Don't serialize if version requirement not met
        }

        let element: &T = element.as_ref().ok_or_else(|| {
            format!(
                "Field {:?} ({}) needs to be set since WAD version {} (data WAD version is {})",
                field_name,
                typename::<T>(),
                ver_req,
                self.gm_data.general_info.wad_version,
            )
        })?;

        element.serialize(self)
    }
}