11#[ derive( Clone , Debug ) ]
22#[ cfg_attr( feature = "unstable-schema" , derive( schemars:: JsonSchema ) ) ]
3- #[ cfg_attr( feature = "serde" , derive( serde:: Serialize ) ) ]
4- #[ cfg_attr( feature = "serde" , serde( rename_all = "kebab-case " ) ) ]
3+ #[ cfg_attr( feature = "serde" , derive( serde:: Serialize , serde :: Deserialize ) ) ]
4+ #[ cfg_attr( feature = "serde" , serde( rename_all = "snake_case " ) ) ]
55#[ cfg_attr( feature = "serde" , serde( tag = "event" ) ) ]
66pub enum Event {
77 DiscoverStart ,
88 DiscoverCase {
99 name : String ,
10+ #[ cfg_attr(
11+ feature = "serde" ,
12+ serde( default , skip_serializing_if = "RunMode::is_default" )
13+ ) ]
1014 mode : RunMode ,
15+ /// Whether selected to be run by the user
16+ #[ cfg_attr(
17+ feature = "serde" ,
18+ serde( default = "true_default" , skip_serializing_if = "is_true" )
19+ ) ]
1120 run : bool ,
1221 } ,
1322 DiscoverComplete {
14- #[ allow( dead_code) ]
15- elapsed_s : Elapsed ,
23+ #[ cfg_attr(
24+ feature = "serde" ,
25+ serde( default , skip_serializing_if = "Option::is_none" )
26+ ) ]
27+ elapsed_s : Option < Elapsed > ,
1628 } ,
1729 SuiteStart ,
1830 CaseStart {
1931 name : String ,
2032 } ,
2133 CaseComplete {
2234 name : String ,
23- #[ allow( dead_code) ]
35+ #[ cfg_attr(
36+ feature = "serde" ,
37+ serde( default , skip_serializing_if = "RunMode::is_default" )
38+ ) ]
2439 mode : RunMode ,
40+ /// `None` means success
41+ #[ cfg_attr(
42+ feature = "serde" ,
43+ serde( default , skip_serializing_if = "Option::is_none" )
44+ ) ]
2545 status : Option < RunStatus > ,
46+ #[ cfg_attr(
47+ feature = "serde" ,
48+ serde( default , skip_serializing_if = "Option::is_none" )
49+ ) ]
2650 message : Option < String > ,
27- #[ allow( dead_code) ]
51+ #[ cfg_attr(
52+ feature = "serde" ,
53+ serde( default , skip_serializing_if = "Option::is_none" )
54+ ) ]
2855 elapsed_s : Option < Elapsed > ,
2956 } ,
3057 SuiteComplete {
31- elapsed_s : Elapsed ,
58+ #[ cfg_attr(
59+ feature = "serde" ,
60+ serde( default , skip_serializing_if = "Option::is_none" )
61+ ) ]
62+ elapsed_s : Option < Elapsed > ,
3263 } ,
3364}
3465
@@ -39,10 +70,18 @@ impl Event {
3970 }
4071}
4172
73+ fn true_default ( ) -> bool {
74+ true
75+ }
76+
77+ fn is_true ( yes : & bool ) -> bool {
78+ * yes
79+ }
80+
4281#[ derive( Copy , Clone , Default , Debug , PartialEq , Eq ) ]
4382#[ cfg_attr( feature = "unstable-schema" , derive( schemars:: JsonSchema ) ) ]
44- #[ cfg_attr( feature = "serde" , derive( serde:: Serialize ) ) ]
45- #[ cfg_attr( feature = "serde" , serde( rename_all = "kebab-case " ) ) ]
83+ #[ cfg_attr( feature = "serde" , derive( serde:: Serialize , serde :: Deserialize ) ) ]
84+ #[ cfg_attr( feature = "serde" , serde( rename_all = "snake_case " ) ) ]
4685pub enum RunMode {
4786 #[ default]
4887 Test ,
@@ -56,21 +95,26 @@ impl RunMode {
5695 Self :: Bench => "bench" ,
5796 }
5897 }
98+
99+ fn is_default ( & self ) -> bool {
100+ * self == Default :: default ( )
101+ }
59102}
60103
61104#[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
62105#[ cfg_attr( feature = "unstable-schema" , derive( schemars:: JsonSchema ) ) ]
63- #[ cfg_attr( feature = "serde" , derive( serde:: Serialize ) ) ]
64- #[ cfg_attr( feature = "serde" , serde( rename_all = "kebab-case " ) ) ]
106+ #[ cfg_attr( feature = "serde" , derive( serde:: Serialize , serde :: Deserialize ) ) ]
107+ #[ cfg_attr( feature = "serde" , serde( rename_all = "snake_case " ) ) ]
65108pub enum RunStatus {
66109 Ignored ,
67110 Failed ,
68111}
69112
70113#[ derive( Copy , Clone , Default , Debug , PartialEq , Eq ) ]
71114#[ cfg_attr( feature = "unstable-schema" , derive( schemars:: JsonSchema ) ) ]
72- #[ cfg_attr( feature = "serde" , derive( serde:: Serialize ) ) ]
115+ #[ cfg_attr( feature = "serde" , derive( serde:: Serialize , serde :: Deserialize ) ) ]
73116#[ cfg_attr( feature = "serde" , serde( into = "String" ) ) ]
117+ #[ cfg_attr( feature = "serde" , serde( try_from = "String" ) ) ]
74118pub struct Elapsed ( pub std:: time:: Duration ) ;
75119
76120impl std:: fmt:: Display for Elapsed {
@@ -79,6 +123,23 @@ impl std::fmt::Display for Elapsed {
79123 }
80124}
81125
126+ impl std:: str:: FromStr for Elapsed {
127+ type Err = std:: num:: ParseFloatError ;
128+
129+ fn from_str ( src : & str ) -> Result < Self , Self :: Err > {
130+ let secs = src. parse ( ) ?;
131+ Ok ( Elapsed ( std:: time:: Duration :: from_secs_f64 ( secs) ) )
132+ }
133+ }
134+
135+ impl TryFrom < String > for Elapsed {
136+ type Error = std:: num:: ParseFloatError ;
137+
138+ fn try_from ( inner : String ) -> Result < Self , Self :: Error > {
139+ inner. parse ( )
140+ }
141+ }
142+
82143impl From < Elapsed > for String {
83144 fn from ( elapsed : Elapsed ) -> Self {
84145 elapsed. 0 . as_secs_f64 ( ) . to_string ( )
0 commit comments