1use intel_cache_lib::lib_backend::{delete_dir,show_dirs,create_dir,update_dir,validate_dir};
2use intel_cache_lib::ic_types::{IcConnection,ic_execute_mod::IcExecute,IcPacket};
3
4pub struct StorageDir { }
5impl StorageDir {
6 #[no_mangle]
7 pub fn sd_new() -> StorageDir {
8 StorageDir {}
9 }
10
11 #[no_mangle]
12 pub fn sd_to_exe() -> Box<dyn IcExecute<Connection = IcConnection>> {
13 Box::new(StorageDir::sd_new())
14 }
15}
16impl IcExecute for StorageDir {
17 type Connection = IcConnection;
18
19 fn exec(&mut self,con: &mut Self::Connection,cmd: Option<Vec<String>>,_data: Option<Vec<u8>>,_cached: bool) -> IcPacket {
20 match cmd {
21 Some(c) => {
22 if c[c.len() - 1..][0] == con.login.as_ref().unwrap().cookie {
23 let mut create = false;
24 let mut set = false;
25 let mut delete = false;
26 let mut show = false;
27 let mut validate = false;
28 match c[1].as_str() {
29 "DELETE" => delete = true,
30 "SHOW" => show = true,
31 "CREATE" => create = true,
32 "SET" => set = true,
33 "VALIDATE" => validate = true,
34 _ => return IcPacket::new(Some(format!("{} is not a valid subcommand of DIR",c[1])),None),
35 }
36
37
38 if create {
39 let public;
41 if c.len() == 5 {
42 match c[3].as_ref() {
43 "PUBLIC" => public = true,
44 _ => public = false,
45 }
46 match create_dir(&con.backend_con,&c[2],None,public,&con.login.as_ref().unwrap().id){
47 Ok(_iv) => return IcPacket::new(Some("OK!".to_string()),None),
48 Err(_err) => return IcPacket::new(Some("ERR.".to_string()),None),
49 };
50 } else if c.len() >= 7 {
51 match c[3].as_ref() {
52 "PUBLIC" => public = true,
53 _ => public = false,
54 }
55 if c[4] == "UNDER" {
56 match c[5].parse::<i32>() {
57 Ok(v) => match create_dir(&con.backend_con,&c[2],Some(v),public,&con.login.as_ref().unwrap().id) {
58 Ok(_iv) => return IcPacket::new(Some("OK!".to_string()),None),
59 Err(_err) => return IcPacket::new(Some("Err.".to_string()),None),
60 },
61 Err(_err) => return IcPacket::new(Some("Err.".to_string()),None),
62 }
63 } else { return IcPacket::new(Some("Err.".to_string()),None) }
64 } else { return IcPacket::new(Some(format!("Err. {} arguments is invalid.",c.len()).to_string()),None) }
65 }
66 if show {
67 let retstr: String;
69 let public_show: bool;
70 if c.len() == 5 { public_show = if c[2] == "PUBLIC" {false} else {true};
73 retstr = show_dirs(&con.backend_con,Some(c[3].parse::<i32>().unwrap()),&con.login.as_ref().unwrap().id,public_show);
74 } else if c.len() == 4{ public_show = if c[2] == "PUBLIC" {false} else {true};
76 retstr = show_dirs(&con.backend_con,None,&con.login.as_ref().unwrap().id,public_show);
77 } else { return IcPacket::new(Some("Error, Invalid amount of arguments.".to_string()),None) }
78 return IcPacket::new(Some("OK!".to_string()),if retstr != "" {Some(retstr.as_bytes().to_vec())} else {None})
79 }
80 if delete {
81 if c.len() == 4 {
83 let r = delete_dir(&con.backend_con,c[2].parse::<i32>().unwrap());
84 match r {
85 Ok(_v) => {return IcPacket::new(Some("OK!".to_string()),None)},
86 Err(_e) => {return IcPacket::new(Some("Err.".to_string()),None)},
87 }
88 } else {
89 return IcPacket::new(Some("Err.".to_string()),None)
90 }
91 }
92 if set {
93 if c.len() == 5 {
95 let dts: i32;
96 let nli: i32;
97 let nns: &str;
98 match c[2].parse::<i32>() { Ok(v) => match c[3].parse::<i32>() {Ok(iv) => match validate_dir(&con.backend_con,v) { Some(_dip) => match validate_dir(&con.backend_con,iv) {
102 Some(_drip) => {
103 dts = v;
104 nli = iv;
105 match update_dir(&con.backend_con,dts,Some(nli),None) {
106 Ok(_) => return IcPacket::new(Some("OK!".to_string()),None),
107 Err(_err) => return IcPacket::new(Some("Err.".to_string()),None),
108 }
109 },
110 None => return IcPacket::new(Some("Err.".to_string()),None),
111 },
112 None => return IcPacket::new(Some("Err.".to_string()),None),
113 },
114 Err(_e1) => match validate_dir(&con.backend_con,v) { Some(_dip) => {
116 dts = v;
117 nns = &c[3];
118 match update_dir(&con.backend_con,dts,None,Some(nns)) {
119 Ok(_) => return IcPacket::new(Some("OK!".to_string()),None),
120 Err(_err) => return IcPacket::new(Some("Err.".to_string()),None),
121 }
122 },
123 None => {return IcPacket::new(Some("Err.".to_string()),None);},
124 }
125 },
126 Err(_e2) => return IcPacket::new(Some("Err.".to_string()),None),
127 };
128 }
129 }
130 if validate {
131 let n = validate_dir(&con.backend_con,c[2].parse::<i32>().unwrap());
133 if n != None {
134 return IcPacket::new(Some("true".to_string()),Some(n.unwrap().as_bytes().to_vec()));
135 } else {
136 return IcPacket::new(Some("false".to_string()),None);
137 }
138
139 }
140 return IcPacket::new(Some("Err: Subcommand not found.".to_string()),None)
141 } else { return IcPacket::new_denied() }
142 },
143 None => return IcPacket::new_denied(),
144 }
145 }
146
147 fn login_required(&mut self) -> bool {
148 true
149 }
150}