use bincode::Options;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Metadata {
pub schemas: Vec<TableSchema>,
pub indexes: Vec<IndexDefinition>,
pub vector_indexes: Vec<VectorIndexMetadata>,
pub range_metadata: Option<RangeMetadata>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TableSchema {
pub table_id: u64,
pub table_name: String,
pub columns: Vec<ColumnDefinition>,
pub primary_key: Vec<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ColumnDefinition {
pub column_id: u32,
pub name: String,
pub data_type: String,
pub nullable: bool,
pub default_value: Option<Vec<u8>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IndexDefinition {
pub index_id: u64,
pub table_id: u64,
pub index_name: String,
pub columns: Vec<u32>,
pub unique: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VectorIndexMetadata {
pub index_id: u64,
pub table_id: u64,
pub dimension: u32,
pub metric: VectorMetric,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub enum VectorMetric {
L2,
Cosine,
Dot,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RangeMetadata {
pub range_id: u64,
pub key_start: Vec<u8>,
pub key_end: Vec<u8>,
pub epoch: u64,
pub replica_set: Vec<u64>,
}
pub fn bincode_config() -> impl bincode::Options {
bincode::DefaultOptions::new()
.with_little_endian()
.with_fixint_encoding()
.reject_trailing_bytes()
}