Expand description
Provision Command Presentation Module
This module implements the CLI presentation layer for the provision command, handling argument processing and user interaction.
§Architecture
The provision command presentation layer follows the DDD pattern, orchestrating
the application layer’s ProvisionCommandHandler while providing user-friendly
output and error handling.
§Components
errors- Presentation layer error types with.help()methodshandler- Main command handler orchestrating the workflow
§Usage Example
§Basic Usage
ⓘ
use std::path::Path;
use std::sync::Arc;
use torrust_tracker_deployer_lib::bootstrap::Container;
use torrust_tracker_deployer_lib::presentation::cli::dispatch::ExecutionContext;
use torrust_tracker_deployer_lib::presentation::cli::controllers::provision;
use torrust_tracker_deployer_lib::presentation::cli::views::VerbosityLevel;
let container = Container::new(VerbosityLevel::Normal, Path::new("."));
let context = ExecutionContext::new(Arc::new(container), global_args);
// Call the provision handler
let result = context
.container()
.create_provision_controller()
.execute("my-environment")
.await;§Direct Usage (For Testing)
ⓘ
use std::path::Path;
use std::sync::Arc;
use torrust_tracker_deployer_lib::bootstrap::Container;
use torrust_tracker_deployer_lib::presentation::cli::dispatch::ExecutionContext;
use torrust_tracker_deployer_lib::presentation::cli::controllers::provision;
use torrust_tracker_deployer_lib::presentation::cli::views::VerbosityLevel;
let container = Container::new(VerbosityLevel::Normal, Path::new("."));
let context = ExecutionContext::new(Arc::new(container), global_args);
if let Err(e) = context
.container()
.create_provision_controller()
.execute("test-env")
.await
{
eprintln!("Provision failed: {e}");
eprintln!("\n{}", e.help());
}§Direct Usage (For Testing)
ⓘ
use std::path::{Path, PathBuf};
use std::sync::Arc;
use std::time::Duration;
use parking_lot::ReentrantMutex;
use std::cell::RefCell;
use torrust_tracker_deployer_lib::presentation::cli::controllers::provision::handler::ProvisionCommandController;
use torrust_tracker_deployer_lib::presentation::cli::views::{UserOutput, VerbosityLevel};
use torrust_tracker_deployer_lib::infrastructure::persistence::file_repository_factory::FileRepositoryFactory;
use torrust_tracker_deployer_lib::shared::clock::SystemClock;
let output = Arc::new(ReentrantMutex::new(RefCell::new(UserOutput::new(VerbosityLevel::Normal))));
let data_dir = PathBuf::from("./data");
let file_repository_factory = FileRepositoryFactory::new(Duration::from_secs(30));
let repository = file_repository_factory.create(data_dir);
let clock = Arc::new(SystemClock);
if let Err(e) = ProvisionCommandController::new(repository, clock, output).execute("test-env").await {
eprintln!("Provision failed: {e}");
eprintln!("\n{}", e.help());
}Re-exports§
pub use handler::ProvisionCommandController;pub use errors::ProvisionSubcommandError;