treefmt/format/task.go
Brian McGee b834fa33da
feat: best-effort application of files to formatters
If a formatter errors out, continue with subsequent formatters regardless.

Do not cache the result to ensure later invocations re-try the same files.

Signed-off-by: Brian McGee <brian@bmcgee.ie>
2024-09-03 15:35:26 +01:00

44 lines
917 B
Go

package format
import (
"cmp"
"slices"
"git.numtide.com/numtide/treefmt/walk"
)
type Task struct {
File *walk.File
Formatters []*Formatter
BatchKey string
Errors []error
}
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,
}
}