71 lines
1.5 KiB
Rust
71 lines
1.5 KiB
Rust
|
use std::ffi::{CString, CStr};
|
||
|
use std::fmt;
|
||
|
use std::ops::Deref;
|
||
|
use std::os::raw::c_char;
|
||
|
use std::str::Utf8Error;
|
||
|
|
||
|
#[derive(Clone, Eq, Hash)]
|
||
|
pub struct VkString {
|
||
|
rust_text: String,
|
||
|
cstring_text: CString,
|
||
|
}
|
||
|
|
||
|
impl VkString {
|
||
|
pub fn new(text: &str) -> VkString {
|
||
|
let owned = String::from(text);
|
||
|
let cstring = CString::new(owned.clone())
|
||
|
.unwrap_or_else(|_| panic!("could not create CString ({})", text));
|
||
|
|
||
|
VkString {
|
||
|
rust_text: owned,
|
||
|
cstring_text: cstring,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pub fn as_ptr(&self) -> *const c_char {
|
||
|
self.cstring_text.as_ptr()
|
||
|
}
|
||
|
|
||
|
pub fn as_str(&self) -> &str {
|
||
|
&self.rust_text
|
||
|
}
|
||
|
|
||
|
pub fn as_string(&self) -> String {
|
||
|
self.rust_text.clone()
|
||
|
}
|
||
|
|
||
|
pub fn into_string(self) -> String {
|
||
|
self.rust_text
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl TryFrom<*const c_char> for VkString {
|
||
|
type Error = Utf8Error;
|
||
|
|
||
|
fn try_from(value: *const c_char) -> Result<Self, Self::Error> {
|
||
|
let cstr = unsafe { CStr::from_ptr(value) };
|
||
|
let str = cstr.to_str()?;
|
||
|
Ok(VkString::new(str))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl Deref for VkString {
|
||
|
type Target = String;
|
||
|
|
||
|
fn deref(&self) -> &String {
|
||
|
&self.rust_text
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl PartialEq for VkString {
|
||
|
fn eq(&self, other: &VkString) -> bool {
|
||
|
self.rust_text == other.rust_text
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl fmt::Debug for VkString {
|
||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||
|
write!(f, "VkString {{ {} }}", self.rust_text)
|
||
|
}
|
||
|
}
|