use crate::http_envelope::unwrap_sync_envelope;
use helix_core::tick::PortOutcome;
use helix_core::EffectSink;
pub(crate) fn emit_members_by_ids(req_id: &str, outcome: &PortOutcome, out: &mut EffectSink) {
match outcome {
PortOutcome::Ok(reply) => match unwrap_sync_envelope(reply.0.as_ref()) {
Ok(raw_body) => {
out.push(crate::read_relay::emit_read_result(
req_id,
raw_body.as_ref(),
));
let body: serde_json::Value =
serde_json::from_slice(raw_body.as_ref()).unwrap_or(serde_json::Value::Null);
for (cid, members) in crate::render_ready_members::members_from_byids_body(&body) {
out.push(crate::render_ready_members::emit_channel_members(
&cid,
members,
Vec::new(),
crate::render_ready_members::MemberProjectionMode::Snapshot,
));
}
}
Err(e) => {
tracing::warn!(req_id, error = ?e, "byIds members reply envelope decode failed");
out.push(crate::read_relay::emit_read_error(
req_id,
"response envelope decode failed",
));
}
},
PortOutcome::Err(e) => {
tracing::warn!(req_id, error = ?e, "byIds members http failed");
out.push(crate::read_relay::emit_read_error(
req_id,
"http request failed",
));
}
}
}
pub(crate) fn emit_contact_candidates(req_id: &str, outcome: &PortOutcome, out: &mut EffectSink) {
match outcome {
PortOutcome::Ok(reply) => match unwrap_sync_envelope(reply.0.as_ref()) {
Ok(raw_body) => {
let body: serde_json::Value =
serde_json::from_slice(raw_body.as_ref()).unwrap_or(serde_json::Value::Null);
out.push(crate::render_ready_candidates::emit(req_id, &body));
}
Err(_) => out.push(crate::render_ready_candidates::emit_error(
req_id,
"response envelope decode failed",
)),
},
PortOutcome::Err(_) => out.push(crate::render_ready_candidates::emit_error(
req_id,
"http request failed",
)),
}
}
pub(crate) fn normalize_replies(
request: &crate::render_ready_replies::ReplyProjectionRequest,
outcome: &PortOutcome,
revisions: &mut std::collections::HashMap<String, u64>,
seen_ids: &mut std::collections::HashMap<String, std::collections::HashSet<String>>,
) -> Option<crate::render_ready_replies::FlatReplyProjection> {
let req_id = request.req_id.as_str();
match outcome {
PortOutcome::Ok(reply) => match unwrap_sync_envelope(reply.0.as_ref()) {
Ok(raw_body) => {
let body: serde_json::Value = match serde_json::from_slice(raw_body.as_ref()) {
Ok(body) => body,
Err(error) => {
tracing::warn!(req_id, error = ?error, "replies authority JSON decode failed");
return None;
}
};
let mut projection = crate::render_ready_replies::finalize_projection(
request,
crate::render_ready_replies::extract_flat_replies(
&body,
request.viewer_user_id.as_str(),
),
);
if crate::render_ready_replies::accept_projection(
&mut projection,
revisions,
seen_ids,
) {
return Some(projection);
}
}
Err(e) => {
tracing::warn!(req_id, error = ?e, "replies reply envelope decode failed");
}
},
PortOutcome::Err(e) => {
tracing::warn!(req_id, error = ?e, "replies http failed");
}
}
None
}
pub(crate) fn emit_create_posts_result(
req_id: &str,
outcome: &PortOutcome,
out: &mut EffectSink,
) -> Result<(), crate::ImError> {
let event = match outcome {
PortOutcome::Ok(reply) => match unwrap_sync_envelope(reply.0.as_ref()) {
Ok(raw_body) => {
let body =
serde_json::from_slice(raw_body.as_ref()).unwrap_or(serde_json::Value::Null);
crate::event::post::batch_result_from_authority(req_id, &body)?
}
Err(_) => crate::event::post::batch_error(req_id, "response envelope decode failed")?,
},
PortOutcome::Err(_) => crate::event::post::batch_error(req_id, "http request failed")?,
};
out.push(event.into_effect());
Ok(())
}
pub(crate) fn emit_post_readers(req_id: &str, outcome: &PortOutcome, out: &mut EffectSink) {
match outcome {
PortOutcome::Ok(reply) => match unwrap_sync_envelope(reply.0.as_ref()) {
Ok(raw_body) => {
let body =
serde_json::from_slice(raw_body.as_ref()).unwrap_or(serde_json::Value::Null);
for event in crate::query::render_ready::receipts::emit(&body) {
out.push(event);
}
}
Err(_) => {
out.push(crate::read_relay::emit_read_error(
req_id,
"response envelope decode failed",
));
}
},
PortOutcome::Err(_) => {
out.push(crate::read_relay::emit_read_error(
req_id,
"http request failed",
));
}
}
}