ic_storage_module/
storage_dir_command.rs

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						//DIR CREATE <NAME> {PUBLIC|PRIVATE} <COOKIE>
40						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						//STORAGE DIR SHOW {PUBLIC|PRIVATE} [<DIR_ID>] <COOKIE>
68						let retstr: String;
69						let public_show: bool;
70						if c.len() == 5 { //DIR SHOW {PUBLIC|PRIVATE} [<DIR_ID>] <COOKIE>
71
72							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{ //DIR SHOW {PUBLIC|PRIVATE} <COOKIE>
75							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						//DIR DELETE [<DIR_ID>] <COOKIE>
82						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						//MARKER 1: DIR SET <DIR ID> {<NEW DIR ID>|<NEW NAME>} <COOKIE>
94						if c.len() == 5 {
95							let dts: i32;
96							let nli: i32;
97							let nns: &str;
98							match c[2].parse::<i32>() { //TEST <DIR IF>
99								Ok(v) => match c[3].parse::<i32>() {//TEST <NEW DIR ID>/<NEW NAME>
100										Ok(iv) => match validate_dir(&con.backend_con,v) { //NEW DIR ID
101												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) { //NEW DIR NAME
115												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						//DIR VALIDATE <DIR ID> <COOKIE>
132						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}