#![forbid(unsafe_code)]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct PdfPermissions {
pub print_low_res: bool,
pub modify: bool,
pub copy: bool,
pub annotate: bool,
pub fill_forms: bool,
pub accessibility: bool,
pub assemble: bool,
pub print_high_res: bool,
pub raw_p: i32,
}
impl PdfPermissions {
pub fn from_p_flag(p: i32) -> Self {
Self {
print_low_res: (p & (1 << 2)) != 0,
modify: (p & (1 << 3)) != 0,
copy: (p & (1 << 4)) != 0,
annotate: (p & (1 << 5)) != 0,
fill_forms: (p & (1 << 8)) != 0,
accessibility: (p & (1 << 9)) != 0,
assemble: (p & (1 << 10)) != 0,
print_high_res: (p & (1 << 11)) != 0,
raw_p: p,
}
}
pub fn all_allowed() -> Self {
Self::from_p_flag(-1)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn from_p_flag_all_bits_set() {
let p = PdfPermissions::from_p_flag(-1);
assert!(p.print_low_res);
assert!(p.modify);
assert!(p.copy);
assert!(p.annotate);
assert!(p.fill_forms);
assert!(p.accessibility);
assert!(p.assemble);
assert!(p.print_high_res);
assert_eq!(p.raw_p, -1);
}
#[test]
fn from_p_flag_typical_restrictive() {
let mut p: i32 = -1;
p &= !(1 << 2); p &= !(1 << 4); p &= !(1 << 5);
let perms = PdfPermissions::from_p_flag(p);
assert!(!perms.print_low_res);
assert!(!perms.copy);
assert!(!perms.annotate);
assert!(perms.modify); assert_eq!(perms.raw_p, p);
}
#[test]
fn from_p_flag_kreuzberg_password_protected_shape() {
let mut p: i32 = -1;
p &= !(1 << 2); p &= !(1 << 3); p &= !(1 << 4); p &= !(1 << 5);
let perms = PdfPermissions::from_p_flag(p);
assert!(!perms.print_low_res);
assert!(!perms.modify);
assert!(!perms.copy);
assert!(!perms.annotate);
assert!(perms.fill_forms);
assert!(perms.accessibility);
assert!(perms.assemble);
assert!(perms.print_high_res);
}
#[test]
fn from_p_flag_zero_is_all_denied() {
let perms = PdfPermissions::from_p_flag(0);
assert!(!perms.print_low_res);
assert!(!perms.modify);
assert!(!perms.copy);
assert!(!perms.annotate);
assert!(!perms.fill_forms);
assert!(!perms.accessibility);
assert!(!perms.assemble);
assert!(!perms.print_high_res);
assert_eq!(perms.raw_p, 0);
}
#[test]
fn all_allowed_matches_minus_one() {
let allowed = PdfPermissions::all_allowed();
let from_minus_one = PdfPermissions::from_p_flag(-1);
assert_eq!(allowed, from_minus_one);
}
#[test]
fn serializes_to_json() {
let p = PdfPermissions::all_allowed();
let json = serde_json::to_string(&p).unwrap();
assert!(json.contains("\"print_low_res\":true"));
assert!(json.contains("\"raw_p\":-1"));
}
}