@@ -2,7 +2,9 @@ use crate::db::models::vote_options::VoteOptions;
22use crate :: utils:: datetime:: unix_timestamp_to_datetime;
33use serde:: de:: Visitor ;
44use serde:: { ser:: Error , Deserialize , Deserializer , Serializer } ;
5+ use snapshot_lib:: Fraction ;
56use std:: fmt;
7+ use std:: str:: FromStr ;
68use time:: { format_description:: well_known:: Rfc3339 , OffsetDateTime } ;
79
810// this warning should be disable here since the interface for this function requires
@@ -113,7 +115,7 @@ pub fn deserialize_vote_options_from_string<'de, D>(
113115where
114116 D : Deserializer < ' de > ,
115117{
116- struct VoteOptionsDeserializer ( ) ;
118+ struct VoteOptionsDeserializer ;
117119
118120 impl < ' de > Visitor < ' de > for VoteOptionsDeserializer {
119121 type Value = VoteOptions ;
@@ -130,7 +132,7 @@ where
130132 }
131133 }
132134
133- deserializer. deserialize_str ( VoteOptionsDeserializer ( ) )
135+ deserializer. deserialize_str ( VoteOptionsDeserializer )
134136}
135137
136138pub fn serialize_vote_options_to_string < S : Serializer > (
@@ -150,3 +152,39 @@ where
150152 "x" | "1" | "true"
151153 ) )
152154}
155+
156+ pub fn serialize_fraction_to_string < S : Serializer > (
157+ fraction : & Fraction ,
158+ serializer : S ,
159+ ) -> Result < S :: Ok , S :: Error > {
160+ serializer. serialize_str ( & fraction. to_string ( ) )
161+ }
162+
163+ pub fn deserialize_fraction_from_string < ' de , D > ( deserializer : D ) -> Result < Fraction , D :: Error >
164+ where
165+ D : Deserializer < ' de > ,
166+ {
167+ struct FractionDeserializer ;
168+
169+ impl < ' de > Visitor < ' de > for FractionDeserializer {
170+ type Value = Fraction ;
171+
172+ fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
173+ formatter. write_str ( "A fraction value e.g. 1.0, 0.56" )
174+ }
175+
176+ fn visit_str < E > ( self , value : & str ) -> Result < Fraction , E >
177+ where
178+ E : serde:: de:: Error ,
179+ {
180+ match value {
181+ "NaN" => Err ( E :: custom (
182+ "Invalid value, should be 1.0, or 0.56" . to_string ( ) ,
183+ ) ) ,
184+ _ => Ok ( Fraction :: from_str ( value) . map_err ( |e| E :: custom ( e. to_string ( ) ) ) ?) ,
185+ }
186+ }
187+ }
188+
189+ deserializer. deserialize_str ( FractionDeserializer )
190+ }
0 commit comments