| 137 | |
| 138 | #[tracing::instrument(level = "debug", skip(self, key, value))] |
| 139 | pub fn save_selective<T>(&self, key: String, value: Option<T>) -> Result<()> |
| 140 | where |
| 141 | T: Serialize + Clone + Debug, |
| 142 | { |
| 143 | let key = format!("prefs.{}", key); |
| 144 | tracing::debug!("saving {} - {:?}", key, value); |
| 145 | |
| 146 | let mut prefs = self.memcache.lock().unwrap(); |
| 147 | |
| 148 | if value.is_none() { |
| 149 | prefs.dot_remove(key.as_str()).unwrap(); |
| 150 | } else { |
| 151 | let old_value: Option<Value> = prefs.dot_get(key.as_str()).unwrap(); |
| 152 | |
| 153 | if let Some(old_value) = old_value { |
| 154 | if old_value == serde_json::to_value(&value).unwrap() { |
| 155 | return Ok(()); |
| 156 | } |
| 157 | } |
| 158 | |
| 159 | { |
| 160 | let mut prefs_clone = prefs.clone(); |
| 161 | prefs_clone.dot_set(key.as_str(), &value).unwrap(); |
| 162 | // let schema = serde_json::from_str(SCHEMA).unwrap(); |
| 163 | // let schema = match jsonschema::validator_for(&schema) { |
| 164 | // Ok(s) => s, |
| 165 | // Err(e) => panic!("{}: {}", e, e.instance_path), |
| 166 | // }; |
| 167 | // schema.validate(&prefs_clone)?; |
| 168 | } |
| 169 | prefs.dot_set(key.as_str(), &value).unwrap(); |
| 170 | } |
| 171 | |
| 172 | let writable = prefs.clone(); |
| 173 | drop(prefs); |
| 174 | |
| 175 | let config_file_path = self.config_file.lock().expect("poisoned"); |
| 176 | let mut config_file = File::create(config_file_path.as_os_str())?; |
| 177 | config_file.write_all(&serde_json::to_vec(&writable)?)?; |
| 178 | config_file.flush()?; |
| 179 | |
| 180 | let parsed = serde_json::to_value(value).unwrap(); |
| 181 | |
| 182 | let sender = self.sender.clone(); |
| 183 | thread::spawn(move || { |
| 184 | sender.send((key, parsed)).unwrap(); |
| 185 | }); |
| 186 | Ok(()) |
| 187 | } |
| 188 | |
| 189 | #[tracing::instrument(level = "debug", skip(self, key))] |
| 190 | pub fn load_selective_array<T>(&self, key: String) -> Result<T> |