github.com/decred/dcrlnd@v0.7.6/kvdb/etcd/driver.go (about)

     1  //go:build kvdb_etcd
     2  // +build kvdb_etcd
     3  
     4  package etcd
     5  
     6  import (
     7  	"context"
     8  	"fmt"
     9  
    10  	"github.com/btcsuite/btcwallet/walletdb"
    11  )
    12  
    13  const (
    14  	dbType = "etcd"
    15  )
    16  
    17  // parseArgs parses the arguments from the walletdb Open/Create methods.
    18  func parseArgs(funcName string, args ...interface{}) (context.Context,
    19  	*Config, error) {
    20  
    21  	if len(args) != 2 {
    22  		return nil, nil, fmt.Errorf("invalid number of arguments to "+
    23  			"%s.%s -- expected: context.Context, etcd.Config",
    24  			dbType, funcName,
    25  		)
    26  	}
    27  
    28  	ctx, ok := args[0].(context.Context)
    29  	if !ok {
    30  		return nil, nil, fmt.Errorf("argument 0 to %s.%s is invalid "+
    31  			"-- expected: context.Context",
    32  			dbType, funcName,
    33  		)
    34  	}
    35  
    36  	config, ok := args[1].(*Config)
    37  	if !ok {
    38  		return nil, nil, fmt.Errorf("argument 1 to %s.%s is invalid -- "+
    39  			"expected: etcd.Config",
    40  			dbType, funcName,
    41  		)
    42  	}
    43  
    44  	return ctx, config, nil
    45  }
    46  
    47  // createDBDriver is the callback provided during driver registration that
    48  // creates, initializes, and opens a database for use.
    49  func createDBDriver(args ...interface{}) (walletdb.DB, error) {
    50  	ctx, config, err := parseArgs("Create", args...)
    51  	if err != nil {
    52  		return nil, err
    53  	}
    54  
    55  	return newEtcdBackend(ctx, *config)
    56  }
    57  
    58  // openDBDriver is the callback provided during driver registration that opens
    59  // an existing database for use.
    60  func openDBDriver(args ...interface{}) (walletdb.DB, error) {
    61  	ctx, config, err := parseArgs("Open", args...)
    62  	if err != nil {
    63  		return nil, err
    64  	}
    65  
    66  	return newEtcdBackend(ctx, *config)
    67  }
    68  
    69  func init() {
    70  	// Register the driver.
    71  	driver := walletdb.Driver{
    72  		DbType: dbType,
    73  		Create: createDBDriver,
    74  		Open:   openDBDriver,
    75  	}
    76  	if err := walletdb.RegisterDriver(driver); err != nil {
    77  		panic(fmt.Sprintf("Failed to regiser database driver '%s': %v",
    78  			dbType, err))
    79  	}
    80  }