@@ -11,6 +11,7 @@ use crate::{
11
11
tabs:: { Revlog , Stashing , Status } ,
12
12
ui:: style:: Theme ,
13
13
} ;
14
+ use anyhow:: Result ;
14
15
use asyncgit:: { sync, AsyncNotification , CWD } ;
15
16
use crossbeam_channel:: Sender ;
16
17
use crossterm:: event:: Event ;
@@ -26,7 +27,6 @@ use tui::{
26
27
widgets:: { Block , Borders , Paragraph , Tabs , Text } ,
27
28
Frame ,
28
29
} ;
29
-
30
30
///
31
31
pub struct App {
32
32
do_quit : bool ,
@@ -73,7 +73,10 @@ impl App {
73
73
}
74
74
75
75
///
76
- pub fn draw < B : Backend > ( & mut self , f : & mut Frame < B > ) {
76
+ pub fn draw < B : Backend > (
77
+ & mut self ,
78
+ f : & mut Frame < B > ,
79
+ ) -> Result < ( ) > {
77
80
let chunks_main = Layout :: default ( )
78
81
. direction ( Direction :: Vertical )
79
82
. constraints (
@@ -90,9 +93,9 @@ impl App {
90
93
91
94
//TODO: macro because of generic draw call
92
95
match self . tab {
93
- 0 => self . status_tab . draw ( f, chunks_main[ 1 ] ) ,
94
- 1 => self . revlog . draw ( f, chunks_main[ 1 ] ) ,
95
- 2 => self . stashing_tab . draw ( f, chunks_main[ 1 ] ) ,
96
+ 0 => self . status_tab . draw ( f, chunks_main[ 1 ] ) ? ,
97
+ 1 => self . revlog . draw ( f, chunks_main[ 1 ] ) ? ,
98
+ 2 => self . stashing_tab . draw ( f, chunks_main[ 1 ] ) ? ,
96
99
_ => panic ! ( "unknown tab" ) ,
97
100
} ;
98
101
@@ -103,25 +106,27 @@ impl App {
103
106
self . theme ,
104
107
) ;
105
108
106
- self . draw_popups ( f) ;
109
+ self . draw_popups ( f) ?;
110
+
111
+ Ok ( ( ) )
107
112
}
108
113
109
114
///
110
- pub fn event ( & mut self , ev : Event ) {
115
+ pub fn event ( & mut self , ev : Event ) -> Result < ( ) > {
111
116
trace ! ( "event: {:?}" , ev) ;
112
117
113
118
if self . check_quit ( ev) {
114
- return ;
119
+ return Ok ( ( ) ) ;
115
120
}
116
121
117
122
let mut flags = NeedsUpdate :: empty ( ) ;
118
123
119
- if event_pump ( ev, self . components_mut ( ) . as_mut_slice ( ) ) {
124
+ if event_pump ( ev, self . components_mut ( ) . as_mut_slice ( ) ) ? {
120
125
flags. insert ( NeedsUpdate :: COMMANDS ) ;
121
126
} else if let Event :: Key ( k) = ev {
122
127
let new_flags = match k {
123
128
keys:: TAB_TOGGLE => {
124
- self . toggle_tabs ( ) ;
129
+ self . toggle_tabs ( ) ? ;
125
130
NeedsUpdate :: COMMANDS
126
131
}
127
132
@@ -131,42 +136,51 @@ impl App {
131
136
flags. insert ( new_flags) ;
132
137
}
133
138
134
- let new_flags = self . process_queue ( ) ;
139
+ let new_flags = self . process_queue ( ) ? ;
135
140
flags. insert ( new_flags) ;
136
141
137
142
if flags. contains ( NeedsUpdate :: ALL ) {
138
- self . update ( ) ;
143
+ self . update ( ) ? ;
139
144
}
140
145
if flags. contains ( NeedsUpdate :: DIFF ) {
141
- self . status_tab . update_diff ( ) ;
146
+ self . status_tab . update_diff ( ) ? ;
142
147
}
143
148
if flags. contains ( NeedsUpdate :: COMMANDS ) {
144
149
self . update_commands ( ) ;
145
150
}
151
+
152
+ Ok ( ( ) )
146
153
}
147
154
148
155
//TODO: do we need this?
149
156
/// forward ticking to components that require it
150
- pub fn update ( & mut self ) {
157
+ pub fn update ( & mut self ) -> Result < ( ) > {
151
158
trace ! ( "update" ) ;
152
- self . status_tab . update ( ) ;
153
- self . revlog . update ( ) ;
154
- self . stashing_tab . update ( ) ;
159
+ self . status_tab . update ( ) ?;
160
+ self . revlog . update ( ) ?;
161
+ self . stashing_tab . update ( ) ?;
162
+
163
+ Ok ( ( ) )
155
164
}
156
165
157
166
///
158
- pub fn update_git ( & mut self , ev : AsyncNotification ) {
167
+ pub fn update_git (
168
+ & mut self ,
169
+ ev : AsyncNotification ,
170
+ ) -> Result < ( ) > {
159
171
trace ! ( "update_git: {:?}" , ev) ;
160
172
161
- self . status_tab . update_git ( ev) ;
162
- self . stashing_tab . update_git ( ev) ;
173
+ self . status_tab . update_git ( ev) ? ;
174
+ self . stashing_tab . update_git ( ev) ? ;
163
175
164
176
match ev {
165
177
AsyncNotification :: Diff => ( ) ,
166
- AsyncNotification :: Log => self . revlog . update ( ) ,
178
+ AsyncNotification :: Log => self . revlog . update ( ) ? ,
167
179
//TODO: is that needed?
168
180
AsyncNotification :: Status => self . update_commands ( ) ,
169
181
}
182
+
183
+ Ok ( ( ) )
170
184
}
171
185
172
186
///
@@ -216,21 +230,23 @@ impl App {
216
230
]
217
231
}
218
232
219
- fn toggle_tabs ( & mut self ) {
233
+ fn toggle_tabs ( & mut self ) -> Result < ( ) > {
220
234
let mut new_tab = self . tab + 1 ;
221
235
{
222
236
let tabs = self . get_tabs ( ) ;
223
237
new_tab %= tabs. len ( ) ;
224
238
225
239
for ( i, t) in tabs. into_iter ( ) . enumerate ( ) {
226
240
if new_tab == i {
227
- t. show ( ) ;
241
+ t. show ( ) ? ;
228
242
} else {
229
243
t. hide ( ) ;
230
244
}
231
245
}
232
246
}
233
247
self . tab = new_tab;
248
+
249
+ Ok ( ( ) )
234
250
}
235
251
236
252
fn update_commands ( & mut self ) {
@@ -239,25 +255,25 @@ impl App {
239
255
self . current_commands . sort_by_key ( |e| e. order ) ;
240
256
}
241
257
242
- fn process_queue ( & mut self ) -> NeedsUpdate {
258
+ fn process_queue ( & mut self ) -> Result < NeedsUpdate > {
243
259
let mut flags = NeedsUpdate :: empty ( ) ;
244
260
loop {
245
261
let front = self . queue . borrow_mut ( ) . pop_front ( ) ;
246
262
if let Some ( e) = front {
247
- flags. insert ( self . process_internal_event ( e) ) ;
263
+ flags. insert ( self . process_internal_event ( e) ? ) ;
248
264
} else {
249
265
break ;
250
266
}
251
267
}
252
268
self . queue . borrow_mut ( ) . clear ( ) ;
253
269
254
- flags
270
+ Ok ( flags)
255
271
}
256
272
257
273
fn process_internal_event (
258
274
& mut self ,
259
275
ev : InternalEvent ,
260
- ) -> NeedsUpdate {
276
+ ) -> Result < NeedsUpdate > {
261
277
let mut flags = NeedsUpdate :: empty ( ) ;
262
278
match ev {
263
279
InternalEvent :: ResetItem ( reset_item) => {
@@ -280,17 +296,15 @@ impl App {
280
296
}
281
297
}
282
298
InternalEvent :: ConfirmResetItem ( reset_item) => {
283
- self . reset . open_for_path ( reset_item) ;
299
+ self . reset . open_for_path ( reset_item) ? ;
284
300
flags. insert ( NeedsUpdate :: COMMANDS ) ;
285
301
}
286
302
InternalEvent :: AddHunk ( hash) => {
287
303
if let Some ( ( path, is_stage) ) =
288
304
self . status_tab . selected_path ( )
289
305
{
290
306
if is_stage {
291
- if sync:: unstage_hunk ( CWD , path, hash)
292
- . unwrap ( )
293
- {
307
+ if sync:: unstage_hunk ( CWD , path, hash) ? {
294
308
flags. insert ( NeedsUpdate :: ALL ) ;
295
309
}
296
310
} else if sync:: stage_hunk ( CWD , path, hash)
@@ -301,17 +315,17 @@ impl App {
301
315
}
302
316
}
303
317
InternalEvent :: ShowErrorMsg ( msg) => {
304
- self . msg . show_msg ( msg. as_str ( ) ) ;
318
+ self . msg . show_msg ( msg. as_str ( ) ) ? ;
305
319
flags. insert ( NeedsUpdate :: ALL ) ;
306
320
}
307
321
InternalEvent :: Update ( u) => flags. insert ( u) ,
308
- InternalEvent :: OpenCommit => self . commit . show ( ) ,
322
+ InternalEvent :: OpenCommit => self . commit . show ( ) ? ,
309
323
InternalEvent :: PopupStashing ( _opts) => {
310
- self . stashmsg_popup . show ( )
324
+ self . stashmsg_popup . show ( ) ?
311
325
}
312
326
} ;
313
327
314
- flags
328
+ Ok ( flags)
315
329
}
316
330
317
331
fn commands ( & self , force_all : bool ) -> Vec < CommandInfo > {
@@ -354,14 +368,19 @@ impl App {
354
368
|| self . msg . is_visible ( )
355
369
}
356
370
357
- fn draw_popups < B : Backend > ( & mut self , f : & mut Frame < B > ) {
371
+ fn draw_popups < B : Backend > (
372
+ & mut self ,
373
+ f : & mut Frame < B > ,
374
+ ) -> Result < ( ) > {
358
375
let size = f. size ( ) ;
359
376
360
- self . commit . draw ( f, size) ;
361
- self . stashmsg_popup . draw ( f, size) ;
362
- self . reset . draw ( f, size) ;
363
- self . help . draw ( f, size) ;
364
- self . msg . draw ( f, size) ;
377
+ self . commit . draw ( f, size) ?;
378
+ self . stashmsg_popup . draw ( f, size) ?;
379
+ self . reset . draw ( f, size) ?;
380
+ self . help . draw ( f, size) ?;
381
+ self . msg . draw ( f, size) ?;
382
+
383
+ Ok ( ( ) )
365
384
}
366
385
367
386
fn draw_tabs < B : Backend > ( & self , f : & mut Frame < B > , r : Rect ) {
0 commit comments