pub mod frame;
pub mod golden;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[repr(u16)]
pub enum FormatFamily {
Frame = 1,
Segment = 2,
VectorCodes = 3,
VectorFactors = 4,
VectorRescore = 5,
Columns = 6,
Alive = 7,
Postings = 8,
ChecksumTable = 9,
Manifest = 10,
Wal = 11,
GraphNodeBlocks = 12,
DocumentVersions = 13,
StoredMetadata = 14,
PurgeIntent = 15,
StoredText = 16,
NativeGraphObject = 17,
NativeGraphRoot = 18,
NativeGraphWal = 19,
}
impl FormatFamily {
#[must_use]
pub const fn id(self) -> u16 {
self as u16
}
pub(crate) const fn current_version(self) -> u16 {
match self {
Self::Manifest => 2,
Self::Frame
| Self::Segment
| Self::VectorCodes
| Self::VectorFactors
| Self::VectorRescore
| Self::Columns
| Self::Alive
| Self::Postings
| Self::ChecksumTable
| Self::Wal
| Self::GraphNodeBlocks
| Self::DocumentVersions
| Self::StoredMetadata
| Self::PurgeIntent
| Self::StoredText
| Self::NativeGraphObject
| Self::NativeGraphRoot
| Self::NativeGraphWal => 1,
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct FamilySpec {
pub family: FormatFamily,
pub current_version: u16,
pub minimum_accepted_version: u16,
pub maximum_accepted_version: u16,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum RegistryError {
UnknownFamily(u16),
UnsupportedVersion {
family: u16,
version: u16,
minimum: u16,
maximum: u16,
},
RetiredScheme(u16),
UnknownScheme(u16),
}
impl std::fmt::Display for RegistryError {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::UnknownFamily(family) => write!(formatter, "unknown format family {family}"),
Self::UnsupportedVersion {
family,
version,
minimum,
maximum,
} => write!(
formatter,
"format family {family} version {version} is outside accepted range {minimum}..={maximum}"
),
Self::RetiredScheme(scheme) => {
write!(
formatter,
"quantization scheme id {scheme} is permanently retired"
)
}
Self::UnknownScheme(scheme) => {
write!(formatter, "unknown quantization scheme {scheme}")
}
}
}
}
impl std::error::Error for RegistryError {}
pub struct FormatRegistry;
const FAMILIES: [FamilySpec; 19] = [
FamilySpec {
family: FormatFamily::Frame,
current_version: 1,
minimum_accepted_version: 1,
maximum_accepted_version: 1,
},
FamilySpec {
family: FormatFamily::Segment,
current_version: 1,
minimum_accepted_version: 1,
maximum_accepted_version: 1,
},
FamilySpec {
family: FormatFamily::VectorCodes,
current_version: 1,
minimum_accepted_version: 1,
maximum_accepted_version: 1,
},
FamilySpec {
family: FormatFamily::VectorFactors,
current_version: 1,
minimum_accepted_version: 1,
maximum_accepted_version: 1,
},
FamilySpec {
family: FormatFamily::VectorRescore,
current_version: 1,
minimum_accepted_version: 1,
maximum_accepted_version: 1,
},
FamilySpec {
family: FormatFamily::Columns,
current_version: 1,
minimum_accepted_version: 1,
maximum_accepted_version: 1,
},
FamilySpec {
family: FormatFamily::Alive,
current_version: 1,
minimum_accepted_version: 1,
maximum_accepted_version: 1,
},
FamilySpec {
family: FormatFamily::Postings,
current_version: 1,
minimum_accepted_version: 1,
maximum_accepted_version: 1,
},
FamilySpec {
family: FormatFamily::ChecksumTable,
current_version: 1,
minimum_accepted_version: 1,
maximum_accepted_version: 1,
},
FamilySpec {
family: FormatFamily::Manifest,
current_version: 2,
minimum_accepted_version: 2,
maximum_accepted_version: 3,
},
FamilySpec {
family: FormatFamily::Wal,
current_version: 1,
minimum_accepted_version: 1,
maximum_accepted_version: 1,
},
FamilySpec {
family: FormatFamily::GraphNodeBlocks,
current_version: 1,
minimum_accepted_version: 1,
maximum_accepted_version: 1,
},
FamilySpec {
family: FormatFamily::DocumentVersions,
current_version: 1,
minimum_accepted_version: 1,
maximum_accepted_version: 1,
},
FamilySpec {
family: FormatFamily::StoredMetadata,
current_version: 1,
minimum_accepted_version: 1,
maximum_accepted_version: 1,
},
FamilySpec {
family: FormatFamily::PurgeIntent,
current_version: 1,
minimum_accepted_version: 1,
maximum_accepted_version: 1,
},
FamilySpec {
family: FormatFamily::StoredText,
current_version: 1,
minimum_accepted_version: 1,
maximum_accepted_version: 1,
},
FamilySpec {
family: FormatFamily::NativeGraphObject,
current_version: 1,
minimum_accepted_version: 1,
maximum_accepted_version: 1,
},
FamilySpec {
family: FormatFamily::NativeGraphRoot,
current_version: 1,
minimum_accepted_version: 1,
maximum_accepted_version: 1,
},
FamilySpec {
family: FormatFamily::NativeGraphWal,
current_version: 1,
minimum_accepted_version: 1,
maximum_accepted_version: 1,
},
];
impl FormatRegistry {
#[must_use]
pub const fn families() -> &'static [FamilySpec] {
&FAMILIES
}
pub fn require(family: u16, version: u16) -> Result<&'static FamilySpec, RegistryError> {
let spec = FAMILIES
.iter()
.find(|candidate| candidate.family.id() == family)
.ok_or(RegistryError::UnknownFamily(family))?;
if version < spec.minimum_accepted_version || version > spec.maximum_accepted_version {
return Err(RegistryError::UnsupportedVersion {
family,
version,
minimum: spec.minimum_accepted_version,
maximum: spec.maximum_accepted_version,
});
}
Ok(spec)
}
pub const fn require_scheme(scheme: u16) -> Result<(), RegistryError> {
match scheme {
0 | 1 | 2 | 4 => Ok(()),
3 | 5 => Err(RegistryError::RetiredScheme(scheme)),
_ => Err(RegistryError::UnknownScheme(scheme)),
}
}
}