#![warn(missing_docs)]
#![warn(clippy::all)]
use lsp_types::Uri;
use std::path::PathBuf;
pub mod handlers;
pub mod ledger_state;
pub mod main_loop;
#[cfg(not(windows))]
pub fn uri_to_path(uri: &Uri) -> Option<PathBuf> {
let path_str = uri.as_str().strip_prefix("file://")?;
let decoded = percent_decode(path_str);
Some(PathBuf::from(decoded))
}
#[cfg(windows)]
pub fn uri_to_path(uri: &Uri) -> Option<PathBuf> {
let path_str = uri.as_str().strip_prefix("file://")?;
let path_str = path_str.strip_prefix('/').unwrap_or(path_str);
let decoded = percent_decode(path_str);
Some(PathBuf::from(decoded))
}
fn percent_decode(s: &str) -> String {
let mut result = String::with_capacity(s.len());
let mut chars = s.chars().peekable();
while let Some(c) = chars.next() {
if c == '%' {
let hex: String = chars.by_ref().take(2).collect();
if hex.len() == 2
&& let Ok(byte) = u8::from_str_radix(&hex, 16)
{
result.push(byte as char);
continue;
}
result.push('%');
result.push_str(&hex);
} else {
result.push(c);
}
}
result
}
mod server;
mod snapshot;
mod vfs;
pub use ledger_state::{LedgerState, LspConfig, SharedLedgerState, new_shared_ledger_state};
pub use main_loop::{run_main_loop, run_main_loop_with_exit_action};
pub use server::{Server, start_stdio};
pub use snapshot::Snapshot;
pub use vfs::Vfs;
pub const VERSION: &str = env!("CARGO_PKG_VERSION");