cfgmatic-paths
Cross-platform configuration path discovery following XDG and platform conventions.
Overview
This crate provides a platform-agnostic way to discover configuration directories following the conventions of each operating system:
- Unix/Linux: XDG Base Directory Specification
- macOS CLI: XDG (same as Unix)
- macOS GUI: Application Support directories (with
macos-guifeature) - Windows: Known Folder IDs (AppData, ProgramData)
Architecture
crates/cfgmatic-paths/
├── Cargo.toml
├── src/
│ ├── lib.rs # Public API and convenience functions
│ ├── builder.rs # PathsBuilder and PathFinder
│ ├── core/ # Core domain types
│ │ ├── mod.rs # Module exports
│ │ ├── app_type.rs # AppType (CLI, GUI, Service)
│ │ ├── config_tier.rs # ConfigTier (User, Local, System)
│ │ ├── discovery.rs # ConfigDiscovery, ConfigCandidate, PathStatus
│ │ └── pattern.rs # FilePattern for matching config files
│ ├── platform/ # Platform-specific implementations
│ │ ├── mod.rs # DirectoryFinder trait
│ │ ├── unix.rs # XDG for Unix/Linux/macOS CLI
│ │ ├── windows.rs # Windows Known Folders
│ │ └── macos_gui.rs # macOS Application Support
│ ├── env/ # Environment abstraction for testing
│ │ ├── mod.rs # Env trait
│ │ └── std_env.rs # StdEnv implementation
│ └── filesystem/ # Filesystem abstraction for testing
│ ├── mod.rs # Fs trait
│ └── std_fs.rs # StdFs implementation
Usage
Basic Usage
use PathsBuilder;
// Create a path finder for your application
let finder = new.build;
// Get user config directories
let user_dirs = finder.user_dirs;
println!;
// Ensure the primary user config directory exists
if let Ok = finder.ensure_user_config_dir
Configuration Discovery
The crate provides comprehensive configuration discovery with full diagnostics:
use ;
// Quick discovery
let discovery = discover_config;
println!;
if let Some = &discovery.found_path
// See all candidates that were searched
for candidate in discovery.candidates
// Check for config fragments (conf.d style)
for fragment in &discovery.fragments
Path Without Existence Check
Get the preferred configuration path without checking if it exists:
use ;
// Get the preferred config directory
let dir = config_path;
println!;
// Get a specific config file path
let file = config_file_path;
println!;
Multi-File Configuration Discovery
Find all configuration files matching a pattern:
use ;
let finder = new.build;
// Find all config files with common extensions
let pattern = extensions;
let configs = finder.find_config_files;
for config in configs
Conf.d Style Fragments
Find configuration fragments from conf.d-style directories:
use ;
let finder = new.build;
// Find all .conf files in conf.d directories
let pattern = glob;
let fragments = finder.find_fragments;
for fragment in fragments
Convenience Functions
use ;
// Find the first existing config directory
if let Some = find_existing_dir
// Ensure user config directory exists
let config_dir = ensure_config_dir?;
// Get all directories with metadata
for info in get_all_dirs
Configuration Tiers
Configuration directories are organized into three tiers:
-
User (
ConfigTier::User): User-specific configs in home directory. Highest priority, typically writable. -
Local (
ConfigTier::Local): Machine-specific configs. Medium priority, may be writable. -
System (
ConfigTier::System): System-wide configs. Lowest priority, typically read-only.
Platform Details
Unix/Linux (XDG)
- User:
$XDG_CONFIG_HOME/<app>/(default:~/.config/<app>/) - Legacy:
~/.<app>rc(optional, enabled by default) - System:
$XDG_CONFIG_DIRS/<app>/(default:/etc/xdg/<app>/)
macOS
CLI Applications (default)
Uses XDG (same as Unix/Linux).
GUI Applications (with macos-gui feature)
- User:
~/Library/Application Support/<bundle-id>/ - System:
/Library/Application Support/<bundle-id>/
Windows
- User Roaming:
%APPDATA%\<Company>\<App>\ - User Local:
%LOCALAPPDATA%\<Company>\<App>\ - System:
%PROGRAMDATA%\<Company>\<App>\
Testing
The crate provides abstractions for testing:
Env: Mock environment variablesFs: Mock filesystem operations
These allow testing without modifying the actual environment or filesystem.
Features
default: No additional features enabled.macos-gui: Use macOS Application Support directories instead of XDG.test-helpers: Additional utilities for testing (future).
Relationship to cfgmatic
This crate is the foundation for the cfgmatic configuration framework:
cfgmatic-paths: Path discovery (this crate)cfgmatic: File search, merging, watching (usescfgmatic-paths)
The separation allows:
- Independent use of path discovery
- Testing without filesystem dependencies
- Platform-specific optimizations
License
This project is licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.