1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-01-24 21:42:51 -05:00
Files
DankMaterialShell/core/internal/plugins/search.go
2025-12-09 15:34:13 -05:00

89 lines
2.3 KiB
Go

package plugins
import (
"sort"
"strings"
"github.com/AvengeMedia/DankMaterialShell/core/internal/utils"
)
func FuzzySearch(query string, plugins []Plugin) []Plugin {
if query == "" {
return plugins
}
queryLower := strings.ToLower(query)
return utils.Filter(plugins, func(p Plugin) bool {
return fuzzyMatch(queryLower, strings.ToLower(p.Name)) ||
fuzzyMatch(queryLower, strings.ToLower(p.Category)) ||
fuzzyMatch(queryLower, strings.ToLower(p.Description)) ||
fuzzyMatch(queryLower, strings.ToLower(p.Author))
})
}
func fuzzyMatch(query, text string) bool {
queryIdx := 0
for _, char := range text {
if queryIdx < len(query) && char == rune(query[queryIdx]) {
queryIdx++
}
}
return queryIdx == len(query)
}
func FilterByCategory(category string, plugins []Plugin) []Plugin {
if category == "" {
return plugins
}
categoryLower := strings.ToLower(category)
return utils.Filter(plugins, func(p Plugin) bool {
return strings.ToLower(p.Category) == categoryLower
})
}
func FilterByCompositor(compositor string, plugins []Plugin) []Plugin {
if compositor == "" {
return plugins
}
compositorLower := strings.ToLower(compositor)
return utils.Filter(plugins, func(p Plugin) bool {
return utils.Any(p.Compositors, func(c string) bool {
return strings.ToLower(c) == compositorLower
})
})
}
func FilterByCapability(capability string, plugins []Plugin) []Plugin {
if capability == "" {
return plugins
}
capabilityLower := strings.ToLower(capability)
return utils.Filter(plugins, func(p Plugin) bool {
return utils.Any(p.Capabilities, func(c string) bool {
return strings.ToLower(c) == capabilityLower
})
})
}
func SortByFirstParty(plugins []Plugin) []Plugin {
sort.SliceStable(plugins, func(i, j int) bool {
isFirstPartyI := strings.HasPrefix(plugins[i].Repo, "https://github.com/AvengeMedia")
isFirstPartyJ := strings.HasPrefix(plugins[j].Repo, "https://github.com/AvengeMedia")
if isFirstPartyI != isFirstPartyJ {
return isFirstPartyI
}
return false
})
return plugins
}
func FindByIDOrName(idOrName string, plugins []Plugin) *Plugin {
if p, found := utils.Find(plugins, func(p Plugin) bool { return p.ID == idOrName }); found {
return &p
}
if p, found := utils.Find(plugins, func(p Plugin) bool { return p.Name == idOrName }); found {
return &p
}
return nil
}