@@ -24,9 +24,9 @@ use std::path::PathBuf;
24
24
use clap:: ArgAction ;
25
25
use clap:: Parser ;
26
26
use clap:: Subcommand ;
27
+ use progress:: ProgressLayer ;
27
28
use tracing_subscriber:: filter:: LevelFilter ;
28
29
use tracing_subscriber:: layer:: SubscriberExt ;
29
- use tracing_subscriber:: reload;
30
30
use tracing_subscriber:: EnvFilter ;
31
31
use tracing_subscriber:: Layer ;
32
32
@@ -79,6 +79,10 @@ enum Command {
79
79
#[ clap( long = "stdout" , conflicts_with = "out" ) ]
80
80
stdout : bool ,
81
81
82
+ /// Log in a JSON format.
83
+ #[ clap( long, default_value = "false" ) ]
84
+ log_json : bool ,
85
+
82
86
/// Use a `rustup`-managed sysroot instead of a `.buckconfig`-managed sysroot.
83
87
///
84
88
/// This option requires the presence of `rustc` in the `$PATH`, as rust-project
@@ -123,46 +127,79 @@ enum Command {
123
127
}
124
128
125
129
fn main ( ) -> Result < ( ) , anyhow:: Error > {
130
+ let opt = Opt :: parse ( ) ;
131
+
126
132
let filter = EnvFilter :: builder ( )
127
133
. with_default_directive ( LevelFilter :: INFO . into ( ) )
128
134
. from_env ( ) ?;
129
135
130
- let fmt = tracing_subscriber:: fmt:: layer ( )
131
- . with_ansi ( io:: stderr ( ) . is_terminal ( ) )
132
- . with_writer ( io:: stderr) ;
133
-
134
- let ( layer, reload_handle) = reload:: Layer :: new ( vec ! [ fmt. with_filter( filter) . boxed( ) ] ) ;
135
-
136
- let subscriber = tracing_subscriber:: registry ( ) . with ( layer) ;
137
- tracing:: subscriber:: set_global_default ( subscriber) ?;
138
-
139
- let cli = Opt :: parse ( ) ;
140
-
141
- if cli. version {
136
+ if opt. version {
142
137
println ! ( "{}" , build_info( ) ) ;
143
138
return Ok ( ( ) ) ;
144
139
}
145
140
146
- let Some ( command) = cli . command else {
141
+ let Some ( command) = opt . command else {
147
142
eprintln ! ( "Expected a subcommand, see --help for more information." ) ;
148
143
return Ok ( ( ) ) ;
149
144
} ;
150
145
146
+ let fmt = tracing_subscriber:: fmt:: layer ( )
147
+ . with_ansi ( io:: stderr ( ) . is_terminal ( ) )
148
+ . with_writer ( io:: stderr) ;
149
+
151
150
match command {
152
- Command :: New { name, kind, path } => cli:: New { name, kind, path } . run ( ) ,
153
- Command :: Check {
154
- mode,
155
- use_clippy,
156
- saved_file,
157
- } => cli:: Check :: new ( mode, use_clippy, saved_file) . run ( ) ,
158
- c @ Command :: Develop { .. } => {
151
+ c @ Command :: Develop { log_json, .. } => {
152
+ if log_json {
153
+ let subscriber =
154
+ tracing_subscriber:: registry ( ) . with ( fmt. json ( ) . with_filter ( filter) ) ;
155
+ tracing:: subscriber:: set_global_default ( subscriber) ?;
156
+ } else {
157
+ let subscriber = tracing_subscriber:: registry ( ) . with ( fmt. with_filter ( filter) ) ;
158
+ tracing:: subscriber:: set_global_default ( subscriber) ?;
159
+ } ;
160
+
159
161
let ( develop, input, out) = cli:: Develop :: from_command ( c) ;
160
- develop. run_as_cli ( input, out)
162
+ match develop. run_as_cli ( input, out) {
163
+ Ok ( _) => Ok ( ( ) ) ,
164
+ Err ( e) => {
165
+ tracing:: error!(
166
+ error = <anyhow:: Error as AsRef <
167
+ dyn std:: error:: Error + Send + Sync + ' static ,
168
+ >>:: as_ref( & e) ,
169
+ source = e. source( )
170
+ ) ;
171
+ Ok ( ( ) )
172
+ }
173
+ }
161
174
}
162
175
Command :: LspServer => {
163
- let state = server:: State :: new ( reload_handle) ?;
176
+ let state = server:: State :: new ( ) ?;
177
+ let sender = state. server . sender . clone ( ) ;
178
+
179
+ let progress = ProgressLayer :: new ( sender) ;
180
+
181
+ let subscriber = tracing_subscriber:: registry ( )
182
+ . with ( fmt. with_filter ( filter) )
183
+ . with ( progress) ;
184
+ tracing:: subscriber:: set_global_default ( subscriber) ?;
185
+
164
186
state. run ( )
165
187
}
188
+ Command :: New { name, kind, path } => {
189
+ let subscriber = tracing_subscriber:: registry ( ) . with ( fmt. with_filter ( filter) ) ;
190
+ tracing:: subscriber:: set_global_default ( subscriber) ?;
191
+
192
+ cli:: New { name, kind, path } . run ( )
193
+ }
194
+ Command :: Check {
195
+ mode,
196
+ use_clippy,
197
+ saved_file,
198
+ } => {
199
+ let subscriber = tracing_subscriber:: registry ( ) . with ( fmt. with_filter ( filter) ) ;
200
+ tracing:: subscriber:: set_global_default ( subscriber) ?;
201
+ cli:: Check :: new ( mode, use_clippy, saved_file) . run ( )
202
+ }
166
203
}
167
204
}
168
205
0 commit comments