// Copyright 2022 The ChromiumOS Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. use std::io::Error; use std::io::Read; use std::io::Result; use winapi::shared::minwindef::LPVOID; use winapi::shared::ntdef::NULL; use winapi::um::fileapi::ReadFile; use winapi::um::minwinbase::LPOVERLAPPED; use crate::AsRawDescriptor; use crate::ReadNotifier; pub struct Console(std::io::Stdin); impl Console { pub fn new() -> Self { Self(std::io::stdin()) } } impl Read for Console { fn read(&mut self, out: &mut [u8]) -> Result { let mut num_of_bytes_read: u32 = 0; // Safe because `out` is guarenteed to be a valid mutable array // and `num_of_bytes_read` is a valid u32. let res = unsafe { ReadFile( self.0.as_raw_descriptor(), out.as_mut_ptr() as LPVOID, out.len() as u32, &mut num_of_bytes_read, NULL as LPOVERLAPPED, ) }; let error = Error::last_os_error(); if res == 0 { Err(error) } else { Ok(num_of_bytes_read as usize) } } } impl ReadNotifier for Console { fn get_read_notifier(&self) -> &dyn AsRawDescriptor { &self.0 } }