@@ -777,16 +777,45 @@ impl Table {
777777 let mut pairs = self . pairs :: < Value , Value > ( ) . flatten ( ) . collect :: < Vec < _ > > ( ) ;
778778 // Sort keys
779779 pairs. sort_by ( |( a, _) , ( b, _) | a. sort_cmp ( b) ) ;
780+ let is_sequence = pairs. iter ( ) . enumerate ( ) . all ( |( i, ( k, _) ) | {
781+ if let Value :: Integer ( n) = k {
782+ * n == ( i + 1 ) as Integer
783+ } else {
784+ false
785+ }
786+ } ) ;
780787 if pairs. is_empty ( ) {
781788 return write ! ( fmt, "{{}}" ) ;
782789 }
783790 writeln ! ( fmt, "{{" ) ?;
784- for ( key, value) in pairs {
785- write ! ( fmt, "{}[" , " " . repeat( ident + 2 ) ) ?;
786- key. fmt_pretty ( fmt, false , ident + 2 , visited) ?;
787- write ! ( fmt, "] = " ) ?;
788- value. fmt_pretty ( fmt, true , ident + 2 , visited) ?;
789- writeln ! ( fmt, "," ) ?;
791+ if is_sequence {
792+ // Format as list
793+ for ( _, value) in pairs {
794+ write ! ( fmt, "{}" , " " . repeat( ident + 2 ) ) ?;
795+ value. fmt_pretty ( fmt, true , ident + 2 , visited) ?;
796+ writeln ! ( fmt, "," ) ?;
797+ }
798+ } else {
799+ for ( key, value) in pairs {
800+ match key {
801+ Value :: String ( key)
802+ if key
803+ . to_string_lossy ( )
804+ . chars ( )
805+ . all ( |c| matches ! ( c, 'a' ..='z' | 'A' ..='Z' | '0' ..='9' | '_' ) ) =>
806+ {
807+ write ! ( fmt, "{}{}" , " " . repeat( ident + 2 ) , key. to_string_lossy( ) ) ?;
808+ write ! ( fmt, " = " ) ?;
809+ }
810+ _ => {
811+ write ! ( fmt, "{}[" , " " . repeat( ident + 2 ) ) ?;
812+ key. fmt_pretty ( fmt, false , ident + 2 , visited) ?;
813+ write ! ( fmt, "] = " ) ?;
814+ }
815+ }
816+ value. fmt_pretty ( fmt, true , ident + 2 , visited) ?;
817+ writeln ! ( fmt, "," ) ?;
818+ }
790819 }
791820 write ! ( fmt, "{}}}" , " " . repeat( ident) )
792821 }
0 commit comments