mirror of
https://github.com/numtide/treefmt.git
synced 2024-10-04 04:27:21 +03:00
43 lines
897 B
Go
43 lines
897 B
Go
|
package format
|
||
|
|
||
|
import (
|
||
|
"cmp"
|
||
|
"slices"
|
||
|
|
||
|
"git.numtide.com/numtide/treefmt/walk"
|
||
|
)
|
||
|
|
||
|
type Task struct {
|
||
|
File *walk.File
|
||
|
Formatters []*Formatter
|
||
|
BatchKey string
|
||
|
}
|
||
|
|
||
|
func NewTask(file *walk.File, formatters []*Formatter) Task {
|
||
|
// sort by priority in ascending order
|
||
|
slices.SortFunc(formatters, func(a, b *Formatter) int {
|
||
|
priorityA := a.Priority()
|
||
|
priorityB := b.Priority()
|
||
|
|
||
|
result := priorityA - priorityB
|
||
|
if result == 0 {
|
||
|
// formatters with the same priority are sorted lexicographically to ensure a deterministic outcome
|
||
|
result = cmp.Compare(a.Name(), b.Name())
|
||
|
}
|
||
|
return result
|
||
|
})
|
||
|
|
||
|
// construct a batch key which represents the unique sequence of formatters to be applied to file
|
||
|
var key string
|
||
|
for _, f := range formatters {
|
||
|
key += f.name + ":"
|
||
|
}
|
||
|
key = key[:len(key)-1]
|
||
|
|
||
|
return Task{
|
||
|
File: file,
|
||
|
Formatters: formatters,
|
||
|
BatchKey: key,
|
||
|
}
|
||
|
}
|