Skip to main content

JsonFileAmpConfigRepository

Struct JsonFileAmpConfigRepository 

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

File-based amp-config repository backed by a single JSON document.

The repository stores one full amplifier snapshot at config_path. It is intentionally simple: every save overwrites the entire file and every load reads the whole document into memory.

This implementation is useful while the configuration remains relatively small and the project does not yet need querying, concurrency control, or schema migrations provided by a database.

Implementations§

Source§

impl JsonFileAmpConfigRepository

Source

pub fn new(config_path: PathBuf) -> Self

Creates a JSON repository that reads from and writes to config_path.

The path is not validated eagerly. Missing parent directories are created on the first successful save call.

Trait Implementations§

Source§

impl AmpConfigPersistence for JsonFileAmpConfigRepository

Source§

fn load(&self) -> Result<Option<AmpConfigDto>, String>

Loads and deserializes the persisted JSON file.

Behavior summary:

  • missing file -> Ok(None)
  • unreadable file -> Err(String)
  • invalid JSON -> Err(String)
  • valid JSON -> Ok(Some(AmpConfigDto))
Source§

fn save(&self, config: &AmpConfigDto) -> Result<(), String>

Serializes the supplied config snapshot and writes it to disk atomically.

The write strategy is:

  1. Serialize the snapshot to JSON.
  2. Write the JSON to a sibling temporary file (same directory as the target, so the subsequent rename stays on the same filesystem/volume).
  3. sync_all the temporary file so the bytes are flushed to the OS.
  4. rename the temporary file over the target path. On all major OSes this rename is atomic at the filesystem level, so a crash between steps 2-3 leaves the old file intact and a crash between steps 3-4 leaves a harmless temporary file that is cleaned up on the next successful save.

Parent directories are created automatically when necessary. The JSON is formatted with to_string_pretty so it remains reasonably human-readable during development and debugging.

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
§

impl<T> Any for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

§

fn type_name(&self) -> &'static str

§

impl<T> AnySync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

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.

§

impl<S> FromSample<S> for S

§

fn from_sample_(s: S) -> S

§

impl<T> Instrument for T

§

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

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

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.

§

impl<T, U> ToSample<U> for T
where U: FromSample<T>,

§

fn to_sample_(self) -> U

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

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,