pub mod desktop;
pub mod web;
#[cfg(target_os = "ios")]
pub mod ios;
#[cfg(target_os = "android")]
pub mod android;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Target {
Desktop,
Web,
IOS,
Android,
}
impl Target {
pub fn parse(s: &str) -> Option<Self> {
match s.to_lowercase().as_str() {
"desktop" => Some(Target::Desktop),
"web" | "wasm" => Some(Target::Web),
"ios" | "iphone" => Some(Target::IOS),
"android" => Some(Target::Android),
_ => None,
}
}
pub fn is_mobile(&self) -> bool {
matches!(self, Target::IOS | Target::Android)
}
pub fn name(&self) -> &'static str {
match self {
Target::Desktop => "desktop",
Target::Web => "web",
Target::IOS => "ios",
Target::Android => "android",
}
}
}
pub trait Renderer {
fn render(&mut self, vnode: &crate::vdom::VNode);
fn handle_event(&mut self, event: Event);
fn update(&mut self);
}
#[derive(Debug, Clone)]
pub enum Event {
Click { x: f32, y: f32 },
KeyPress { key: String },
TextInput { text: String },
Gesture(GestureEvent),
}
#[derive(Debug, Clone)]
pub enum GestureEvent {
Swipe {
direction: SwipeDirection,
velocity: f32,
},
Pinch { scale: f32 },
LongPress { x: f32, y: f32, duration: f32 },
Pan { dx: f32, dy: f32 },
}
#[derive(Debug, Clone, Copy)]
pub enum SwipeDirection {
Up,
Down,
Left,
Right,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_target_from_str() {
assert_eq!(Target::parse("desktop"), Some(Target::Desktop));
assert_eq!(Target::parse("web"), Some(Target::Web));
assert_eq!(Target::parse("ios"), Some(Target::IOS));
assert_eq!(Target::parse("android"), Some(Target::Android));
assert_eq!(Target::parse("invalid"), None);
}
#[test]
fn test_is_mobile() {
assert!(!Target::Desktop.is_mobile());
assert!(!Target::Web.is_mobile());
assert!(Target::IOS.is_mobile());
assert!(Target::Android.is_mobile());
}
#[test]
fn test_target_name() {
assert_eq!(Target::Desktop.name(), "desktop");
assert_eq!(Target::Web.name(), "web");
assert_eq!(Target::IOS.name(), "ios");
assert_eq!(Target::Android.name(), "android");
}
}