pasteboard 0.1.0

CLI and Rust bindings for interacting with the macOS pasteboard.
use {
    cocoa::{
        appkit::{NSImage, NSPasteboard, NSSound},
        base::nil,
        foundation::{NSArray, NSAutoreleasePool, NSData, NSDictionary, NSString},
    },
    objc::{class, msg_send, runtime::Object, sel, sel_impl},
    structopt::clap::arg_enum,
};
pub type Id = *mut Object;

arg_enum! {
    #[derive(Debug)]
    pub enum Pasteboard {
        String,
        Image,
        Sound,
    }
}

impl Pasteboard {
    pub unsafe fn copy(&self, path: &str) {
        let pool = NSAutoreleasePool::new(nil);

        let path = NSString::alloc(pool).init_str(path);

        let data = NSData::dataWithContentsOfFile_(pool, path);

        let object = match self {
            Pasteboard::String => {
                let string: Id = msg_send![NSString::alloc(pool), initWithData:data encoding:4];
                string
            }
            Pasteboard::Image => NSImage::initWithData_(NSImage::alloc(pool), data),
            Pasteboard::Sound => {
                let alloc: Id = msg_send![class!(NSSound), alloc];
                NSSound::initWithData_(alloc, data)
            }
        };

        if object != nil {
            let pasteboard = NSPasteboard::generalPasteboard(pool);
            pasteboard.clearContents();
            pasteboard.writeObjects(NSArray::arrayWithObject(pool, object));
        }
    }

    pub unsafe fn paste(&self, path: &str) {
        let pool = NSAutoreleasePool::new(nil);

        let path = NSString::alloc(pool).init_str(path);

        let class = match self {
            Pasteboard::String => class!(NSString),
            Pasteboard::Image => class!(NSImage),
            Pasteboard::Sound => class!(NSSound),
        };

        let class_array = msg_send![class!(NSArray), arrayWithObject: class];
        let options = NSDictionary::dictionary(pool);

        let pasteboard = NSPasteboard::generalPasteboard(pool);
        if pasteboard.canReadObjectForClasses_options(class_array, options) != 0 {
            let objects_to_paste = pasteboard.readObjectsForClasses_options(class_array, options);
            let object = objects_to_paste.objectAtIndex(0);
            NSData::writeToFile_atomically_(object, path, 0);
        }
    }
}