Skip to main content

SettingsService

Struct SettingsService 

Source
pub struct SettingsService { /* private fields */ }
Expand description

Settings service - main interface for accessing and managing settings

Implementations§

Source§

impl SettingsService

Source

pub fn new( registry: Arc<FrozenSettingsRegistry>, meta: Arc<dyn MetaAdapter>, cache_size: usize, ) -> Self

Source

pub async fn get( &self, tn_id: TnId, key: &str, ) -> ClResult<Option<SettingValue>>

Get setting value with full resolution (tenant -> global -> default).

Three distinct outcomes:

  • Ok(Some(value)) — value resolved (stored or default)
  • Ok(None) — wildcard-namespace key with no stored value (legitimate absence; wildcard registrations declare a namespace, not fixed keys)
  • Err(SettingNotFound) — exact-match key with no default and not configured (programmer/configuration error)
  • Err(other) — transient adapter or deserialization error
Source

pub async fn get_raw( &self, tn_id: TnId, key: &str, ) -> ClResult<Option<SettingValue>>

Get the raw stored value at a single level without fallback.

Unlike get, this does not consult the schema default or the global row when querying a tenant — it only returns the value stored in the row keyed by (tn_id, key). Useful for the UI to distinguish “no per-tenant override” from “explicit override that happens to equal the global value”.

Returns Ok(None) when no row exists at that level. Bypasses cache because the cache stores resolved values, not raw rows.

Source

pub async fn set<S: AsRef<str>>( &self, tn_id: TnId, key: &str, value: SettingValue, roles: &[S], ) -> ClResult<Setting>

Set setting value with validation and permission checks The roles parameter should be the authenticated user’s roles

Source

pub async fn delete(&self, tn_id: TnId, key: &str) -> ClResult<bool>

Delete a setting (falls back to next level)

Source

pub async fn clear<S: AsRef<str>>( &self, tn_id: TnId, key: &str, roles: &[S], ) -> ClResult<()>

Clear (unset) a setting with the same role-gating and scope checks as set. Use this instead of calling MetaAdapter::update_setting(..., None) directly when the caller is acting on behalf of an authenticated user — it keeps audit trails and permission checks consistent across set/clear.

Source

pub async fn validate_required_settings(&self) -> ClResult<()>

Validate that all required settings (no default and not optional) are configured

Source

pub async fn get_string(&self, tn_id: TnId, key: &str) -> ClResult<String>

Type-safe getters (required - returns error if not found)

Source

pub async fn get_int(&self, tn_id: TnId, key: &str) -> ClResult<i64>

Source

pub async fn get_bool(&self, tn_id: TnId, key: &str) -> ClResult<bool>

Source

pub async fn get_json(&self, tn_id: TnId, key: &str) -> ClResult<Value>

Source

pub async fn get_string_opt( &self, tn_id: TnId, key: &str, ) -> ClResult<Option<String>>

Type-safe optional getters (returns None if not found or has no default) Still returns error if setting exists but has wrong type

Source

pub async fn get_int_opt(&self, tn_id: TnId, key: &str) -> ClResult<Option<i64>>

Source

pub async fn get_bool_opt( &self, tn_id: TnId, key: &str, ) -> ClResult<Option<bool>>

Source

pub async fn get_json_opt( &self, tn_id: TnId, key: &str, ) -> ClResult<Option<Value>>

Source

pub fn registry(&self) -> &Arc<FrozenSettingsRegistry>

Get reference to registry (for listing all settings)

Source

pub async fn list_by_prefix( &self, tn_id: TnId, prefixes: &[String], ) -> ClResult<Vec<(String, SettingValue, &SettingDefinition)>>

List stored settings by prefix with definition metadata

This queries the database for actual stored settings matching the prefixes, then resolves each against the registry (supporting wildcard patterns like “ui.*”). Global settings are merged with tenant-specific settings (tenant overrides global).

Source

pub async fn list_by_prefix_at( &self, tn_id: TnId, prefixes: &[String], ) -> ClResult<Vec<(String, SettingValue, &SettingDefinition)>>

List stored settings at exactly one level (no merge, no fallback). Used by the list handler when an explicit level= is requested.

Auto Trait Implementations§

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<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

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