backend: Hardcode backend scheme in Factory

Our ParseConfig implementations always expect a specific scheme, thus no
other scheme would work.
This commit is contained in:
Michael Eischer 2023-06-08 17:32:43 +02:00
parent 705ad51bcc
commit 50e0d5e6b5
14 changed files with 43 additions and 29 deletions

View file

@ -10,8 +10,8 @@ import (
func TestStripPassword(t *testing.T) {
registry := location.NewRegistry()
registry.Register("test",
location.NewHTTPBackendFactory[any, restic.Backend](nil,
registry.Register(
location.NewHTTPBackendFactory[any, restic.Backend]("test", nil,
func(s string) string {
return "cleaned"
}, nil, nil,

View file

@ -14,6 +14,7 @@ type testConfig struct {
func testFactory() location.Factory {
return location.NewHTTPBackendFactory[testConfig, restic.Backend](
"local",
func(s string) (*testConfig, error) {
return &testConfig{loc: s}, nil
}, nil, nil, nil,
@ -22,12 +23,12 @@ func testFactory() location.Factory {
func TestParse(t *testing.T) {
registry := location.NewRegistry()
registry.Register("test", testFactory())
registry.Register(testFactory())
path := "test:example"
path := "local:example"
u, err := location.Parse(registry, path)
test.OK(t, err)
test.Equals(t, "test", u.Scheme)
test.Equals(t, "local", u.Scheme)
test.Equals(t, &testConfig{loc: path}, u.Config)
}
@ -43,7 +44,7 @@ func TestParseFallback(t *testing.T) {
}
registry := location.NewRegistry()
registry.Register("local", testFactory())
registry.Register(testFactory())
for _, path := range fallbackTests {
t.Run(path, func(t *testing.T) {

View file

@ -18,11 +18,11 @@ func NewRegistry() *Registry {
}
}
func (r *Registry) Register(scheme string, factory Factory) {
if r.factories[scheme] != nil {
func (r *Registry) Register(factory Factory) {
if r.factories[factory.Scheme()] != nil {
panic("duplicate backend")
}
r.factories[scheme] = factory
r.factories[factory.Scheme()] = factory
}
func (r *Registry) Lookup(scheme string) Factory {
@ -30,6 +30,7 @@ func (r *Registry) Lookup(scheme string) Factory {
}
type Factory interface {
Scheme() string
ParseConfig(s string) (interface{}, error)
StripPassword(s string) string
Create(ctx context.Context, cfg interface{}, rt http.RoundTripper, lim limiter.Limiter) (restic.Backend, error)
@ -37,12 +38,17 @@ type Factory interface {
}
type genericBackendFactory[C any, T restic.Backend] struct {
scheme string
parseConfigFn func(s string) (*C, error)
stripPasswordFn func(s string) string
createFn func(ctx context.Context, cfg C, rt http.RoundTripper, lim limiter.Limiter) (T, error)
openFn func(ctx context.Context, cfg C, rt http.RoundTripper, lim limiter.Limiter) (T, error)
}
func (f *genericBackendFactory[C, T]) Scheme() string {
return f.scheme
}
func (f *genericBackendFactory[C, T]) ParseConfig(s string) (interface{}, error) {
return f.parseConfigFn(s)
}
@ -59,12 +65,15 @@ func (f *genericBackendFactory[C, T]) Open(ctx context.Context, cfg interface{},
return f.openFn(ctx, *cfg.(*C), rt, lim)
}
func NewHTTPBackendFactory[C any, T restic.Backend](parseConfigFn func(s string) (*C, error),
func NewHTTPBackendFactory[C any, T restic.Backend](
scheme string,
parseConfigFn func(s string) (*C, error),
stripPasswordFn func(s string) string,
createFn func(ctx context.Context, cfg C, rt http.RoundTripper) (T, error),
openFn func(ctx context.Context, cfg C, rt http.RoundTripper) (T, error)) Factory {
return &genericBackendFactory[C, T]{
scheme: scheme,
parseConfigFn: parseConfigFn,
stripPasswordFn: stripPasswordFn,
createFn: func(ctx context.Context, cfg C, rt http.RoundTripper, _ limiter.Limiter) (T, error) {
@ -76,12 +85,15 @@ func NewHTTPBackendFactory[C any, T restic.Backend](parseConfigFn func(s string)
}
}
func NewLimitedBackendFactory[C any, T restic.Backend](parseConfigFn func(s string) (*C, error),
func NewLimitedBackendFactory[C any, T restic.Backend](
scheme string,
parseConfigFn func(s string) (*C, error),
stripPasswordFn func(s string) string,
createFn func(ctx context.Context, cfg C, lim limiter.Limiter) (T, error),
openFn func(ctx context.Context, cfg C, lim limiter.Limiter) (T, error)) Factory {
return &genericBackendFactory[C, T]{
scheme: scheme,
parseConfigFn: parseConfigFn,
stripPasswordFn: stripPasswordFn,
createFn: func(ctx context.Context, cfg C, _ http.RoundTripper, lim limiter.Limiter) (T, error) {