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  }