74 lines
2.2 KiB
Rust
74 lines
2.2 KiB
Rust
//! Platform abstraction layer
|
|
//!
|
|
//! This module provides platform-agnostic interfaces for OS/hardware interaction:
|
|
//! - **input**: Abstract input events (keyboard, mouse, touch, gestures)
|
|
//! - **desktop**: Concrete winit-based implementation for desktop platforms
|
|
//! - **ios**: Concrete UIKit-based implementation for iOS
|
|
//!
|
|
//! The `run_executor()` function is the main entry point and automatically
|
|
//! selects the correct platform-specific executor based on compilation target.
|
|
|
|
use std::path::PathBuf;
|
|
|
|
pub mod input;
|
|
|
|
#[cfg(target_os = "ios")]
|
|
pub mod ios;
|
|
|
|
#[cfg(not(target_os = "ios"))]
|
|
pub mod desktop;
|
|
|
|
// Re-export the appropriate executor based on target platform
|
|
#[cfg(target_os = "ios")]
|
|
pub use ios::run_executor;
|
|
|
|
#[cfg(not(target_os = "ios"))]
|
|
pub use desktop::run_executor;
|
|
|
|
/// Sanitize app name for safe filesystem usage
|
|
///
|
|
/// Removes whitespace and converts to lowercase.
|
|
/// Example: "My App" -> "myapp"
|
|
pub fn sanitize_app_name(app_name: &str) -> String {
|
|
app_name.replace(char::is_whitespace, "").to_lowercase()
|
|
}
|
|
|
|
/// Get the database filename for an application
|
|
///
|
|
/// Returns sanitized app name with .db extension.
|
|
/// Example: "My App" -> "myapp.db"
|
|
pub fn get_database_filename(app_name: &str) -> String {
|
|
format!("{}.db", sanitize_app_name(app_name))
|
|
}
|
|
|
|
/// Get the full database path for an application
|
|
///
|
|
/// Combines platform-appropriate directory with sanitized database filename.
|
|
/// Example on iOS: "/path/to/Documents/myapp.db"
|
|
/// Example on desktop: "./myapp.db"
|
|
pub fn get_database_path(app_name: &str) -> PathBuf {
|
|
get_data_directory().join(get_database_filename(app_name))
|
|
}
|
|
|
|
/// Get the platform-appropriate data directory
|
|
///
|
|
/// - iOS: Returns the app's Documents directory (via dirs crate)
|
|
/// - Desktop: Returns the current directory
|
|
pub fn get_data_directory() -> PathBuf {
|
|
#[cfg(target_os = "ios")]
|
|
{
|
|
// Use dirs crate for proper iOS document directory access
|
|
if let Some(doc_dir) = dirs::document_dir() {
|
|
doc_dir
|
|
} else {
|
|
tracing::warn!("Failed to get iOS document directory, using current directory");
|
|
PathBuf::from(".")
|
|
}
|
|
}
|
|
|
|
#[cfg(not(target_os = "ios"))]
|
|
{
|
|
PathBuf::from(".")
|
|
}
|
|
}
|