@@ -1022,3 +1022,73 @@ where
10221022 . finish ( )
10231023 }
10241024}
1025+
1026+ #[ cfg( feature = "serde" ) ]
1027+ mod serde_impls {
1028+ use super :: IndexMap ;
1029+ use core:: fmt;
1030+ use core:: marker:: PhantomData ;
1031+ use serde:: de:: { Deserialize , MapAccess , Visitor } ;
1032+ use serde:: ser:: { Serialize , SerializeMap , Serializer } ;
1033+
1034+ impl < K , V > Serialize for IndexMap < K , V >
1035+ where
1036+ K : Serialize + Ord ,
1037+ V : Serialize ,
1038+ {
1039+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
1040+ where
1041+ S : Serializer ,
1042+ {
1043+ let mut map = serializer. serialize_map ( Some ( self . len ( ) ) ) ?;
1044+ for ( k, v) in self . iter ( ) {
1045+ map. serialize_entry ( k, v) ?;
1046+ }
1047+ map. end ( )
1048+ }
1049+ }
1050+
1051+ impl < ' a , K , V > Deserialize < ' a > for IndexMap < K , V >
1052+ where
1053+ K : Deserialize < ' a > + Clone + Ord ,
1054+ V : Deserialize < ' a > ,
1055+ {
1056+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
1057+ where
1058+ D : serde:: de:: Deserializer < ' a > ,
1059+ {
1060+ deserializer. deserialize_map ( IndexMapVisitor {
1061+ _marker : PhantomData ,
1062+ } )
1063+ }
1064+ }
1065+
1066+ struct IndexMapVisitor < K , V > {
1067+ _marker : PhantomData < fn ( ) -> IndexMap < K , V > > ,
1068+ }
1069+
1070+ impl < ' de , K , V > Visitor < ' de > for IndexMapVisitor < K , V >
1071+ where
1072+ K : Deserialize < ' de > + Clone + Ord ,
1073+ V : Deserialize < ' de > ,
1074+ {
1075+ type Value = IndexMap < K , V > ;
1076+
1077+ fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
1078+ formatter. write_str ( "a map" )
1079+ }
1080+
1081+ fn visit_map < M > ( self , mut access : M ) -> Result < Self :: Value , M :: Error >
1082+ where
1083+ M : MapAccess < ' de > ,
1084+ {
1085+ let mut map = IndexMap :: with_capacity ( access. size_hint ( ) . unwrap_or ( 0 ) ) ;
1086+
1087+ while let Some ( ( key, value) ) = access. next_entry ( ) ? {
1088+ map. insert ( key, value) ;
1089+ }
1090+
1091+ Ok ( map)
1092+ }
1093+ }
1094+ }
0 commit comments