pub struct SettingsConfigBuilder<S: StorageBackend = JsonStorage, Schema: SettingsSchema = ()> { /* private fields */ }Expand description
Core configuration types and traits for settings management.
Builder for creating SettingsConfig with a fluent API.
This is the recommended way to create a settings manager.
§Type Parameters
Schema: Settings schema type (defaults to()for dynamic usage)
§Examples
Type-Safe (With Schema):
use rcman::{SettingsConfig, SettingsSchema, SettingMetadata, settings};
use serde::{Serialize, Deserialize};
use std::collections::HashMap;
#[derive(Default, Serialize, Deserialize)]
struct MySettings { theme: String }
impl SettingsSchema for MySettings {
fn get_metadata() -> HashMap<String, SettingMetadata> {
settings! { "ui.theme" => SettingMetadata::text("dark").meta_str("label", "Theme") }
}
}
let config = SettingsConfig::builder("my-app", "1.0.0")
.with_schema::<MySettings>()
.with_config_dir("~/.config/my-app")
.build();Dynamic (Without Schema):
use rcman::SettingsConfig;
let config = SettingsConfig::builder("my-app", "1.0.0")
.with_config_dir("~/.config/my-app")
.build();Implementations§
Source§impl<S: StorageBackend, Schema: SettingsSchema> SettingsConfigBuilder<S, Schema>
impl<S: StorageBackend, Schema: SettingsSchema> SettingsConfigBuilder<S, Schema>
Sourcepub fn with_pretty_json(self, pretty: bool) -> Self
pub fn with_pretty_json(self, pretty: bool) -> Self
Use compact JSON (no pretty printing)
Note: This method is only available when using JsonStorage.
§Example
use rcman::SettingsConfig;
let config = SettingsConfig::builder("my-app", "1.0.0")
.build();Sourcepub fn with_config_dir(self, path: impl Into<PathBuf>) -> Self
pub fn with_config_dir(self, path: impl Into<PathBuf>) -> Self
Set the configuration directory
Supports ~ expansion for home directory.
Sourcepub fn settings_file(self, filename: impl Into<String>) -> Self
pub fn settings_file(self, filename: impl Into<String>) -> Self
Set the settings filename (default: “settings.{ext}”)
Sourcepub fn with_credentials(self) -> Self
pub fn with_credentials(self) -> Self
Enable credential management for secret settings with default behavior.
When enabled, settings marked as secret: true in metadata
will be stored in the primary OS keychain instead of the settings file.
Sourcepub fn with_credential_config(self, config: CredentialConfig) -> Self
pub fn with_credential_config(self, config: CredentialConfig) -> Self
Extensively configure how credential secrets should be stored, enabling advanced scenarios like custom proxy backends or keychain fallbacks.
§Example
use rcman::{SettingsConfig, CredentialConfig, SecretPasswordSource};
let config = SettingsConfig::builder("my-app", "1.0.0")
.with_credential_config(CredentialConfig::WithFallback {
fallback_path: "/tmp/secrets.enc.json".into(),
password: SecretPasswordSource::Environment("APP_KEY".into()),
})
.build();Sourcepub fn with_encrypted_fallback(
self,
path: impl Into<PathBuf>,
password_source: SecretPasswordSource,
) -> Self
pub fn with_encrypted_fallback( self, path: impl Into<PathBuf>, password_source: SecretPasswordSource, ) -> Self
Enable credential management with an encrypted file fallback triggered by a password source.
This is the recommended way to support CI/Docker environments securely.
pub fn with_env_credentials(self) -> Self
Sourcepub fn with_custom_env_credentials(self, var_name: impl Into<String>) -> Self
pub fn with_custom_env_credentials(self, var_name: impl Into<String>) -> Self
Enable credentials with a custom environment variable password source (Keychain + Encrypted File fallback).
The fallback file will be stored at the default path in the config directory.
Sourcepub fn with_file_credentials(self, path: impl Into<PathBuf>) -> Self
pub fn with_file_credentials(self, path: impl Into<PathBuf>) -> Self
Enable credentials with file password source (Keychain + Encrypted File fallback).
The fallback file will be stored at the default path in the config directory.
Sourcepub fn with_password_credentials(self, password: impl Into<String>) -> Self
pub fn with_password_credentials(self, password: impl Into<String>) -> Self
Enable credentials with provided password string (Keychain + Encrypted File fallback).
The fallback file will be stored at the default path in the config directory.
Sourcepub fn with_external_config(self, config: ExternalConfig) -> Self
pub fn with_external_config(self, config: ExternalConfig) -> Self
Register an external configuration file for backup
External configs are files managed outside of rcman (like rclone.conf) that can be included in backups.
§Example
use rcman::SettingsConfig;
use rcman::backup::ExternalConfig;
let config = SettingsConfig::builder("my-app", "1.0.0")
.with_external_config(ExternalConfig::new("rclone", "/path/to/rclone.conf")
.display_name("Rclone Configuration"))
.build();Sourcepub fn with_env_prefix(self, prefix: impl Into<String>) -> Self
pub fn with_env_prefix(self, prefix: impl Into<String>) -> Self
Enable environment variable overrides
When set, settings can be overridden by environment variables.
The format is: {PREFIX}_{CATEGORY}_{KEY} (all uppercase, dots become underscores)
§Example
use rcman::SettingsConfig;
let config = SettingsConfig::builder("my-app", "1.0.0")
.with_env_prefix("MYAPP")
.build();
// Now MYAPP_UI_THEME=dark will override the "ui.theme" settingSourcepub fn env_overrides_secrets(self, allow: bool) -> Self
pub fn env_overrides_secrets(self, allow: bool) -> Self
Allow environment variables to override secret settings
By default, secrets stored in the OS keychain are NOT affected by env vars. Enable this for Docker/CI environments where secrets are passed via env.
§Example
use rcman::SettingsConfig;
let config = SettingsConfig::builder("my-app", "1.0.0")
.with_env_prefix("MYAPP")
.env_overrides_secrets(true) // MYAPP_API_KEY will override keychain
.build();Sourcepub fn with_env_source(self, source: Arc<dyn EnvSource>) -> Self
pub fn with_env_source(self, source: Arc<dyn EnvSource>) -> Self
Set a custom environment variable source
Useful for testing or injecting env vars procedurally.
Sourcepub fn with_migrator<F>(self, migrator: F) -> Self
pub fn with_migrator<F>(self, migrator: F) -> Self
Set a migration function for schema changes (lazy migration)
The migrator function is called automatically when loading settings. If the function modifies the value, the migrated version is saved back.
Use this to upgrade old data formats to new ones transparently.
§Example
use rcman::SettingsConfig;
use serde_json::json;
let config = SettingsConfig::builder("my-app", "1.0.0")
.with_migrator(|mut value| {
// Migrate v1 to v2: rename "color" to "theme"
if let Some(obj) = value.as_object_mut() {
if let Some(ui) = obj.get_mut("ui").and_then(|v| v.as_object_mut()) {
if let Some(color) = ui.remove("color") {
ui.insert("theme".to_string(), color);
}
}
}
value
})
.build();Sourcepub fn with_hot_reload(self) -> Self
pub fn with_hot_reload(self) -> Self
Enable hot-reload with default configuration.
Sourcepub fn with_hot_reload_config(self, config: HotReloadConfig) -> Self
pub fn with_hot_reload_config(self, config: HotReloadConfig) -> Self
Enable hot-reload with a custom configuration.
Sourcepub fn with_profiles(self) -> Self
pub fn with_profiles(self) -> Self
Enable profiles for main settings
When enabled, the main settings file is stored per-profile, allowing completely different configurations (e.g., “work” vs “personal”).
§Example
use rcman::SettingsManager;
let manager = SettingsManager::builder("my-app", "1.0.0")
.with_profiles() // Enable profiles for main settings
.build()?;
// Now you can switch profiles
manager.switch_profile("work")?;Sourcepub fn with_schema<NewSchema: SettingsSchema>(
self,
) -> SettingsConfigBuilder<S, NewSchema>
pub fn with_schema<NewSchema: SettingsSchema>( self, ) -> SettingsConfigBuilder<S, NewSchema>
Specify the schema type for compile-time type safety.
This binds your settings struct to the manager, enabling:
- Type-safe
get_all()method returning your struct - Compile-time validation of setting keys
- Better IDE autocomplete and refactoring support
§Example
use rcman::{SettingsConfig, SettingsSchema, SettingMetadata, settings};
use serde::{Serialize, Deserialize};
use std::collections::HashMap;
#[derive(Default, Serialize, Deserialize)]
struct AppSettings {
theme: String,
font_size: f64,
}
impl SettingsSchema for AppSettings {
fn get_metadata() -> HashMap<String, SettingMetadata> {
settings! {
"ui.theme" => SettingMetadata::text("dark").meta_str("label", "Theme"),
"ui.font_size" => SettingMetadata::number(14.0).meta_str("label", "Font Size")
}
}
}
let config = SettingsConfig::builder("my-app", "1.0.0")
.with_schema::<AppSettings>() // Bind the schema
.build();Sourcepub fn with_storage<NewS: StorageBackend + Default>(
self,
) -> SettingsConfigBuilder<NewS, Schema>
pub fn with_storage<NewS: StorageBackend + Default>( self, ) -> SettingsConfigBuilder<NewS, Schema>
Specify the storage backend type.
This transforms the builder to use the specified storage backend. The settings filename will automatically be updated to match the format.
§Example
use rcman::{SettingsConfig, JsonStorage};
let config = SettingsConfig::builder("my-app", "1.0.0")
.with_storage::<JsonStorage>()
.build();Sourcepub fn build(self) -> SettingsConfig<S, Schema>where
S: Default,
pub fn build(self) -> SettingsConfig<S, Schema>where
S: Default,
Build the SettingsConfig
If config_dir is not set, uses the system config directory for the app.
Trait Implementations§
Source§impl<S: Clone + StorageBackend, Schema: Clone + SettingsSchema> Clone for SettingsConfigBuilder<S, Schema>
impl<S: Clone + StorageBackend, Schema: Clone + SettingsSchema> Clone for SettingsConfigBuilder<S, Schema>
Source§fn clone(&self) -> SettingsConfigBuilder<S, Schema>
fn clone(&self) -> SettingsConfigBuilder<S, Schema>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<S: StorageBackend, Schema: SettingsSchema> Debug for SettingsConfigBuilder<S, Schema>
impl<S: StorageBackend, Schema: SettingsSchema> Debug for SettingsConfigBuilder<S, Schema>
Auto Trait Implementations§
impl<S, Schema> Freeze for SettingsConfigBuilder<S, Schema>
impl<S = JsonStorage, Schema = ()> !RefUnwindSafe for SettingsConfigBuilder<S, Schema>
impl<S, Schema> Send for SettingsConfigBuilder<S, Schema>where
Schema: Send,
impl<S, Schema> Sync for SettingsConfigBuilder<S, Schema>where
Schema: Sync,
impl<S, Schema> Unpin for SettingsConfigBuilder<S, Schema>
impl<S, Schema> UnsafeUnpin for SettingsConfigBuilder<S, Schema>
impl<S = JsonStorage, Schema = ()> !UnwindSafe for SettingsConfigBuilder<S, Schema>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more