use crate::WString;
use mssf_com::FabricCommon::{
IFabricStringListResult, IFabricStringResult, IFabricStringResult_Impl,
};
use windows_core::implement;
#[derive(Debug)]
#[implement(IFabricStringResult)]
pub struct StringResult {
data: WString,
}
impl StringResult {
pub fn new(data: WString) -> StringResult {
StringResult { data }
}
pub fn into_inner(self) -> WString {
self.data
}
}
impl IFabricStringResult_Impl for StringResult_Impl {
fn get_String(&self) -> crate::PCWSTR {
crate::PCWSTR::from_raw(self.data.as_ptr())
}
}
impl From<&IFabricStringResult> for StringResult {
fn from(value: &IFabricStringResult) -> Self {
let content = unsafe { value.get_String() };
Self {
data: WString::from(content),
}
}
}
pub struct WStringList {
data: Vec<WString>,
}
impl WStringList {
pub fn into_vec(self) -> Vec<WString> {
self.data
}
}
impl From<&IFabricStringListResult> for WStringList {
fn from(value: &IFabricStringListResult) -> Self {
let mut itemcount = 0_u32;
let first_str = unsafe {
value
.GetStrings(std::ptr::addr_of_mut!(itemcount))
.expect("cannot get strings")
};
let data = crate::iter::vec_from_raw_com(itemcount as usize, first_str);
Self { data }
}
}
#[cfg(test)]
mod test {
use super::StringResult;
use crate::WString;
use mssf_com::FabricCommon::IFabricStringResult;
#[test]
fn test_str_addr() {
let addr = "1.2.3.4:1234";
let haddr = WString::from(addr);
let haddr_slice = haddr.as_wide();
assert_eq!(haddr_slice.len(), 12);
let com_addr: IFabricStringResult = StringResult::new(haddr.clone()).into();
let raw = unsafe { com_addr.get_String() };
let slice = unsafe { raw.as_wide() };
assert_eq!(slice.len(), 12);
let haddr2: WString = StringResult::from(&com_addr).into_inner();
assert_eq!(haddr, haddr2);
}
}