Mountain/Binary/Initialize/
StateBuild.rs

1//! # StateBuild - Advanced Application State Initialization
2//!
3//! Builds the application state with dependency injection, telemetry
4//! and feature flag support for different build configurations.
5//!
6//! ## Build Profiles
7//!
8//! - **Debug**: Enhanced validation, state inspection
9//! - **Development**: Reduced validation for faster iteration
10//! - **Telemetry**: Full metrics and tracing export
11//!
12//! ## Defensive Coding
13//!
14//! - Type-safe dependency resolution
15//! - Validation of required capabilities
16//! - Graceful degradation for optional dependencies
17
18use std::sync::Arc;
19
20use log::{debug, error, info, warn};
21// ============ Feature Flags ============
22#[cfg(feature = "Telemetry")]
23use opentelemetry::{KeyValue, global};
24#[cfg(feature = "Telemetry")]
25use opentelemetry::trace::Tracer;
26#[cfg(feature = "Telemetry")]
27use opentelemetry::trace::Span;
28
29use crate::{ApplicationState::ApplicationState, Environment::MountainEnvironment::MountainEnvironment};
30
31/// State build configuration
32#[derive(Debug)]
33pub struct StateBuildConfig {
34	/// Enable comprehensive validation
35	pub strict_validation:bool,
36	/// Enable state snapshotting
37	pub enable_snapshots:bool,
38	/// Log state initialization
39	pub verbose_logging:bool,
40}
41
42impl Default for StateBuildConfig {
43	fn default() -> Self {
44		Self {
45			#[cfg(feature = "Debug")]
46			strict_validation:true,
47			#[cfg(not(feature = "Debug"))]
48			strict_validation:false,
49			enable_snapshots:false,
50			#[cfg(feature = "Debug")]
51			verbose_logging:true,
52			#[cfg(not(feature = "Debug"))]
53			verbose_logging:false,
54		}
55	}
56}
57
58/// Build application state from environment
59///
60/// Creates the application state with all required capabilities
61/// injected from the MountainEnvironment.
62///
63/// # Parameters
64///
65/// - `environment`: Mountain environment containing all capabilities
66///
67/// # Returns
68///
69/// Initialized application state ready for use
70///
71/// # Errors
72///
73/// Returns error if required capabilities are not available
74pub fn Build(environment:MountainEnvironment) -> Result<ApplicationState, String> {
75	BuildWithConfig(environment, StateBuildConfig::default())
76}
77
78/// Build application state with custom configuration
79///
80/// # Parameters
81///
82/// - `environment`: Mountain environment
83/// - `config`: State build configuration
84///
85/// # Returns
86///
87/// Configured application state
88pub fn BuildWithConfig(environment:MountainEnvironment, config:StateBuildConfig) -> Result<ApplicationState, String> {
89	#[cfg(feature = "Telemetry")]
90	let span = global::tracer("StateBuild").start("Build");
91
92	info!("[StateBuild] Initializing application state");
93
94	if config.verbose_logging {
95		debug!("[StateBuild] Config: {:?}", config);
96	}
97
98	// Validate required capabilities if strict mode enabled
99	if config.strict_validation {
100		#[cfg(feature = "Telemetry")]
101		span.set_attribute(KeyValue::new("validation", "strict"));
102
103		if let Err(err) = ValidateCapabilities(&environment) {
104			error!("[StateBuild] Capability validation failed: {}", err);
105			#[cfg(feature = "Telemetry")]
106			span.set_attribute(KeyValue::new("error", err.clone()));
107			return Err(format!("Capability validation failed: {}", err));
108		}
109		info!("[StateBuild] All required capabilities validated");
110	}
111
112	// Create state with injected capabilities
113	let state = ApplicationState::default();
114
115	#[cfg(feature = "Telemetry")]
116	{
117		span.add_event("state_initialized", vec![]);
118		span.end();
119	}
120
121	info!("[StateBuild] Application state initialized successfully");
122	Ok(state)
123}
124
125/// Validate required capabilities are available
126fn ValidateCapabilities(_environment:&MountainEnvironment) -> Result<(), String> {
127	// Check critical capabilities
128	// TODO: Implement actual capability checks based on Environment API
129	Ok(())
130}
131
132/// Create minimal state for testing (reduced requirements)
133#[cfg(any(test, feature = "Test"))]
134pub fn BuildMinimal(_app_handle: tauri::AppHandle) -> Result<ApplicationState, String> {
135	info!("[StateBuild] Creating minimal test state");
136	// Create minimal ApplicationState for tests (no environment needed)
137	// The environment is created later in the actual application lifecycle
138	let app_state = ApplicationState::default();
139	Ok(app_state)
140}
141
142#[cfg(test)]
143mod tests {
144	use super::*;
145
146	// Note: These tests are disabled because MountainEnvironment::Create()
147	// requires a tauri::AppHandle which cannot be easily created in unit tests.
148	// Integration tests should be used instead.
149	#[test]
150	#[ignore = "Requires tauri::AppHandle - use integration tests instead"]
151	fn test_state_build() {
152		// Cannot create AppHandle in unit test context
153		// Integration tests should be used for this
154		unimplemented!("This test requires integration test setup with AppHandle");
155	}
156
157	#[test]
158	#[ignore = "Requires tauri::AppHandle - use integration tests instead"]
159	fn test_state_build_minimal() {
160		// Cannot create AppHandle in unit test context
161		// Integration tests should be used for this
162		unimplemented!("This test requires integration test setup with AppHandle");
163	}
164}