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 }