use serde_json::Value;
use super::event::parse_events;
use super::field::parse_fields;
use super::index::parse_indexes;
use super::{expect_object, pick_map, value_to_string_map};
use crate::error::Result;
use crate::schema::table::{TableDefinition, TableMode};
pub fn parse_table_mode(definition: &str) -> TableMode {
if definition.is_empty() {
return TableMode::Schemaless;
}
let upper = definition.to_uppercase();
if upper.contains("SCHEMAFULL") {
TableMode::Schemafull
} else if upper.contains("SCHEMALESS") {
TableMode::Schemaless
} else if upper.contains("DROP") {
TableMode::Drop
} else {
TableMode::Schemaless
}
}
pub fn parse_table_info(table_name: &str, info: &Value) -> Result<TableDefinition> {
let obj = expect_object(info, &format!("INFO FOR TABLE {table_name}"))?;
let tb_definition = obj.get("tb").and_then(Value::as_str).unwrap_or("");
let mode = parse_table_mode(tb_definition);
let fields_value = pick_map(obj, &["fields", "fd"]);
let fields = fields_value
.map(|v| parse_fields(&value_to_string_map(v)))
.unwrap_or_default();
let indexes_value = pick_map(obj, &["indexes", "ix"]);
let indexes = indexes_value
.map(|v| parse_indexes(&value_to_string_map(v)))
.unwrap_or_default();
let events_value = pick_map(obj, &["events", "ev"]);
let events = events_value
.map(|v| parse_events(&value_to_string_map(v)))
.unwrap_or_default();
Ok(TableDefinition {
name: table_name.to_string(),
mode,
fields,
indexes,
events,
permissions: None,
drop: false,
})
}