@@ -5,12 +5,13 @@ pub mod output;
5
5
6
6
use std:: time:: Instant ;
7
7
8
+ use chrono:: { Local , TimeDelta , Utc } ;
8
9
use clap:: Parser ;
9
10
10
11
use portablemc:: { download, standard, mojang} ;
11
12
12
13
use parse:: { CliArgs , CliCmd , CliOutput , LoginArgs , LogoutArgs , SearchArgs , SearchKind , ShowArgs , StartArgs , StartResolution , StartVersion } ;
13
- use output:: { Output , LogOutput , LogLevel } ;
14
+ use output:: { Output , LogOutput , LogLevel , TimeDeltaDisplay } ;
14
15
15
16
16
17
fn main ( ) {
@@ -24,7 +25,6 @@ fn main() {
24
25
CliOutput :: Machine => Output :: tab_separated ( ) ,
25
26
} ;
26
27
27
- println ! ( "{args:?}" ) ;
28
28
cmd_cli ( & mut out, & args) ;
29
29
30
30
}
@@ -41,10 +41,10 @@ fn cmd_cli(out: &mut Output, args: &CliArgs) {
41
41
42
42
fn cmd_search ( out : & mut Output , cli_args : & CliArgs , args : & SearchArgs ) {
43
43
44
- let _ = ( out , cli_args) ;
44
+ let _ = cli_args;
45
45
46
46
match args. kind {
47
- SearchKind :: Mojang => cmd_search_mojang ( & args. query ) ,
47
+ SearchKind :: Mojang => cmd_search_mojang ( & mut * out , & args. query ) ,
48
48
SearchKind :: Local => todo ! ( ) ,
49
49
SearchKind :: Forge => todo ! ( ) ,
50
50
SearchKind :: Fabric => todo ! ( ) ,
@@ -54,8 +54,51 @@ fn cmd_search(out: &mut Output, cli_args: &CliArgs, args: &SearchArgs) {
54
54
55
55
}
56
56
57
- fn cmd_search_mojang ( _query : & str ) {
58
- mojang:: request_manifest ( ( ) ) . unwrap ( ) ;
57
+ fn cmd_search_mojang ( out : & mut Output , _query : & str ) {
58
+
59
+ let manifest = mojang:: request_manifest ( ( ) ) . unwrap ( ) ;
60
+
61
+ let mut table = out. table ( 3 ) ;
62
+ table. cell ( "id" ) . format ( "Identifier" ) ;
63
+ table. cell ( "type" ) . format ( "Type" ) ;
64
+ table. cell ( "release_date" ) . format ( "Release date" ) ;
65
+
66
+ let today = Utc :: now ( ) ;
67
+
68
+ for version in & manifest. versions {
69
+
70
+ table. cell ( & version. id ) ;
71
+
72
+ let is_latest = manifest. latest . get ( & version. r#type )
73
+ . map ( |id| id == & version. id )
74
+ . unwrap_or ( false ) ;
75
+
76
+ let ( type_id, type_fmt) = match version. r#type {
77
+ standard:: serde:: VersionType :: Release => ( "release" , "Release" ) ,
78
+ standard:: serde:: VersionType :: Snapshot => ( "snapshot" , "Snapshot" ) ,
79
+ standard:: serde:: VersionType :: OldBeta => ( "old_beta" , "Beta" ) ,
80
+ standard:: serde:: VersionType :: OldAlpha => ( "old_alpha" , "Alpha" ) ,
81
+ } ;
82
+
83
+ if is_latest {
84
+ table. cell ( format_args ! ( "{type_id}*" ) ) . format ( format_args ! ( "{type_fmt}*" ) ) ;
85
+ } else {
86
+ table. cell ( format_args ! ( "{type_id}" ) ) . format ( format_args ! ( "{type_fmt}" ) ) ;
87
+ }
88
+
89
+ let mut cell = table. cell ( & version. release_time . to_rfc3339 ( ) ) ;
90
+ let local_release_date = version. release_time . with_timezone ( & Local ) ;
91
+ let local_release_data_fmt: _ = version. release_time . format ( "%a %b %e %T %Y" ) ;
92
+
93
+ let delta = today. signed_duration_since ( & local_release_date) ;
94
+ if is_latest || delta <= TimeDelta :: weeks ( 4 ) {
95
+ cell. format ( format_args ! ( "{} ({})" , local_release_data_fmt, TimeDeltaDisplay ( delta) ) ) ;
96
+ } else {
97
+ cell. format ( format_args ! ( "{}" , local_release_data_fmt) ) ;
98
+ }
99
+
100
+ }
101
+
59
102
}
60
103
61
104
fn cmd_start ( out : & mut Output , cli_args : & CliArgs , args : & StartArgs ) {
0 commit comments