From 1673fb22d60eba8e86b999a11183410418f49145 Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Fri, 4 Nov 2022 22:59:25 +0100 Subject: [PATCH] refactor(pdb): Use `bitflags` crate for page flags --- Cargo.lock | 1 + Cargo.toml | 1 + src/pdb/mod.rs | 19 +++++++++---------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 52d18652..f6e73923 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -275,6 +275,7 @@ name = "rekordcrate" version = "0.2.0" dependencies = [ "binrw", + "bitflags", "clap", "crc16", "glob", diff --git a/Cargo.toml b/Cargo.toml index 39039adb..30e980b3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ exclude = [".*"] [dependencies] binrw = "0.10" modular-bitfield = "0.11" +bitflags = "1.3" crc16 = "0.4" clap = { version = "4.0.10", features = ["derive"], optional = true } parse-display = "0.6.0" diff --git a/src/pdb/mod.rs b/src/pdb/mod.rs index 6bd5421e..d136e2b5 100644 --- a/src/pdb/mod.rs +++ b/src/pdb/mod.rs @@ -27,6 +27,7 @@ use binrw::{ io::{Read, Seek, SeekFrom, Write}, BinRead, BinResult, BinWrite, Endian, FilePtr16, FilePtr8, ReadOptions, WriteOptions, }; +use bitflags::bitflags; /// Do not read anything, but the return the current stream position of `reader`. fn current_offset(reader: &mut R, _: &ReadOptions, _: ()) -> BinResult { @@ -184,14 +185,12 @@ impl Header { } } -#[binrw] -#[derive(Debug, PartialEq, Eq, Clone, Copy)] -struct PageFlags(u8); - -impl PageFlags { - #[must_use] - pub fn page_has_data(&self) -> bool { - (self.0 & 0x40) == 0 +bitflags! { + /// Flags of a table page. + #[derive(BinRead, BinWrite)] + struct PageFlags: u8 { + /// Determines whether the page is a data page. + const DATA = 0x40; } } @@ -316,7 +315,7 @@ impl Page { args: (PageType, u64, u16, u16, PageFlags), ) -> BinResult> { let (page_type, page_heap_offset, num_rows, num_row_groups, page_flags) = args; - if num_row_groups == 0 || !page_flags.page_has_data() { + if num_row_groups == 0 || !page_flags.contains(PageFlags::DATA) { return Ok(vec![]); } @@ -352,7 +351,7 @@ impl Page { #[must_use] /// Returns `true` if the page actually contains row data. pub fn has_data(&self) -> bool { - self.page_flags.page_has_data() + self.page_flags.contains(PageFlags::DATA) } #[must_use]