1
0
mirror of https://github.com/mxpv/podsync.git synced 2024-05-11 05:55:04 +00:00
2020-04-20 20:54:49 -07:00

63 lines
1.0 KiB
Go

package feed
import (
"sync"
"github.com/pkg/errors"
)
type KeyProvider interface {
Get() string
}
func NewKeyProvider(keys []string) (KeyProvider, error) {
switch len(keys) {
case 0:
return nil, errors.New("no keys")
case 1:
return NewFixedKey(keys[0])
default:
return NewRotatedKeys(keys)
}
}
type FixedKeyProvider struct {
key string
}
func NewFixedKey(key string) (KeyProvider, error) {
if key == "" {
return nil, errors.New("key can't be empty")
}
return &FixedKeyProvider{key: key}, nil
}
func (p FixedKeyProvider) Get() string {
return p.key
}
type RotatedKeyProvider struct {
keys []string
lock sync.Mutex
index int
}
func NewRotatedKeys(keys []string) (KeyProvider, error) {
if len(keys) < 2 {
return nil, errors.Errorf("at least 2 keys required (got %d)", len(keys))
}
return &RotatedKeyProvider{keys: keys, index: 0}, nil
}
func (p *RotatedKeyProvider) Get() string {
p.lock.Lock()
defer p.lock.Unlock()
current := p.index % len(p.keys)
p.index++
return p.keys[current]
}