crabcamera/
lib.rs

1//! CrabCamera: Advanced cross-platform camera integration for Tauri applications
2//!
3//! This crate provides unified camera access across desktop platforms
4//! with real-time processing capabilities and professional camera controls.
5//!
6//! # Features
7//! - Cross-platform camera access (Windows, macOS, Linux)
8//! - Real-time camera streaming and capture
9//! - Platform-specific optimizations
10//! - Professional camera controls
11//! - Thread-safe camera management
12//! - Multiple camera format support
13//!
14//! # Usage
15//! Add this to your `Cargo.toml`:
16//! ```toml
17//! [dependencies]
18//! crabcamera = { version = "0.6", features = ["recording", "audio"] }
19//! tauri = { version = "2.0", features = ["protocol-asset"] }
20//! ```
21//!
22//! Then in your Tauri app:
23//! ```rust,ignore
24//! use crabcamera;
25//!
26//! fn main() {
27//!     tauri::Builder::default()
28//!         .plugin(crabcamera::init())
29//!         .run(tauri::generate_context!())
30//!         .expect("error while running tauri application");
31//! }
32//! ```
33pub mod commands;
34pub mod config;
35pub mod errors;
36pub mod focus_stack;
37#[cfg(feature = "headless")]
38pub mod headless;
39pub mod permissions;
40pub mod platform;
41pub mod quality;
42#[cfg(any(feature = "headless", feature = "audio"))]
43pub mod timing;
44pub mod types;
45
46#[cfg(feature = "recording")]
47pub mod recording;
48
49#[cfg(feature = "audio")]
50pub mod audio;
51
52// Tests module - available for external tests
53pub mod tests;
54
55// Testing utilities - synthetic data for offline testing
56pub mod testing;
57
58// Re-exports for convenience
59pub use errors::CameraError;
60pub use platform::{CameraSystem, PlatformCamera};
61pub use types::{
62    CameraDeviceInfo, CameraFormat, CameraFrame, CameraInitParams, FrameMetadata, Platform,
63};
64
65#[cfg(feature = "headless")]
66pub use headless::{list_controls, list_devices, list_formats, HeadlessSession};
67
68use tauri::{
69    plugin::{Builder, TauriPlugin},
70    Runtime,
71};
72
73/// Initialize the CrabCamera plugin with all commands
74pub fn init<R: Runtime>() -> TauriPlugin<R> {
75    Builder::new("crabcamera")
76        .invoke_handler(tauri::generate_handler![
77            // Initialization commands
78            commands::init::initialize_camera_system,
79            commands::init::get_available_cameras,
80            commands::init::get_platform_info,
81            commands::init::test_camera_system,
82            commands::init::get_current_platform,
83            commands::init::check_camera_availability,
84            commands::init::get_camera_formats,
85            commands::init::get_recommended_format,
86            commands::init::get_optimal_settings,
87            commands::init::get_system_diagnostics,
88            // Permission commands
89            commands::permissions::request_camera_permission,
90            commands::permissions::check_camera_permission_status,
91            commands::permissions::get_permission_status_string,
92            // Capture commands
93            commands::capture::capture_single_photo,
94            commands::capture::capture_photo_sequence,
95            commands::capture::capture_with_quality_retry,
96            commands::capture::start_camera_preview,
97            commands::capture::stop_camera_preview,
98            commands::capture::release_camera,
99            commands::capture::get_capture_stats,
100            commands::capture::save_frame_to_disk,
101            commands::capture::save_frame_compressed,
102            commands::capture::set_frame_callback,
103            // Advanced camera commands
104            commands::advanced::set_camera_controls,
105            commands::advanced::get_camera_controls,
106            commands::advanced::capture_burst_sequence,
107            commands::advanced::set_manual_focus,
108            commands::advanced::set_manual_exposure,
109            commands::advanced::set_white_balance,
110            commands::advanced::capture_hdr_sequence,
111            commands::advanced::capture_focus_stack_legacy,
112            commands::advanced::get_camera_performance,
113            commands::advanced::test_camera_capabilities,
114            // Quality validation commands
115            commands::quality::validate_frame_quality,
116            commands::quality::validate_provided_frame,
117            commands::quality::analyze_frame_blur,
118            commands::quality::analyze_frame_exposure,
119            commands::quality::update_quality_config,
120            commands::quality::get_quality_config,
121            commands::quality::capture_best_quality_frame,
122            commands::quality::auto_capture_with_quality,
123            commands::quality::analyze_quality_trends,
124            // Configuration commands
125            commands::config::get_config,
126            commands::config::update_config,
127            commands::config::reset_config,
128            commands::config::get_camera_config,
129            commands::config::get_full_quality_config,
130            commands::config::get_storage_config,
131            commands::config::get_advanced_config,
132            commands::config::update_camera_config,
133            commands::config::update_full_quality_config,
134            commands::config::update_storage_config,
135            commands::config::update_advanced_config,
136            // Device monitoring commands
137            commands::device_monitor::start_device_monitoring,
138            commands::device_monitor::stop_device_monitoring,
139            commands::device_monitor::poll_device_event,
140            commands::device_monitor::get_monitored_devices,
141            // Focus stacking commands
142            commands::focus_stack::capture_focus_stack,
143            commands::focus_stack::capture_focus_brackets_command,
144            commands::focus_stack::get_default_focus_config,
145            commands::focus_stack::validate_focus_config,
146        ])
147        .build()
148}
149
150/// Detect the current platform using the Platform enum
151pub fn current_platform() -> Platform {
152    Platform::current()
153}
154
155/// Get current platform as string (legacy compatibility)
156pub fn current_platform_string() -> String {
157    Platform::current().as_str().to_string()
158}
159
160/// Initialize logging for the camera system
161pub fn init_logging() {
162    if std::env::var("RUST_LOG").is_err() {
163        std::env::set_var("RUST_LOG", "crabcamera=info");
164    }
165    let _ = env_logger::try_init();
166}
167
168/// Version information
169pub const VERSION: &str = env!("CARGO_PKG_VERSION");
170pub const NAME: &str = env!("CARGO_PKG_NAME");
171pub const DESCRIPTION: &str = env!("CARGO_PKG_DESCRIPTION");
172
173/// Get crate information
174pub fn get_info() -> CrateInfo {
175    CrateInfo {
176        name: NAME.to_string(),
177        version: VERSION.to_string(),
178        description: DESCRIPTION.to_string(),
179        platform: Platform::current(),
180    }
181}
182
183/// Crate information structure
184#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
185pub struct CrateInfo {
186    pub name: String,
187    pub version: String,
188    pub description: String,
189    pub platform: Platform,
190}
191
192#[cfg(test)]
193mod lib_tests {
194    use super::*;
195
196    #[test]
197    fn test_platform_detection() {
198        let platform = current_platform();
199        assert_ne!(platform, Platform::Unknown);
200    }
201
202    #[test]
203    fn test_platform_string() {
204        let platform_str = current_platform_string();
205        assert!(!platform_str.is_empty());
206    }
207
208    #[test]
209    fn test_crate_info() {
210        let info = get_info();
211        assert_eq!(info.name, "crabcamera");
212        assert!(!info.version.is_empty());
213        assert!(!info.description.is_empty());
214    }
215}