@@ -285,7 +285,7 @@ pub fn install_themes(extension_path: PathBuf) {
285
285
let current_extension_config = storage:: read_data ( "extensions" . to_string ( ) ) ;
286
286
let current_extension_config = match current_extension_config {
287
287
Ok ( config) => {
288
- if config. status {
288
+ if config. status && config . data . is_object ( ) {
289
289
config. data
290
290
} else {
291
291
serde_json:: json!( { } )
@@ -300,13 +300,18 @@ pub fn install_themes(extension_path: PathBuf) {
300
300
Some ( _) => current_extension_config,
301
301
None => {
302
302
let mut current_extension_config = current_extension_config. clone ( ) ;
303
- current_extension_config[ "themes" ] = serde_json:: json!( [ ] ) ;
303
+ // Create themes key on current extension config
304
+ current_extension_config
305
+ . as_object_mut ( )
306
+ . unwrap ( )
307
+ . insert ( "themes" . to_string ( ) , serde_json:: json!( { } ) ) ;
304
308
current_extension_config
305
309
}
306
310
} ;
307
311
308
312
let themes = current_extension_config. get ( "themes" ) . unwrap ( ) ;
309
- let themes = themes. as_array ( ) . unwrap ( ) ;
313
+ let empty_vec = Vec :: new ( ) ;
314
+ let themes = themes. as_array ( ) . unwrap_or ( & empty_vec) ;
310
315
311
316
// Remove theme if already installed
312
317
let mut themes = themes
@@ -327,3 +332,96 @@ pub fn install_themes(extension_path: PathBuf) {
327
332
. insert ( "themes" . to_string ( ) , serde_json:: json!( themes) ) ;
328
333
storage:: write_data ( "extensions" . to_string ( ) , current_extension_config) ;
329
334
}
335
+
336
+ pub fn install_extensions ( extension_path : PathBuf ) {
337
+ let extension_file: Result < serde_json:: Value , serde_json:: Error > = serde_json:: from_str (
338
+ std:: fs:: read_to_string ( extension_path. clone ( ) )
339
+ . unwrap ( )
340
+ . as_str ( ) ,
341
+ ) ;
342
+ let extension_information = match extension_file {
343
+ Ok ( file) => file,
344
+ Err ( _) => {
345
+ panic ! ( "Error parsing extension file" ) ;
346
+ }
347
+ } ;
348
+
349
+ // Check the type of packaged extension
350
+ if extension_information
351
+ . get ( "extensionType" )
352
+ . unwrap_or ( & serde_json:: Value :: Null )
353
+ != "theme"
354
+ {
355
+ panic ! ( "Only theme extension is supported right now" ) ;
356
+ }
357
+ install_themes ( extension_path) ;
358
+ }
359
+
360
+ pub fn uninstall_extensions ( extension_identifier : String ) {
361
+ let extensions = storage:: read_data ( "extensions" . to_string ( ) ) ;
362
+ let mut extensions = match extensions {
363
+ Ok ( config) => {
364
+ if config. status {
365
+ config. data
366
+ } else {
367
+ serde_json:: json!( { } )
368
+ }
369
+ }
370
+ Err ( _) => {
371
+ serde_json:: json!( { } )
372
+ }
373
+ } ;
374
+ // Iterate on every object of extensions and iterate extensions key of the object and remove the extension
375
+ let mut extensions = extensions. as_object_mut ( ) . unwrap ( ) . clone ( ) ;
376
+ let mut new_extensions = serde_json:: json!( { } ) . as_object_mut ( ) . unwrap ( ) . clone ( ) ;
377
+ for ( key, value) in extensions {
378
+ let value = value. as_array ( ) . unwrap ( ) . clone ( ) ;
379
+ let new_value = value
380
+ . iter ( )
381
+ . filter ( |ext| {
382
+ let _empty_string = serde_json:: Value :: String ( "" . to_string ( ) ) ;
383
+ let ext_identifier = ext. get ( "identifier" ) . unwrap_or ( & _empty_string) ;
384
+ if key == "themes" && ext_identifier == & extension_identifier {
385
+ let theme = storage:: read_data ( "theme" . to_string ( ) ) ;
386
+ let theme = match theme {
387
+ Ok ( config) => {
388
+ if config. status {
389
+ config. data
390
+ } else {
391
+ serde_json:: json!( { } )
392
+ }
393
+ }
394
+ Err ( _) => {
395
+ serde_json:: json!( { } )
396
+ }
397
+ } ;
398
+ let theme = theme. as_object ( ) . unwrap ( ) . clone ( ) ;
399
+ let current_active_theme = theme
400
+ . get ( "theme" )
401
+ . unwrap_or ( & serde_json:: Value :: String ( "" . to_string ( ) ) )
402
+ . to_string ( ) ;
403
+
404
+ let current_active_theme =
405
+ current_active_theme. split ( "@" ) . collect :: < Vec < _ > > ( ) [ 0 ] . to_string ( ) ;
406
+ // If the current_active_theme starts with unused " character, remove it
407
+ let current_active_theme = if current_active_theme. starts_with ( "\" " ) {
408
+ current_active_theme. split_at ( 1 ) . 1 . to_string ( )
409
+ } else {
410
+ current_active_theme
411
+ } ;
412
+ let current_active_theme = serde_json:: Value :: String ( current_active_theme) ;
413
+ if & current_active_theme == ext_identifier {
414
+ storage:: write_data (
415
+ "theme" . to_string ( ) ,
416
+ serde_json:: json!( { "theme" : "System Default" } ) ,
417
+ ) ;
418
+ }
419
+ }
420
+ ext_identifier != & extension_identifier
421
+ } )
422
+ . cloned ( )
423
+ . collect :: < Vec < _ > > ( ) ;
424
+ new_extensions. insert ( key. to_string ( ) , serde_json:: json!( new_value) ) ;
425
+ }
426
+ storage:: write_data ( "extensions" . to_string ( ) , serde_json:: json!( new_extensions) ) ;
427
+ }
0 commit comments