Skip to main content

SourcedConfig

Struct SourcedConfig 

Source
pub struct SourcedConfig<State = ConfigLoaded> {
    pub global: SourcedGlobalConfig,
    pub per_file_ignores: SourcedValue<BTreeMap<String, Vec<String>>>,
    pub per_file_flavor: SourcedValue<IndexMap<String, MarkdownFlavor>>,
    pub code_block_tools: SourcedValue<CodeBlockToolsConfig>,
    pub rules: BTreeMap<String, SourcedRuleConfig>,
    pub loaded_files: Vec<String>,
    pub unknown_keys: Vec<(String, String, Option<String>)>,
    pub project_root: Option<PathBuf>,
    pub discovery_warnings: Vec<String>,
    pub validation_warnings: Vec<ConfigValidationWarning>,
    /* private fields */
}
Expand description

Configuration with provenance tracking for values.

The State type parameter encodes the validation state:

  • ConfigLoaded: Config has been loaded but not validated
  • ConfigValidated: Config has been validated and can be converted to Config

§Typestate Pattern

This uses the typestate pattern to ensure validation happens before conversion:

let loaded: SourcedConfig<ConfigLoaded> = SourcedConfig::load_with_discovery(...)?;
let validated: SourcedConfig<ConfigValidated> = loaded.validate(&registry)?;
let config: Config = validated.into();  // Only works on ConfigValidated!

Attempting to convert a ConfigLoaded config directly to Config is a compile error.

Fields§

§global: SourcedGlobalConfig§per_file_ignores: SourcedValue<BTreeMap<String, Vec<String>>>§per_file_flavor: SourcedValue<IndexMap<String, MarkdownFlavor>>§code_block_tools: SourcedValue<CodeBlockToolsConfig>§rules: BTreeMap<String, SourcedRuleConfig>§loaded_files: Vec<String>

Every config file that contributed, by resolved path, in load order.

A file reached through extends appears here as the path its reference expanded to, unlike every message about such a file (see ConfigOrigin). This list is not a message: it exists to answer which files took effect, which rumdl config is asked directly and a language server answers for the editor that started it, and the resolved path is the answer.

§unknown_keys: Vec<(String, String, Option<String>)>

(section, key, display_name), as on SourcedConfigFragment.

§project_root: Option<PathBuf>

Project root directory (parent of config file), used for resolving relative paths

§discovery_warnings: Vec<String>

Warnings produced while finding and reading config files: a rumdl.toml shadowed by a sibling .rumdl.toml, or a setting a file could not contribute (see SourcedConfigFragment::load_warnings). Shadowing is reported by auto-discovery only, so an explicit --config path and --no-config/--isolated see only the reading half.

§validation_warnings: Vec<ConfigValidationWarning>

Validation warnings (populated after validate() is called)

Implementations§

Source§

impl SourcedConfig<ConfigLoaded>

Source

pub fn load( config_path: Option<&str>, cli_overrides: Option<&SourcedGlobalConfig>, ) -> Result<Self, ConfigError>

Load and merge configurations from files and CLI overrides.

Source

pub fn load_discovered( config_file: &Path, user_config_dir: Option<&Path>, home_dir: Option<&Path>, ) -> Result<Self, DiscoveredConfigError>

Load a config file that the caller discovered by walking the tree itself.

The LSP cannot use load_with_discovery: that walk starts at the process working directory, while the server resolves a config per document and stops at the workspace root. It finds the file with its own walk and hands it here, so the discovered-config rules in load_discovered_config still apply.

project_root comes from the config file’s own location, which is what per-file ignore globs are matched against.

user_config_dir and home_dir override the platform user-config directory and the home directory; the server passes the home directory it already resolved for its walk boundary, and tests pass both.

The error distinguishes an unusable discovered file from an unusable user config so a caller walking several candidates can tell “try the next one” from “nothing here will resolve correctly”.

Source

pub fn load_for_workspace( start_dir: &Path, config_path: Option<&str>, user_config_dir: Option<&Path>, home_dir: Option<&Path>, ) -> Result<Self, ConfigError>

Load the configuration that applies to a directory, as if the CLI had run there.

Discovery normally walks up from the process working directory, which is the scope the user chose when they typed rumdl check. A language server has no such directory: the editor launches it from wherever it happens to be, which may sit in an unrelated project. The workspace root is the scope the user chose, so the server passes that here and resolves what rumdl check would resolve inside it.

user_config_dir and home_dir override the platform user-config directory and the home-directory walk boundary; the server passes the home directory it already resolved for its per-file walk, and tests pass both.

Source

pub fn load_with_discovery( config_path: Option<&str>, cli_overrides: Option<&SourcedGlobalConfig>, skip_auto_discovery: bool, ) -> Result<Self, ConfigError>

Load and merge configurations from files and CLI overrides. If skip_auto_discovery is true, only explicit config paths are loaded.

Source

pub fn validate( self, registry: &RuleRegistry, ) -> Result<SourcedConfig<ConfigValidated>, ConfigError>

Validate the configuration against a rule registry.

This method transitions the config from ConfigLoaded to ConfigValidated state, enabling conversion to Config. Validation warnings are stored in the config and can be displayed to the user.

§Example
let loaded = SourcedConfig::load_with_discovery(path, None, false)?;
let validated = loaded.validate(&registry)?;
let config: Config = validated.into();
Source

pub fn validate_into( self, registry: &RuleRegistry, ) -> Result<(Config, Vec<ConfigValidationWarning>), ConfigError>

Validate and convert to Config in one step (convenience method).

This combines validate() and into() for callers who want the validation warnings separately.

Source

pub fn into_validated_unchecked(self) -> SourcedConfig<ConfigValidated>

Skip validation and convert directly to ConfigValidated state.

§Safety

This method bypasses validation. Use only when:

  • You’ve already validated via validate_config_sourced()
  • You’re in test code that doesn’t need validation
  • You’re migrating legacy code and will add proper validation later

Prefer validate() for new code.

Source

pub fn discover_config_for_dir( dir: &Path, project_root: &Path, ) -> Option<PathBuf>

Discover the nearest config file for a specific directory, walking upward to project_root (inclusive).

Searches for rumdl config files (.rumdl.toml, rumdl.toml, .config/rumdl.toml, pyproject.toml with [tool.rumdl]) and markdownlint config files at each directory level.

Returns the config file path if found. Does NOT use CWD.

Source

pub fn load_sourced_for_path( config_path: &Path, project_root: &Path, ) -> Result<SourcedConfig<ConfigLoaded>, ConfigError>

Load a config from a specific file path, with extends resolution, returning the still-Loaded SourcedConfig (before validation and conversion).

Used by per-directory resolution so the caller can layer CLI-level overrides (e.g. inline --config) on top before converting to Config, matching the precedence applied to the global config.

Source

pub fn load_config_for_path( config_path: &Path, project_root: &Path, ) -> Result<Config, ConfigError>

Load a config from a specific file path, with extends resolution, and convert to Config. Used for per-directory config loading where each subdirectory config is standalone.

Trait Implementations§

Source§

impl<State: Clone> Clone for SourcedConfig<State>

Source§

fn clone(&self) -> SourcedConfig<State>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<State: Debug> Debug for SourcedConfig<State>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for SourcedConfig<ConfigLoaded>

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl From<SourcedConfig<ConfigValidated>> for Config

Convert a validated configuration to the final Config type.

This implementation only exists for SourcedConfig<ConfigValidated>, ensuring that validation must occur before conversion.

Source§

fn from(sourced: SourcedConfig<ConfigValidated>) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl<State> Freeze for SourcedConfig<State>

§

impl<State> RefUnwindSafe for SourcedConfig<State>
where State: RefUnwindSafe,

§

impl<State> Send for SourcedConfig<State>
where State: Send,

§

impl<State> Sync for SourcedConfig<State>
where State: Sync,

§

impl<State> Unpin for SourcedConfig<State>
where State: Unpin,

§

impl<State> UnsafeUnpin for SourcedConfig<State>

§

impl<State> UnwindSafe for SourcedConfig<State>
where State: UnwindSafe,

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

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> 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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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<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