pub struct CliApp { /* private fields */ }Expand description
Builder entry point for the Kanban CLI.
A third-party backend crate constructs a CliApp, registers its own
StoreFactory, and calls CliApp::run from its own main — owning
the binary while reusing every CLI command here.
Implementations§
Source§impl CliApp
impl CliApp
Sourcepub fn with_defaults() -> Self
pub fn with_defaults() -> Self
Returns a CliApp pre-configured with all backends compiled in.
SQLite is registered first so content-sniffing prefers it; JSON is
registered as the catch-all fallback. When no backend features are
active the registry is empty (same as Default).
Sourcepub fn register_backend(self, factory: Box<dyn StoreFactory>) -> Self
pub fn register_backend(self, factory: Box<dyn StoreFactory>) -> Self
Registers an additional backend factory. Order matters for content sniffing — factories registered earlier win when multiple match.
§Example — third-party binary with a custom backend
A crate that owns its own main can reuse every CLI command while
injecting a proprietary storage backend:
use kanban_cli::CliApp;
use kanban_persistence::{PersistenceError, PersistenceStore, StoreFactory};
use std::sync::Arc;
// A backend factory provided by a third-party crate.
struct MyBackendFactory;
impl StoreFactory for MyBackendFactory {
fn name(&self) -> &str { "my-backend" }
fn create(
&self,
locator: &str,
) -> Result<Arc<dyn PersistenceStore + Send + Sync>, PersistenceError> {
unimplemented!()
}
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
CliApp::with_defaults()
.register_backend(Box::new(MyBackendFactory))
.run()
.await
}Sourcepub fn with_config(self, config: AppConfig) -> Self
pub fn with_config(self, config: AppConfig) -> Self
Overrides the AppConfig that run would otherwise load from disk.
Sourcepub fn registry(&self) -> &StoreRegistry
pub fn registry(&self) -> &StoreRegistry
Exposes the underlying registry for inspection and tests.
Sourcepub async fn run(self) -> Result<()>
pub async fn run(self) -> Result<()>
Executes the CLI: parses args, loads config, and dispatches to the requested command (or launches the TUI if no subcommand was given).
Sourcepub async fn run_with_args<I, T>(self, args: I) -> Result<()>
pub async fn run_with_args<I, T>(self, args: I) -> Result<()>
Like [run], but accepts an explicit argument list instead of reading
from std::env::args_os(). Useful for testing without spawning a
subprocess.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for CliApp
impl !RefUnwindSafe for CliApp
impl Send for CliApp
impl Sync for CliApp
impl Unpin for CliApp
impl UnsafeUnpin for CliApp
impl !UnwindSafe for CliApp
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> 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