use ruma_common::{OwnedTransactionId, serde::StringEnum};
use ruma_macros::EventContent;
use serde::{Deserialize, Serialize};
use crate::{PrivOwnedStr, relation::Reference};
#[derive(Clone, Debug, Deserialize, Serialize, EventContent)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
#[ruma_event(type = "m.key.verification.cancel", kind = ToDevice)]
pub struct ToDeviceKeyVerificationCancelEventContent {
pub transaction_id: OwnedTransactionId,
pub reason: String,
pub code: CancelCode,
}
impl ToDeviceKeyVerificationCancelEventContent {
pub fn new(transaction_id: OwnedTransactionId, reason: String, code: CancelCode) -> Self {
Self { transaction_id, reason, code }
}
}
#[derive(Clone, Debug, Deserialize, Serialize, EventContent)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
#[ruma_event(type = "m.key.verification.cancel", kind = MessageLike)]
pub struct KeyVerificationCancelEventContent {
pub reason: String,
pub code: CancelCode,
#[serde(rename = "m.relates_to")]
pub relates_to: Reference,
}
impl KeyVerificationCancelEventContent {
pub fn new(reason: String, code: CancelCode, relates_to: Reference) -> Self {
Self { reason, code, relates_to }
}
}
#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/string_enum.md"))]
#[derive(Clone, StringEnum)]
#[ruma_enum(rename_all(prefix = "m.", rule = "snake_case"))]
#[non_exhaustive]
pub enum CancelCode {
User,
Timeout,
UnknownTransaction,
UnknownMethod,
UnexpectedMessage,
KeyMismatch,
UserMismatch,
InvalidMessage,
Accepted,
MismatchedCommitment,
MismatchedSas,
#[doc(hidden)]
_Custom(PrivOwnedStr),
}
#[cfg(test)]
mod tests {
use ruma_common::canonical_json::assert_to_canonical_json_eq;
use serde_json::{from_value as from_json_value, json};
use super::CancelCode;
#[test]
fn cancel_codes_serialize_to_display_form() {
assert_to_canonical_json_eq!(CancelCode::User, json!("m.user"));
}
#[test]
fn custom_cancel_codes_serialize_to_display_form() {
assert_to_canonical_json_eq!(CancelCode::from("io.ruma.test"), json!("io.ruma.test"));
}
#[test]
fn cancel_codes_deserialize_from_display_form() {
assert_eq!(from_json_value::<CancelCode>(json!("m.user")).unwrap(), CancelCode::User);
}
#[test]
fn custom_cancel_codes_deserialize_from_display_form() {
assert_eq!(
from_json_value::<CancelCode>(json!("io.ruma.test")).unwrap(),
"io.ruma.test".into()
);
}
}