use serde::Serialize;
use crate::error::Error;
use crate::exec::exec;
#[derive(Debug, Default, Clone, Copy)]
pub struct TransitionClasses<'a> {
pub transition: &'a [&'a str],
pub start: &'a [&'a str],
pub end: &'a [&'a str],
}
#[derive(Serialize)]
struct TransitionArgs<'a> {
transition: [&'a [&'a str]; 3],
#[serde(skip_serializing_if = "Option::is_none")]
to: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
time: Option<u32>,
}
pub fn transition(
classes: TransitionClasses<'_>,
to: Option<&str>,
time_ms: Option<u32>,
) -> Result<(), Error> {
exec(
"transition",
&TransitionArgs {
transition: [classes.transition, classes.start, classes.end],
to,
time: time_ms,
},
)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::exec::encode_command;
use serde_json::Value;
#[test]
fn encodes_three_class_lists() {
let classes = TransitionClasses {
transition: &["fade-in"],
start: &["opacity-0"],
end: &["opacity-100"],
};
let args = TransitionArgs {
transition: [classes.transition, classes.start, classes.end],
to: None,
time: Some(150),
};
let parsed: Value =
serde_json::from_str(&encode_command("transition", &args).unwrap()).unwrap();
assert_eq!(parsed[0][1]["transition"][0][0], "fade-in");
assert_eq!(parsed[0][1]["transition"][1][0], "opacity-0");
assert_eq!(parsed[0][1]["transition"][2][0], "opacity-100");
assert_eq!(parsed[0][1]["time"], 150);
assert!(parsed[0][1].get("to").is_none());
}
}