use std::io::{Read, Seek};
use crate::index::lucene::read::{LuceneReadError, LuceneResult, Reader};
pub const CODEC_MAGIC: i32 = 0x3fd7_6c17;
pub const MAXIMUM_CODEC_NAME_BYTES: usize = 127;
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct CodecHeader {
pub name: String,
pub version: i32,
}
pub fn read_codec_header<Source: Read + Seek>(
reader: &mut Reader<Source>,
expected_name: &str,
minimum_version: i32,
maximum_version: i32,
) -> LuceneResult<CodecHeader> {
let offset = reader.position()?;
let magic = reader.read_int()?;
if magic != CODEC_MAGIC {
return Err(LuceneReadError::NotALuceneFile {
file: reader.file_name().to_owned(),
offset,
found: magic,
});
}
read_codec_header_without_magic(reader, expected_name, minimum_version, maximum_version)
}
pub fn read_codec_header_without_magic<Source: Read + Seek>(
reader: &mut Reader<Source>,
expected_name: &str,
minimum_version: i32,
maximum_version: i32,
) -> LuceneResult<CodecHeader> {
let offset = reader.position()?;
let name = reader.read_string(MAXIMUM_CODEC_NAME_BYTES)?;
if name != expected_name {
return Err(LuceneReadError::WrongCodecName {
file: reader.file_name().to_owned(),
offset,
expected: expected_name.to_owned(),
found: name,
});
}
let version = reader.read_int()?;
if version < minimum_version || version > maximum_version {
return Err(LuceneReadError::UnsupportedFormatVersion {
file: reader.file_name().to_owned(),
offset,
codec: name,
version,
minimum: minimum_version,
maximum: maximum_version,
});
}
Ok(CodecHeader { name, version })
}
#[must_use]
pub fn header_length(codec_name: &str) -> usize {
9 + codec_name.len()
}