events: Create error type for extensible events conversion

This commit is contained in:
Kévin Commaille 2022-03-26 09:12:18 +01:00 committed by Kévin Commaille
parent 245bf75276
commit f9390c7c35
2 changed files with 13 additions and 10 deletions

View File

@ -51,6 +51,7 @@ use std::ops::Deref;
use ruma_macros::EventContent; use ruma_macros::EventContent;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use thiserror::Error;
pub(crate) mod content_serde; pub(crate) mod content_serde;
@ -248,3 +249,12 @@ impl Text {
"text/plain".to_owned() "text/plain".to_owned()
} }
} }
/// The error type returned when a conversion to an extensible event type fails.
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum TryFromExtensibleError {
/// A field is missing.
#[error("missing field `{0}`")]
MissingField(String),
}

View File

@ -3,15 +3,8 @@
use std::convert::TryFrom; use std::convert::TryFrom;
use serde::{ser::SerializeStruct, Deserialize, Serialize}; use serde::{ser::SerializeStruct, Deserialize, Serialize};
use thiserror::Error;
use super::{MessageContent, Text}; use super::{MessageContent, Text, TryFromExtensibleError};
#[derive(Error, Debug)]
pub enum MessageContentSerdeError {
#[error("missing field `m.message` or `m.text`")]
MissingMessage,
}
#[derive(Debug, Default, Deserialize)] #[derive(Debug, Default, Deserialize)]
pub(crate) struct MessageContentSerDeHelper { pub(crate) struct MessageContentSerDeHelper {
@ -33,7 +26,7 @@ pub(crate) struct MessageContentSerDeHelper {
} }
impl TryFrom<MessageContentSerDeHelper> for MessageContent { impl TryFrom<MessageContentSerDeHelper> for MessageContent {
type Error = MessageContentSerdeError; type Error = TryFromExtensibleError;
fn try_from(helper: MessageContentSerDeHelper) -> Result<Self, Self::Error> { fn try_from(helper: MessageContentSerDeHelper) -> Result<Self, Self::Error> {
let MessageContentSerDeHelper { let MessageContentSerDeHelper {
@ -48,7 +41,7 @@ impl TryFrom<MessageContentSerDeHelper> for MessageContent {
} else if let Some(text) = text_stable.or(text_unstable) { } else if let Some(text) = text_stable.or(text_unstable) {
Ok(Self::plain(text)) Ok(Self::plain(text))
} else { } else {
Err(MessageContentSerdeError::MissingMessage) Err(TryFromExtensibleError::MissingField("m.message or m.text".to_owned()))
} }
} }
} }