mirror of
https://github.com/AmbiML/sparrow-kata-full.git
synced 2025-08-28 17:51:38 +00:00
Merge "Implements some std::io functions in kata_io"
GitOrigin-RevId: b5b1afb7b0528acd100fd35a84a48b984f1b02c1
This commit is contained in:
parent
6b25d6fea0
commit
4904a61ca0
@ -4,14 +4,43 @@ pub struct Error;
|
||||
|
||||
pub type Result<T> = core::result::Result<T, Error>;
|
||||
|
||||
/// Interface for the CLI to consume bytes.
|
||||
/// Partial mimic of std::io::Read.
|
||||
pub trait Read {
|
||||
fn read(&mut self, buf: &mut [u8]) -> Result<usize>;
|
||||
|
||||
fn read_exact(&mut self, mut buf: &mut [u8]) -> Result<()> {
|
||||
while !buf.is_empty() {
|
||||
match self.read(buf) {
|
||||
Ok(0) => break,
|
||||
Ok(n) => {
|
||||
let tmp = buf;
|
||||
buf = &mut tmp[n..];
|
||||
}
|
||||
Err(e) => return Err(e),
|
||||
}
|
||||
}
|
||||
if !buf.is_empty() {
|
||||
Err(Error)
|
||||
} else {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Interface for the CLI to emit bytes.
|
||||
/// Partial mimic of std::io::Write.
|
||||
pub trait Write {
|
||||
fn write(&mut self, buf: &[u8]) -> Result<usize>;
|
||||
|
||||
fn write_all(&mut self, mut buf: &[u8]) -> Result<()> {
|
||||
while !buf.is_empty() {
|
||||
match self.write(buf) {
|
||||
Ok(0) => return Err(Error),
|
||||
Ok(n) => buf = &buf[n..],
|
||||
Err(e) => return Err(e),
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
/// Adapter for writing core::fmt formatted strings.
|
||||
@ -25,13 +54,13 @@ impl core::fmt::Write for dyn Write + '_ {
|
||||
}
|
||||
}
|
||||
|
||||
impl dyn Read + '_ {
|
||||
pub fn get_u8(&mut self) -> Result<u8> {
|
||||
let mut buf: [u8; 1] = [0u8];
|
||||
let n_read = self.read(&mut buf)?;
|
||||
match n_read {
|
||||
1usize => Ok(buf[0]),
|
||||
_ => Err(Error),
|
||||
}
|
||||
}
|
||||
pub enum SeekFrom {
|
||||
Start(u64),
|
||||
End(i64),
|
||||
Current(i64),
|
||||
}
|
||||
|
||||
/// Partial mimic of std::io::Seek.
|
||||
pub trait Seek {
|
||||
fn seek(&mut self, pos: SeekFrom) -> Result<u64>;
|
||||
}
|
||||
|
@ -39,6 +39,12 @@ pub struct LineReader {
|
||||
buf: [u8; LINE_MAX],
|
||||
}
|
||||
|
||||
fn get_u8(reader: &mut dyn io::Read) -> io::Result<u8> {
|
||||
let mut buf: [u8; 1] = [0u8];
|
||||
reader.read_exact(&mut buf)?;
|
||||
Ok(buf[0])
|
||||
}
|
||||
|
||||
impl LineReader {
|
||||
pub fn new() -> LineReader {
|
||||
LineReader {
|
||||
@ -55,13 +61,13 @@ impl LineReader {
|
||||
const BACKSPACE: u8 = 8u8;
|
||||
let mut len = 0;
|
||||
while len < self.buf.len() {
|
||||
let mut c = input.get_u8()?;
|
||||
let mut c = get_u8(input)?;
|
||||
while c == DEL || c == BACKSPACE {
|
||||
if len > 0 {
|
||||
output.write(&[BACKSPACE, b' ', BACKSPACE])?;
|
||||
len -= 1;
|
||||
}
|
||||
c = input.get_u8()?;
|
||||
c = get_u8(input)?;
|
||||
}
|
||||
if c == b'\r' || c == b'\n' {
|
||||
if len > 0 {
|
||||
|
Loading…
Reference in New Issue
Block a user