#[derive(serde::Serialize, serde::Deserialize)]
#[serde(untagged)]
enum StoredIndexKey {
Column(String),
Expression(serde_json::Map<String, serde_json::Value>),
}
pub fn references_column(encoded: &str, column: &str) -> serde_json::Result<bool> {
let keys: Vec<StoredIndexKey> = serde_json::from_str(encoded)?;
Ok(keys
.iter()
.any(|key| matches!(key, StoredIndexKey::Column(name) if name == column)))
}
pub fn rename_column(encoded: &str, from: &str, to: &str) -> serde_json::Result<Option<String>> {
let mut keys: Vec<StoredIndexKey> = serde_json::from_str(encoded)?;
let mut changed = false;
for key in &mut keys {
if let StoredIndexKey::Column(name) = key {
if name == from {
*name = to.into();
changed = true;
}
}
}
changed.then(|| serde_json::to_string(&keys)).transpose()
}