use super::entry_for;
use super::multi_vector;
use super::rerank;
use super::sparse;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub enum Catalog {
Sparse,
Bm25,
MultiVector,
Rerank,
}
impl Catalog {
pub(crate) fn name(self) -> &'static str {
match self {
Catalog::Sparse | Catalog::Bm25 => "sparse",
Catalog::MultiVector => "multi-vector",
Catalog::Rerank => "rerank",
}
}
pub(crate) fn entry_point(self) -> &'static str {
match self {
Catalog::Sparse => "`SparseTextEmbedding::builder` (`candding embed --sparse`)",
Catalog::Bm25 => "`Bm25TextEmbedding::builder`",
Catalog::MultiVector => {
"`MultiVectorTextEmbedding::builder` (`candding embed --multi-vector`)"
}
Catalog::Rerank => "`TextCrossEncoder::builder` (`candding rerank`)",
}
}
pub(crate) fn unstated_facts(self) -> &'static str {
match self {
Catalog::Sparse | Catalog::Bm25 => "its head or vocabulary",
Catalog::MultiVector => "its head or projection shape",
Catalog::Rerank => "its head or score activation",
}
}
}
pub(crate) fn other_catalog(id: &str) -> Option<Catalog> {
if entry_for(id).is_some() {
return None;
}
if let Some(descriptor) = sparse::lookup(id) {
return Some(match descriptor.computation {
sparse::SparseComputation::Computed => Catalog::Bm25,
sparse::SparseComputation::Encoded => Catalog::Sparse,
});
}
if multi_vector::lookup(id).is_some() {
return Some(Catalog::MultiVector);
}
rerank::lookup(id).map(|_| Catalog::Rerank)
}