github.com/decred/dcrlnd@v0.7.6/cluster/factory.go (about)

     1  package cluster
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  )
     7  
     8  // leaderElectorFactoryFunc is a LeaderElector factory method type.
     9  type leaderElectorFactoryFunc func(context.Context, ...interface{}) (
    10  	LeaderElector, error)
    11  
    12  var leaderElectorFactories map[string]leaderElectorFactoryFunc
    13  
    14  // RegisterLeaderElectorFactory will register a new LeaderElector factory
    15  // method corresponding to the passed id.
    16  func RegisterLeaderElectorFactory(id string, factory leaderElectorFactoryFunc) {
    17  	if leaderElectorFactories == nil {
    18  		leaderElectorFactories = make(
    19  			map[string]leaderElectorFactoryFunc,
    20  		)
    21  	}
    22  
    23  	leaderElectorFactories[id] = factory
    24  }
    25  
    26  // MakeLeaderElector will constuct a LeaderElector identified by id with the
    27  // passed arguments.
    28  func MakeLeaderElector(ctx context.Context, id string, args ...interface{}) (
    29  	LeaderElector, error) {
    30  
    31  	if _, ok := leaderElectorFactories[id]; !ok {
    32  		return nil, fmt.Errorf("leader elector factory for '%v' "+
    33  			"not found", id)
    34  	}
    35  
    36  	return leaderElectorFactories[id](ctx, args...)
    37  }