nyquest-backend-winrt 0.4.0

Windows.Web.Http.HttpClient backend for nyquest
Documentation
use windows::core::{self as windows_core, *};
use windows::Storage::Streams::{IBuffer, IBuffer_Impl};
use windows::Win32::System::WinRT::*;

#[implement(IBuffer, IBufferByteAccess)]
pub(crate) struct VecBuffer {
    data: std::cell::UnsafeCell<Vec<u8>>,
}

impl VecBuffer {
    pub fn new(data: Vec<u8>) -> Self {
        if u32::try_from(data.len()).is_err() {
            panic!("VecBuffer::new: data too large");
        }
        Self {
            data: std::cell::UnsafeCell::new(data),
        }
    }
}

#[allow(non_snake_case)]
impl IBuffer_Impl for VecBuffer_Impl {
    fn Capacity(&self) -> windows_core::Result<u32> {
        Ok(unsafe {
            let buf = &mut *self.data.get();
            buf.capacity() as u32
        })
    }

    fn Length(&self) -> windows_core::Result<u32> {
        Ok(unsafe {
            let buf = &mut *self.data.get();
            buf.len() as u32
        })
    }

    fn SetLength(&self, value: u32) -> windows_core::Result<()> {
        unsafe {
            let buf = &mut *self.data.get();
            buf.resize(value as usize, 0);
        }
        Ok(())
    }
}

#[allow(non_snake_case)]
impl IBufferByteAccess_Impl for VecBuffer_Impl {
    fn Buffer(&self) -> Result<*mut u8> {
        unsafe { Ok((*self.data.get()).as_mut_ptr()) }
    }
}