@@ -35,20 +35,29 @@ pub struct ImageMetadata {
3535 pub extra : HashMap < String , serde_json:: Value > ,
3636}
3737
38+ const RESERVED_KEYS : & [ & str ] = & [ "image_file_name" , "width" , "height" ] ;
39+
3840impl Serialize for ImageMetadata {
3941 fn serialize < S : Serializer > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error > {
40- let mut map = serializer . serialize_map ( Some ( self . extra . len ( ) + 3 ) ) ? ;
41-
42- // Sidecar fields first (user-provided extras )
43- for ( key , value ) in & self . extra {
44- map . serialize_entry ( key , value ) ? ;
45- }
46-
47- // CLI-managed fields last — these always win
42+ let extra_count = self
43+ . extra
44+ . keys ( )
45+ . filter ( |k| ! RESERVED_KEYS . contains ( & k . as_str ( ) ) )
46+ . count ( ) ;
47+ let mut map = serializer . serialize_map ( Some ( extra_count + 3 ) ) ? ;
48+
49+ // CLI-managed fields first
4850 map. serialize_entry ( "image_file_name" , & self . image_file_name ) ?;
4951 map. serialize_entry ( "width" , & self . width ) ?;
5052 map. serialize_entry ( "height" , & self . height ) ?;
5153
54+ // User-provided sidecar fields, skipping any that conflict with CLI fields
55+ for ( key, value) in & self . extra {
56+ if !RESERVED_KEYS . contains ( & key. as_str ( ) ) {
57+ map. serialize_entry ( key, value) ?;
58+ }
59+ }
60+
5261 map. end ( )
5362 }
5463}
0 commit comments