github.com/erda-project/erda-infra@v1.0.9/base/servicehub/default_provider_define.go (about) 1 // Copyright (c) 2021 Terminus, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package servicehub 16 17 import "reflect" 18 19 // Spec define provider and register with Register function 20 type Spec struct { 21 Define interface{} // optional 22 Services []string // optional 23 Dependencies []string // optional 24 OptionalDependencies []string // optional 25 DependenciesFunc func(h *Hub) []string // optional 26 Summary string // optional 27 Description string // optional 28 ConfigFunc func() interface{} // optional 29 Types []reflect.Type // optional 30 Creator Creator // required 31 } 32 33 // Register . 34 func Register(name string, spec *Spec) { 35 RegisterProvider(name, &specDefine{spec}) // wrap Spec as ProviderDefine 36 } 37 38 // ensure specDefine implements some interface 39 var ( 40 // _ ProviderDefine = (*specDefine)(nil) // through RegisterProvider to ensure 41 _ ProviderServices = (*specDefine)(nil) 42 _ ServiceTypes = (*specDefine)(nil) 43 _ ProviderUsageSummary = (*specDefine)(nil) 44 _ ProviderUsage = (*specDefine)(nil) 45 _ ProviderUsage = (*specDefine)(nil) 46 _ ServiceDependencies = (*specDefine)(nil) 47 _ ConfigCreator = (*specDefine)(nil) 48 _ ConfigCreator = (*specDefine)(nil) 49 ) 50 51 type specDefine struct { 52 s *Spec 53 } 54 55 func (d *specDefine) Services() []string { 56 if len(d.s.Services) > 0 { 57 return d.s.Services 58 } 59 if d, ok := d.s.Define.(ProviderServices); ok { 60 return d.Services() 61 } 62 return nil 63 } 64 65 func (d *specDefine) Types() []reflect.Type { 66 if len(d.s.Types) > 0 { 67 return d.s.Types 68 } 69 if d, ok := d.s.Define.(ServiceTypes); ok { 70 return d.Types() 71 } 72 return nil 73 } 74 75 func (d *specDefine) Dependencies(h *Hub) []string { 76 var list = d.s.Dependencies 77 for _, svr := range d.s.OptionalDependencies { 78 if h.IsServiceExist(svr) { 79 list = append(list, svr) 80 } 81 } 82 if d.s.DependenciesFunc != nil { 83 list = append(list, d.s.DependenciesFunc(h)...) 84 } 85 if len(list) > 0 { 86 return list 87 } 88 if d, ok := d.s.Define.(ServiceDependencies); ok { 89 return d.Dependencies(h) 90 } 91 return nil 92 } 93 94 func (d *specDefine) Summary() string { 95 if len(d.s.Summary) > 0 { 96 return d.s.Summary 97 } 98 if d, ok := d.s.Define.(ProviderUsageSummary); ok { 99 return d.Summary() 100 } 101 return "" 102 } 103 104 func (d *specDefine) Description() string { 105 if len(d.s.Description) > 0 { 106 return d.s.Description 107 } 108 if d, ok := d.s.Define.(ProviderUsage); ok { 109 return d.Description() 110 } 111 return "" 112 } 113 114 func (d *specDefine) Config() interface{} { 115 if d.s.ConfigFunc != nil { 116 return d.s.ConfigFunc() 117 } 118 if d, ok := d.s.Define.(ConfigCreator); ok { 119 return d.Config() 120 } 121 return nil 122 } 123 124 func (d *specDefine) Creator() Creator { 125 if d.s.Creator != nil { 126 return d.s.Creator 127 } 128 if d, ok := d.s.Define.(ProviderDefine); ok { 129 return d.Creator() 130 } 131 return nil // panic 132 }