Files
marathon/crates/libmarathon/src/platform/mod.rs
2026-02-07 18:18:57 +00:00

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(".")
}
}