Skip to main content

shuck_server/
lib.rs

1#![allow(missing_docs)]
2#![cfg_attr(not(test), warn(clippy::unwrap_used))]
3
4use std::num::NonZeroUsize;
5
6pub use edit::{DocumentKey, PositionEncoding, TextDocument};
7use lsp_types::CodeActionKind;
8pub use server::Server;
9pub use session::{Client, ClientOptions, DocumentQuery, DocumentSnapshot, Session};
10pub use workspace::{Workspace, Workspaces};
11
12mod edit;
13mod fix;
14mod format;
15mod lint;
16mod logging;
17mod resolve;
18mod server;
19mod session;
20mod workspace;
21
22pub(crate) const SERVER_NAME: &str = "shuck";
23pub(crate) const DIAGNOSTIC_NAME: &str = "Shuck";
24
25pub(crate) const SOURCE_FIX_ALL_SHUCK: CodeActionKind = CodeActionKind::new("source.fixAll.shuck");
26
27pub(crate) type Result<T> = anyhow::Result<T>;
28
29pub(crate) fn version() -> &'static str {
30    env!("CARGO_PKG_VERSION")
31}
32
33pub fn run() -> Result<()> {
34    let four = NonZeroUsize::try_from(4usize)
35        .map_err(|_| anyhow::anyhow!("failed to create non-zero worker count"))?;
36    let worker_threads = std::thread::available_parallelism()
37        .unwrap_or(four)
38        .min(four);
39
40    let (connection, io_threads) = server::ConnectionInitializer::stdio();
41    let server_result = Server::new(worker_threads, connection)
42        .map_err(|err| err.context("Failed to start server"))?
43        .run();
44
45    let io_result = io_threads.join();
46    match (server_result, io_result) {
47        (Ok(()), Ok(())) => Ok(()),
48        (Err(server), Ok(())) => Err(server),
49        (Ok(()), Err(io)) => Err(anyhow::Error::new(io).context("IO thread error")),
50        (Err(server), Err(io)) => Err(server.context(format!("IO thread error: {io}"))),
51    }
52}