use serde_json::{Map, Value};
use crate::schema::Schema;
use crate::types::get_default;
#[derive(Debug, Clone)]
pub struct ComputeEntry {
pub key: String,
pub fn_ref: String,
pub depends: Vec<String>,
}
#[derive(Debug, Clone, Default)]
pub struct Cache {
pub field_defaults: Map<String, Value>,
pub compute_defaults: Map<String, Value>,
pub fn_list: Vec<ComputeEntry>,
pub async_fn_list: Vec<ComputeEntry>,
}
pub fn ensure_cache(schema: &Schema) -> Cache {
let mut field_defaults = Map::new();
for (key, field) in &schema.fields {
if let Some(d) = field.default.as_ref() {
if !d.is_null() {
field_defaults.insert(key.clone(), d.clone());
}
}
}
let mut compute_defaults = Map::new();
let mut fn_list = Vec::new();
let mut async_fn_list = Vec::new();
for (key, comp) in &schema.computes {
compute_defaults.insert(key.clone(), get_default(&comp.comp_type));
let fn_ref = comp.fn_ref.clone().unwrap_or_else(|| key.clone());
if comp.has_fn {
fn_list.push(ComputeEntry {
key: key.clone(),
fn_ref: fn_ref.clone(),
depends: comp.depends.clone(),
});
}
if comp.has_async_fn {
async_fn_list.push(ComputeEntry {
key: key.clone(),
fn_ref,
depends: comp.depends.clone(),
});
}
}
Cache {
field_defaults,
compute_defaults,
fn_list,
async_fn_list,
}
}