1
- use std:: { error:: Error , time:: Duration } ;
2
- use std:: cell:: RefCell ;
3
- use std:: rc:: Rc ;
1
+ use crate :: {
2
+ parser:: { Compiler , FieldMap , Value } ,
3
+ ui:: widgets:: { KeyValueView , LineEdit , TableView , WidgetExt } ,
4
+ LogCollection , LogParser ,
5
+ } ;
4
6
use chrono:: NaiveDateTime ;
5
7
use crossterm:: {
6
8
event,
7
- event:: { Event , KeyCode } ,
9
+ event:: { Event , KeyCode , KeyModifiers } ,
8
10
} ;
9
- use crossterm :: event :: KeyModifiers ;
11
+ use std :: { cell :: RefCell , error :: Error , rc :: Rc , time :: Duration } ;
10
12
use tui:: {
11
13
backend:: Backend ,
12
- Frame ,
13
- layout:: { Constraint , Direction , Layout } , Terminal ,
14
+ layout:: { Constraint , Direction , Layout } ,
15
+ style:: { Color , Style } ,
16
+ text:: { Span , Spans , Text } ,
17
+ widgets:: Paragraph ,
18
+ Frame , Terminal ,
14
19
} ;
15
- use tui:: style:: { Color , Style } ;
16
- use tui:: text:: { Span , Spans , Text } ;
17
- use tui:: widgets:: Paragraph ;
18
- use crate :: { LogCollection , LogParser , ui:: widgets:: { WidgetExt , TableView , LineEdit } } ;
19
- use crate :: parser:: { Compiler , FieldMap , Value } ;
20
- use crate :: ui:: widgets:: KeyValueView ;
21
20
22
21
#[ derive( Default ) ]
23
22
enum ActiveWidget {
@@ -51,11 +50,9 @@ impl App {
51
50
Constraint :: Percentage ( 20 ) ,
52
51
] ;
53
52
54
- let log_data = Rc :: new ( RefCell :: new (
55
- LogCollection :: new (
56
- LogParser :: parse ( dir, date)
57
- )
58
- ) ) ;
53
+ let log_data = Rc :: new ( RefCell :: new ( LogCollection :: new ( LogParser :: parse (
54
+ dir, date,
55
+ ) ) ) ) ;
59
56
60
57
let mut table_view = TableView :: new ( widths) ;
61
58
table_view. set_model ( log_data. clone ( ) ) ;
@@ -73,61 +70,64 @@ impl App {
73
70
74
71
let log_data = Rc :: downgrade ( & app. log_data ) ;
75
72
let table = Rc :: downgrade ( & app. table ) ;
76
- app. search . borrow_mut ( ) . on_changed ( move |sender| match log_data. upgrade ( ) {
77
- Some ( model) => {
78
- match model. borrow_mut ( ) . set_filter ( sender. text ( ) . to_string ( ) ) {
79
- Err ( e) => {
73
+ app. search
74
+ . borrow_mut ( )
75
+ . on_changed ( move |sender| match log_data. upgrade ( ) {
76
+ Some ( model) => match model. borrow_mut ( ) . set_filter ( sender. text ( ) . to_string ( ) ) {
77
+ Err ( e) => {
80
78
sender. set_border_text ( e. to_string ( ) ) ;
81
79
sender. set_style ( Style :: default ( ) . fg ( Color :: Red ) ) ;
82
- } ,
80
+ }
83
81
_ => {
84
82
sender. set_border_text ( String :: new ( ) ) ;
85
83
sender. set_style ( Style :: default ( ) ) ;
86
84
if let Some ( table) = table. upgrade ( ) {
87
85
table. borrow_mut ( ) . reset_state ( ) ;
88
86
}
89
- } ,
90
- }
91
- } ,
92
- None => { }
93
- } ) ;
87
+ }
88
+ } ,
89
+ None => { }
90
+ } ) ;
94
91
95
92
let text = Rc :: downgrade ( & app. text ) ;
96
93
let log_data = Rc :: downgrade ( & app. log_data ) ;
97
- app. table . borrow_mut ( ) . on_selection_changed ( move |_sender, index| {
98
- if let ( Some ( log_data) , Some ( text) ) = ( log_data. upgrade ( ) , text. upgrade ( ) ) {
99
- if let Some ( index) = index {
100
- if let Some ( line) = log_data. borrow ( ) . line ( index) {
101
- text. borrow_mut ( ) . set_data ( line. fields ) ;
102
- return
94
+ app. table
95
+ . borrow_mut ( )
96
+ . on_selection_changed ( move |_sender, index| {
97
+ if let ( Some ( log_data) , Some ( text) ) = ( log_data. upgrade ( ) , text. upgrade ( ) ) {
98
+ if let Some ( index) = index {
99
+ if let Some ( line) = log_data. borrow ( ) . line ( index) {
100
+ text. borrow_mut ( ) . set_data ( line. fields ( ) . into ( ) ) ;
101
+ return ;
102
+ }
103
103
}
104
- }
105
104
106
- // Panic if we can't borrow. Because dont need reset state when filter from info widget.
107
- if let Ok ( mut borrowed) = text. try_borrow_mut ( ) {
108
- borrowed. set_data ( FieldMap :: new ( ) ) ;
105
+ // Panic if we can't borrow. Because dont need reset state when filter from info widget.
106
+ if let Ok ( mut borrowed) = text. try_borrow_mut ( ) {
107
+ borrowed. set_data ( FieldMap :: new ( ) ) ;
108
+ }
109
109
}
110
- }
111
- } ) ;
110
+ } ) ;
112
111
113
112
let search = Rc :: downgrade ( & app. search ) ;
114
113
app. text . borrow_mut ( ) . on_add_to_filter ( move |( key, value) | {
115
114
if let Some ( search) = search. upgrade ( ) {
116
115
let value = match value {
117
116
Value :: String ( s) => format ! ( "\" {}\" " , s) ,
118
117
Value :: Number ( n) => n. to_string ( ) ,
118
+ Value :: DateTime ( n) => format ! ( "'{}'" , n. format( "%Y-%m-%d %H:%M:%S%.9f" ) ) ,
119
119
_ => unreachable ! ( ) ,
120
120
} ;
121
121
122
-
123
122
let mut search_borrowed = search. borrow_mut ( ) ;
124
123
search_borrowed. show ( ) ;
125
124
let text = search_borrowed. text ( ) . to_string ( ) ;
126
125
if text. trim ( ) . is_empty ( ) {
127
126
search_borrowed. set_text ( format ! ( r#"WHERE {} = {}"# , key, value) ) ;
128
- }
129
- else if Compiler :: new ( ) . compile ( text. trim ( ) ) . is_ok ( ) {
130
- search_borrowed. set_text ( format ! ( r#"{} AND {} = {}"# , text, key, value) ) ;
127
+ } else if let Ok ( query) = Compiler :: new ( ) . compile ( text. trim ( ) ) {
128
+ if !query. is_regex ( ) {
129
+ search_borrowed. set_text ( format ! ( r#"{} AND {} = {}"# , text, key, value) ) ;
130
+ }
131
131
}
132
132
}
133
133
} ) ;
@@ -137,49 +137,52 @@ impl App {
137
137
138
138
pub fn run < B : Backend > ( & mut self , terminal : & mut Terminal < B > ) -> Result < ( ) , Box < dyn Error > > {
139
139
loop {
140
-
141
140
terminal. draw ( |f| ui ( f, self ) ) ?;
142
141
143
142
if event:: poll ( Duration :: from_millis ( 100 ) ) ? {
144
143
let event = event:: read ( ) ?;
145
144
match event {
146
145
Event :: Key ( key) => match key. code {
147
- KeyCode :: Char ( 'q' ) if key. modifiers == KeyModifiers :: CONTROL => return Ok ( ( ) ) ,
146
+ KeyCode :: Char ( 'q' ) if key. modifiers == KeyModifiers :: CONTROL => {
147
+ return Ok ( ( ) )
148
+ }
148
149
KeyCode :: Char ( 'f' ) if key. modifiers == KeyModifiers :: CONTROL => {
149
150
match self . state {
150
151
ActiveWidget :: LogTable | ActiveWidget :: InfoView => {
151
152
self . search . borrow_mut ( ) . set_visible ( true ) ;
152
153
self . set_active_widget ( ActiveWidget :: SearchBox ) ;
153
- } ,
154
+ }
154
155
ActiveWidget :: SearchBox => {
155
156
self . search . borrow_mut ( ) . set_visible ( false ) ;
156
157
self . set_active_widget ( ActiveWidget :: LogTable ) ;
157
- } ,
158
+ }
158
159
}
159
- } ,
160
- KeyCode :: Tab => { // Next active widget
160
+ }
161
+ KeyCode :: Tab => {
162
+ // Next active widget
161
163
match self . state {
162
164
ActiveWidget :: LogTable => {
163
165
self . set_active_widget ( ActiveWidget :: InfoView ) ;
164
- } ,
166
+ }
165
167
ActiveWidget :: SearchBox => {
166
168
self . set_active_widget ( ActiveWidget :: LogTable ) ;
167
- } ,
169
+ }
168
170
ActiveWidget :: InfoView => {
169
171
if self . search . borrow ( ) . visible ( ) {
170
172
self . set_active_widget ( ActiveWidget :: SearchBox ) ;
171
- }
172
- else {
173
+ } else {
173
174
self . set_active_widget ( ActiveWidget :: LogTable ) ;
174
175
}
175
176
}
176
177
}
177
178
}
178
179
_ => match self . state {
179
180
ActiveWidget :: LogTable => self . table . borrow_mut ( ) . key_press_event ( key) ,
180
- ActiveWidget :: SearchBox => self . search . borrow_mut ( ) . key_press_event ( key) ,
181
+ ActiveWidget :: SearchBox => {
182
+ self . search . borrow_mut ( ) . key_press_event ( key)
183
+ }
181
184
ActiveWidget :: InfoView => self . text . borrow_mut ( ) . key_press_event ( key) ,
182
- }
185
+ } ,
183
186
} ,
184
187
_ => { }
185
188
}
@@ -193,12 +196,12 @@ impl App {
193
196
self . table . borrow_mut ( ) . set_focus ( true ) ;
194
197
self . search . borrow_mut ( ) . set_focus ( false ) ;
195
198
self . text . borrow_mut ( ) . set_focus ( false )
196
- } ,
199
+ }
197
200
ActiveWidget :: SearchBox => {
198
201
self . table . borrow_mut ( ) . set_focus ( false ) ;
199
202
self . search . borrow_mut ( ) . set_focus ( true ) ;
200
203
self . text . borrow_mut ( ) . set_focus ( false )
201
- } ,
204
+ }
202
205
ActiveWidget :: InfoView => {
203
206
self . table . borrow_mut ( ) . set_focus ( false ) ;
204
207
self . search . borrow_mut ( ) . set_focus ( false ) ;
@@ -211,37 +214,40 @@ impl App {
211
214
}
212
215
213
216
fn ui < B : Backend > ( f : & mut Frame < B > , app : & mut App ) {
214
-
215
217
let rects = Layout :: default ( )
216
218
. direction ( Direction :: Vertical )
217
- . constraints (
218
- vec ! [
219
- Constraint :: Min ( 1 ) ,
220
- Constraint :: Length ( 1 ) ,
221
- ]
222
- )
219
+ . constraints ( vec ! [ Constraint :: Min ( 1 ) , Constraint :: Length ( 1 ) ] )
223
220
. split ( f. size ( ) ) ;
224
221
225
222
let keys_rect = rects[ 1 ] ;
226
223
let rects = Layout :: default ( )
227
224
. direction ( Direction :: Vertical )
228
- . constraints (
229
- vec ! [
230
- Constraint :: Length ( if app. search. borrow( ) . visible( ) { 3 } else { 0 } ) ,
231
- Constraint :: Percentage ( 60 ) ,
232
- Constraint :: Percentage ( 40 ) ,
233
- ] ,
234
- )
225
+ . constraints ( vec ! [
226
+ Constraint :: Length ( if app. search. borrow( ) . visible( ) { 3 } else { 0 } ) ,
227
+ Constraint :: Percentage ( 60 ) ,
228
+ Constraint :: Percentage ( 40 ) ,
229
+ ] )
235
230
. split ( rects[ 0 ] ) ;
236
231
237
- if rects[ 0 ] . width != app. search . borrow ( ) . width ( ) || rects[ 0 ] . height != app. search . borrow ( ) . height ( ) {
238
- app. search . borrow_mut ( ) . resize ( rects[ 0 ] . width , rects[ 0 ] . height ) ;
232
+ if rects[ 0 ] . width != app. search . borrow ( ) . width ( )
233
+ || rects[ 0 ] . height != app. search . borrow ( ) . height ( )
234
+ {
235
+ app. search
236
+ . borrow_mut ( )
237
+ . resize ( rects[ 0 ] . width , rects[ 0 ] . height ) ;
239
238
}
240
- if rects[ 1 ] . width != app. table . borrow ( ) . width ( ) || rects[ 1 ] . height != app. table . borrow ( ) . height ( ) {
241
- app. table . borrow_mut ( ) . resize ( rects[ 1 ] . width , rects[ 1 ] . height ) ;
239
+ if rects[ 1 ] . width != app. table . borrow ( ) . width ( )
240
+ || rects[ 1 ] . height != app. table . borrow ( ) . height ( )
241
+ {
242
+ app. table
243
+ . borrow_mut ( )
244
+ . resize ( rects[ 1 ] . width , rects[ 1 ] . height ) ;
242
245
}
243
- if rects[ 2 ] . width != app. text . borrow ( ) . width ( ) || rects[ 2 ] . height != app. text . borrow ( ) . height ( ) {
244
- app. text . borrow_mut ( ) . resize ( rects[ 2 ] . width , rects[ 2 ] . height ) ;
246
+ if rects[ 2 ] . width != app. text . borrow ( ) . width ( ) || rects[ 2 ] . height != app. text . borrow ( ) . height ( )
247
+ {
248
+ app. text
249
+ . borrow_mut ( )
250
+ . resize ( rects[ 2 ] . width , rects[ 2 ] . height ) ;
245
251
}
246
252
247
253
app. prev_size = ( f. size ( ) . width , f. size ( ) . height ) ;
@@ -256,15 +262,11 @@ fn ui<B: Backend>(f: &mut Frame<B>, app: &mut App) {
256
262
Span :: styled( "Ctrl+Q" , Style :: default ( ) . fg( Color :: White ) ) ,
257
263
Span :: raw( " " ) ,
258
264
Span :: styled( "Quit" , Style :: default ( ) . fg( Color :: LightCyan ) ) ,
259
-
260
265
Span :: raw( " | " ) ,
261
-
262
266
Span :: styled( "Ctrl+F" , Style :: default ( ) . fg( Color :: White ) ) ,
263
267
Span :: raw( " " ) ,
264
268
Span :: styled( "Search" , Style :: default ( ) . fg( Color :: LightCyan ) ) ,
265
-
266
269
Span :: raw( " | " ) ,
267
-
268
270
Span :: styled( "Tab" , Style :: default ( ) . fg( Color :: White ) ) ,
269
271
Span :: raw( " " ) ,
270
272
Span :: styled( "Next widget" , Style :: default ( ) . fg( Color :: LightCyan ) ) ,
@@ -277,38 +279,32 @@ fn ui<B: Backend>(f: &mut Frame<B>, app: &mut App) {
277
279
Span :: styled ( "PageUp" , Style :: default ( ) . fg ( Color :: White ) ) ,
278
280
Span :: raw ( " " ) ,
279
281
Span :: styled ( "Go to begin" , Style :: default ( ) . fg ( Color :: LightCyan ) ) ,
280
-
281
282
Span :: raw ( " | " ) ,
282
283
Span :: styled ( "PageDown" , Style :: default ( ) . fg ( Color :: White ) ) ,
283
284
Span :: raw ( " " ) ,
284
285
Span :: styled ( "Go to end" , Style :: default ( ) . fg ( Color :: LightCyan ) ) ,
285
286
] ) ;
286
- } ,
287
- ActiveWidget :: SearchBox => {
288
- common_keys. extend_from_slice ( & [
289
- Span :: raw ( " | " ) ,
290
- Span :: styled ( "Ctrl-Bckspc" , Style :: default ( ) . fg ( Color :: White ) ) ,
291
- Span :: raw ( " " ) ,
292
- Span :: styled ( "Clear" , Style :: default ( ) . fg ( Color :: LightCyan ) ) ,
293
- ] )
294
- } ,
287
+ }
288
+ ActiveWidget :: SearchBox => common_keys. extend_from_slice ( & [
289
+ Span :: raw ( " | " ) ,
290
+ Span :: styled ( "Ctrl-Bckspc" , Style :: default ( ) . fg ( Color :: White ) ) ,
291
+ Span :: raw ( " " ) ,
292
+ Span :: styled ( "Clear" , Style :: default ( ) . fg ( Color :: LightCyan ) ) ,
293
+ ] ) ,
295
294
ActiveWidget :: InfoView => {
296
295
common_keys. extend_from_slice ( & [
297
296
Span :: raw ( " | " ) ,
298
297
Span :: styled ( "C" , Style :: default ( ) . fg ( Color :: White ) ) ,
299
298
Span :: raw ( " " ) ,
300
299
Span :: styled ( "Copy" , Style :: default ( ) . fg ( Color :: LightCyan ) ) ,
301
-
302
300
Span :: raw ( " | " ) ,
303
301
Span :: styled ( "F" , Style :: default ( ) . fg ( Color :: White ) ) ,
304
302
Span :: raw ( " " ) ,
305
303
Span :: styled ( "Add to filter" , Style :: default ( ) . fg ( Color :: LightCyan ) ) ,
306
-
307
304
Span :: raw ( " | " ) ,
308
305
Span :: styled ( "PageUp" , Style :: default ( ) . fg ( Color :: White ) ) ,
309
306
Span :: raw ( " " ) ,
310
307
Span :: styled ( "Go to begin" , Style :: default ( ) . fg ( Color :: LightCyan ) ) ,
311
-
312
308
Span :: raw ( " | " ) ,
313
309
Span :: styled ( "PageDown" , Style :: default ( ) . fg ( Color :: White ) ) ,
314
310
Span :: raw ( " " ) ,
@@ -317,5 +313,8 @@ fn ui<B: Backend>(f: &mut Frame<B>, app: &mut App) {
317
313
}
318
314
} ;
319
315
320
- f. render_widget ( Paragraph :: new ( Text :: from ( Spans :: from ( common_keys) ) ) , keys_rect)
316
+ f. render_widget (
317
+ Paragraph :: new ( Text :: from ( Spans :: from ( common_keys) ) ) ,
318
+ keys_rect,
319
+ )
321
320
}
0 commit comments