github.com/decred/dcrlnd@v0.7.6/lnrpc/chainrpc/driver.go (about)

     1  //go:build !no_chainrpc
     2  // +build !no_chainrpc
     3  
     4  package chainrpc
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"github.com/decred/dcrlnd/lnrpc"
    10  )
    11  
    12  // createNewSubServer is a helper method that will create the new chain notifier
    13  // sub server given the main config dispatcher method. If we're unable to find
    14  // the config that is meant for us in the config dispatcher, then we'll exit
    15  // with an error.
    16  func createNewSubServer(configRegistry lnrpc.SubServerConfigDispatcher) (
    17  	*Server, lnrpc.MacaroonPerms, error) {
    18  
    19  	// We'll attempt to look up the config that we expect, according to our
    20  	// subServerName name. If we can't find this, then we'll exit with an
    21  	// error, as we're unable to properly initialize ourselves without this
    22  	// config.
    23  	chainNotifierServerConf, ok := configRegistry.FetchConfig(subServerName)
    24  	if !ok {
    25  		return nil, nil, fmt.Errorf("unable to find config for "+
    26  			"subserver type %s", subServerName)
    27  	}
    28  
    29  	// Now that we've found an object mapping to our service name, we'll
    30  	// ensure that it's the type we need.
    31  	config, ok := chainNotifierServerConf.(*Config)
    32  	if !ok {
    33  		return nil, nil, fmt.Errorf("wrong type of config for "+
    34  			"subserver %s, expected %T got %T", subServerName,
    35  			&Config{}, chainNotifierServerConf)
    36  	}
    37  
    38  	// Before we try to make the new chain notifier service instance, we'll
    39  	// perform some sanity checks on the arguments to ensure that they're
    40  	// usable.
    41  	switch {
    42  	// If the macaroon service is set (we should use macaroons), then
    43  	// ensure that we know where to look for them, or create them if not
    44  	// found.
    45  	case config.MacService != nil && config.NetworkDir == "":
    46  		return nil, nil, fmt.Errorf("NetworkDir must be set to create " +
    47  			"chainrpc")
    48  	case config.ChainNotifier == nil:
    49  		return nil, nil, fmt.Errorf("ChainNotifier must be set to " +
    50  			"create chainrpc")
    51  	}
    52  
    53  	return New(config)
    54  }
    55  
    56  func init() {
    57  	subServer := &lnrpc.SubServerDriver{
    58  		SubServerName: subServerName,
    59  		NewGrpcHandler: func() lnrpc.GrpcHandler {
    60  			return &ServerShell{}
    61  		},
    62  	}
    63  
    64  	// If the build tag is active, then we'll register ourselves as a
    65  	// sub-RPC server within the global lnrpc package namespace.
    66  	if err := lnrpc.RegisterSubServer(subServer); err != nil {
    67  		panic(fmt.Sprintf("failed to register subserver driver %s: %v",
    68  			subServerName, err))
    69  	}
    70  }