| 99 | } |
| 100 | |
| 101 | func newDefaultDriver(args DriverArgs) (Driver, error) { |
| 102 | var diDriver struct { |
| 103 | di.In |
| 104 | Driver `optional:"true"` |
| 105 | } |
| 106 | if err := args.Populator.Populate(&diDriver); err != nil { |
| 107 | return nil, fmt.Errorf("failed to contruct default driver from DI: %w", err) |
| 108 | } |
| 109 | if diDriver.Driver != nil { |
| 110 | return diDriver.Driver, nil |
| 111 | } |
| 112 | |
| 113 | var injected struct { |
| 114 | di.In |
| 115 | |
| 116 | Conf contract.ConfigUnmarshaler |
| 117 | AppName contract.AppName |
| 118 | Env contract.Env |
| 119 | Maker otetcd.Maker |
| 120 | Driver Driver `optional:"true"` |
| 121 | } |
| 122 | if err := args.Populator.Populate(&injected); err != nil { |
| 123 | return nil, fmt.Errorf("missing dependency for the default election driver: %w", err) |
| 124 | } |
| 125 | if injected.Driver != nil { |
| 126 | return injected.Driver, nil |
| 127 | } |
| 128 | var option Option |
| 129 | if err := injected.Conf.Unmarshal("leader", &option); err != nil { |
| 130 | return nil, fmt.Errorf("leader election configuration error: %w", err) |
| 131 | } |
| 132 | if option.EtcdName == "" { |
| 133 | option.EtcdName = "default" |
| 134 | } |
| 135 | etcdClient, err := injected.Maker.Make(option.EtcdName) |
| 136 | if err != nil { |
| 137 | return nil, fmt.Errorf("failed to initiate leader election with etcd driver (%s): %w", option.EtcdName, err) |
| 138 | } |
| 139 | return leaderetcd.NewEtcdDriver(etcdClient, key.New(injected.AppName.String(), injected.Env.String())), nil |
| 140 | } |
| 141 | |
| 142 | type configOut struct { |
| 143 | di.Out |