use crate::*;
use crate::sid::Box as SidBox;
use abistr::{AsCStr, TryIntoAsCStr};
use winapi::shared::sddl::{ConvertStringSidToSidW, ConvertStringSidToSidA};
use winapi::shared::winerror::*;
use core::ptr::null_mut;
pub fn convert_string_sid_to_sid_a(s: impl TryIntoAsCStr) -> Result<SidBox<alloc::LocalAllocFree>, Error> {
let s = s.try_into().map_err(|_| Error(E_STRING_NOT_NULL_TERMINATED as _))?;
let mut sid = null_mut();
Error::get_last_if(0 == unsafe { ConvertStringSidToSidA(s.as_cstr(), &mut sid) })?;
unsafe { SidBox::from_raw(sid.cast()) }.ok_or(Error(ERROR_INVALID_SID))
}
pub fn convert_string_sid_to_sid_w(s: impl TryIntoAsCStr<u16>) -> Result<SidBox<alloc::LocalAllocFree>, Error> {
let s = s.try_into().map_err(|_| Error(E_STRING_NOT_NULL_TERMINATED as _))?;
let mut sid = null_mut();
Error::get_last_if(0 == unsafe { ConvertStringSidToSidW(s.as_cstr(), &mut sid) })?;
unsafe { SidBox::from_raw(sid.cast()) }.ok_or(Error(ERROR_INVALID_SID))
}