use std::sync::OnceLock;
use serde::Deserialize;
pub const SCHEMA_SQL: &str = include_str!("../schema/schema.sql");
const VERSION_JSON: &str = include_str!("../schema/version.json");
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SchemaVersion {
pub version: i64,
pub min_compatible: i64,
pub fts_tokenizer: String,
}
pub fn schema_version() -> &'static SchemaVersion {
static VERSION: OnceLock<SchemaVersion> = OnceLock::new();
VERSION.get_or_init(|| {
serde_json::from_str(VERSION_JSON).expect("schema/version.json is valid JSON")
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn version_json_parses() {
let v = schema_version();
assert!(v.version >= v.min_compatible);
assert_eq!(v.fts_tokenizer, "porter unicode61");
}
#[test]
fn schema_sql_pins_user_version() {
let v = schema_version();
let pragma = format!("PRAGMA user_version = {};", v.version);
assert!(
SCHEMA_SQL.contains(&pragma),
"schema.sql must set PRAGMA user_version to match version.json"
);
}
#[test]
fn schema_sql_pins_tokenizer() {
let v = schema_version();
let tokenize = format!("tokenize='{}'", v.fts_tokenizer);
assert!(
SCHEMA_SQL.contains(&tokenize),
"schema.sql FTS tables must use the tokenizer pinned in version.json"
);
}
}