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)
}
}