[FEATURE] опции в микро #391

Open
opened 2025-01-04 01:00:01 +03:00 by vtolstov · 1 comment
Owner

Перестать использовать указатель на опции
Убрать мьютексы которые защищают опции
Сделать метод клон для опций
Все опции могут имплементировать интерфейс валидатора и выдавать ошибку если не хватает нужных
Прекратить использовать контекст как хранилище опций, использовать map[interface{}]interface{} , где ключ это type xxx struct{}

Перестать использовать указатель на опции Убрать мьютексы которые защищают опции Сделать метод клон для опций Все опции могут имплементировать интерфейс валидатора и выдавать ошибку если не хватает нужных Прекратить использовать контекст как хранилище опций, использовать map[interface{}]interface{} , где ключ это type xxx struct{}
Author
Owner

// server.go
func Address(a...string) Option {
    return func(o Options) {
        o.Set(addressKey{}, a)
    }
}

type Options interface {
	// Validate returns nil, if all options are correct,
	// otherwise returns an error explaining the mistake
	Validate() error
	
	// SetDefaults sets the default values for unset options if necessary
	SetDefaults()

    As(interface{}) error
}

type Option func(

func ApplyOptions(options Options, opts...options.Option) {

}

func NewXXX/Init(opts ...options.Option) error {
    switch opts := options.(type) {
	case *Options:
		if opts == nil {
			return nil, fmt.Errorf("QueryOptions is nil")
		}

		// Validate the options
		if err := options.Validate(); err != nil {
			return nil, fmt.Errorf("Invalid options: %s", err)
		}

		// Get a copy of the options to avoid unexpected mutations
		options = options.Clone()

		// Set unset fields if necessary
		options.SetDefaults()

	case nil:
		// No options set, use default options
		options = &QueryOptions{
			BatchID:        "",
			QueryBatchSize: 32,
			ImportDetails:  nil,
		}

	default:
		// Unexpected options type
		return nil, fmt.Errorf(
			"Invalid options type: %s, expected: *QueryOptions",
			reflect.TypeOf(options),
		)
	}
```go // server.go func Address(a...string) Option { return func(o Options) { o.Set(addressKey{}, a) } } type Options interface { // Validate returns nil, if all options are correct, // otherwise returns an error explaining the mistake Validate() error // SetDefaults sets the default values for unset options if necessary SetDefaults() As(interface{}) error } type Option func( func ApplyOptions(options Options, opts...options.Option) { } func NewXXX/Init(opts ...options.Option) error { switch opts := options.(type) { case *Options: if opts == nil { return nil, fmt.Errorf("QueryOptions is nil") } // Validate the options if err := options.Validate(); err != nil { return nil, fmt.Errorf("Invalid options: %s", err) } // Get a copy of the options to avoid unexpected mutations options = options.Clone() // Set unset fields if necessary options.SetDefaults() case nil: // No options set, use default options options = &QueryOptions{ BatchID: "", QueryBatchSize: 32, ImportDetails: nil, } default: // Unexpected options type return nil, fmt.Errorf( "Invalid options type: %s, expected: *QueryOptions", reflect.TypeOf(options), ) } ```
Sign in to join this conversation.
No Milestone
No project
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: unistack-org/micro#391
No description provided.