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  }