laburnum 1.17.1

An LSP framework for building language servers and compilers, powered by an incremental query tree with content-addressed storage, task-based dataflow, and parallel queries.
Documentation
// Copyright Two Neutron Stars Incorporated and contributors
// SPDX-License-Identifier: BlueOak-1.0.0

//! Platform-specific runtime directory discovery.

use std::path::PathBuf;

/// Get the runtime directory for socket files.
///
/// Returns a platform-appropriate directory for storing runtime files like
/// sockets.
///
/// # Parameters
///
/// * `app_name` - The application name used for the subdirectory (e.g., "myapp")
/// * `env_override` - Optional environment variable name to check for override
///   (e.g., "MYAPP_SOCKET_DIR")
///
/// # Example
///
/// ```
/// use laburnum::protocol::ipc::runtime_dir::runtime_socket_dir;
///
/// // With env var override
/// let dir = runtime_socket_dir("myapp", Some("MYAPP_SOCKET_DIR"));
///
/// // Without env var override
/// let dir = runtime_socket_dir("myapp", None);
/// ```
pub fn runtime_socket_dir(
  app_name: &str,
  env_override: Option<&str>,
) -> PathBuf {
  if let Some(env_var) = env_override
    && let Some(dir) = std::env::var_os(env_var)
  {
    return PathBuf::from(dir);
  }

  #[cfg(target_os = "linux")]
  {
    if let Ok(dir) = std::env::var("XDG_RUNTIME_DIR") {
      return PathBuf::from(dir).join(app_name);
    }
  }

  #[cfg(target_os = "macos")]
  {
    if let Ok(dir) = std::env::var("TMPDIR") {
      return PathBuf::from(dir).join(app_name);
    }
  }

  #[cfg(unix)]
  {
    if let Ok(user) = std::env::var("USER") {
      return PathBuf::from(format!("/tmp/{}-{}", app_name, user));
    }

    PathBuf::from(format!("/tmp/{}", app_name))
  }

  #[cfg(windows)]
  {
    if let Ok(dir) = std::env::var("LOCALAPPDATA") {
      return PathBuf::from(dir).join(app_name).join("run");
    }
    if let Ok(dir) = std::env::var("TEMP") {
      return PathBuf::from(dir).join(app_name);
    }
    return PathBuf::from(format!("C:\\Temp\\{}", app_name));
  }
}