github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/pkg/labels/selector.go (about)

     1  package labels
     2  
     3  import "gopkg.in/yaml.v3"
     4  
     5  var _ Labels = (*Selector)(nil)
     6  
     7  type Selector struct {
     8  	model InternalSelector
     9  	base  *Name
    10  }
    11  
    12  type InternalSelector struct {
    13  	InternalSelectableProp `yaml:",inline"`
    14  	InternalNameProp       `yaml:",inline"`
    15  	InternalComponentProp  `yaml:",inline"`
    16  	InternalManagedByProp  `yaml:",inline"`
    17  	InternalPartofProp     `yaml:",inline"`
    18  }
    19  
    20  func OpenComponentSelector(product string, component string) *Selector {
    21  	return DeriveComponentSelector(MustForComponent(NoopAPI(SelectorOperator(product, component+".caos.ch")), component), false)
    22  }
    23  
    24  func OpenOperatorSelector(product string, component string) *Selector {
    25  	return DeriveComponentSelector(MustForComponent(NoopAPI(SelectorOperator(product, component)), "operator"), false)
    26  }
    27  
    28  func DeriveComponentSelector(l *Component, open bool) *Selector {
    29  	selector := &Selector{
    30  		base: newName(l, ""),
    31  		model: InternalSelector{
    32  			InternalSelectableProp: selectable,
    33  			InternalComponentProp:  l.model.InternalComponentProp,
    34  		},
    35  	}
    36  
    37  	if !open {
    38  		selector.model.InternalPartofProp = l.model.InternalPartofProp
    39  		selector.model.InternalManagedByProp = l.model.InternalManagedByProp
    40  	}
    41  
    42  	return selector
    43  }
    44  
    45  func DeriveNameSelector(l *Name, open bool) *Selector {
    46  	selector := DeriveComponentSelector(l.base, open)
    47  	selector.base = l
    48  
    49  	if !open {
    50  		selector.model.InternalNameProp = l.model.InternalNameProp
    51  	}
    52  
    53  	return selector
    54  }
    55  
    56  func SelectorFrom(arbitrary map[string]string) (*Selector, error) {
    57  	intermediate, err := yaml.Marshal(arbitrary)
    58  	if err != nil {
    59  		panic(err)
    60  	}
    61  	s := &Selector{}
    62  	return s, yaml.Unmarshal(intermediate, s)
    63  }
    64  
    65  /*
    66  func (l *Selector) Major() int8 {
    67  	return l.base.Major()
    68  }
    69  */
    70  
    71  func (l *Selector) Equal(r comparable) bool {
    72  	if right, ok := r.(*Selector); ok {
    73  		return l.model == right.model
    74  	}
    75  	return false
    76  }
    77  
    78  func (l *Selector) MarshalYAML() (interface{}, error) {
    79  	return l.model, nil
    80  }
    81  
    82  func (l *Selector) UnmarshalYAML(node *yaml.Node) error {
    83  	if err := node.Decode(&l.model); err != nil {
    84  		return err
    85  	}
    86  	l.base = &Name{}
    87  	return node.Decode(l.base)
    88  }