micropdf 0.16.0

A pure Rust PDF library - A pure Rust PDF library with fz_/pdf_ API compatibility
//! PDF Object Comparison FFI Functions

use super::super::Handle;
use super::refcount::with_obj;
use super::types::{PdfObjHandle, PdfObjType};

#[unsafe(no_mangle)]
pub extern "C" fn pdf_objcmp(_ctx: Handle, a: PdfObjHandle, b: PdfObjHandle) -> i32 {
    let obj_a = with_obj(a, None, |o| Some(o.obj_type.clone()));
    let obj_b = with_obj(b, None, |o| Some(o.obj_type.clone()));

    match (obj_a, obj_b) {
        (Some(a_type), Some(b_type)) => i32::from(!a_type.shallow_eq(&b_type)),
        _ => 1,
    }
}

#[unsafe(no_mangle)]
pub extern "C" fn pdf_name_eq(_ctx: Handle, a: PdfObjHandle, b: PdfObjHandle) -> i32 {
    let name_a = with_obj(a, None, |o| match &o.obj_type {
        PdfObjType::Name(s) => Some(s.clone()),
        _ => None,
    });

    let name_b = with_obj(b, None, |o| match &o.obj_type {
        PdfObjType::Name(s) => Some(s.clone()),
        _ => None,
    });

    match (name_a, name_b) {
        (Some(a_name), Some(b_name)) => i32::from(a_name == b_name),
        _ => 0,
    }
}

#[cfg(test)]
mod tests {
    use super::super::create::{pdf_new_int, pdf_new_name};
    use super::*;
    use std::ffi::CString;

    #[test]
    fn test_pdf_objcmp() {
        let int1 = pdf_new_int(0, 42);
        let int2 = pdf_new_int(0, 42);
        let int3 = pdf_new_int(0, 99);
        assert_eq!(pdf_objcmp(0, int1, int2), 0);
        assert_eq!(pdf_objcmp(0, int1, int3), 1);
    }

    #[test]
    fn test_pdf_name_eq_same() {
        let name1 = pdf_new_name(0, CString::new("Type").unwrap().as_ptr());
        let name2 = pdf_new_name(0, CString::new("Type").unwrap().as_ptr());
        assert_eq!(pdf_name_eq(0, name1, name2), 1);
    }

    #[test]
    fn test_pdf_name_eq_different() {
        let name1 = pdf_new_name(0, CString::new("Type").unwrap().as_ptr());
        let name2 = pdf_new_name(0, CString::new("Other").unwrap().as_ptr());
        assert_eq!(pdf_name_eq(0, name1, name2), 0);
    }

    #[test]
    fn test_pdf_name_eq_non_name() {
        let name1 = pdf_new_name(0, CString::new("Type").unwrap().as_ptr());
        let int_obj = pdf_new_int(0, 42);
        assert_eq!(pdf_name_eq(0, name1, int_obj), 0);
        assert_eq!(pdf_name_eq(0, int_obj, name1), 0);
    }
}