use sim_kernel::{Expr, Symbol};
pub use sim_value::access::as_i64 as as_int;
pub use sim_value::access::field as get;
pub use sim_value::access::set;
pub use sim_value::build::sym as key;
pub use sim_value::build::{int, map};
pub const WORKSPACE_CLASS: &str = "web/Workspace";
pub fn new_workspace(mode: &str) -> Expr {
map(vec![
("class", Expr::Symbol(Symbol::qualified("web", "Workspace"))),
("mode", Expr::Symbol(Symbol::new(mode))),
("panes", Expr::List(Vec::new())),
("focus", Expr::Nil),
("session", Expr::Nil),
("history", Expr::Nil),
(
"palette",
map(vec![
("open", Expr::Bool(false)),
("query", Expr::String(String::new())),
]),
),
])
}
pub fn mode(workspace: &Expr) -> Option<Symbol> {
match get(workspace, "mode") {
Some(Expr::Symbol(symbol)) => Some(symbol.clone()),
_ => None,
}
}
pub fn panes(workspace: &Expr) -> Vec<Expr> {
match get(workspace, "panes") {
Some(Expr::List(items)) => items.clone(),
_ => Vec::new(),
}
}
pub fn focus(workspace: &Expr) -> Option<Symbol> {
match get(workspace, "focus") {
Some(Expr::Symbol(symbol)) => Some(symbol.clone()),
_ => None,
}
}
pub fn with_panes(workspace: &Expr, panes: Vec<Expr>) -> Expr {
set(workspace, "panes", Expr::List(panes))
}