1pub 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
52pub mod tests;
54
55pub mod testing;
57
58pub 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
73pub fn init<R: Runtime>() -> TauriPlugin<R> {
75 Builder::new("crabcamera")
76 .invoke_handler(tauri::generate_handler![
77 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 commands::permissions::request_camera_permission,
90 commands::permissions::check_camera_permission_status,
91 commands::permissions::get_permission_status_string,
92 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 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 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 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 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 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
150pub fn current_platform() -> Platform {
152 Platform::current()
153}
154
155pub fn current_platform_string() -> String {
157 Platform::current().as_str().to_string()
158}
159
160pub 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
168pub const VERSION: &str = env!("CARGO_PKG_VERSION");
170pub const NAME: &str = env!("CARGO_PKG_NAME");
171pub const DESCRIPTION: &str = env!("CARGO_PKG_DESCRIPTION");
172
173pub 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#[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}