marc 3.1.1

Reader and builder for MARC 21 Bibliographic format
use crate::errors::*;

pub fn read_dec_1(i: u8) -> Result<u8> {
    if !(0x30..=0x39).contains(&i) {
        Err(Error::UnexpectedByteInDecNum(i))
    } else {
        Ok(0x0F & i)
    }
}

pub fn read_dec_4(i: &[u8]) -> Result<usize> {
    if i.len() < 4 {
        return Err(Error::UnexpectedEofInDecNum);
    }
    let mut result = 0usize;
    for (x, byte) in i.iter().enumerate().take(4) {
        result += 10_usize.pow(3 - x as u32) * read_dec_1(*byte)? as usize;
    }
    Ok(result)
}

pub fn read_dec_5(i: &[u8]) -> Result<usize> {
    if i.len() < 5 {
        return Err(Error::UnexpectedEofInDecNum);
    }
    let mut result = 0usize;
    for (x, byte) in i.iter().enumerate().take(5) {
        result += 10_usize.pow(4 - x as u32) * read_dec_1(*byte)? as usize;
    }
    Ok(result)
}