schnauzer 0.3.5

Library for parsing Mach-O files
Documentation
use std::{path::Path, io::{self, Read, Seek, SeekFrom, BufReader, BufRead}, fs::File, fmt::Debug};
use crate::fmt_ext;

use super::result::*;

use std::rc::Rc;
use std::cell::RefCell;
pub(super) type RcReader = super::RcCell<Reader>;

#[derive(Debug)]
pub struct Reader {
    buf_read: BufReader<File>,
}

impl Reader {
    pub(super) fn build(path: &Path) -> Result<RcReader> {
        let file = File::open(path)?;
        let buf_read = BufReader::new(file);
        Ok(Rc::new(RefCell::new(Reader { buf_read })))
    }
}

impl Seek for Reader {
    fn seek(&mut self, style: SeekFrom) -> io::Result<u64> {
        self.buf_read.seek(style)
    }
}

impl Read for Reader {
    fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
        self.buf_read.read(buf)
    }
}

impl Reader {
    pub fn read_zero_terminated_string(&mut self) -> Result<String> {
        let mut buf = Vec::new();
        self.buf_read.read_until(0, &mut buf)?;

        Ok(fmt_ext::printable_string(&buf))
    }
}