github.com/enbility/spine-go@v0.7.0/spine/nodemanagement_subscription.go (about)

     1  package spine
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/ahmetb/go-linq/v3"
     7  	"github.com/enbility/spine-go/api"
     8  	"github.com/enbility/spine-go/model"
     9  	"github.com/enbility/spine-go/util"
    10  )
    11  
    12  func NewNodeManagementSubscriptionRequestCallType(clientAddress *model.FeatureAddressType, serverAddress *model.FeatureAddressType, featureType model.FeatureTypeType) *model.NodeManagementSubscriptionRequestCallType {
    13  	return &model.NodeManagementSubscriptionRequestCallType{
    14  		SubscriptionRequest: &model.SubscriptionManagementRequestCallType{
    15  			ClientAddress:     clientAddress,
    16  			ServerAddress:     serverAddress,
    17  			ServerFeatureType: &featureType,
    18  		},
    19  	}
    20  }
    21  
    22  func NewNodeManagementSubscriptionDeleteCallType(clientAddress *model.FeatureAddressType, serverAddress *model.FeatureAddressType) *model.NodeManagementSubscriptionDeleteCallType {
    23  	return &model.NodeManagementSubscriptionDeleteCallType{
    24  		SubscriptionDelete: &model.SubscriptionManagementDeleteCallType{
    25  			ClientAddress: clientAddress,
    26  			ServerAddress: serverAddress,
    27  		},
    28  	}
    29  }
    30  
    31  // route subscription request calls to the appropriate feature implementation and add the subscription to the current list
    32  func (r *NodeManagement) processReadSubscriptionData(message *api.Message) error {
    33  	var remoteDeviceSubscriptions []model.SubscriptionManagementEntryDataType
    34  	remoteDeviceSubscriptionEntries := r.Device().SubscriptionManager().Subscriptions(message.FeatureRemote.Device())
    35  	linq.From(remoteDeviceSubscriptionEntries).SelectT(func(s *api.SubscriptionEntry) model.SubscriptionManagementEntryDataType {
    36  		return model.SubscriptionManagementEntryDataType{
    37  			SubscriptionId: util.Ptr(model.SubscriptionIdType(s.Id)),
    38  			ServerAddress:  s.ServerFeature.Address(),
    39  			ClientAddress:  s.ClientFeature.Address(),
    40  		}
    41  	}).ToSlice(&remoteDeviceSubscriptions)
    42  
    43  	cmd := model.CmdType{
    44  		NodeManagementSubscriptionData: &model.NodeManagementSubscriptionDataType{
    45  			SubscriptionEntry: remoteDeviceSubscriptions,
    46  		},
    47  	}
    48  
    49  	return message.FeatureRemote.Device().Sender().Reply(message.RequestHeader, r.Address(), cmd)
    50  }
    51  
    52  func (r *NodeManagement) handleMsgSubscriptionData(message *api.Message) error {
    53  	switch message.CmdClassifier {
    54  	case model.CmdClassifierTypeCall:
    55  		return r.processReadSubscriptionData(message)
    56  
    57  	default:
    58  		return fmt.Errorf("nodemanagement.handleSubscriptionDeleteCall: NodeManagementSubscriptionRequestCall CmdClassifierType not implemented: %s", message.CmdClassifier)
    59  	}
    60  }
    61  
    62  func (r *NodeManagement) handleMsgSubscriptionRequestCall(message *api.Message, data *model.NodeManagementSubscriptionRequestCallType) error {
    63  	switch message.CmdClassifier {
    64  	case model.CmdClassifierTypeCall:
    65  		subscriptionMgr := r.Device().SubscriptionManager()
    66  
    67  		return subscriptionMgr.AddSubscription(message.FeatureRemote.Device(), *data.SubscriptionRequest)
    68  
    69  	default:
    70  		return fmt.Errorf("nodemanagement.handleSubscriptionRequestCall: NodeManagementSubscriptionRequestCall CmdClassifierType not implemented: %s", message.CmdClassifier)
    71  	}
    72  }
    73  
    74  func (r *NodeManagement) handleMsgSubscriptionDeleteCall(message *api.Message, data *model.NodeManagementSubscriptionDeleteCallType) error {
    75  	switch message.CmdClassifier {
    76  	case model.CmdClassifierTypeCall:
    77  		subscriptionMgr := r.Device().SubscriptionManager()
    78  
    79  		return subscriptionMgr.RemoveSubscription(*data.SubscriptionDelete, message.FeatureRemote.Device())
    80  
    81  	default:
    82  		return fmt.Errorf("nodemanagement.handleSubscriptionDeleteCall: NodeManagementSubscriptionRequestCall CmdClassifierType not implemented: %s", message.CmdClassifier)
    83  	}
    84  }