use serde_json::{Map, Value};
use super::super::Reply;
use crate::boundary::codec::fields::{opt_str_of, opt_val, str_of, strings_of};
pub(super) fn decode(kind: &str, o: &Map<String, Value>) -> Option<Result<Reply, String>> {
Some(match kind {
"transcript" => crate::transcript::wire::decode::transcript(o).map(Reply::Transcript),
"steps" => crate::steps_view::wire::decode::steps(o).map(Reply::Steps),
"step" => crate::steps_view::wire::decode::detail(o).map(Reply::Step),
"files" => files(o),
"rail" => crate::rail::wire::rail_of(o).map(Reply::Rail),
"governing" => governing(o),
"inbox" => crate::inboxview::wire::entries_of(o).map(Reply::Inbox),
"agent" => super::super::agent::view_of(o).map(Reply::Agent),
"work-diff" => work_diff(o),
_ => return None,
})
}
fn files(o: &Map<String, Value>) -> Result<Reply, String> {
Ok(Reply::Files {
view: crate::files_view::wire::view_of(o)?,
preview: opt_val(o, "preview", crate::files_view::wire::preview_of)?,
})
}
fn governing(o: &Map<String, Value>) -> Result<Reply, String> {
Ok(Reply::Governing(
crate::config_edit::branch::GoverningConfig {
oid: str_of(o, "oid")?,
short_oid: str_of(o, "short_oid")?,
branch_name_if_tip_of_one: opt_str_of(o, "branch")?,
files: strings_of(o, "files")?,
},
))
}
fn work_diff(o: &Map<String, Value>) -> Result<Reply, String> {
Ok(Reply::WorkDiff {
attempts: crate::workdiff::wire::attempts_of(o)?,
patch: opt_val(o, "patch", crate::files_view::wire::preview_of)?,
})
}