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 {