github.com/octohelm/storage@v0.0.0-20240516030302-1ac2cc1ea347/pkg/sqlbuilder/toggles.go (about)

     1  package sqlbuilder
     2  
     3  import (
     4  	"context"
     5  
     6  	contextx "github.com/octohelm/x/context"
     7  )
     8  
     9  var (
    10  	ToggleMultiTable    = "MultiTable"
    11  	ToggleNeedAutoAlias = "NeedAlias"
    12  	ToggleUseValues     = "UseValues"
    13  )
    14  
    15  type Toggles map[string]bool
    16  
    17  func (toggles Toggles) Merge(next Toggles) Toggles {
    18  	final := Toggles{}
    19  
    20  	for k, v := range toggles {
    21  		if v {
    22  			final[k] = true
    23  		}
    24  	}
    25  
    26  	for k, v := range next {
    27  		if v {
    28  			final[k] = true
    29  		} else {
    30  			delete(final, k)
    31  		}
    32  	}
    33  
    34  	return final
    35  }
    36  
    37  func (toggles Toggles) Is(key string) bool {
    38  	if v, ok := toggles[key]; ok {
    39  		return v
    40  	}
    41  	return false
    42  }
    43  
    44  type contextKeyForToggles struct {
    45  }
    46  
    47  func ContextWithToggles(ctx context.Context, toggles Toggles) context.Context {
    48  	return contextx.WithValue(ctx, contextKeyForToggles{}, TogglesFromContext(ctx).Merge(toggles))
    49  }
    50  
    51  func TogglesFromContext(ctx context.Context) Toggles {
    52  	if ctx == nil {
    53  		return Toggles{}
    54  	}
    55  	if toggles, ok := ctx.Value(contextKeyForToggles{}).(Toggles); ok {
    56  		return toggles
    57  	}
    58  	return Toggles{}
    59  }