Implement first trybuild tests
and use a dedicated InvalidEvent constructor fn in EventContent derives
This commit is contained in:
parent
0c0dafa2c5
commit
7ec162678e
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,2 +1,5 @@
|
||||
Cargo.lock
|
||||
target
|
||||
|
||||
# trybuild generates a `wip` folder when creating or updating a test
|
||||
wip
|
||||
|
@ -26,6 +26,7 @@ strum = { version = "0.18.0", features = ["derive"] }
|
||||
maplit = "1.0.2"
|
||||
matches = "0.1.8"
|
||||
ruma-identifiers = { version = "0.16.2", features = ["rand"] }
|
||||
trybuild = "1.0.27"
|
||||
|
||||
[workspace]
|
||||
members = [
|
||||
|
@ -58,10 +58,9 @@ fn expand_room_event(input: DeriveInput) -> syn::Result<TokenStream> {
|
||||
content: Box<::serde_json::value::RawValue>
|
||||
) -> Result<Self, ::ruma_events::InvalidEvent> {
|
||||
if ev_type != #event_type {
|
||||
return Err(::ruma_events::InvalidEvent {
|
||||
kind: ::ruma_events::error::InvalidEventKind::Deserialization,
|
||||
message: format!("expected `{}` found {}", #event_type, ev_type),
|
||||
});
|
||||
return Err(
|
||||
::ruma_events::InvalidEvent::wrong_event_type(#event_type, ev_type)
|
||||
);
|
||||
}
|
||||
|
||||
let ev_json = ::ruma_events::EventJson::from(content);
|
||||
|
17
src/error.rs
17
src/error.rs
@ -11,17 +11,32 @@ use std::{
|
||||
/// message and a flag for which type of error was encountered.
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct InvalidEvent {
|
||||
/// A description of the error that occurred.
|
||||
pub(crate) message: String,
|
||||
/// The kind of error that occurred.
|
||||
pub(crate) kind: InvalidEventKind,
|
||||
}
|
||||
|
||||
/// The kind of error that occurred.
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||
pub enum InvalidEventKind {
|
||||
pub(crate) enum InvalidEventKind {
|
||||
/// A deserialization error from malformed input.
|
||||
Deserialization,
|
||||
/// An error occurred validating input according the the matrix spec.
|
||||
Validation,
|
||||
}
|
||||
|
||||
impl InvalidEvent {
|
||||
/// Constructor used in the event content macros.
|
||||
///
|
||||
/// This has to be public to allow the macros to be used outside of ruma-events.
|
||||
#[doc(hidden)]
|
||||
pub fn wrong_event_type(expected: &str, found: &str) -> Self {
|
||||
Self {
|
||||
message: format!("expected `{}` found {}", expected, found),
|
||||
kind: InvalidEventKind::Deserialization,
|
||||
}
|
||||
}
|
||||
/// A message describing why the event is invalid.
|
||||
pub fn message(&self) -> String {
|
||||
self.message.clone()
|
||||
|
7
tests/event_content.rs
Normal file
7
tests/event_content.rs
Normal file
@ -0,0 +1,7 @@
|
||||
#[test]
|
||||
fn ui() {
|
||||
let t = trybuild::TestCases::new();
|
||||
t.pass("tests/ui/01-sanity-check.rs");
|
||||
t.compile_fail("tests/ui/02-no-event-type.rs");
|
||||
t.compile_fail("tests/ui/03-invalid-event-type.rs");
|
||||
}
|
10
tests/ui/01-sanity-check.rs
Normal file
10
tests/ui/01-sanity-check.rs
Normal file
@ -0,0 +1,10 @@
|
||||
use ruma_events_macros::{FromRaw, StateEventContent};
|
||||
use serde::Serialize;
|
||||
|
||||
#[derive(Clone, Debug, Serialize, FromRaw, StateEventContent)]
|
||||
#[ruma_event(type = "m.macro.test")]
|
||||
pub struct MacroTest {
|
||||
pub url: String,
|
||||
}
|
||||
|
||||
fn main() {}
|
9
tests/ui/02-no-event-type.rs
Normal file
9
tests/ui/02-no-event-type.rs
Normal file
@ -0,0 +1,9 @@
|
||||
use ruma_events_macros::{FromRaw, StateEventContent};
|
||||
use serde::Serialize;
|
||||
|
||||
#[derive(Clone, Debug, Serialize, FromRaw, StateEventContent)]
|
||||
pub struct MacroTest {
|
||||
pub url: String,
|
||||
}
|
||||
|
||||
fn main() {}
|
7
tests/ui/02-no-event-type.stderr
Normal file
7
tests/ui/02-no-event-type.stderr
Normal file
@ -0,0 +1,7 @@
|
||||
error: no event type attribute found, add `#[ruma_events(type = "any.room.event")]` below the event content derive
|
||||
--> $DIR/02-no-event-type.rs:4:44
|
||||
|
|
||||
4 | #[derive(Clone, Debug, Serialize, FromRaw, StateEventContent)]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
16
tests/ui/03-invalid-event-type.rs
Normal file
16
tests/ui/03-invalid-event-type.rs
Normal file
@ -0,0 +1,16 @@
|
||||
use ruma_events_macros::{FromRaw, StateEventContent};
|
||||
use serde::Serialize;
|
||||
|
||||
#[derive(Clone, Debug, Serialize, FromRaw, StateEventContent)]
|
||||
#[not_ruma_event(type = "m.macro.test")]
|
||||
pub struct MacroTest {
|
||||
pub test: String,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Serialize, StateEventContent)]
|
||||
#[ruma_event(event = "m.macro.test")]
|
||||
pub struct MoreMacroTest {
|
||||
pub test: String,
|
||||
}
|
||||
|
||||
fn main() {}
|
19
tests/ui/03-invalid-event-type.stderr
Normal file
19
tests/ui/03-invalid-event-type.stderr
Normal file
@ -0,0 +1,19 @@
|
||||
error: expected `type`
|
||||
--> $DIR/03-invalid-event-type.rs:11:14
|
||||
|
|
||||
11 | #[ruma_event(event = "m.macro.test")]
|
||||
| ^^^^^
|
||||
|
||||
error: no event type attribute found, add `#[ruma_events(type = "any.room.event")]` below the event content derive
|
||||
--> $DIR/03-invalid-event-type.rs:4:44
|
||||
|
|
||||
4 | #[derive(Clone, Debug, Serialize, FromRaw, StateEventContent)]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: cannot find attribute `not_ruma_event` in this scope
|
||||
--> $DIR/03-invalid-event-type.rs:5:3
|
||||
|
|
||||
5 | #[not_ruma_event(type = "m.macro.test")]
|
||||
| ^^^^^^^^^^^^^^ help: a derive helper attribute with a similar name exists: `ruma_event`
|
Loading…
x
Reference in New Issue
Block a user