use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::binary::Binary;
use crate::to_json_binary;
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum StdAck {
#[serde(rename = "result")]
Success(Binary),
Error(String),
}
impl StdAck {
pub fn success(data: impl Into<Binary>) -> Self {
StdAck::Success(data.into())
}
pub fn error(err: impl Into<String>) -> Self {
StdAck::Error(err.into())
}
#[must_use = "if you intended to assert that this is a success, consider `.unwrap()` instead"]
#[inline]
pub const fn is_success(&self) -> bool {
matches!(*self, StdAck::Success(_))
}
#[must_use = "if you intended to assert that this is an error, consider `.unwrap_err()` instead"]
#[inline]
pub const fn is_error(&self) -> bool {
!self.is_success()
}
pub fn to_binary(&self) -> Binary {
to_json_binary(&self).unwrap()
}
pub fn unwrap(self) -> Binary {
match self {
StdAck::Success(data) => data,
StdAck::Error(err) => panic!("{}", err),
}
}
pub fn unwrap_err(self) -> String {
match self {
StdAck::Success(_) => panic!("not an error"),
StdAck::Error(err) => err,
}
}
}
impl From<StdAck> for Binary {
fn from(original: StdAck) -> Binary {
original.to_binary()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn stdack_success_works() {
let success = StdAck::success(b"foo");
match success {
StdAck::Success(data) => assert_eq!(data, b"foo"),
StdAck::Error(_err) => panic!("must not be an error"),
}
}
#[test]
fn stdack_error_works() {
let err = StdAck::error("bar");
match err {
StdAck::Success(_data) => panic!("must not be a success"),
StdAck::Error(err) => assert_eq!(err, "bar"),
}
}
#[test]
fn stdack_is_success_is_error_work() {
let success = StdAck::success(b"foo");
let err = StdAck::error("bar");
assert!(success.is_success());
assert!(!err.is_success());
assert!(!success.is_error());
assert!(err.is_error());
}
#[test]
fn stdack_to_binary_works() {
let ack1 = StdAck::success(b"\x01");
assert_eq!(ack1.to_binary(), br#"{"result":"AQ=="}"#);
let ack2 = StdAck::error("kaputt");
assert_eq!(ack2.to_binary(), br#"{"error":"kaputt"}"#);
}
}