github.com/enbility/spine-go@v0.7.0/spine/function_data_cmd.go (about) 1 package spine 2 3 import ( 4 "github.com/enbility/spine-go/api" 5 "github.com/enbility/spine-go/model" 6 "github.com/enbility/spine-go/util" 7 ) 8 9 type FunctionDataCmd[T any] struct { 10 *FunctionData[T] 11 } 12 13 func NewFunctionDataCmd[T any](function model.FunctionType) *FunctionDataCmd[T] { 14 return &FunctionDataCmd[T]{ 15 FunctionData: NewFunctionData[T](function), 16 } 17 } 18 19 var _ api.FunctionDataCmdInterface = (*FunctionDataCmd[int])(nil) 20 21 /* FunctionDataCmdInterface */ 22 23 func (r *FunctionDataCmd[T]) ReadCmdType(partialSelector any, elements any) model.CmdType { 24 cmd := createCmd[T](r.functionType, nil) 25 26 var filters []model.FilterType 27 filters = filtersForSelectorsElements(r.functionType, filters, nil, partialSelector, nil, elements) 28 if len(filters) > 0 { 29 cmd.Filter = filters 30 cmd.Function = util.Ptr(model.FunctionType("")) 31 } 32 33 return cmd 34 } 35 36 func (r *FunctionDataCmd[T]) ReplyCmdType(partial bool) model.CmdType { 37 data := r.DataCopy() 38 cmd := createCmd(r.functionType, data) 39 if partial { 40 cmd.Filter = filterEmptyPartial() 41 cmd.Function = util.Ptr(model.FunctionType("")) 42 } 43 return cmd 44 } 45 46 func (r *FunctionDataCmd[T]) NotifyOrWriteCmdType(deleteSelector, partialSelector any, partialWithoutSelector bool, deleteElements any) model.CmdType { 47 data := r.DataCopy() 48 cmd := createCmd(r.functionType, data) 49 50 if partialWithoutSelector { 51 cmd.Filter = filterEmptyPartial() 52 cmd.Function = util.Ptr(model.FunctionType(r.functionType)) 53 return cmd 54 } 55 var filters []model.FilterType 56 if filters := filtersForSelectorsElements(r.functionType, filters, deleteSelector, partialSelector, deleteElements, nil); len(filters) > 0 { 57 cmd.Filter = filters 58 cmd.Function = util.Ptr(model.FunctionType(r.functionType)) 59 } 60 61 return cmd 62 } 63 64 func filtersForSelectorsElements(functionType model.FunctionType, filters []model.FilterType, deleteSelector, partialSelector any, deleteElements, readElements any) []model.FilterType { 65 if !util.IsNil(deleteSelector) || !util.IsNil(deleteElements) { 66 filter := model.FilterType{CmdControl: &model.CmdControlType{Delete: &model.ElementTagType{}}} 67 if !util.IsNil(deleteSelector) { 68 filter = addSelectorToFilter(filter, functionType, &deleteSelector) 69 } 70 if !util.IsNil(deleteElements) { 71 filter = addElementToFilter(filter, functionType, &deleteElements) 72 } 73 filters = append(filters, filter) 74 } 75 76 if !util.IsNil(partialSelector) || !util.IsNil(readElements) { 77 filter := model.FilterType{CmdControl: &model.CmdControlType{Partial: &model.ElementTagType{}}} 78 if !util.IsNil(partialSelector) { 79 filter = addSelectorToFilter(filter, functionType, partialSelector) 80 } 81 if !util.IsNil(readElements) { 82 filter = addElementToFilter(filter, functionType, readElements) 83 } 84 filters = append(filters, filter) 85 } 86 87 return filters 88 } 89 90 // simple helper for adding a single filterType without any selectors 91 func filterEmptyPartial() []model.FilterType { 92 return []model.FilterType{*model.NewFilterTypePartial()} 93 } 94 95 func addSelectorToFilter(filter model.FilterType, function model.FunctionType, data any) model.FilterType { 96 result := filter 97 98 result.SetDataForFunction(model.EEBusTagTypeTypeSelector, function, data) 99 100 return result 101 } 102 103 func addElementToFilter(filter model.FilterType, function model.FunctionType, data any) model.FilterType { 104 result := filter 105 106 result.SetDataForFunction(model.EEbusTagTypeTypeElements, function, data) 107 108 return result 109 } 110 111 func createCmd[T any](function model.FunctionType, data *T) model.CmdType { 112 result := model.CmdType{} 113 114 result.SetDataForFunction(function, data) 115 116 return result 117 }