use std::any::Any;
use std::sync::Arc;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Selector(&'static str);
#[derive(Debug, Clone)]
pub struct Command {
pub selector: Selector,
object: Option<Arc<dyn Any>>,
}
pub mod sys {
use super::Selector;
pub const QUIT_APP: Selector = Selector::new("druid-builtin.quit-app");
pub const HIDE_APPLICATION: Selector = Selector::new("druid-builtin.menu-hide-application");
pub const HIDE_OTHERS: Selector = Selector::new("druid-builtin.menu-hide-others");
pub const NEW_WINDOW: Selector = Selector::new("druid-builtin.new-window");
pub const CLOSE_WINDOW: Selector = Selector::new("druid-builtin.close-window");
pub const SHOW_WINDOW: Selector = Selector::new("druid-builtin.show-window");
pub const SHOW_CONTEXT_MENU: Selector = Selector::new("druid-builtin.show-context-menu");
pub const SET_MENU: Selector = Selector::new("druid-builtin.set-menu");
pub const SHOW_PREFERENCES: Selector = Selector::new("druid-builtin.menu-show-preferences");
pub const SHOW_ABOUT: Selector = Selector::new("druid-builtin.menu-show-about");
pub const SHOW_ALL: Selector = Selector::new("druid-builtin.menu-show-all");
pub const NEW_FILE: Selector = Selector::new("druid-builtin.menu-file-new");
pub const SHOW_OPEN_PANEL: Selector = Selector::new("druid-builtin.menu-file-open");
pub const OPEN_FILE: Selector = Selector::new("druid-builtin.open-file-path");
pub const SHOW_SAVE_PANEL: Selector = Selector::new("druid-builtin.menu-file-save-as");
pub const SAVE_FILE: Selector = Selector::new("druid-builtin.menu-file-save");
pub const PRINT_SETUP: Selector = Selector::new("druid-builtin.menu-file-print-setup");
pub const PRINT: Selector = Selector::new("druid-builtin.menu-file-print");
pub const PRINT_PREVIEW: Selector = Selector::new("druid-builtin.menu-file-print");
pub const CUT: Selector = Selector::new("druid-builtin.menu-cut");
pub const COPY: Selector = Selector::new("druid-builtin.menu-copy");
pub const PASTE: Selector = Selector::new("druid-builtin.menu-paste");
pub const UNDO: Selector = Selector::new("druid-builtin.menu-undo");
pub const REDO: Selector = Selector::new("druid-builtin.menu-redo");
}
impl Selector {
pub const NOOP: Selector = Selector::new("");
pub const fn new(s: &'static str) -> Selector {
Selector(s)
}
}
impl Command {
pub fn new(selector: Selector, arg: impl Any) -> Self {
Command {
selector,
object: Some(Arc::new(arg)),
}
}
pub fn get_object<T: Any>(&self) -> Option<&T> {
match self.object.as_ref() {
None => None,
Some(obj) => obj.downcast_ref::<T>(),
}
}
}
impl From<Selector> for Command {
fn from(selector: Selector) -> Command {
Command {
selector,
object: None,
}
}
}
impl std::fmt::Display for Selector {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "Selector('{}')", self.0)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn get_object() {
let sel = Selector::new("my-selector");
let objs = vec![0, 1, 2];
let command = Command::new(sel, objs);
assert_eq!(command.get_object(), Some(&vec![0, 1, 2]));
}
}