use encoding_rs_io::DecodeReaderBytesBuilder;
use tracing::{error, trace};
use std::io::{BufRead, BufReader};
use std::path::Path;
use crate::parser::object_types::{ObjectType, OBJECT_TOKEN_MAP};
use crate::parser::{DF_ENCODING, RAW_TOKEN_RE};
use crate::util::try_get_file;
use crate::ParserError;
#[allow(clippy::too_many_lines)]
pub fn read_raw_file_type<P: AsRef<Path>>(input_path: &P) -> Result<ObjectType, ParserError> {
let file = try_get_file(input_path)?;
let decoding_reader = DecodeReaderBytesBuilder::new()
.encoding(Some(*DF_ENCODING))
.build(file);
let reader = BufReader::new(decoding_reader);
let mut raw_filename = String::new();
for (index, line) in reader.lines().enumerate() {
if line.is_err() {
error!(
"read_raw_file_type: Error processing {}:{}",
input_path.as_ref().display(),
index
);
continue;
}
let line = match line {
Ok(l) => l,
Err(e) => {
error!("read_raw_file_type: Line-reading error\n{:?}", e);
continue;
}
};
if index == 0 {
raw_filename = String::from(&line);
continue;
}
for cap in RAW_TOKEN_RE.captures_iter(&line) {
let captured_key = match cap.get(2) {
Some(v) => v.as_str(),
_ => {
continue;
}
};
let captured_value = match cap.get(3) {
Some(v) => v.as_str(),
_ => {
continue;
}
};
trace!(
"read_raw_file_type: Key: {} Value: {}",
captured_key,
captured_value
);
match captured_key {
"OBJECT" => {
trace!(
"read_raw_file_type: {} is a {} raw file",
raw_filename,
captured_value
);
return Ok(OBJECT_TOKEN_MAP
.get(captured_value)
.cloned()
.unwrap_or_default());
}
&_ => (),
}
}
}
Err(ParserError::InvalidRawFile(
"No [OBJECT] tag found".to_string(),
))
}