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 }