sync from monorepo @ 2452e92e

This commit is contained in:
2026-05-08 01:59:04 +02:00
commit b03dc15371
459 changed files with 129586 additions and 0 deletions
+147
View File
@@ -0,0 +1,147 @@
//! Platform path resolution for Zed editor directories.
//!
//! Resolves configuration and data directories for each Zed release channel
//! across Linux, macOS, and Windows.
use std::path::PathBuf;
/// Zed release channel. Each channel has independent config and data directories.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ZedChannel {
Stable,
Preview,
Nightly,
Dev,
}
impl ZedChannel {
/// All known release channels.
pub fn all() -> &'static [ZedChannel] {
&[
ZedChannel::Stable,
ZedChannel::Preview,
ZedChannel::Nightly,
ZedChannel::Dev,
]
}
/// Socket/identifier name used in IPC paths.
pub fn socket_name(&self) -> &'static str {
match self {
ZedChannel::Stable => "stable",
ZedChannel::Preview => "preview",
ZedChannel::Nightly => "nightly",
ZedChannel::Dev => "dev",
}
}
/// Display name for the channel.
pub fn display_name(&self) -> &'static str {
match self {
ZedChannel::Stable => "Stable",
ZedChannel::Preview => "Preview",
ZedChannel::Nightly => "Nightly",
ZedChannel::Dev => "Dev",
}
}
}
impl std::fmt::Display for ZedChannel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.display_name())
}
}
/// Resolve the Zed configuration directory for this platform.
///
/// | Platform | Path |
/// |----------|------|
/// | Linux | `$XDG_CONFIG_HOME/zed` (default: `~/.config/zed`) |
/// | macOS | `~/.config/zed` |
/// | Windows | `%APPDATA%\Zed` |
pub fn zed_config_dir() -> Option<PathBuf> {
#[cfg(target_os = "macos")]
{
dirs::home_dir().map(|d| d.join(".config").join("zed"))
}
#[cfg(target_os = "windows")]
{
dirs::config_dir().map(|d| d.join("Zed"))
}
#[cfg(not(any(target_os = "macos", target_os = "windows")))]
{
dirs::config_dir().map(|d| d.join("zed"))
}
}
/// Resolve the Zed data directory for this platform.
///
/// | Platform | Path |
/// |----------|------|
/// | Linux | `$XDG_DATA_HOME/zed` (default: `~/.local/share/zed`) |
/// | macOS | `~/Library/Application Support/Zed` |
/// | Windows | `%LOCALAPPDATA%\Zed` |
pub fn zed_data_dir() -> Option<PathBuf> {
#[cfg(target_os = "windows")]
{
dirs::data_local_dir().map(|d| d.join("Zed"))
}
#[cfg(not(target_os = "windows"))]
{
dirs::data_dir().map(|d| d.join("zed"))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_all_channels() {
let channels = ZedChannel::all();
assert_eq!(channels.len(), 4);
assert!(channels.contains(&ZedChannel::Stable));
assert!(channels.contains(&ZedChannel::Preview));
assert!(channels.contains(&ZedChannel::Nightly));
assert!(channels.contains(&ZedChannel::Dev));
}
#[test]
fn test_socket_names() {
assert_eq!(ZedChannel::Stable.socket_name(), "stable");
assert_eq!(ZedChannel::Preview.socket_name(), "preview");
assert_eq!(ZedChannel::Nightly.socket_name(), "nightly");
assert_eq!(ZedChannel::Dev.socket_name(), "dev");
}
#[test]
fn test_display_names() {
assert_eq!(ZedChannel::Stable.to_string(), "Stable");
assert_eq!(ZedChannel::Dev.to_string(), "Dev");
}
#[test]
fn test_config_dir_is_some() {
// On any supported platform, this should resolve.
let dir = zed_config_dir();
assert!(dir.is_some(), "zed_config_dir should resolve on this platform");
let path = dir.unwrap();
let path_str = path.to_string_lossy();
assert!(
path_str.contains("zed") || path_str.contains("Zed"),
"config dir should contain 'zed': {path_str}"
);
}
#[test]
fn test_data_dir_is_some() {
let dir = zed_data_dir();
assert!(dir.is_some(), "zed_data_dir should resolve on this platform");
let path = dir.unwrap();
let path_str = path.to_string_lossy();
assert!(
path_str.contains("zed") || path_str.contains("Zed"),
"data dir should contain 'zed': {path_str}"
);
}
}