use serde::Serialize;
use crate::error::Error;
use crate::exec::exec;
#[derive(Serialize)]
struct PushArgs<'a, Payload: Serialize + ?Sized> {
event: &'a str,
value: &'a Payload,
#[serde(skip_serializing_if = "Option::is_none")]
target: Option<&'a str>,
}
pub fn push_event<Payload>(event: &str, payload: &Payload) -> Result<(), Error>
where
Payload: Serialize + ?Sized,
{
exec(
"push",
&PushArgs {
event,
value: payload,
target: None,
},
)
}
pub fn push_event_to<Payload>(
target: &str,
event: &str,
payload: &Payload,
) -> Result<(), Error>
where
Payload: Serialize + ?Sized,
{
exec(
"push",
&PushArgs {
event,
value: payload,
target: Some(target),
},
)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::exec::encode_command;
use serde_json::Value;
#[derive(Serialize)]
struct Submit<'a> {
word: &'a str,
route: &'a [usize],
}
#[test]
fn without_target() {
let submit = Submit {
word: "TRY",
route: &[0, 1, 2],
};
let args = PushArgs {
event: "submit_word",
value: &submit,
target: None,
};
let parsed: Value = serde_json::from_str(&encode_command("push", &args).unwrap()).unwrap();
assert_eq!(parsed[0][0], "push");
assert_eq!(parsed[0][1]["event"], "submit_word");
assert_eq!(parsed[0][1]["value"]["word"], "TRY");
assert_eq!(parsed[0][1]["value"]["route"][2], 2);
assert!(parsed[0][1].get("target").is_none());
}
#[test]
fn with_target() {
let args = PushArgs {
event: "noop",
value: &serde_json::json!({}),
target: Some("#form"),
};
let parsed: Value = serde_json::from_str(&encode_command("push", &args).unwrap()).unwrap();
assert_eq!(parsed[0][1]["target"], "#form");
}
#[test]
fn non_wasm_stubs_to_ok() {
assert!(push_event("ping", &serde_json::json!({})).is_ok());
}
}