use super::super::RunWasmGcHost;
pub(crate) fn record_effect_if_recording(
caller: &mut wasmtime::Caller<'_, RunWasmGcHost>,
effect_type: &str,
args: Vec<aver::replay::JsonValue>,
outcome: aver::replay::JsonValue,
caller_fn: &str,
) {
if let Some(rec) = caller.data_mut().recorder.as_mut()
&& rec.mode() == aver::replay::EffectReplayMode::Record
{
rec.record_effect(
effect_type,
args,
aver::replay::RecordedOutcome::Value(outcome),
caller_fn,
0,
);
}
}
pub(crate) fn try_replay(
caller: &mut wasmtime::Caller<'_, RunWasmGcHost>,
effect_type: &str,
args: Vec<aver::replay::JsonValue>,
) -> Result<Option<aver::replay::JsonValue>, wasmtime::Error> {
let in_replay = caller
.data()
.recorder
.as_ref()
.is_some_and(|r| r.mode() == aver::replay::EffectReplayMode::Replay);
if !in_replay {
return Ok(None);
}
let outcome = caller
.data_mut()
.recorder
.as_mut()
.expect("checked above")
.replay_effect(effect_type, Some(args))
.map_err(|e| wasmtime::Error::msg(format!("replay {}: {:?}", effect_type, e)))?;
match outcome {
aver::replay::RecordedOutcome::Value(json) => Ok(Some(json)),
aver::replay::RecordedOutcome::RuntimeError(msg) => Err(wasmtime::Error::msg(format!(
"replay {}: trace recorded a runtime error ({})",
effect_type, msg
))),
}
}
pub(crate) fn json_ok(inner: aver::replay::JsonValue) -> aver::replay::JsonValue {
let mut obj = std::collections::BTreeMap::new();
obj.insert("$ok".to_string(), inner);
aver::replay::JsonValue::Object(obj)
}
pub(crate) fn json_err(msg: &str) -> aver::replay::JsonValue {
let mut obj = std::collections::BTreeMap::new();
obj.insert(
"$err".to_string(),
aver::replay::JsonValue::String(msg.to_string()),
);
aver::replay::JsonValue::Object(obj)
}
pub(crate) fn json_some(inner: aver::replay::JsonValue) -> aver::replay::JsonValue {
let mut obj = std::collections::BTreeMap::new();
obj.insert("$some".to_string(), inner);
aver::replay::JsonValue::Object(obj)
}
pub(crate) fn json_none() -> aver::replay::JsonValue {
let mut obj = std::collections::BTreeMap::new();
obj.insert("$none".to_string(), aver::replay::JsonValue::Bool(true));
aver::replay::JsonValue::Object(obj)
}
pub(crate) fn json_record(
type_name: &str,
fields: Vec<(&str, aver::replay::JsonValue)>,
) -> aver::replay::JsonValue {
let mut fields_obj = std::collections::BTreeMap::new();
for (k, v) in fields {
fields_obj.insert(k.to_string(), v);
}
let mut payload = std::collections::BTreeMap::new();
payload.insert(
"type".to_string(),
aver::replay::JsonValue::String(type_name.to_string()),
);
payload.insert(
"fields".to_string(),
aver::replay::JsonValue::Object(fields_obj),
);
let mut wrapper = std::collections::BTreeMap::new();
wrapper.insert(
"$record".to_string(),
aver::replay::JsonValue::Object(payload),
);
aver::replay::JsonValue::Object(wrapper)
}