fayalite 0.2.0

Hardware Description Language embedded in Rust, using FIRRTL's semantics
Documentation
// SPDX-License-Identifier: LGPL-3.0-or-later
// See Notices.txt for copyright information
use std::{
    io::{self, BufRead},
    str,
};

pub(crate) fn streaming_read_utf8<R: BufRead, E: From<io::Error>>(
    reader: R,
    mut callback: impl FnMut(&str) -> Result<(), E>,
) -> Result<(), E> {
    let mut buf = [0; 4];
    let mut buf_len = 0;
    for byte in reader.bytes() {
        buf[buf_len] = byte?;
        buf_len += 1;
        match str::from_utf8(&buf[..buf_len]) {
            Ok(buf) => {
                callback(buf)?;
                buf_len = 0;
            }
            Err(e) => {
                if e.error_len().is_some() {
                    callback("\u{FFFD}")?; // replacement character
                    buf_len = 0;
                }
            }
        }
    }
    Ok(())
}