cyfs_lib/rmeta/def/
object.rs

1use crate::*;
2use cyfs_base::*;
3
4use once_cell::sync::OnceCell;
5use serde::{Deserialize, Serialize};
6
7#[derive(Clone, Debug, Serialize, Deserialize)]
8pub struct GlobalStateObjectMetaItem {
9    // Object dynamic selector
10    pub selector: String,
11
12    // Access value
13    pub access: GlobalStatePathGroupAccess,
14
15    // Object referer's depth, default is 1
16    pub depth: Option<u8>,
17}
18
19impl std::fmt::Display for GlobalStateObjectMetaItem {
20    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
21        write!(f, "({}, {}, {:?})", self.selector, self.access, self.depth)
22    }
23}
24
25pub struct GlobalStateObjectMetaConfigItemValue {
26    // Access value
27    pub access: GlobalStatePathGroupAccess,
28
29    // Object referer's depth, default is 1
30    pub depth: Option<u8>,
31}
32
33pub trait ObjectSelectorDataProvider: Send + Sync {
34    fn object_id(&self) -> &ObjectId;
35    fn obj_type(&self) -> u16;
36
37    fn object_dec_id(&self) -> &Option<ObjectId>;
38    fn object_author(&self) -> &Option<ObjectId>;
39    fn object_owner(&self) -> &Option<ObjectId>;
40
41    fn object_create_time(&self) -> Option<u64>;
42    fn object_update_time(&self) -> Option<u64>;
43    fn object_expired_time(&self) -> Option<u64>;
44
45    fn update_time(&self) -> &u64;
46    fn insert_time(&self) -> &u64;
47}
48
49pub struct ObjectSelectorTokenList;
50
51impl ObjectSelectorTokenList {
52    fn gen_token_list() -> ExpReservedTokenList {
53        let mut token_list = ExpReservedTokenList::new();
54
55        // token_list.add_string("object_id");
56        token_list.add_u16("obj_type_code");
57        token_list.add_string("obj_category");
58        token_list.add_u16("obj_type");
59
60        token_list.add_string("object.dec_id");
61        token_list.add_string("object.author");
62        token_list.add_string("object.owner");
63
64        token_list.add_u64("object.create_time");
65        token_list.add_u64("object.update_time");
66        token_list.add_u64("object.expired_time");
67
68        token_list.add_u64("insert_time");
69        token_list.add_u64("update_time");
70
71        token_list
72    }
73
74    pub fn token_list() -> &'static ExpReservedTokenList {
75        static S_INSTANCE: OnceCell<ExpReservedTokenList> = OnceCell::new();
76        S_INSTANCE.get_or_init(|| Self::gen_token_list())
77    }
78}
79
80impl ExpReservedTokenTranslator for &dyn ObjectSelectorDataProvider
81{
82    fn trans(&self, token: &str) -> ExpTokenEvalValue {
83        match token {
84            "obj_type_code" => ExpTokenEvalValue::U16(self.object_id().obj_type_code().into()),
85            "obj_category" => ExpTokenEvalValue::from_string(&self.object_id().object_category()),
86            "obj_type" => ExpTokenEvalValue::U16(self.obj_type()),
87
88            "object.dec_id" => ExpTokenEvalValue::from_opt_string(&self.object_dec_id()),
89            "object.author" => ExpTokenEvalValue::from_opt_string(&self.object_author()),
90            "object.owner" => ExpTokenEvalValue::from_opt_string(&self.object_owner()),
91
92            "object.create_time" => ExpTokenEvalValue::from_opt_u64(self.object_create_time()),
93            "object.update_time" => ExpTokenEvalValue::from_opt_u64(self.object_update_time()),
94            "object.expired_time" => ExpTokenEvalValue::from_opt_u64(self.object_expired_time()),
95
96            "insert_time" => ExpTokenEvalValue::U64(*self.insert_time()),
97            "update_time" => ExpTokenEvalValue::U64(*self.update_time()),
98
99            _ => {
100                unreachable!("unknown object selector token! {}", token);
101            }
102        }
103    }
104}
105