github.com/kaydxh/golang@v0.0.131/pkg/config/config_option.go (about)

     1  /*
     2   *Copyright (c) 2022, kaydxh
     3   *
     4   *Permission is hereby granted, free of charge, to any person obtaining a copy
     5   *of this software and associated documentation files (the "Software"), to deal
     6   *in the Software without restriction, including without limitation the rights
     7   *to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     8   *copies of the Software, and to permit persons to whom the Software is
     9   *furnished to do so, subject to the following conditions:
    10   *
    11   *The above copyright notice and this permission notice shall be included in all
    12   *copies or substantial portions of the Software.
    13   *
    14   *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    15   *IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    16   *FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    17   *AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    18   *LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    19   *OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    20   *SOFTWARE.
    21   */
    22  package config
    23  
    24  import "google.golang.org/protobuf/proto"
    25  
    26  // A ConfigOption sets options.
    27  type ConfigOption[T proto.Message] interface {
    28  	apply(*Config[T])
    29  }
    30  
    31  // EmptyConfigOption does not alter the configuration. It can be embedded
    32  // in another structure to build custom options.
    33  //
    34  // This API is EXPERIMENTAL.
    35  type EmptyConfigOption[T proto.Message] struct{}
    36  
    37  func (EmptyConfigOption[T]) apply(*Config[T]) {}
    38  
    39  // ConfigOptionFunc wraps a function that modifies Client into an
    40  // implementation of the ConfigOption interface.
    41  type ConfigOptionFunc[T proto.Message] func(*Config[T])
    42  
    43  func (f ConfigOptionFunc[T]) apply(do *Config[T]) {
    44  	f(do)
    45  }
    46  
    47  // sample code for option, default for nothing to change
    48  func _ConfigOptionWithDefault[T proto.Message]() ConfigOption[T] {
    49  	return ConfigOptionFunc[T](func(*Config[T]) {
    50  		// nothing to change
    51  	})
    52  }
    53  func (o *Config[T]) ApplyOptions(options ...ConfigOption[T]) *Config[T] {
    54  	for _, opt := range options {
    55  		if opt == nil {
    56  			continue
    57  		}
    58  		opt.apply(o)
    59  	}
    60  	return o
    61  }