1pub 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
53pub mod tests;
55
56pub mod testing;
58
59pub 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
74pub fn init<R: Runtime>() -> TauriPlugin<R> {
76 Builder::new("crabcamera")
77 .invoke_handler(tauri::generate_handler![
78 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 commands::permissions::request_camera_permission,
91 commands::permissions::check_camera_permission_status,
92 commands::permissions::get_permission_status_string,
93 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 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 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 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 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 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
151pub fn current_platform() -> Platform {
153 Platform::current()
154}
155
156pub fn current_platform_string() -> String {
158 Platform::current().as_str().to_string()
159}
160
161pub 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
169pub const VERSION: &str = env!("CARGO_PKG_VERSION");
171pub const NAME: &str = env!("CARGO_PKG_NAME");
172pub const DESCRIPTION: &str = env!("CARGO_PKG_DESCRIPTION");
173
174pub 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#[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}