cjaggerx 0.1.1

Rust bindings for the CJaggerX library
Documentation
use crate::traits::Types;

pub mod debug;

pub mod include {
    pub use crate::string::debug::*;
}

pub struct String<T: Types> {
    inner: include::DebugString,
    val: Vec<T>,
}


impl<T: Types> Default for String<T> {
    fn default() -> Self {
        Self {
            inner: include::DebugString::default(),
            val: Vec::new(),
        }
    }
}

impl From<include::DebugString> for String<std::ffi::CString> {
    fn from(value: include::DebugString) -> Self {
        Self {
            inner: value,
            val: Vec::new(),
        }
    }
}

impl String<std::ffi::CString> {

    pub fn new(val: std::ffi::CString) -> Self {
        let orig = include::DebugString::new(val.clone());
        Self {
            inner: orig,
            val: vec![val]
        }
    }

    pub fn push(&mut self, val: std::ffi::CString) -> Result<(), Box<dyn std::error::Error>> {
        self.inner.push_cstring(val.clone()).unwrap();
        self.val.push(val);
        Ok(())
    }

    pub fn get(&self) -> Option<std::ffi::CString> {
        let c_string = self.inner.get_cstring().unwrap();
        Some(c_string)
    }

    pub fn get_index(&self, index: usize) -> Option<std::ffi::CString> {
        let c_string = self.inner.get_cstring_index(index).unwrap();
        Some(c_string)
    }

    pub fn get_slice(&self, start: usize, end: usize) -> Option<std::ffi::CString> {
        let c_string = self.inner.get_cstring_exact(start, end).unwrap();
        Some(c_string)
    }

    pub fn remove(&mut self, val: std::ffi::CString) -> Result<(), Box<dyn std::error::Error>> {
        self.inner.remove_cstring(val.clone()).unwrap();
        Ok(())
    }

    pub fn replace(&mut self, old: usize, new: usize) -> Result<(), Box<dyn std::error::Error>> {
        self.inner.replace(old, new).unwrap();
        Ok(())
    }

    pub fn clear(&mut self) -> Result<(), Box<dyn std::error::Error>> {
        self.inner.destroy().unwrap();
        Ok(())
    }

    pub fn len(&self) -> Option<usize> {
        Some(self.inner.len().unwrap())
    }

    pub fn size(&self) -> Option<usize> {
        Some(self.inner.size().unwrap())
    }

    pub fn size_from_index(&self, index: usize) -> Option<usize> {
        Some(self.inner.size_from(index).unwrap())
    }

    pub fn status(&self) -> Option<usize> {
        Some(self.inner.status().unwrap())
    }

    pub fn new_instance(&self) -> String<std::ffi::CString> {
        let new_instance = include::DebugString::instance(&self.inner).unwrap();
        let orig = String::from(new_instance);
        orig
    }

}

impl From<include::DebugString> for String<std::string::String> {
    fn from(value: include::DebugString) -> Self {
        Self {
            inner: value,
            val: Vec::new(),
        }
    }
}

impl String<std::string::String> {

    pub fn new(val: std::string::String) -> Self {
        let mut tmp: String<std::ffi::CString> = String::default();
        tmp.push(std::ffi::CString::new(val.clone()).unwrap()).unwrap();
        let orig = tmp.inner.clone();
        Self {
            inner: orig,
            val: vec![val],
        }
    }

    pub fn push(&mut self, val: std::string::String) -> Result<(), Box<dyn std::error::Error>> {
        self.inner.push_cstring(std::ffi::CString::new(val.clone()).unwrap()).unwrap();
        self.val.push(val.clone());
        Ok(())
    }

    pub fn get(&self) -> Option<std::string::String> {
        let c_string = self.inner.get_cstring().unwrap();
        Some(c_string.to_string_lossy().to_string())
    }

    pub fn get_index(&self, index: usize) -> Option<std::string::String> {
        let c_string = self.inner.get_cstring_index(index).unwrap();
        Some(c_string.to_string_lossy().to_string())
    }

    pub fn get_slice(&self, start: usize, end: usize) -> Option<std::string::String> {
        let c_string = self.inner.get_cstring_exact(start, end).unwrap();
        Some(c_string.to_string_lossy().to_string())
    }

    pub fn remove(&mut self, val: std::string::String) -> Result<(), Box<dyn std::error::Error>> {
        self.inner.remove_cstring(std::ffi::CString::new(val.clone()).unwrap()).unwrap();
        Ok(())
    }

    pub fn replace(&mut self, old: usize, new: usize) -> Result<(), Box<dyn std::error::Error>> {
        self.inner.replace(old, new).unwrap();
        Ok(())
    }

    pub fn clear(&mut self) -> Result<(), Box<dyn std::error::Error>> {
        self.inner.destroy().unwrap();
        Ok(())
    }

    pub fn len(&self) -> Option<usize> {
        Some(self.inner.len().unwrap())
    }

    pub fn size(&self) -> Option<usize> {
        Some(self.inner.size().unwrap())
    }

    pub fn size_from_index(&self, index: usize) -> Option<usize> {
        Some(self.inner.size_from(index).unwrap())
    }

    pub fn status(&self) -> Option<usize> {
        Some(self.inner.status().unwrap())
    }

    pub fn new_instance(&self) -> Result<String<std::string::String>, Box<dyn std::error::Error>> {
        let new_instance = include::DebugString::instance(&self.inner).unwrap();
        let orig = String::from(new_instance);
        Ok(orig)
    }
}