@@ -3,7 +3,7 @@ use std::{
3
3
ops:: { Add , Div , Sub } ,
4
4
} ;
5
5
6
- use serde:: Serialize ;
6
+ use serde:: { ser :: SerializeStruct , Serialize , Serializer } ;
7
7
8
8
pub trait IsQuantity {
9
9
type Value ;
@@ -16,7 +16,7 @@ pub trait IsQuantity {
16
16
fn unsafe_from ( value : Self :: Value ) -> Self ;
17
17
}
18
18
19
- #[ derive( Debug , Clone , Copy , Default , Serialize , PartialEq , Eq , PartialOrd ) ] // TODO: check partialord
19
+ #[ derive( Debug , Clone , Copy , Default , PartialEq , Eq , PartialOrd ) ] // TODO: check partialord
20
20
pub struct Quantity <
21
21
Value ,
22
22
const IS_TIME : bool ,
84
84
85
85
self . 0
86
86
}
87
+
88
+ const fn unit_name_long ( & self ) -> & ' static str {
89
+ match ( IS_TIME , IS_INFORMATION ) {
90
+ ( true , false ) => match METRIC_PREFIX_TIME {
91
+ -6 => "microsecond" ,
92
+ -3 => "millisecond" ,
93
+ 0 => "second" ,
94
+ _ => unreachable ! ( ) ,
95
+ } ,
96
+ ( false , true ) => match BINARY_PREFIX_INFORMATION {
97
+ 0 => "byte" ,
98
+ 10 => "kibibyte" ,
99
+ 20 => "mebibyte" ,
100
+ 30 => "gibibyte" ,
101
+ 40 => "tebibyte" ,
102
+ _ => unreachable ! ( ) ,
103
+ } ,
104
+ _ => unreachable ! ( ) ,
105
+ }
106
+ }
87
107
}
88
108
89
109
impl < const METRIC_PREFIX_TIME : i32 > Time < METRIC_PREFIX_TIME > {
@@ -144,6 +164,26 @@ impl<const BINARY_PREFIX_INFORMATION: i32> Display for Information<BINARY_PREFIX
144
164
}
145
165
}
146
166
167
+ impl <
168
+ Value : Copy + Default + Serialize ,
169
+ const IS_TIME : bool ,
170
+ const METRIC_PREFIX_TIME : i32 ,
171
+ const IS_INFORMATION : bool ,
172
+ const BINARY_PREFIX_INFORMATION : i32 ,
173
+ > Serialize
174
+ for Quantity < Value , IS_TIME , METRIC_PREFIX_TIME , IS_INFORMATION , BINARY_PREFIX_INFORMATION >
175
+ {
176
+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
177
+ where
178
+ S : Serializer ,
179
+ {
180
+ let mut state = serializer. serialize_struct ( "Quantity" , 2 ) ?;
181
+ state. serialize_field ( "value" , & self . 0 ) ?;
182
+ state. serialize_field ( "unit" , self . unit_name_long ( ) ) ?;
183
+ state. end ( )
184
+ }
185
+ }
186
+
147
187
macro_rules! quantity_fn {
148
188
( $name: ident, $unwrapped_values: ident, $body: expr) => {
149
189
pub fn $name<
0 commit comments