Skip to main content

StoreManager

Struct StoreManager 

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

Owns the StoreRegistry and exposes the high-level operations that used to live as free functions in kanban_service. Callers (the CLI, TUI, MCP) construct a StoreManager with whichever factories they want available, then thread it through request handlers — inverting the old model where kanban-service hard-coded default_registry().

Implementations§

Source§

impl StoreManager

Source

pub fn new(registry: StoreRegistry) -> StoreManager

Wraps registry in an Arc. Cloning a StoreManager is cheap — all clones share the same underlying registry.

Source

pub fn registry(&self) -> &StoreRegistry

Returns a reference to the underlying StoreRegistry. Useful for introspection and testing.

Source

pub fn has_backends(&self) -> bool

Returns true if at least one backend factory is registered.

Source

pub fn backend_names(&self) -> Vec<&str>

Returns the names of all registered factories in registration order.

Source

pub fn is_sqlite(&self, locator: &str) -> bool

Returns true if locator points to a SQLite database — either because detect_backend recognised it as "sqlite", or because the file extension matches one of the conventional SQLite extensions.

Source

pub fn detect_backend(&self, locator: &str) -> Option<String>

Pattern-matches locator against all registered factories and returns the name of the first match. For existing SQLite files, detects by magic bytes even when no SQLite factory is in the registry.

Source

pub fn sync_backend_with_file( &self, locator: &str, config: &mut AppConfig, ) -> bool

Updates config.storage_backend to match the backend inferred from locator. Returns true if the config value changed.

Source

pub async fn make_backend( &self, locator: &str, config: &AppConfig, ) -> Result<Arc<dyn KanbanBackend>, KanbanError>

Creates a [KanbanBackend] for locator, selecting SQLite or JSON automatically from the file content / extension.

Source

pub fn make_store( &self, backend: &str, locator: &str, ) -> Result<Arc<dyn PersistenceStore + Sync + Send>, KanbanError>

Creates a PersistenceStore for the named backend at locator. Returns an error if backend is not registered in this manager.

Source

pub fn make_store_with_config( &self, file: Option<&str>, config: &AppConfig, ) -> Result<Arc<dyn PersistenceStore + Sync + Send>, KanbanError>

Creates a store from an explicit file locator, or falls back to the storage location in config when file is None. The backend is inferred from the locator; if no factory matches, config’s backend is used as a fallback.

Source

pub async fn validate_and_load_store( &self, backend: &str, path: &str, ) -> Result<Snapshot, KanbanError>

Creates a store for path, verifies the file exists, then loads and deserializes the snapshot. Returns an error if the file is missing or the data cannot be parsed.

For .sqlite/.db files, bypasses the registry and uses SqliteStore directly.

Source

pub async fn export_to_sqlite( &self, export: AllBoardsExport, filename: &str, ) -> Result<(), KanbanError>

Exports a board selection to a new SQLite file via SqliteStore.

Note: The dependency graph is not part of the AllBoardsExport format and will not be present in the exported file.

Source

pub async fn migrate_store( &self, from_backend: &str, from_path: &str, to_backend: &str, to_path: &str, ) -> Result<(), KanbanError>

Copies a snapshot from one backend/path pair to another, repairing any dangling foreign keys in the process. Rolls back (deletes the partial destination file) on failure.

SQLite source/destination are handled directly via SqliteStore; JSON and other registry-backed backends go through the StoreRegistry.

Trait Implementations§

Source§

impl Clone for StoreManager

Source§

fn clone(&self) -> StoreManager

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

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<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> Downcast for T
where T: Any,

Source§

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

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

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

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &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)

Convert &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> DowncastSync for T
where T: Any + Send + Sync,

Source§

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

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
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> Same for T

Source§

type Output = T

Should always be Self
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