59 lines
1.2 KiB
Go
59 lines
1.2 KiB
Go
package crypters
|
|
|
|
import (
|
|
"sort"
|
|
"strings"
|
|
|
|
"github.com/StackExchange/blackbox/v2/models"
|
|
)
|
|
|
|
// Crypter is the handle
|
|
type Crypter interface {
|
|
models.Crypter
|
|
}
|
|
|
|
// NewFnSig function signature needed by reg.
|
|
type NewFnSig func(debug bool) (Crypter, error)
|
|
|
|
// Item stores one item
|
|
type Item struct {
|
|
Name string
|
|
New NewFnSig
|
|
Priority int
|
|
}
|
|
|
|
// Catalog is the list of registered vcs's.
|
|
var Catalog []*Item
|
|
|
|
// SearchByName returns a Crypter handle for name.
|
|
// The search is case insensitive.
|
|
func SearchByName(name string, debug bool) Crypter {
|
|
name = strings.ToLower(name)
|
|
for _, v := range Catalog {
|
|
//fmt.Printf("Trying %v %v\n", v.Name)
|
|
if strings.ToLower(v.Name) == name {
|
|
chandle, err := v.New(debug)
|
|
if err != nil {
|
|
return nil // No idea how that would happen.
|
|
}
|
|
//fmt.Printf("USING! %v\n", v.Name)
|
|
return chandle
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Register a new VCS.
|
|
func Register(name string, priority int, newfn NewFnSig) {
|
|
//fmt.Printf("CRYPTER registered: %v\n", name)
|
|
item := &Item{
|
|
Name: name,
|
|
New: newfn,
|
|
Priority: priority,
|
|
}
|
|
Catalog = append(Catalog, item)
|
|
|
|
// Keep the list sorted.
|
|
sort.Slice(Catalog, func(i, j int) bool { return Catalog[j].Priority < Catalog[i].Priority })
|
|
}
|