@@ -19,33 +19,29 @@ pub trait Backend {
1919 fn get_host ( & self ) -> IpAddr ;
2020
2121 fn as_remote_command ( & self , command : Command ) -> Command ;
22-
23- fn get_installed_apps ( & self ) -> Result < Vec < App > > ;
2422}
2523
2624#[ enum_dispatch( Backend ) ]
25+ #[ derive( Debug , Clone ) ]
2726pub enum Backends {
2827 Container ,
2928 Manual ,
3029}
3130
3231impl Config {
33- pub fn get_backend ( & ' static self ) -> Backends {
34- assert ! ( self . libvirt. enable ^ self . container. enable ^ self . manual. enable) ;
35-
36- if self . libvirt . enable {
37- todo ! ( )
38- }
39-
40- if self . container . enable {
41- return Container :: new ( self ) . into ( ) ;
42- }
43-
44- if self . manual . enable {
45- return Manual :: new ( self ) . into ( ) ;
46- }
47-
48- unreachable ! ( )
32+ pub fn get_backend ( & ' static self ) -> & ' static Backends {
33+ self . backend . get_or_init ( || {
34+ match (
35+ self . libvirt . enable ,
36+ self . container . enable ,
37+ self . manual . enable ,
38+ ) {
39+ ( true , _, _) => todo ! ( ) ,
40+ ( _, true , _) => Container :: new ( self ) . into ( ) ,
41+ ( _, _, true ) => Manual :: new ( self ) . into ( ) ,
42+ _ => unreachable ! ( ) ,
43+ }
44+ } )
4945 }
5046
5147 pub fn get_host ( & ' static self ) -> IpAddr {
@@ -57,8 +53,8 @@ impl Config {
5753 }
5854
5955 fn get_installed_apps ( & ' static self ) -> Result < Vec < App > > {
60- Ok ( self
61- . as_remote_command ( Command :: new ( "C: \\ ExtractPrograms.ps1" ) )
56+ let apps = Command :: new ( "C: \\ ExtractPrograms.ps1" )
57+ . into_remote ( self . get_backend ( ) )
6258 . wait_with_output ( ) ?
6359 . lines ( )
6460 . filter_map ( |line| {
@@ -75,6 +71,8 @@ impl Config {
7571 _ => None ,
7672 }
7773 } )
78- . collect :: < Vec < App > > ( ) )
74+ . collect :: < Vec < App > > ( ) ;
75+
76+ Ok ( apps)
7977 }
8078}
0 commit comments