11use chrono:: { DateTime , Utc } ;
2- use serde:: { Deserialize , Serialize } ;
2+ use serde:: { ser :: SerializeSeq , ser :: Serializer , Deserialize , Serialize } ;
33use serde_with:: DisplayFromStr ;
44
55use crate :: common:: { Bbox , Crs } ;
@@ -43,7 +43,7 @@ impl Default for SpatialExtent {
4343#[ derive( Serialize , Deserialize , Debug , PartialEq , Eq , Clone ) ]
4444pub struct TemporalExtent {
4545 #[ serde( skip_serializing_if = "Vec::is_empty" ) ]
46- #[ serde_as ( as = "Vec<Vec<Option<DisplayFromStr>>> " ) ]
46+ #[ serde ( serialize_with = "serialize_interval " ) ]
4747 pub interval : Vec < Vec < Option < DateTime < Utc > > > > ,
4848 #[ serde( default = "default_trs" ) ]
4949 pub trs : String ,
@@ -58,6 +58,25 @@ impl Default for TemporalExtent {
5858 }
5959}
6060
61+ fn serialize_interval < S > (
62+ interval : & Vec < Vec < Option < DateTime < Utc > > > > ,
63+ serializer : S ,
64+ ) -> Result < S :: Ok , S :: Error >
65+ where
66+ S : Serializer ,
67+ {
68+ let mut outer_seq = serializer. serialize_seq ( Some ( interval. len ( ) ) ) ?;
69+ for inner_vec in interval {
70+ let serialized_inner_vec: Vec < _ > = inner_vec
71+ . iter ( )
72+ . map ( |item| item. as_ref ( ) . map ( |dt| dt. to_rfc3339 ( ) ) )
73+ . collect ( ) ;
74+
75+ outer_seq. serialize_element ( & serialized_inner_vec) ?;
76+ }
77+ outer_seq. end ( )
78+ }
79+
6180fn default_trs ( ) -> String {
6281 "http://www.opengis.net/def/uom/ISO-8601/0/Gregorian" . to_string ( )
6382}
0 commit comments