refactor(engine): audit and rationalize platform cfg gates (closes #49)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
funman300
2026-05-27 18:00:57 -07:00
parent 561395fca6
commit ce536b0176
13 changed files with 302 additions and 243 deletions
@@ -0,0 +1,72 @@
use std::sync::Arc;
use bevy::prelude::Resource;
use thiserror::Error;
/// Abstracts platform-specific clipboard access for gameplay UI systems.
pub trait ClipboardBackend: Send + Sync + 'static {
/// Write plain text to the active OS clipboard.
fn set_text(&self, text: &str) -> Result<(), ClipboardError>;
}
/// Bevy resource that exposes the active clipboard backend.
#[derive(Resource, Clone)]
pub struct ClipboardBackendResource(pub Arc<dyn ClipboardBackend>);
/// Errors surfaced by platform clipboard backends.
#[derive(Debug, Error)]
pub enum ClipboardError {
#[cfg(all(not(target_os = "android"), not(target_arch = "wasm32")))]
#[error(transparent)]
Native(#[from] arboard::Error),
#[cfg(target_os = "android")]
#[error("android clipboard failed: {0}")]
Android(String),
#[cfg(all(target_arch = "wasm32", not(target_os = "android")))]
#[error("clipboard backend unavailable on wasm32")]
Unsupported,
}
/// Construct the default clipboard backend for the current platform.
pub fn default_clipboard_backend() -> Result<Arc<dyn ClipboardBackend>, ClipboardError> {
#[cfg(all(not(target_os = "android"), not(target_arch = "wasm32")))]
{
Ok(Arc::new(NativeClipboardBackend))
}
#[cfg(target_os = "android")]
{
Ok(Arc::new(AndroidClipboardBackend))
}
#[cfg(all(target_arch = "wasm32", not(target_os = "android")))]
{
Err(ClipboardError::Unsupported)
}
}
/// `arboard`-backed clipboard bridge for desktop targets.
#[cfg(all(not(target_os = "android"), not(target_arch = "wasm32")))]
#[derive(Debug, Default, Clone, Copy)]
pub struct NativeClipboardBackend;
#[cfg(all(not(target_os = "android"), not(target_arch = "wasm32")))]
impl ClipboardBackend for NativeClipboardBackend {
fn set_text(&self, text: &str) -> Result<(), ClipboardError> {
let mut clipboard = arboard::Clipboard::new()?;
clipboard.set_text(text.to_string())?;
Ok(())
}
}
/// JNI-backed clipboard bridge for Android targets.
#[cfg(target_os = "android")]
#[derive(Debug, Default, Clone, Copy)]
pub struct AndroidClipboardBackend;
#[cfg(target_os = "android")]
impl ClipboardBackend for AndroidClipboardBackend {
fn set_text(&self, text: &str) -> Result<(), ClipboardError> {
crate::android_clipboard::set_text(text).map_err(ClipboardError::Android)
}
}
+19 -3
View File
@@ -1,12 +1,28 @@
//! Platform abstraction layer.
//!
//! Traits defined here are implemented per target:
//! - native builds use filesystem-backed storage
//! - browser builds use `localStorage`
//! Target-specific implementations live here so gameplay and rendering systems
//! can depend on stable engine-facing abstractions instead of sprinkling
//! `#[cfg(...)]` branches through UI code.
pub mod clipboard;
pub mod storage;
pub mod time;
#[cfg(target_os = "android")]
/// `false` on touch-first Android builds, where UI buttons replace keyboard chips.
pub const SHOW_KEYBOARD_ACCELERATORS: bool = false;
#[cfg(not(target_os = "android"))]
/// `true` on desktop builds, where keyboard chips should be rendered.
pub const SHOW_KEYBOARD_ACCELERATORS: bool = true;
#[cfg(target_os = "android")]
/// `true` when the engine should prefer touch-optimised HUD affordances.
pub const USE_TOUCH_UI_LAYOUT: bool = true;
#[cfg(not(target_os = "android"))]
/// `false` when the engine should prefer desktop HUD affordances.
pub const USE_TOUCH_UI_LAYOUT: bool = false;
pub use clipboard::{ClipboardBackend, ClipboardBackendResource, default_clipboard_backend};
#[cfg(not(target_arch = "wasm32"))]
pub use storage::NativeStorage;
#[cfg(target_arch = "wasm32")]