#![forbid(unsafe_code)]
pub mod encoding;
pub mod error;
pub mod format;
pub mod raw;
pub mod reader;
pub mod record;
pub mod xml;
pub use crate::encoding::Encoding;
pub use crate::error::MarcError;
pub use crate::format::MarcFormat;
pub use crate::raw::{BinaryReader, BinaryWriter, RawRecord, RawRecordView};
pub use crate::reader::MarcReader;
pub use crate::record::Record;
pub use crate::record::RecordValidationIssue;
pub use crate::xml::{XmlReader, XmlWriter};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FileFormat {
Binary,
Xml,
}
pub fn detect_file_format(data: &[u8]) -> FileFormat {
let mut start = 0;
if data.len() >= 3 && data[..3] == [0xEF, 0xBB, 0xBF] {
start = 3;
}
while start < data.len() && data[start].is_ascii_whitespace() {
start += 1;
}
if start < data.len() && data[start] == b'<' {
FileFormat::Xml
} else {
FileFormat::Binary
}
}
pub fn parse_records(data: &[u8]) -> Result<Vec<Record>, MarcError> {
MarcReader::from_bytes(data.to_vec())?.into_records()
}