1pub mod datatypes;
5pub mod format;
6pub(crate) mod io;
7pub mod reader;
8pub mod testing;
9pub mod version;
10pub mod versions;
11pub mod writer;
12
13#[cfg(test)]
14mod compatibility_tests;
15
16pub use io::LanceEncodingsIo;
17
18use format::MAGIC;
19use lance_core::{Error, Result};
20use lance_io::object_store::ObjectStore;
21use object_store::path::Path;
22use version::{ConcreteFileVersion, LanceFileVersion};
23
24pub async fn determine_file_version(
25 store: &ObjectStore,
26 path: &Path,
27 known_size: Option<usize>,
28) -> Result<LanceFileVersion> {
29 let size = match known_size {
30 None => store.size(path).await.unwrap() as usize,
31 Some(size) => size,
32 };
33 if size < 8 {
34 return Err(Error::invalid_input_source(
35 format!(
36 "the file {} does not appear to be a lance file (too small)",
37 path
38 )
39 .into(),
40 ));
41 }
42 let reader = store.open_with_size(path, size).await?;
43 let footer = reader.get_range((size - 8)..size).await?;
44 if &footer[4..] != MAGIC {
45 return Err(Error::invalid_input_source(
46 format!(
47 "the file {} does not appear to be a lance file (magic mismatch)",
48 path
49 )
50 .into(),
51 ));
52 }
53 let major_version = u16::from_le_bytes([footer[0], footer[1]]);
54 let minor_version = u16::from_le_bytes([footer[2], footer[3]]);
55
56 ConcreteFileVersion::from_footer_numbers(major_version, minor_version).map(Into::into)
57}