1515//! <br>
1616//!
1717//! A language server for the Rune Language, an embeddable dynamic programming language for Rust.
18- use anyhow:: { bail, Result } ;
19- use rune:: languageserver:: { Input , Output } ;
18+
19+ use anyhow:: { anyhow, bail, Result } ;
20+ use rune:: languageserver;
2021use rune:: Options ;
2122use std:: env;
23+ use std:: fs:: File ;
2224use std:: path:: PathBuf ;
23- use tracing_appender:: non_blocking:: WorkerGuard ;
2425use tracing_subscriber:: EnvFilter ;
2526
2627pub const VERSION : & str = include_str ! ( concat!( env!( "OUT_DIR" ) , "/version.txt" ) ) ;
2728
28- fn setup_logging ( ) -> Result < Option < WorkerGuard > > {
29- let mut guard = None ;
30-
31- let env_filter = EnvFilter :: from_env ( "RUNE_LOG" ) ;
29+ fn setup_logging ( ) -> Result < ( ) > {
30+ let Ok ( env_filter ) = EnvFilter :: try_from_env ( "RUNE_LOG" ) else {
31+ return Ok ( ( ) ) ;
32+ } ;
3233
3334 // Set environment variable to get the language server to trace log to the
3435 // given file.
35- if let Some ( log_path) = std:: env:: var_os ( "RUNE_LOG_FILE" ) {
36- let log_path = PathBuf :: from ( log_path) ;
36+ let Some ( log_path) = std:: env:: var_os ( "RUNE_LOG_FILE" ) else {
37+ return Ok ( ( ) ) ;
38+ } ;
3739
38- if let ( Some ( d) , Some ( name) ) = ( log_path. parent ( ) , log_path. file_name ( ) ) {
39- let file_appender = tracing_appender:: rolling:: never ( d, name) ;
40- let ( non_blocking, g) = tracing_appender:: non_blocking ( file_appender) ;
40+ let log_path = PathBuf :: from ( log_path) ;
4141
42- tracing_subscriber:: fmt ( )
43- . with_env_filter ( env_filter)
44- . with_writer ( non_blocking)
45- . init ( ) ;
46-
47- guard = Some ( g) ;
48- }
42+ if let Some ( d) = log_path. parent ( ) {
43+ _ = std:: fs:: create_dir_all ( d) ;
4944 }
5045
51- Ok ( guard)
46+ tracing_subscriber:: fmt ( )
47+ . with_env_filter ( env_filter)
48+ . with_writer ( File :: options ( ) . append ( true ) . create ( true ) . open ( log_path) ?)
49+ . try_init ( )
50+ . map_err ( |e| anyhow ! ( "{e}" ) ) ?;
51+
52+ Ok ( ( ) )
5253}
5354
54- fn main ( ) -> Result < ( ) > {
55- let _guard = setup_logging ( ) ?;
55+ #[ tokio:: main]
56+ async fn main ( ) -> Result < ( ) > {
57+ setup_logging ( ) ?;
5658
5759 let mut it = env:: args ( ) ;
5860 it. next ( ) ;
@@ -74,20 +76,15 @@ fn main() -> Result<()> {
7476 }
7577
7678 let context = rune_modules:: default_context ( ) ?;
77-
7879 let options = Options :: from_default_env ( ) ?;
7980
80- let runtime = tokio:: runtime:: Builder :: new_current_thread ( )
81- . enable_all ( )
81+ let languageserver = languageserver:: builder ( )
82+ . with_context ( context)
83+ . with_options ( options)
84+ . with_stdio ( )
8285 . build ( ) ?;
8386
84- let result = runtime. block_on ( rune:: languageserver:: run (
85- context,
86- options,
87- ( Input :: from_stdin ( ) ?, Output :: from_stdout ( ) ?) ,
88- ) ) ;
89-
90- match result {
87+ match languageserver. run ( ) . await {
9188 Ok ( ( ) ) => {
9289 tracing:: info!( "Server shutting down" ) ;
9390 }
0 commit comments