mirror of
				https://github.com/Dadido3/go-typst.git
				synced 2025-11-04 13:19:36 +00:00 
			
		
		
		
	Fix map keys being in random order by sorting them
This commit is contained in:
		
							parent
							
								
									1458dc5db7
								
							
						
					
					
						commit
						a0eb762709
					
				@ -7,6 +7,7 @@ package typst
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"bytes"
 | 
						"bytes"
 | 
				
			||||||
 | 
						"cmp"
 | 
				
			||||||
	"encoding"
 | 
						"encoding"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
@ -298,23 +299,35 @@ func (e *VariableEncoder) encodeMap(v reflect.Value) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	e.indentLevel++
 | 
						e.indentLevel++
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// BUG: Map output needs to be sorted, otherwise this will cause the test to fail randomly
 | 
						type pair struct {
 | 
				
			||||||
 | 
							key   string
 | 
				
			||||||
 | 
							value reflect.Value
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Get all key value pairs as reflect.Value.
 | 
				
			||||||
	mi := v.MapRange()
 | 
						mi := v.MapRange()
 | 
				
			||||||
 | 
						pairs := make([]pair, 0, v.Len())
 | 
				
			||||||
	for mi.Next() {
 | 
						for mi.Next() {
 | 
				
			||||||
		mk, mv := mi.Key(), mi.Value()
 | 
							mk, mv := mi.Key(), mi.Value()
 | 
				
			||||||
		key, err := e.resolveKeyName(mk)
 | 
							key, err := e.resolveKeyName(mk)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							pairs = append(pairs, pair{CleanIdentifier(key), mv})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Sort and then generate markup.
 | 
				
			||||||
 | 
						slices.SortFunc(pairs, func(a, b pair) int { return cmp.Compare(a.key, b.key) })
 | 
				
			||||||
 | 
						for _, pair := range pairs {
 | 
				
			||||||
 | 
							key, value := pair.key, pair.value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if err := e.writeIndentationCharacters(); err != nil {
 | 
							if err := e.writeIndentationCharacters(); err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if err := e.writeString(CleanIdentifier(key) + ": "); err != nil {
 | 
							if err := e.writeString(key + ": "); err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if err := e.marshal(mv); err != nil {
 | 
							if err := e.marshal(value); err != nil {
 | 
				
			||||||
			return fmt.Errorf("failed to encode map field %q: %w", key, err)
 | 
								return fmt.Errorf("failed to encode map field %q: %w", key, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user