cyfs_core/app/
default_app.rs1use crate::coreobj::CoreObjectType;
2use crate::DecAppId;
3use cyfs_base::*;
4use std::collections::{hash_map, HashMap};
5use serde::Serialize;
6
7#[derive(RawEncode, RawDecode, Clone, Debug, Serialize)]
9pub struct DefaultAppInfo {
10 pub name: String,
11 pub desc: String,
12 pub copyright: String,
13 pub dec_id: DecAppId,
14}
15
16#[derive(RawEncode, RawDecode, Clone, Serialize)]
17pub struct DefaultAppListDescContent {
18 id: String,
19}
20
21impl DescContent for DefaultAppListDescContent {
22 fn obj_type() -> u16 {
23 CoreObjectType::DefaultAppList as u16
24 }
25
26 type OwnerType = Option<ObjectId>;
27 type AreaType = SubDescNone;
28 type AuthorType = SubDescNone;
29 type PublicKeyType = SubDescNone;
30}
31
32#[derive(RawEncode, RawDecode, Clone, Serialize)]
33pub struct DefaultAppListContent {
34 list: HashMap<String, DefaultAppInfo>,
35}
36
37impl BodyContent for DefaultAppListContent {}
38
39type DefaultAppListType = NamedObjType<DefaultAppListDescContent, DefaultAppListContent>;
40type DefaultAppListBuilder = NamedObjectBuilder<DefaultAppListDescContent, DefaultAppListContent>;
41type DefaultAppListDesc = NamedObjectDesc<DefaultAppListDescContent>;
42
43pub type DefaultAppListId = NamedObjectId<DefaultAppListType>;
44pub type DefaultAppList = NamedObjectBase<DefaultAppListType>;
45
46pub trait DefaultAppListObj {
47 fn create(owner: ObjectId, id: &str) -> Self;
48 fn id(&self) -> &str;
49
50 fn set(&mut self, group: &str, app: DefaultAppInfo);
51 fn remove(&mut self, group: &str, dec_id: Option<DecAppId>) -> Option<DefaultAppInfo>;
52 fn app_list(&self) -> &HashMap<String, DefaultAppInfo>;
53 fn get(&self, group: &str) -> Option<&DefaultAppInfo>;
54
55 fn generate_id(owner: ObjectId, id: &str) -> ObjectId;
56}
57
58impl DefaultAppListObj for DefaultAppList {
59 fn create(owner: ObjectId, id: &str) -> Self {
60 let body = DefaultAppListContent {
61 list: HashMap::new(),
62 };
63 let desc = DefaultAppListDescContent { id: id.to_owned() };
64 DefaultAppListBuilder::new(desc, body)
65 .owner(owner)
66 .no_create_time()
67 .build()
68 }
69
70 fn id(&self) -> &str {
71 &self.desc().content().id
72 }
73
74 fn set(&mut self, group: &str, info: DefaultAppInfo) {
75 match self
76 .body_mut_expect("")
77 .content_mut()
78 .list
79 .entry(group.to_owned())
80 {
81 hash_map::Entry::Vacant(v) => {
82 info!(
83 "will add new default app for group={}, app={:?}",
84 group, info
85 );
86 v.insert(info);
87 }
88 hash_map::Entry::Occupied(mut v) => {
89 let c = v.get_mut();
90 if c.dec_id != info.dec_id {
91 info!(
92 "will change default app for group={}, old={:?}, new app={:?}",
93 group, c, info
94 );
95 *c = info;
96 } else {
97 info!(
98 "will update default app info for group={}, app={:?}",
99 group, info
100 );
101 *c = info;
102 }
103 }
104 }
105
106 self.body_mut_expect("")
107 .increase_update_time(bucky_time_now());
108 }
109
110 fn remove(&mut self, group: &str, dec_id: Option<DecAppId>) -> Option<DefaultAppInfo> {
111 let c = self.body_mut_expect("").content_mut().list.get(group);
112 if c.is_none() {
113 warn!(
114 "revoke defualt app for group but not found! group={}",
115 group
116 );
117 return None;
118 }
119
120 let c = c.unwrap();
121
122 let ret = match dec_id {
123 Some(id) => {
124 if c.dec_id == id {
125 info!("will revoke default app for group={}, app={:?}", group, c);
126 drop(c);
127 self.body_mut_expect("").content_mut().list.remove(group)
128 } else {
129 error!("revoke default app for group but dec_id not match! group={}, expect={}, got={}", group, id, c.dec_id);
130 None
131 }
132 }
133 None => {
134 info!("will revoke default app for group={}, app={:?}", group, c);
135 drop(c);
136 self.body_mut_expect("").content_mut().list.remove(group)
137 }
138 };
139
140 if ret.is_some() {
141 self.body_mut_expect("")
142 .increase_update_time(bucky_time_now());
143 }
144
145 ret
146 }
147
148 fn get(&self, group: &str) -> Option<&DefaultAppInfo> {
149 self.body_expect("").content().list.get(group)
150 }
151
152 fn app_list(&self) -> &HashMap<String, DefaultAppInfo> {
153 &self.body_expect("").content().list
154 }
155
156 fn generate_id(owner: ObjectId, id: &str) -> ObjectId {
157 Self::create(owner, id).desc().calculate_id()
158 }
159}