forked from TrueCloudLab/distribution
9c88801a12
Back in the before time, the best practices surrounding usage of Context weren't quite worked out. We defined our own type to make usage easier. As this packaged was used elsewhere, it make it more and more challenging to integrate with the forked `Context` type. Now that it is available in the standard library, we can just use that one directly. To make usage more consistent, we now use `dcontext` when referring to the distribution context package. Signed-off-by: Stephen J Day <stephen.day@docker.com>
40 lines
1.2 KiB
Go
40 lines
1.2 KiB
Go
package middleware
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/docker/distribution"
|
|
)
|
|
|
|
// InitFunc is the type of a RepositoryMiddleware factory function and is
|
|
// used to register the constructor for different RepositoryMiddleware backends.
|
|
type InitFunc func(ctx context.Context, repository distribution.Repository, options map[string]interface{}) (distribution.Repository, error)
|
|
|
|
var middlewares map[string]InitFunc
|
|
|
|
// Register is used to register an InitFunc for
|
|
// a RepositoryMiddleware backend with the given name.
|
|
func Register(name string, initFunc InitFunc) error {
|
|
if middlewares == nil {
|
|
middlewares = make(map[string]InitFunc)
|
|
}
|
|
if _, exists := middlewares[name]; exists {
|
|
return fmt.Errorf("name already registered: %s", name)
|
|
}
|
|
|
|
middlewares[name] = initFunc
|
|
|
|
return nil
|
|
}
|
|
|
|
// Get constructs a RepositoryMiddleware with the given options using the named backend.
|
|
func Get(ctx context.Context, name string, options map[string]interface{}, repository distribution.Repository) (distribution.Repository, error) {
|
|
if middlewares != nil {
|
|
if initFunc, exists := middlewares[name]; exists {
|
|
return initFunc(ctx, repository, options)
|
|
}
|
|
}
|
|
|
|
return nil, fmt.Errorf("no repository middleware registered with name: %s", name)
|
|
}
|