sapi-lite 0.1.1

A simplified wrapper around Microsoft's Speech API (SAPI) library
Documentation
use std::ffi::c_void;
use std::ops::Deref;

use windows as Windows;
use Windows::Win32::Foundation::PWSTR;
use Windows::Win32::System::Com::CoTaskMemFree;

pub unsafe trait ComBuffer {
    fn as_ptr(&self) -> *const c_void;
}

unsafe impl<T> ComBuffer for *const T {
    fn as_ptr(&self) -> *const c_void {
        *self as _
    }
}

unsafe impl ComBuffer for PWSTR {
    fn as_ptr(&self) -> *const c_void {
        self.0 as _
    }
}

#[derive(Debug)]
pub struct ComBox<P: ComBuffer>(P);

impl<P: ComBuffer> ComBox<P> {
    pub unsafe fn from_raw(ptr: P) -> Self {
        ComBox(ptr)
    }
}

impl<P: ComBuffer> Deref for ComBox<P> {
    type Target = P;
    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

impl<P: ComBuffer> Drop for ComBox<P> {
    fn drop(&mut self) {
        unsafe { CoTaskMemFree(self.0.as_ptr()) }
    }
}