@@ -24,9 +24,9 @@ use std::path::PathBuf;
2424use clap:: ArgAction ;
2525use clap:: Parser ;
2626use clap:: Subcommand ;
27+ use progress:: ProgressLayer ;
2728use tracing_subscriber:: filter:: LevelFilter ;
2829use tracing_subscriber:: layer:: SubscriberExt ;
29- use tracing_subscriber:: reload;
3030use tracing_subscriber:: EnvFilter ;
3131use tracing_subscriber:: Layer ;
3232
@@ -79,6 +79,10 @@ enum Command {
7979 #[ clap( long = "stdout" , conflicts_with = "out" ) ]
8080 stdout : bool ,
8181
82+ /// Log in a JSON format.
83+ #[ clap( long, default_value = "false" ) ]
84+ log_json : bool ,
85+
8286 /// Use a `rustup`-managed sysroot instead of a `.buckconfig`-managed sysroot.
8387 ///
8488 /// This option requires the presence of `rustc` in the `$PATH`, as rust-project
@@ -123,46 +127,79 @@ enum Command {
123127}
124128
125129fn main ( ) -> Result < ( ) , anyhow:: Error > {
130+ let opt = Opt :: parse ( ) ;
131+
126132 let filter = EnvFilter :: builder ( )
127133 . with_default_directive ( LevelFilter :: INFO . into ( ) )
128134 . from_env ( ) ?;
129135
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 {
142137 println ! ( "{}" , build_info( ) ) ;
143138 return Ok ( ( ) ) ;
144139 }
145140
146- let Some ( command) = cli . command else {
141+ let Some ( command) = opt . command else {
147142 eprintln ! ( "Expected a subcommand, see --help for more information." ) ;
148143 return Ok ( ( ) ) ;
149144 } ;
150145
146+ let fmt = tracing_subscriber:: fmt:: layer ( )
147+ . with_ansi ( io:: stderr ( ) . is_terminal ( ) )
148+ . with_writer ( io:: stderr) ;
149+
151150 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+
159161 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+ }
161174 }
162175 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+
164186 state. run ( )
165187 }
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+ }
166203 }
167204}
168205
0 commit comments