xlsbye-biff12 0.1.0

BIFF12 binary record parser for XLSB files
Documentation
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
#[repr(transparent)]
pub struct RecordId(pub u16);

impl RecordId {
    pub const fn as_u16(self) -> u16 {
        self.0
    }
}

impl From<u16> for RecordId {
    fn from(value: u16) -> Self {
        Self(value)
    }
}

impl From<RecordId> for u16 {
    fn from(value: RecordId) -> Self {
        value.0
    }
}

pub const BRT_FILE_VERSION: RecordId = RecordId(0x0080);
pub const BRT_BEGIN_BOOK: RecordId = RecordId(0x0083);
pub const BRT_END_BOOK: RecordId = RecordId(0x0084);
pub const BRT_BEGIN_SHEETS: RecordId = RecordId(0x008F);
pub const BRT_END_SHEETS: RecordId = RecordId(0x0090);
pub const BRT_WB_PROP: RecordId = RecordId(0x0099);
pub const BRT_BUNDLE_SH: RecordId = RecordId(0x009C);
pub const BRT_DEFINED_NAME: RecordId = RecordId(0x0027);
pub const BRT_CALC_PROP: RecordId = RecordId(0x009D);

pub const BRT_BEGIN_SHEET: RecordId = RecordId(0x0081);
pub const BRT_END_SHEET: RecordId = RecordId(0x0082);
pub const BRT_BEGIN_SHEET_DATA: RecordId = RecordId(0x0091);
pub const BRT_END_SHEET_DATA: RecordId = RecordId(0x0092);
pub const BRT_WS_DIM: RecordId = RecordId(0x0094);
pub const BRT_BEGIN_WS_VIEWS: RecordId = RecordId(0x0085);
pub const BRT_END_WS_VIEWS: RecordId = RecordId(0x0086);
pub const BRT_BEGIN_WS_VIEW: RecordId = RecordId(0x0089);
pub const BRT_END_WS_VIEW: RecordId = RecordId(0x008A);
pub const BRT_PANE: RecordId = RecordId(0x0097);
pub const BRT_SEL: RecordId = RecordId(0x0098);
pub const BRT_COL_INFO: RecordId = RecordId(0x003C);
pub const BRT_BEGIN_COL_INFOS: RecordId = RecordId(0x0186);
pub const BRT_END_COL_INFOS: RecordId = RecordId(0x0187);
pub const BRT_SHR_FMLA: RecordId = RecordId(0x01AB);
pub const BRT_ROW_HDR: RecordId = RecordId(0x0000);

pub const BRT_CELL_BLANK: RecordId = RecordId(0x0001);
pub const BRT_CELL_RK: RecordId = RecordId(0x0002);
pub const BRT_CELL_ERROR: RecordId = RecordId(0x0003);
pub const BRT_CELL_BOOL: RecordId = RecordId(0x0004);
pub const BRT_CELL_REAL: RecordId = RecordId(0x0005);
pub const BRT_CELL_ST: RecordId = RecordId(0x0006);
pub const BRT_CELL_ISST: RecordId = RecordId(0x0007);
pub const BRT_FMLA_STRING: RecordId = RecordId(0x0008);
pub const BRT_FMLA_NUM: RecordId = RecordId(0x0009);
pub const BRT_FMLA_BOOL: RecordId = RecordId(0x000A);
pub const BRT_FMLA_ERROR: RecordId = RecordId(0x000B);

pub const BRT_MERGE_CELL: RecordId = RecordId(0x00B0);
pub const BRT_BEGIN_MERGE_CELLS: RecordId = RecordId(0x00B1);
pub const BRT_END_MERGE_CELLS: RecordId = RecordId(0x00B2);

pub const BRT_SST_ITEM: RecordId = RecordId(0x0013);
pub const BRT_BEGIN_SST: RecordId = RecordId(0x009F);
pub const BRT_END_SST: RecordId = RecordId(0x00A0);

pub const BRT_FONT: RecordId = RecordId(0x002B);
pub const BRT_FMT: RecordId = RecordId(0x002C);
pub const BRT_FILL: RecordId = RecordId(0x002D);
pub const BRT_BORDER: RecordId = RecordId(0x002E);
pub const BRT_XF: RecordId = RecordId(0x002F);
pub const BRT_BEGIN_STYLE_SHEET: RecordId = RecordId(0x0116);
pub const BRT_END_STYLE_SHEET: RecordId = RecordId(0x0117);
pub const BRT_BEGIN_FILLS: RecordId = RecordId(0x025B);
pub const BRT_END_FILLS: RecordId = RecordId(0x025C);
pub const BRT_BEGIN_FONTS: RecordId = RecordId(0x0263);
pub const BRT_END_FONTS: RecordId = RecordId(0x0264);
pub const BRT_BEGIN_BORDERS: RecordId = RecordId(0x0265);
pub const BRT_END_BORDERS: RecordId = RecordId(0x0266);
pub const BRT_BEGIN_FMTS: RecordId = RecordId(0x0267);
pub const BRT_END_FMTS: RecordId = RecordId(0x0268);
pub const BRT_BEGIN_CELL_XFS: RecordId = RecordId(0x0269);
pub const BRT_END_CELL_XFS: RecordId = RecordId(0x026A);
pub const BRT_BEGIN_CELL_STYLE_XFS: RecordId = RecordId(0x0272);
pub const BRT_END_CELL_STYLE_XFS: RecordId = RecordId(0x0273);
pub const BRT_BEGIN_COMMENT_LIST: RecordId = RecordId(0x0274);
pub const BRT_END_COMMENT_LIST: RecordId = RecordId(0x0275);
pub const BRT_BEGIN_COMMENT: RecordId = RecordId(0x0276);
pub const BRT_END_COMMENT: RecordId = RecordId(0x0277);
pub const BRT_BEGIN_COMMENT_AUTHORS: RecordId = RecordId(0x0278);
pub const BRT_COMMENT_AUTHOR: RecordId = RecordId(0x0279);
pub const BRT_BEGIN_DXFS: RecordId = RecordId(0x01F9);
pub const BRT_END_DXFS: RecordId = RecordId(0x01FA);

pub const BRT_BEGIN_COND_FMT: RecordId = RecordId(0x01CD);
pub const BRT_END_COND_FMT: RecordId = RecordId(0x01CE);
pub const BRT_BEGIN_CF_RULE: RecordId = RecordId(0x01CF);
pub const BRT_END_CF_RULE: RecordId = RecordId(0x01D0);

pub const BRT_DVAL: RecordId = RecordId(0x0040);
pub const BRT_BEGIN_DVALS: RecordId = RecordId(0x023D);
pub const BRT_END_DVALS: RecordId = RecordId(0x023E);

pub const BRT_H_LINK: RecordId = RecordId(0x01EE);

pub const BRT_BEGIN_EXTERN_SHEET: RecordId = RecordId(0x016A);
pub const BRT_BEGIN_SUP_BOOK: RecordId = RecordId(0x01AE);

pub const BRT_BEGIN_LIST: RecordId = RecordId(0x01DB);
pub const BRT_END_LIST: RecordId = RecordId(0x01DC);
pub const BRT_BEGIN_LIST_COLS: RecordId = RecordId(0x01E3);
pub const BRT_END_LIST_COLS: RecordId = RecordId(0x01E4);
pub const BRT_BEGIN_LIST_COL: RecordId = RecordId(0x01E5);
pub const BRT_END_LIST_COL: RecordId = RecordId(0x01E6);
pub const BRT_BEGIN_AFILTER: RecordId = RecordId(0x00A1);
pub const BRT_LIST_COLUMN: RecordId = RecordId(0x019B);

pub const BRT_BEGIN_PIVOT_CACHE_DEF: RecordId = RecordId(0x0800);
pub const BRT_END_PIVOT_CACHE_DEF: RecordId = RecordId(0x0801);
pub const BRT_BEGIN_PCD_FIELDS: RecordId = RecordId(0x0802);
pub const BRT_END_PCD_FIELDS: RecordId = RecordId(0x0803);
pub const BRT_BEGIN_PCD_FIELD: RecordId = RecordId(0x0804);
pub const BRT_END_PCD_FIELD: RecordId = RecordId(0x0805);

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

    #[test]
    fn record_id_roundtrip() {
        let id = RecordId::from(0x0156);
        assert_eq!(id.as_u16(), 0x0156);
        assert_eq!(u16::from(id), 0x0156);
    }

    #[test]
    fn critical_ids_match_spec_values() {
        assert_eq!(BRT_CELL_REAL.as_u16(), 0x0005);
        assert_eq!(BRT_BEGIN_SHEET_DATA.as_u16(), 0x0091);
        assert_eq!(BRT_END_SHEET_DATA.as_u16(), 0x0092);
        assert_eq!(BRT_WB_PROP.as_u16(), 0x0099);
        assert_eq!(BRT_BEGIN_STYLE_SHEET.as_u16(), 0x0116);
        assert_eq!(BRT_BEGIN_FMTS.as_u16(), 0x0267);
        assert_eq!(BRT_BEGIN_DXFS.as_u16(), 0x01F9);
    }
}