use std::str::Utf8Error;
#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, thiserror::Error)]
#[non_exhaustive]
pub enum Error {
#[error("identifier or required part of it is empty")]
Empty,
#[error("identifier contains invalid characters")]
InvalidCharacters,
#[error("invalid matrix ID: {0}")]
InvalidMatrixId(#[from] MatrixIdError),
#[error("invalid matrix.to URI: {0}")]
InvalidMatrixToUri(#[from] MatrixToError),
#[error("invalid matrix URI: {0}")]
InvalidMatrixUri(#[from] MatrixUriError),
#[error("invalid Matrix Content URI: {0}")]
InvalidMxcUri(#[from] MxcUriError),
#[error("invalid VoIP version ID: {0}")]
InvalidVoipVersionId(#[from] VoipVersionIdError),
#[error("server name is not a valid IP address or domain name")]
InvalidServerName,
#[error("invalid UTF-8")]
InvalidUtf8,
#[error("ID exceeds 255 bytes")]
MaximumLengthExceeded,
#[error("required colon is missing")]
MissingColon,
#[error("leading sigil is incorrect or missing")]
MissingLeadingSigil,
}
impl From<Utf8Error> for Error {
fn from(_: Utf8Error) -> Self {
Self::InvalidUtf8
}
}
#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, thiserror::Error)]
#[non_exhaustive]
pub enum MxcUriError {
#[error("MXC URI schema was not mxc://")]
WrongSchema,
#[error("MXC URI does not have first slash")]
MissingSlash,
#[error("Media Identifier malformed, invalid characters")]
MediaIdMalformed,
#[error("invalid Server Name")]
ServerNameMalformed,
}
#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, thiserror::Error)]
#[non_exhaustive]
pub enum MatrixIdError {
#[error("invalid number of parts")]
InvalidPartsNumber,
#[error("missing room ID or alias")]
MissingRoom,
#[error("no identifier")]
NoIdentifier,
#[error("too many identifiers")]
TooManyIdentifiers,
#[error("unknown identifier")]
UnknownIdentifier,
#[error("unknown identifier pair")]
UnknownIdentifierPair,
#[error("unknown identifier type")]
UnknownType,
}
#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, thiserror::Error)]
#[non_exhaustive]
pub enum MatrixToError {
#[error("given string is not a valid URL")]
InvalidUrl,
#[error("base URL is not https://matrix.to/#/")]
WrongBaseUrl,
#[error("unknown additional argument")]
UnknownArgument,
}
#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, thiserror::Error)]
#[non_exhaustive]
pub enum MatrixUriError {
#[error("scheme is not 'matrix:'")]
WrongScheme,
#[error("too many actions")]
TooManyActions,
#[error("unknown query item")]
UnknownQueryItem,
}
#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, thiserror::Error)]
#[non_exhaustive]
pub enum VoipVersionIdError {
#[error("UInt value is not 0")]
WrongUintValue,
}
#[cfg(test)]
mod tests {
use std::mem::size_of;
use super::Error;
#[test]
fn small_error_type() {
assert!(size_of::<Error>() <= 8);
}
}