use serde_json::{Map, Value, json};
use super::{Action, opt_str_of, str_of};
pub(crate) const LOGIN: &str = "login";
pub(crate) const ENROLL: &str = "enroll";
pub(super) fn encode_enroll(request: &crate::registry::enroll::Request) -> Value {
let mut map = Map::new();
map.insert("op".to_owned(), json!(ENROLL));
map.insert("workspace".to_owned(), json!(request.workspace));
map.insert("name".to_owned(), json!(request.name));
map.insert("grade".to_owned(), json!(request.grade.word()));
if let Some(address) = &request.address {
map.insert("address".to_owned(), json!(address));
}
Value::Object(map)
}
pub(super) fn encode_login(workspace: &str, provider: &str) -> Value {
json!({ "op": LOGIN, "workspace": workspace, "provider": provider })
}
pub(super) fn decode(op: &str, o: &Map<String, Value>) -> Result<Action, String> {
if op == LOGIN {
return Ok(Action::Login {
workspace: str_of(o, "workspace")?,
provider: str_of(o, "provider")?,
});
}
Ok(Action::Enroll(crate::registry::enroll::Request {
workspace: str_of(o, "workspace")?,
name: str_of(o, "name")?,
grade: grade_of(&str_of(o, "grade")?)?,
address: opt_str_of(o, "address")?,
}))
}
pub(crate) fn grade_of(word: &str) -> Result<crate::registry::Grade, String> {
crate::registry::Grade::of(word).ok_or_else(|| format!("unknown grade {word:?}"))
}