rust_store_core/computes/
cache.rs1use serde_json::{Map, Value};
4
5use crate::schema::Schema;
6use crate::types::get_default;
7
8#[derive(Debug, Clone)]
10pub struct ComputeEntry {
11 pub key: String,
12 pub fn_ref: String,
14 pub depends: Vec<String>,
15}
16
17#[derive(Debug, Clone, Default)]
18pub struct Cache {
19 pub field_defaults: Map<String, Value>,
21 pub compute_defaults: Map<String, Value>,
23 pub fn_list: Vec<ComputeEntry>,
24 pub async_fn_list: Vec<ComputeEntry>,
25}
26
27pub fn ensure_cache(schema: &Schema) -> Cache {
29 let mut field_defaults = Map::new();
30 for (key, field) in &schema.fields {
31 if let Some(d) = field.default.as_ref() {
36 if !d.is_null() {
37 field_defaults.insert(key.clone(), d.clone());
38 }
39 }
40 }
41
42 let mut compute_defaults = Map::new();
43 let mut fn_list = Vec::new();
44 let mut async_fn_list = Vec::new();
45 for (key, comp) in &schema.computes {
46 compute_defaults.insert(key.clone(), get_default(&comp.comp_type));
47 let fn_ref = comp.fn_ref.clone().unwrap_or_else(|| key.clone());
48 if comp.has_fn {
49 fn_list.push(ComputeEntry {
50 key: key.clone(),
51 fn_ref: fn_ref.clone(),
52 depends: comp.depends.clone(),
53 });
54 }
55 if comp.has_async_fn {
56 async_fn_list.push(ComputeEntry {
57 key: key.clone(),
58 fn_ref,
59 depends: comp.depends.clone(),
60 });
61 }
62 }
63
64 Cache {
65 field_defaults,
66 compute_defaults,
67 fn_list,
68 async_fn_list,
69 }
70}