From e9407a4857464fd308561d92e7fc5de781716a03 Mon Sep 17 00:00:00 2001 From: Dominik Nakamura Date: Tue, 5 Dec 2023 13:23:04 +0900 Subject: [PATCH] feat(lsp): use local time with shorter format Change from UTC time to local time in any log messages, and shorten the time format to only the time component (stripping off the date). --- Cargo.lock | 25 ++++++++------- crates/stef-lsp/Cargo.toml | 5 +-- crates/stef-lsp/src/main.rs | 62 ++++++++++++++++++++++++------------- 3 files changed, 56 insertions(+), 36 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0adb256..dd08d7f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -751,6 +751,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + [[package]] name = "object" version = "0.32.1" @@ -1186,6 +1195,7 @@ dependencies = [ "serde_json", "stef-compiler", "stef-parser", + "time", "tokio", "tower-lsp", "tracing", @@ -1348,6 +1358,8 @@ checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ "deranged", "itoa", + "libc", + "num_threads", "powerfmt", "serde", "time-core", @@ -1394,18 +1406,6 @@ dependencies = [ "bytes", "num_cpus", "pin-project-lite", - "tokio-macros", -] - -[[package]] -name = "tokio-macros" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.39", ] [[package]] @@ -1547,6 +1547,7 @@ dependencies = [ "sharded-slab", "smallvec", "thread_local", + "time", "tracing-core", "tracing-log", ] diff --git a/crates/stef-lsp/Cargo.toml b/crates/stef-lsp/Cargo.toml index 14c2ebb..e773b15 100644 --- a/crates/stef-lsp/Cargo.toml +++ b/crates/stef-lsp/Cargo.toml @@ -18,11 +18,12 @@ serde = { version = "1.0.193", features = ["derive"] } serde_json = "1.0.108" stef-compiler = { path = "../stef-compiler" } stef-parser = { path = "../stef-parser" } -tokio = { version = "1.34.0", features = ["fs", "io-std", "io-util", "macros", "rt-multi-thread"] } +time = { version = "0.3.30", features = ["formatting", "local-offset", "macros"] } +tokio = { version = "1.34.0", features = ["fs", "io-std", "io-util", "rt-multi-thread"] } tower-lsp = { version = "0.20.0", features = ["proposed"] } tracing = "0.1.40" tracing-appender = "0.2.3" -tracing-subscriber = "0.3.18" +tracing-subscriber = { version = "0.3.18", features = ["time"] } [lints] workspace = true diff --git a/crates/stef-lsp/src/main.rs b/crates/stef-lsp/src/main.rs index a3dff47..cacd378 100644 --- a/crates/stef-lsp/src/main.rs +++ b/crates/stef-lsp/src/main.rs @@ -7,6 +7,7 @@ use anyhow::{ensure, Context, Result}; use directories::ProjectDirs; use ouroboros::self_referencing; use stef_parser::Schema; +use time::{macros::format_description, UtcOffset}; use tokio::sync::{Mutex, RwLock}; use tower_lsp::{ async_trait, @@ -23,7 +24,11 @@ use tower_lsp::{ Client, LanguageServer, LspService, Server, }; use tracing::{debug, error, Level}; -use tracing_subscriber::{filter::Targets, fmt::MakeWriter, prelude::*}; +use tracing_subscriber::{ + filter::Targets, + fmt::{time::OffsetTime, MakeWriter}, + prelude::*, +}; use self::cli::Cli; @@ -243,9 +248,12 @@ impl LanguageServer for Backend { } } -#[tokio::main] -async fn main() -> Result<()> { +fn main() -> Result<()> { let cli = Cli::parse(); + let timer = OffsetTime::new( + UtcOffset::current_local_offset().context("failed retrieving local UTC offset")?, + format_description!("[hour]:[minute]:[second]"), + ); let dirs = ProjectDirs::from("rocks", "dnaka91", env!("CARGO_PKG_NAME")) .context("failed locating project directories")?; @@ -258,9 +266,14 @@ async fn main() -> Result<()> { .with( tracing_subscriber::fmt::layer() .with_ansi(false) + .with_timer(timer.clone()) .with_writer(ClientLogWriter::new(client.clone())), ) - .with(tracing_subscriber::fmt::layer().with_writer(file_appender)) + .with( + tracing_subscriber::fmt::layer() + .with_timer(timer) + .with_writer(file_appender), + ) .with(Targets::new().with_default(Level::WARN).with_targets([ (env!("CARGO_CRATE_NAME"), Level::TRACE), ("stef_compiler", Level::TRACE), @@ -276,24 +289,29 @@ async fn main() -> Result<()> { } }); - if cli.stdio { - let (stdin, stdout) = (tokio::io::stdin(), tokio::io::stdout()); - Server::new(stdin, stdout, socket).serve(service).await; - } else if let Some(file) = cli.pipe { - let file = tokio::fs::File::options() - .read(true) - .write(true) - .open(file) - .await - .context("failed to open provided pipe/socket")?; - - let (read, write) = tokio::io::split(file); - Server::new(read, write, socket).serve(service).await; - } else if let Some(port) = cli.socket { - unimplemented!("open TCP connection on port {port}"); - } - - Ok(()) + tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build()? + .block_on(async move { + if cli.stdio { + let (stdin, stdout) = (tokio::io::stdin(), tokio::io::stdout()); + Server::new(stdin, stdout, socket).serve(service).await; + } else if let Some(file) = cli.pipe { + let file = tokio::fs::File::options() + .read(true) + .write(true) + .open(file) + .await + .context("failed to open provided pipe/socket")?; + + let (read, write) = tokio::io::split(file); + Server::new(read, write, socket).serve(service).await; + } else if let Some(port) = cli.socket { + unimplemented!("open TCP connection on port {port}"); + } + + anyhow::Ok(()) + }) } struct ClientLogWriter {