1- use anyhow:: anyhow as err;
21use anyhow:: Result ;
32use serde:: { Deserialize , Serialize } ;
43use simctl:: list:: DeviceState ;
54use simctl:: Device ;
65use std:: hash:: Hash ;
76use std:: ops:: { Deref , DerefMut } ;
87use std:: path:: PathBuf ;
8+ use tap:: Pipe ;
99
1010use crate :: nvim:: Logger ;
1111use crate :: nvim:: NvimWindow ;
@@ -60,12 +60,14 @@ impl SimDevice {
6060 win : & Option < NvimWindow > ,
6161 ) -> Result < ( ) > {
6262 if let DeviceState :: Shutdown = & self . state {
63- self . boot ( ) . map_err ( |e| err ! ( "{:#?}" , e) ) ?;
64- self . state = DeviceState :: Booted ;
63+ logger
64+ . log ( format ! ( "[Booting] ({})" , self . name) , win)
65+ . await ?;
6566
66- let msg = format ! ( "[Booting] \" {}\" " , self . name) ;
67- tracing:: info!( "{msg}" ) ;
68- logger. log ( msg, win) . await ?;
67+ self . boot ( )
68+ . pipe ( |res| self . handle_error ( res, logger, win) )
69+ . await ?;
70+ self . state = DeviceState :: Booted ;
6971 }
7072
7173 Ok ( ( ) )
@@ -78,11 +80,12 @@ impl SimDevice {
7880 logger : & mut Logger < ' a > ,
7981 win : & Option < NvimWindow > ,
8082 ) -> Result < ( ) > {
81- self . install ( path_to_app) . map_err ( |e| err ! ( "{:#?}" , e) ) ?;
82- let msg = format ! ( "[Installed] \" {}\" {app_id}" , self . name) ;
83- tracing:: info!( "{msg}" ) ;
84- logger. log ( msg, win) . await ?;
85- Ok ( ( ) )
83+ self . install ( path_to_app)
84+ . pipe ( |res| self . handle_error ( res, logger, win) )
85+ . await ?;
86+ logger
87+ . log ( format ! ( "[Installing] ({}) {app_id}" , self . name) , win)
88+ . await
8689 }
8790
8891 pub async fn try_launch < ' a > (
@@ -92,21 +95,49 @@ impl SimDevice {
9295 win : & Option < NvimWindow > ,
9396 ) -> Result < ( ) > {
9497 if !self . is_running {
95- tracing:: info!( "[Launching] \" {}\" {app_id}" , self . name) ;
98+ logger
99+ . log ( format ! ( "[Launching] ({}) {app_id}" , self . name) , win)
100+ . await ?;
101+
96102 self . launch ( app_id)
97103 . stdout ( & "/tmp/wordle_log" )
98104 . stderr ( & "/tmp/wordle_log" )
99105 . exec ( )
100- . map_err ( |e| err ! ( "{:#?}" , e) ) ?;
106+ . pipe ( |res| self . handle_error ( res, logger, win) )
107+ . await ?;
101108
102109 self . is_running = true ;
103110
104- tracing:: info!( "[Launched]" ) ;
105111 logger
106112 . log ( string_as_section ( "[Launched]" . into ( ) ) , win)
107113 . await ?;
108114 }
109115
110116 Ok ( ( ) )
111117 }
118+
119+ async fn handle_error < ' a , T > (
120+ & mut self ,
121+ res : simctl:: Result < T > ,
122+ logger : & mut Logger < ' a > ,
123+ win : & Option < NvimWindow > ,
124+ ) -> Result < ( ) > {
125+ if let Err ( e) = to_anyhow_error ( res) {
126+ logger. log ( e. to_string ( ) , win) . await ?;
127+ logger. set_status_end ( false , true ) . await ?;
128+ self . is_running = false ;
129+ }
130+ Ok ( ( ) )
131+ }
132+ }
133+
134+ fn to_anyhow_error < T > ( v : simctl:: Result < T > ) -> Result < T > {
135+ v. map_err ( |e| match e {
136+ simctl:: Error :: Output { stderr, .. } => {
137+ anyhow:: anyhow!( "External Command Failure: {stderr}" )
138+ }
139+ simctl:: Error :: Io ( err) => anyhow:: Error :: new ( err) ,
140+ simctl:: Error :: Json ( err) => anyhow:: Error :: new ( err) ,
141+ simctl:: Error :: Utf8 ( err) => anyhow:: Error :: new ( err) ,
142+ } )
112143}
0 commit comments