Skip to main content

SettingsManagerBuilder

Struct SettingsManagerBuilder 

Source
pub struct SettingsManagerBuilder<S: StorageBackend = JsonStorage, Schema: SettingsSchema = ()> { /* private fields */ }
Expand description

Main settings manager and builder. Builder for creating a SettingsManager with a fluent API.

This is the recommended way to create a SettingsManager. It allows you to configure all options and register sub-settings in a single chain of calls.

§Example

use rcman::{SettingsManager, SubSettingsConfig};

let manager = SettingsManager::builder("my-app", "1.0.0")
    .with_config_dir("~/.config/my-app")
    .with_credentials()
    .with_sub_settings(SubSettingsConfig::new("remotes"))
    .with_sub_settings(SubSettingsConfig::singlefile("backends"))
    .build()
    .unwrap();

Implementations§

Source§

impl<S: StorageBackend, Schema: SettingsSchema> SettingsManagerBuilder<S, Schema>

Source

pub fn new( app_name: impl Into<String>, app_version: impl Into<String>, ) -> SettingsManagerBuilder

Create a new builder with required app name and version.

Source§

impl<S: StorageBackend, Schema: SettingsSchema> SettingsManagerBuilder<S, Schema>

Source

pub fn with_config_dir(self, path: impl Into<PathBuf>) -> Self

Set the configuration directory path.

If not set, uses the system config directory.

Source

pub fn with_settings_file(self, filename: impl Into<String>) -> Self

Set the settings filename (default: “settings.json”).

Source

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 OS keychain instead of the settings file.

Source

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::{SettingsManager, CredentialConfig};

let manager = SettingsManager::builder("my-app", "1.0.0")
    .with_credential_config(CredentialConfig::WithFallback {
        fallback_path: "/tmp/secrets.enc.json".into(),
        encryption_key: [0u8; 32], // Use a derived key
    })
    .build()
    .unwrap();
Source

pub fn with_env_credentials(self) -> Self

Enable credentials with a default environment variable password source (Keychain + Encrypted File fallback).

The environment variable name is automatically derived from the app name (e.g., “my-app” -> “MY_APP_SECRET”).

Source

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).

Source

pub fn with_file_credentials(self, path: impl Into<PathBuf>) -> Self

Enable credentials with file password source (Keychain + Encrypted File fallback).

Source

pub fn with_password_credentials(self, password: impl Into<String>) -> Self

Enable credentials with provided password string (Keychain + Encrypted File fallback).

Source

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)

§Example
use rcman::SettingsManager;

let manager = SettingsManager::builder("my-app", "1.0.0")
    .with_env_prefix("MYAPP")
    .build()
    .unwrap();

// Now MYAPP_UI_THEME=dark will override the "ui.theme" setting
Source

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.

Source

pub fn with_migrator<F>(self, migrator: F) -> Self
where F: Fn(Value) -> Value + Send + Sync + 'static,

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.

Source

pub fn with_hot_reload(self) -> Self

Enable hot-reload with default watcher configuration.

Source

pub fn with_hot_reload_config(self, config: HotReloadConfig) -> Self

Enable hot-reload with a custom watcher configuration.

Source

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.

Source

pub fn with_schema<NewSchema: SettingsSchema>( self, ) -> SettingsManagerBuilder<S, NewSchema>

Specify the schema type for the settings.

This transforms the builder to use a typed schema instead of dynamic.

§Example
use rcman::{SettingsManager, SettingsSchema, SettingMetadata, settings};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
struct AppSettings {
    theme: String,
}

impl SettingsSchema for AppSettings {
    fn get_metadata() -> HashMap<String, SettingMetadata> {
        settings! {
            "ui.theme" => SettingMetadata::text("dark").meta_str("label", "Theme")
        }
    }
}

let manager = SettingsManager::builder("my-app", "1.0.0")
    .with_schema::<AppSettings>()
    .build()
    .unwrap();
Source

pub fn with_storage<NewS: StorageBackend + Default>( self, ) -> SettingsManagerBuilder<NewS, Schema>

Specify the storage backend type.

This transforms the builder to use the specified storage backend.

§Example
use rcman::{SettingsManager, JsonStorage};

let manager = SettingsManager::builder("my-app", "1.0.0")
    .with_storage::<JsonStorage>()
    .build()
    .unwrap();
Source

pub fn with_profiles(self) -> Self

Enable profiles for main settings.

When enabled, the main settings file is stored per-profile, allowing completely different app configurations (e.g., “work” vs “personal”).

§Example
use rcman::SettingsManager;

let manager = SettingsManager::builder("my-app", "1.0.0")
    .with_profiles()  // Enable profiles
    .build()?;

// Switch the entire app to work profile
manager.switch_profile("work")?;
Source

pub fn with_sub_settings(self, config: SubSettingsConfig) -> Self

Register a sub-settings type for per-entity configuration.

Sub-settings allow you to manage separate config files for each entity (e.g., one file per remote, per profile, etc.).

§Example
use rcman::{SettingsManager, SubSettingsConfig};

let manager = SettingsManager::builder("my-app", "1.0.0")
    .with_sub_settings(SubSettingsConfig::new("remotes"))
    .with_sub_settings(SubSettingsConfig::singlefile("backends"))
    .build()
    .unwrap();
Source

pub fn build(self) -> Result<SettingsManager<S, Schema>>
where S: Default + 'static,

Build the SettingsManager.

This creates the config directory if it doesn’t exist, initializes the manager, and registers all sub-settings.

§Errors

Returns an error if the config directory cannot be created.

Auto Trait Implementations§

§

impl<S, Schema> Freeze for SettingsManagerBuilder<S, Schema>

§

impl<S = JsonStorage, Schema = ()> !RefUnwindSafe for SettingsManagerBuilder<S, Schema>

§

impl<S, Schema> Send for SettingsManagerBuilder<S, Schema>
where Schema: Send,

§

impl<S, Schema> Sync for SettingsManagerBuilder<S, Schema>
where Schema: Sync,

§

impl<S, Schema> Unpin for SettingsManagerBuilder<S, Schema>
where Schema: Unpin, S: Unpin,

§

impl<S, Schema> UnsafeUnpin for SettingsManagerBuilder<S, Schema>

§

impl<S = JsonStorage, Schema = ()> !UnwindSafe for SettingsManagerBuilder<S, Schema>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more