Skip to main content

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 invariant_ppt;
40pub mod permissions;
41pub mod platform;
42pub mod quality;
43#[cfg(any(feature = "headless", feature = "audio"))]
44pub mod timing;
45pub mod types;
46
47#[cfg(feature = "recording")]
48pub mod recording;
49
50#[cfg(feature = "audio")]
51pub mod audio;
52
53// Tests module - available for external tests
54pub mod tests;
55
56// Testing utilities - synthetic data for offline testing
57pub mod testing;
58
59// Re-exports for convenience
60pub use errors::CameraError;
61pub use platform::{CameraSystem, PlatformCamera};
62pub use types::{
63    CameraDeviceInfo, CameraFormat, CameraFrame, CameraInitParams, FrameMetadata, Platform,
64};
65
66#[cfg(feature = "headless")]
67pub use headless::{list_controls, list_devices, list_formats, HeadlessSession};
68
69use tauri::{
70    plugin::{Builder, TauriPlugin},
71    Runtime,
72};
73
74/// Initialize the CrabCamera plugin with all commands
75pub fn init<R: Runtime>() -> TauriPlugin<R> {
76    Builder::new("crabcamera")
77        .invoke_handler(tauri::generate_handler![
78            // Initialization commands
79            commands::init::initialize_camera_system,
80            commands::init::get_available_cameras,
81            commands::init::get_platform_info,
82            commands::init::test_camera_system,
83            commands::init::get_current_platform,
84            commands::init::check_camera_availability,
85            commands::init::get_camera_formats,
86            commands::init::get_recommended_format,
87            commands::init::get_optimal_settings,
88            commands::init::get_system_diagnostics,
89            // Permission commands
90            commands::permissions::request_camera_permission,
91            commands::permissions::check_camera_permission_status,
92            commands::permissions::get_permission_status_string,
93            // Capture commands
94            commands::capture::capture_single_photo,
95            commands::capture::capture_photo_sequence,
96            commands::capture::capture_with_quality_retry,
97            commands::capture::start_camera_preview,
98            commands::capture::stop_camera_preview,
99            commands::capture::release_camera,
100            commands::capture::get_capture_stats,
101            commands::capture::save_frame_to_disk,
102            commands::capture::save_frame_compressed,
103            commands::capture::set_frame_callback,
104            // Advanced camera commands
105            commands::advanced::set_camera_controls,
106            commands::advanced::get_camera_controls,
107            commands::advanced::capture_burst_sequence,
108            commands::advanced::set_manual_focus,
109            commands::advanced::set_manual_exposure,
110            commands::advanced::set_white_balance,
111            commands::advanced::capture_hdr_sequence,
112            commands::advanced::capture_focus_stack_legacy,
113            commands::advanced::get_camera_performance,
114            commands::advanced::test_camera_capabilities,
115            // Quality validation commands
116            commands::quality::validate_frame_quality,
117            commands::quality::validate_provided_frame,
118            commands::quality::analyze_frame_blur,
119            commands::quality::analyze_frame_exposure,
120            commands::quality::update_quality_config,
121            commands::quality::get_quality_config,
122            commands::quality::capture_best_quality_frame,
123            commands::quality::auto_capture_with_quality,
124            commands::quality::analyze_quality_trends,
125            // Configuration commands
126            commands::config::get_config,
127            commands::config::update_config,
128            commands::config::reset_config,
129            commands::config::get_camera_config,
130            commands::config::get_full_quality_config,
131            commands::config::get_storage_config,
132            commands::config::get_advanced_config,
133            commands::config::update_camera_config,
134            commands::config::update_full_quality_config,
135            commands::config::update_storage_config,
136            commands::config::update_advanced_config,
137            // Device monitoring commands
138            commands::device_monitor::start_device_monitoring,
139            commands::device_monitor::stop_device_monitoring,
140            commands::device_monitor::poll_device_event,
141            commands::device_monitor::get_monitored_devices,
142            // Focus stacking commands
143            commands::focus_stack::capture_focus_stack,
144            commands::focus_stack::capture_focus_brackets_command,
145            commands::focus_stack::get_default_focus_config,
146            commands::focus_stack::validate_focus_config,
147        ])
148        .build()
149}
150
151/// Detect the current platform using the Platform enum
152pub fn current_platform() -> Platform {
153    Platform::current()
154}
155
156/// Get current platform as string (legacy compatibility)
157pub fn current_platform_string() -> String {
158    Platform::current().as_str().to_string()
159}
160
161/// Initialize logging for the camera system
162pub fn init_logging() {
163    if std::env::var("RUST_LOG").is_err() {
164        std::env::set_var("RUST_LOG", "crabcamera=info");
165    }
166    let _ = env_logger::try_init();
167}
168
169/// Version information
170pub const VERSION: &str = env!("CARGO_PKG_VERSION");
171pub const NAME: &str = env!("CARGO_PKG_NAME");
172pub const DESCRIPTION: &str = env!("CARGO_PKG_DESCRIPTION");
173
174/// Get crate information
175pub fn get_info() -> CrateInfo {
176    CrateInfo {
177        name: NAME.to_string(),
178        version: VERSION.to_string(),
179        description: DESCRIPTION.to_string(),
180        platform: Platform::current(),
181    }
182}
183
184/// Crate information structure
185#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
186pub struct CrateInfo {
187    pub name: String,
188    pub version: String,
189    pub description: String,
190    pub platform: Platform,
191}
192
193#[cfg(test)]
194mod lib_tests {
195    use super::*;
196
197    #[test]
198    fn test_platform_detection() {
199        let platform = current_platform();
200        assert_ne!(platform, Platform::Unknown);
201    }
202
203    #[test]
204    fn test_platform_string() {
205        let platform_str = current_platform_string();
206        assert!(!platform_str.is_empty());
207    }
208
209    #[test]
210    fn test_crate_info() {
211        let info = get_info();
212        assert_eq!(info.name, "crabcamera");
213        assert!(!info.version.is_empty());
214        assert!(!info.description.is_empty());
215    }
216}