aes_externalobj 0.1.2

ExtendScript external object library implementation in Rust
Documentation

use crate::bindings;
use aes_types::TaggedData;
use libc::{c_char, c_long};

// Public type aliases with better names
pub type ESGetVersionFn = extern "C" fn () -> c_long;
pub type ESInitializeFn = extern "C" fn (data: *mut ExtendScriptData, count: c_long) -> *mut c_char;
pub type ESTerminateFn = extern "C" fn ();

// Wrapper around TaggedData for safer interface
#[repr(transparent)]
#[derive(Debug)]
pub struct ExtendScriptData(TaggedData);

impl ExtendScriptData {
    pub fn new_undefined() -> Self {
        Self(bindings::TaggedData::new_undefined())
    }

    pub fn new_string(s: &str) -> Self {
        Self(bindings::TaggedData::new_string(s))
    }

    pub fn new_integer(val: i32) -> Self {
        Self(bindings::TaggedData::new_integer(val))
    }

    pub fn new_bool(val: bool) -> Self {
        Self(bindings::TaggedData::new_bool(val))
    }

    // Add other conversion methods as needed
}

// Internal conversion traits
impl From<bindings::TaggedData> for ExtendScriptData {
    fn from(data: bindings::TaggedData) -> Self {
        Self(data)
    }
}

impl From<ExtendScriptData> for bindings::TaggedData {
    fn from(data: ExtendScriptData) -> Self {
        data.0
    }
}

// Internal helper functions
pub(crate) fn to_raw_tagged_data(data: &ExtendScriptData) -> *mut bindings::TaggedData {
    &data.0 as *const _ as *mut _
}

pub(crate) fn from_raw_tagged_data(ptr: *mut bindings::TaggedData) -> Option<&'static ExtendScriptData> {
    if ptr.is_null() {
        None
    } else {
        unsafe {
            Some(&*(ptr as *const ExtendScriptData))
        }
    }
}

#[derive(Debug)]
pub enum Error {
    InitializationFailed,
    InvalidArguments,
    ExecutionFailed,
    // Add other error types
}

pub type Result<T> = std::result::Result<T, Error>;