use std::error::Error;
use std::io;
use std::io::prelude::*;
use std::fs::File;
use utf8conv::*;
fn read_bytes_without_interrupt(
read_obj: & mut (impl Read + ?Sized), buf: & mut [u8]) -> io::Result<usize> {
loop {
match read_obj.read(buf) {
Ok(num_bytes) => { return Ok(num_bytes); }
Err(er) => {
if er.kind() != io::ErrorKind::Interrupted {
return Err(er);
}
}
}
}
}
fn real_io_iterator(
read_obj: & mut (impl Read + ?Sized), buf: & mut [u8]) -> io::Result<()> {
let mut parser = FromUtf8::new();
loop {
match read_bytes_without_interrupt(read_obj, buf) {
Err(er) => { return Err(er); }
Ok(num_bytes) => {
parser.set_is_last_buffer(num_bytes == 0);
let buf_slice = & buf[0 .. num_bytes];
let mut utf8_ref_iter = buf_slice.iter();
let mut iterator = parser.utf8_ref_to_char_with_iter(& mut utf8_ref_iter);
while let Some(char_val) = iterator.next() {
print!("{}", char_val);
}
if num_bytes == 0 {
break Ok(());
}
}
}
}
}
fn main() -> Result<(), Box<dyn Error>> {
let mut buf: [u8; 128] = [0u8; 128];
let mut f = File::open("examples/real_io_iterator.rs") ?;
real_io_iterator(& mut f, & mut buf[..]) ?;
Ok(())
}