junobuild_collections/
store.rs

1use crate::assert::rules::{
2    assert_memory, assert_mutable_permissions, assert_storage_reserved_collection,
3    assert_system_collection_delete_permission, assert_system_collection_set_permission,
4    assert_write_version,
5};
6use crate::constants::core::SYS_COLLECTION_PREFIX;
7use crate::types::core::CollectionKey;
8use crate::types::interface::{DelRule, SetRule};
9use crate::types::rules::{Rule, Rules};
10
11// ---------------------------------------------------------
12// Rules
13// ---------------------------------------------------------
14
15pub fn filter_rules(rules: &Rules) -> Vec<(CollectionKey, Rule)> {
16    rules
17        .clone()
18        .into_iter()
19        .filter(|(path, _rules)| (path.starts_with(|c| c != SYS_COLLECTION_PREFIX)))
20        .collect()
21}
22
23pub fn set_rule(
24    collection: CollectionKey,
25    user_rule: SetRule,
26    storage_checks: bool,
27    rules: &mut Rules,
28) -> Result<Rule, String> {
29    let current_rule = rules.get(&collection);
30
31    assert_write_version(current_rule, &user_rule.version)?;
32
33    assert_system_collection_set_permission(&collection, current_rule, &user_rule)?;
34
35    if storage_checks {
36        assert_storage_reserved_collection(&collection, rules)?;
37    }
38
39    assert_memory(current_rule, &user_rule.memory)?;
40    assert_mutable_permissions(current_rule, &user_rule)?;
41
42    let rule: Rule = Rule::prepare(&collection, &current_rule, &user_rule)?;
43
44    rules.insert(collection, rule.clone());
45
46    Ok(rule)
47}
48
49pub fn del_rule(
50    collection: CollectionKey,
51    user_rule: DelRule,
52    rules: &mut Rules,
53) -> Result<(), String> {
54    let current_rule = rules.get(&collection);
55
56    assert_write_version(current_rule, &user_rule.version)?;
57
58    assert_system_collection_delete_permission(&collection)?;
59
60    rules.remove(&collection);
61
62    Ok(())
63}