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
impl StoreManager
Sourcepub fn new(registry: StoreRegistry) -> StoreManager
pub fn new(registry: StoreRegistry) -> StoreManager
Wraps registry in an Arc. Cloning a StoreManager is cheap —
all clones share the same underlying registry.
Sourcepub fn registry(&self) -> &StoreRegistry
pub fn registry(&self) -> &StoreRegistry
Returns a reference to the underlying StoreRegistry.
Useful for introspection and testing.
Sourcepub fn has_backends(&self) -> bool
pub fn has_backends(&self) -> bool
Returns true if at least one backend factory is registered.
Sourcepub fn backend_names(&self) -> Vec<&str>
pub fn backend_names(&self) -> Vec<&str>
Returns the names of all registered factories in registration order.
Sourcepub fn is_sqlite(&self, locator: &str) -> bool
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.
Sourcepub fn detect_backend(&self, locator: &str) -> Option<String>
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.
Sourcepub fn sync_backend_with_file(
&self,
locator: &str,
config: &mut AppConfig,
) -> bool
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.
Sourcepub async fn make_backend(
&self,
locator: &str,
config: &AppConfig,
) -> Result<Arc<dyn KanbanBackend>, KanbanError>
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.
Sourcepub fn make_store(
&self,
backend: &str,
locator: &str,
) -> Result<Arc<dyn PersistenceStore + Sync + Send>, KanbanError>
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.
Sourcepub fn make_store_with_config(
&self,
file: Option<&str>,
config: &AppConfig,
) -> Result<Arc<dyn PersistenceStore + Sync + Send>, KanbanError>
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.
Sourcepub async fn validate_and_load_store(
&self,
backend: &str,
path: &str,
) -> Result<Snapshot, KanbanError>
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.
Sourcepub async fn export_to_sqlite(
&self,
export: AllBoardsExport,
filename: &str,
) -> Result<(), KanbanError>
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.
Sourcepub async fn migrate_store(
&self,
from_backend: &str,
from_path: &str,
to_backend: &str,
to_path: &str,
) -> Result<(), KanbanError>
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
impl Clone for StoreManager
Source§fn clone(&self) -> StoreManager
fn clone(&self) -> StoreManager
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl !RefUnwindSafe for StoreManager
impl !UnwindSafe for StoreManager
impl Freeze for StoreManager
impl Send for StoreManager
impl Sync for StoreManager
impl Unpin for StoreManager
impl UnsafeUnpin for StoreManager
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&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
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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