llam 0.1.3

Safe, Go-style Rust bindings for the LLAM runtime
use crate::error::{Error, Result};
use crate::sys;
use std::sync::Arc;

struct Inner {
    raw: *mut sys::llam_cancel_token_t,
}

unsafe impl Send for Inner {}
unsafe impl Sync for Inner {}

impl Drop for Inner {
    fn drop(&mut self) {
        if !self.raw.is_null() {
            unsafe {
                let _ = sys::llam_cancel_token_destroy(self.raw);
            }
        }
    }
}

#[derive(Clone)]
pub struct CancelToken {
    inner: Arc<Inner>,
}

impl CancelToken {
    pub fn new() -> Result<Self> {
        let raw = unsafe { sys::llam_cancel_token_create() };
        if raw.is_null() {
            Err(Error::last())
        } else {
            Ok(Self {
                inner: Arc::new(Inner { raw }),
            })
        }
    }

    pub fn cancel(&self) -> Result<()> {
        let rc = unsafe { sys::llam_cancel_token_cancel(self.inner.raw) };
        if rc == 0 {
            Ok(())
        } else {
            Err(Error::last())
        }
    }

    pub fn is_cancelled(&self) -> bool {
        unsafe { sys::llam_cancel_token_is_cancelled(self.inner.raw) != 0 }
    }

    pub(crate) fn raw(&self) -> *mut sys::llam_cancel_token_t {
        self.inner.raw
    }
}