use serde_json::{Map, Value, json};
use crate::fleet::Verb;
use super::{Action, Gesture, encode_path, path_of, usize_of};
pub(crate) const ARM: &str = "fleet";
pub(crate) const DISARM: &str = "disband";
pub(super) fn encode(verb: &Verb) -> Value {
match verb {
Verb::Arm {
workspace,
project,
cap,
} => json!({ "op": ARM, "workspace": encode_path(workspace),
"project": encode_path(project), "cap": cap }),
Verb::Disarm { workspace } => {
json!({ "op": DISARM, "workspace": encode_path(workspace) })
}
}
}
pub(super) fn decode(op: &str, o: &Map<String, Value>) -> Result<Gesture, String> {
let workspace = path_of(o, "workspace")?;
let verb = match op {
ARM => Verb::Arm {
workspace,
project: path_of(o, "project")?,
cap: usize_of(o, "cap")?,
},
_ => Verb::Disarm { workspace },
};
Ok(Gesture::Act(Action::Fleet(verb)))
}