@@ -9,7 +9,6 @@ use crate::api::post::get_comment_list::PostCommentEntry;
9
9
use crate :: api:: post:: get_one:: PostEntry ;
10
10
use crate :: api:: user:: info:: UserInfo ;
11
11
use crate :: args:: TimeStyle ;
12
- use crate :: infra:: iter:: IteratorExt ;
13
12
use crate :: infra:: result:: IntoResult ;
14
13
use crate :: infra:: str:: StrExt ;
15
14
use crate :: infra:: terminal:: get_term_width;
@@ -78,103 +77,94 @@ pub fn user_info(info: &Result<UserInfo>) -> Result<String> {
78
77
// TODO: rm unnecessary line divider
79
78
pub fn list_ing (
80
79
time_style : & TimeStyle ,
81
- ing_with_comment_list : & Result < Vec < ( IngEntry , Vec < IngCommentEntry > ) > > ,
82
- rev : bool ,
80
+ ing_with_comment_iter : Result < impl ExactSizeIterator < Item = ( IngEntry , Vec < IngCommentEntry > ) > > ,
83
81
align : bool ,
84
82
) -> Result < String > {
85
- let ing_with_comment_list = match ing_with_comment_list {
83
+ let mut ing_with_comment_iter = match ing_with_comment_iter {
86
84
Ok ( o) => o,
87
- Err ( e) => return fmt_err ( e) . into_ok ( ) ,
85
+ Err ( e) => return fmt_err ( & e) . into_ok ( ) ,
88
86
} ;
89
87
90
- ing_with_comment_list. iter ( ) . dyn_rev ( rev) . try_fold (
91
- String :: new ( ) ,
92
- |mut buf, ( ing, comment_list) | try {
93
- {
94
- let buf = & mut buf;
95
- let create_time = display_cnb_time ( & ing. create_time , time_style) ;
96
- write ! ( buf, "{}" , create_time. dimmed( ) ) ?;
88
+ ing_with_comment_iter. try_fold ( String :: new ( ) , |mut buf, ( ing, comment_list) | try {
89
+ {
90
+ let buf = & mut buf;
91
+ let create_time = display_cnb_time ( & ing. create_time , time_style) ;
92
+ write ! ( buf, "{}" , create_time. dimmed( ) ) ?;
97
93
98
- let send_from_mark = match ing. send_from {
99
- IngSendFrom :: Cli => Some ( "CLI" ) ,
100
- IngSendFrom :: CellPhone => Some ( "Mobile" ) ,
101
- IngSendFrom :: VsCode => Some ( "VSCode" ) ,
102
- IngSendFrom :: Web => Some ( "Web" ) ,
103
- _ => None ,
104
- } ;
105
- if let Some ( mark) = send_from_mark {
106
- write ! ( buf, " {}" , mark. dimmed( ) ) ?;
107
- }
108
- if ing. is_lucky {
109
- let star_text = ing_star_tag_to_text ( & ing. icons ) ;
110
- write ! ( buf, " {}⭐" , star_text. yellow( ) ) ?;
111
- }
112
- writeln ! ( buf, " {} {}" , "#" . dimmed( ) , ing. id. to_string( ) . dimmed( ) ) ?;
113
- let content = if align {
114
- let user_name_width = ing. user_name . width_cjk ( ) ;
115
- let left_width = get_term_width ( ) . saturating_sub ( user_name_width + 3 ) ;
116
- fmt_content ( & ing. content )
117
- . width_split ( left_width)
118
- . map_or_else (
119
- || ing. content . clone ( ) ,
120
- |lines| {
121
- if comment_list. is_empty ( ) . not ( ) {
122
- lines. join ( "\n " ) . replace (
123
- '\n' ,
124
- & format ! ( "\n │{}" , " " . repeat( user_name_width - 2 ) ) ,
125
- )
126
- } else {
127
- lines. join ( "\n " ) . replace (
128
- '\n' ,
129
- & format ! ( "\n {}" , " " . repeat( user_name_width + 3 ) ) ,
130
- )
131
- }
132
- } ,
133
- )
134
- } else {
135
- fmt_content ( & ing. content )
136
- } ;
137
- writeln ! ( buf, " {} {}" , ing. user_name. cyan( ) , content) ?;
94
+ let send_from_mark = match ing. send_from {
95
+ IngSendFrom :: Cli => Some ( "CLI" ) ,
96
+ IngSendFrom :: CellPhone => Some ( "Mobile" ) ,
97
+ IngSendFrom :: VsCode => Some ( "VSCode" ) ,
98
+ IngSendFrom :: Web => Some ( "Web" ) ,
99
+ _ => None ,
100
+ } ;
101
+ if let Some ( mark) = send_from_mark {
102
+ write ! ( buf, " {}" , mark. dimmed( ) ) ?;
103
+ }
104
+ if ing. is_lucky {
105
+ let star_text = ing_star_tag_to_text ( & ing. icons ) ;
106
+ write ! ( buf, " {}⭐" , star_text. yellow( ) ) ?;
107
+ }
108
+ writeln ! ( buf, " {} {}" , "#" . dimmed( ) , ing. id. to_string( ) . dimmed( ) ) ?;
109
+ let content = if align {
110
+ let user_name_width = ing. user_name . width_cjk ( ) ;
111
+ let left_width = get_term_width ( ) . saturating_sub ( user_name_width + 3 ) ;
112
+ fmt_content ( & ing. content )
113
+ . width_split ( left_width)
114
+ . map_or_else (
115
+ || ing. content . clone ( ) ,
116
+ |lines| {
117
+ if comment_list. is_empty ( ) . not ( ) {
118
+ lines. join ( "\n " ) . replace (
119
+ '\n' ,
120
+ & format ! ( "\n │{}" , " " . repeat( user_name_width - 2 ) ) ,
121
+ )
122
+ } else {
123
+ lines. join ( "\n " ) . replace (
124
+ '\n' ,
125
+ & format ! ( "\n {}" , " " . repeat( user_name_width + 3 ) ) ,
126
+ )
127
+ }
128
+ } ,
129
+ )
130
+ } else {
131
+ fmt_content ( & ing. content )
132
+ } ;
133
+ writeln ! ( buf, " {} {}" , ing. user_name. cyan( ) , content) ?;
138
134
139
- let len = comment_list. len ( ) ;
140
- if len != 0 {
141
- let max_i = len - 1 ;
142
- let comment_list_buf: Result < String > = comment_list
143
- . iter ( )
144
- . enumerate ( )
145
- . try_fold ( String :: new ( ) , |mut buf, ( i, entry) | try {
146
- {
147
- let buf = & mut buf;
148
- if i != max_i {
149
- write ! ( buf, " │ {}" , entry. user_name. blue( ) ) ?;
150
- } else {
151
- write ! ( buf, " └ {}" , entry. user_name. blue( ) ) ?;
152
- }
153
- let at_user = get_ing_at_user_tag_text ( & entry. content ) ;
154
- if at_user. is_empty ( ) . not ( ) {
155
- write ! (
156
- buf,
157
- " {}{}" ,
158
- "@" . bright_black( ) ,
159
- at_user. bright_black( )
160
- ) ?;
161
- }
162
- let content = {
163
- let content = rm_ing_at_user_tag ( & entry. content ) ;
164
- fmt_content ( & content)
165
- } ;
166
- writeln ! ( buf, " {}" , content. dimmed( ) ) ?;
135
+ let len = comment_list. len ( ) ;
136
+ if len != 0 {
137
+ let max_i = len - 1 ;
138
+ let comment_list_buf: Result < String > = comment_list. iter ( ) . enumerate ( ) . try_fold (
139
+ String :: new ( ) ,
140
+ |mut buf, ( i, entry) | try {
141
+ {
142
+ let buf = & mut buf;
143
+ if i != max_i {
144
+ write ! ( buf, " │ {}" , entry. user_name. blue( ) ) ?;
145
+ } else {
146
+ write ! ( buf, " └ {}" , entry. user_name. blue( ) ) ?;
167
147
}
168
- buf
169
- } ) ;
170
- write ! ( buf, "{}" , comment_list_buf?) ?;
171
- }
148
+ let at_user = get_ing_at_user_tag_text ( & entry. content ) ;
149
+ if at_user. is_empty ( ) . not ( ) {
150
+ write ! ( buf, " {}{}" , "@" . bright_black( ) , at_user. bright_black( ) ) ?;
151
+ }
152
+ let content = {
153
+ let content = rm_ing_at_user_tag ( & entry. content ) ;
154
+ fmt_content ( & content)
155
+ } ;
156
+ writeln ! ( buf, " {}" , content. dimmed( ) ) ?;
157
+ }
158
+ buf
159
+ } ,
160
+ ) ;
161
+ write ! ( buf, "{}" , comment_list_buf?) ?;
162
+ }
172
163
173
- writeln ! ( buf) ?;
174
- } ;
175
- buf
176
- } ,
177
- )
164
+ writeln ! ( buf) ?;
165
+ } ;
166
+ buf
167
+ } )
178
168
}
179
169
180
170
pub fn show_post ( entry : & Result < PostEntry > ) -> Result < String > {
@@ -240,37 +230,35 @@ pub fn show_post_meta(time_style: &TimeStyle, entry: &Result<PostEntry>) -> Resu
240
230
241
231
pub fn show_post_comment (
242
232
time_style : & TimeStyle ,
243
- comment_list : & Result < Vec < PostCommentEntry > > ,
244
- rev : bool ,
233
+ comment_iter : Result < impl ExactSizeIterator < Item = PostCommentEntry > > ,
245
234
) -> Result < String > {
246
- let comment_list = match comment_list {
235
+ let mut comment_iter = match comment_iter {
247
236
Ok ( entry) => entry,
248
- Err ( e) => return fmt_err ( e) . into_ok ( ) ,
237
+ Err ( e) => return fmt_err ( & e) . into_ok ( ) ,
249
238
} ;
250
239
251
- comment_list
252
- . iter ( )
253
- . dyn_rev ( rev)
254
- . try_fold ( String :: new ( ) , |mut buf, comment| try {
255
- {
256
- let buf = & mut buf;
257
- let create_time = display_cnb_time ( & comment. create_time , time_style) ;
258
- let floor_text = format ! ( "{}F" , comment. floor) ;
259
- writeln ! ( buf, "{} {}" , create_time. dimmed( ) , floor_text. dimmed( ) ) ?;
260
- writeln ! ( buf, " {} {}" , comment. user_name. cyan( ) , comment. content) ?;
261
- }
262
- buf
263
- } )
240
+ comment_iter. try_fold ( String :: new ( ) , |mut buf, comment| try {
241
+ {
242
+ let buf = & mut buf;
243
+ let create_time = display_cnb_time ( & comment. create_time , time_style) ;
244
+ let floor_text = format ! ( "{}F" , comment. floor) ;
245
+ writeln ! ( buf, "{} {}" , create_time. dimmed( ) , floor_text. dimmed( ) ) ?;
246
+ writeln ! ( buf, " {} {}" , comment. user_name. cyan( ) , comment. content) ?;
247
+ }
248
+ buf
249
+ } )
264
250
}
265
251
266
- pub fn list_post ( result : & Result < ( Vec < PostEntry > , usize ) > , rev : bool ) -> Result < String > {
267
- let ( entry_list, total_count) = match result {
252
+ pub fn list_post (
253
+ result : Result < ( impl ExactSizeIterator < Item = PostEntry > , usize ) > ,
254
+ ) -> Result < String > {
255
+ let ( mut entry_iter, total_count) = match result {
268
256
Ok ( o) => o,
269
- Err ( e) => return fmt_err ( e) . into_ok ( ) ,
257
+ Err ( e) => return fmt_err ( & e) . into_ok ( ) ,
270
258
} ;
271
259
272
- entry_list . iter ( ) . dyn_rev ( rev ) . try_fold (
273
- format ! ( "{}/{}\n " , entry_list . len( ) , total_count) ,
260
+ entry_iter . try_fold (
261
+ format ! ( "{}/{}\n " , entry_iter . len( ) , total_count) ,
274
262
|mut buf, entry| try {
275
263
{
276
264
let buf = & mut buf;
@@ -291,14 +279,16 @@ pub fn list_post(result: &Result<(Vec<PostEntry>, usize)>, rev: bool) -> Result<
291
279
)
292
280
}
293
281
294
- pub fn search_post ( result : & Result < ( Vec < usize > , usize ) > , rev : bool ) -> Result < String > {
295
- let ( id_list, total_count) = match result {
282
+ pub fn search_post (
283
+ result : Result < ( impl ExactSizeIterator < Item = usize > , usize ) > ,
284
+ ) -> Result < String > {
285
+ let ( mut id_iter, total_count) = match result {
296
286
Ok ( o) => o,
297
- Err ( e) => return fmt_err ( e) . into_ok ( ) ,
287
+ Err ( e) => return fmt_err ( & e) . into_ok ( ) ,
298
288
} ;
299
289
300
- id_list . iter ( ) . dyn_rev ( rev ) . try_fold (
301
- format ! ( "{}/{}\n " , id_list . len( ) , total_count) ,
290
+ id_iter . try_fold (
291
+ format ! ( "{}/{}\n " , id_iter . len( ) , total_count) ,
302
292
|mut buf, id| try {
303
293
writeln ! ( & mut buf, "# {}" , id) ?;
304
294
buf
@@ -308,17 +298,14 @@ pub fn search_post(result: &Result<(Vec<usize>, usize)>, rev: bool) -> Result<St
308
298
309
299
pub fn list_news (
310
300
time_style : & TimeStyle ,
311
- news_list : & Result < Vec < NewsEntry > > ,
312
- rev : bool ,
301
+ news_iter : Result < impl ExactSizeIterator < Item = NewsEntry > > ,
313
302
) -> Result < String > {
314
- let news_list = match news_list {
303
+ let news_iter = match news_iter {
315
304
Ok ( o) => o,
316
- Err ( e) => return fmt_err ( e) . into_ok ( ) ,
305
+ Err ( e) => return fmt_err ( & e) . into_ok ( ) ,
317
306
} ;
318
307
319
- news_list
320
- . iter ( )
321
- . dyn_rev ( rev)
308
+ news_iter
322
309
. map ( |news| try {
323
310
let mut buf = String :: new ( ) ;
324
311
{
@@ -350,20 +337,16 @@ pub fn list_news(
350
337
} )
351
338
}
352
339
353
- // TODO: lift out rev option
354
340
pub fn list_fav (
355
341
time_style : & TimeStyle ,
356
- fav_list : & Result < Vec < FavEntry > > ,
357
- rev : bool ,
342
+ fav_iter : Result < impl ExactSizeIterator < Item = FavEntry > > ,
358
343
) -> Result < String > {
359
- let fav_list = match fav_list {
344
+ let fav_iter = match fav_iter {
360
345
Ok ( o) => o,
361
- Err ( e) => return fmt_err ( e) . into_ok ( ) ,
346
+ Err ( e) => return fmt_err ( & e) . into_ok ( ) ,
362
347
} ;
363
348
364
- fav_list
365
- . iter ( )
366
- . dyn_rev ( rev)
349
+ fav_iter
367
350
. map ( |fav| try {
368
351
let mut buf = String :: new ( ) ;
369
352
{
0 commit comments