@@ -48,23 +48,15 @@ func WithParseErrorHandler(errorHandler func(error)) fromConfigOption {
4848 }
4949}
5050
51- func FromConfig (config string , opts ... fromConfigOption ) (b balancer.Balancer ) {
51+ func CreateFromConfig (config string ) (balancer.Balancer , error ) {
5252 var (
53- h = fromConfigOptionsHolder {
54- fallbackBalancer : Default (),
55- }
56- c balancersConfig
53+ b balancer.Balancer
54+ err error
55+ c balancersConfig
5756 )
5857
59- for _ , o := range opts {
60- o (& h )
61- }
62-
63- if err := json .Unmarshal ([]byte (config ), & c ); err != nil {
64- if h .errorHandler != nil {
65- h .errorHandler (err )
66- }
67- return h .fallbackBalancer
58+ if err = json .Unmarshal ([]byte (config ), & c ); err != nil {
59+ return nil , err
6860 }
6961
7062 switch c .Type {
@@ -75,30 +67,47 @@ func FromConfig(config string, opts ...fromConfigOption) (b balancer.Balancer) {
7567 case typeRoundRobin :
7668 b = RoundRobin ()
7769 default :
78- if h .errorHandler != nil {
79- h .errorHandler (errors .Errorf ("unknown type of balancer: %s" , c .Type ))
80- }
81- return h .fallbackBalancer
70+ return nil , errors .Errorf ("unknown type of balancer: %s" , c .Type )
8271 }
8372
8473 switch c .Prefer {
8574 case preferLocalDC :
8675 if c .Fallback {
87- return PreferLocalDCWithFallBack (b )
76+ return PreferLocalDCWithFallBack (b ), nil
8877 }
89- return PreferLocalDC (b )
78+ return PreferLocalDC (b ), nil
9079 case preferLocations :
9180 if len (c .Locations ) == 0 {
92- if h .errorHandler != nil {
93- h .errorHandler (errors .Errorf ("empty locations list in balancer '%s' config" , c .Type ))
94- }
95- return h .fallbackBalancer
81+ return nil , errors .Errorf ("empty locations list in balancer '%s' config" , c .Type )
9682 }
9783 if c .Fallback {
98- return PreferLocationsWithFallback (b , c .Locations ... )
84+ return PreferLocationsWithFallback (b , c .Locations ... ), nil
9985 }
100- return PreferLocations (b , c .Locations ... )
86+ return PreferLocations (b , c .Locations ... ), nil
10187 default :
102- return b
88+ return b , nil
10389 }
10490}
91+
92+ func FromConfig (config string , opts ... fromConfigOption ) balancer.Balancer {
93+ var (
94+ h = fromConfigOptionsHolder {
95+ fallbackBalancer : Default (),
96+ }
97+ b balancer.Balancer
98+ err error
99+ )
100+ for _ , o := range opts {
101+ o (& h )
102+ }
103+
104+ b , err = CreateFromConfig (config )
105+ if err != nil {
106+ if h .errorHandler != nil {
107+ h .errorHandler (err )
108+ }
109+ return h .fallbackBalancer
110+ }
111+
112+ return b
113+ }
0 commit comments