blob: 947069ccc9f0b93500cf1ba6ae8abcd096a4933e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package model
import (
"context"
"time"
"github.com/pkg/errors"
apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
"github.com/apache/plc4x/plc4go/spi"
)
//go:generate go tool plc4xGenerator -type=DefaultPlcSubscriptionRequestBuilder
type DefaultPlcSubscriptionRequestBuilder struct {
subscriber spi.PlcSubscriber `ignore:"true"`
tagHandler spi.PlcTagHandler `ignore:"true"`
valueHandler spi.PlcValueHandler `ignore:"true"`
tagNames []string
tagAddresses map[string]string
tags map[string]apiModel.PlcSubscriptionTag
types map[string]apiModel.PlcSubscriptionType
intervals map[string]time.Duration
preRegisteredConsumers map[string][]apiModel.PlcSubscriptionEventConsumer
}
func NewDefaultPlcSubscriptionRequestBuilder(tagHandler spi.PlcTagHandler, valueHandler spi.PlcValueHandler, subscriber spi.PlcSubscriber) apiModel.PlcSubscriptionRequestBuilder {
return &DefaultPlcSubscriptionRequestBuilder{
subscriber: subscriber,
tagHandler: tagHandler,
valueHandler: valueHandler,
tagNames: make([]string, 0),
tagAddresses: map[string]string{},
tags: map[string]apiModel.PlcSubscriptionTag{},
types: map[string]apiModel.PlcSubscriptionType{},
intervals: map[string]time.Duration{},
preRegisteredConsumers: make(map[string][]apiModel.PlcSubscriptionEventConsumer),
}
}
func (d *DefaultPlcSubscriptionRequestBuilder) AddCyclicTagAddress(name string, tagAddress string, interval time.Duration) apiModel.PlcSubscriptionRequestBuilder {
d.tagNames = append(d.tagNames, name)
d.tagAddresses[name] = tagAddress
d.types[name] = apiModel.SubscriptionCyclic
d.intervals[name] = interval
return d
}
func (d *DefaultPlcSubscriptionRequestBuilder) AddCyclicTag(name string, tag apiModel.PlcSubscriptionTag, interval time.Duration) apiModel.PlcSubscriptionRequestBuilder {
d.tagNames = append(d.tagNames, name)
d.tags[name] = tag
d.types[name] = apiModel.SubscriptionCyclic
d.intervals[name] = interval
return d
}
func (d *DefaultPlcSubscriptionRequestBuilder) AddChangeOfStateTagAddress(name string, tagAddress string) apiModel.PlcSubscriptionRequestBuilder {
d.tagNames = append(d.tagNames, name)
d.tagAddresses[name] = tagAddress
d.types[name] = apiModel.SubscriptionChangeOfState
return d
}
func (d *DefaultPlcSubscriptionRequestBuilder) AddChangeOfStateTag(name string, tag apiModel.PlcSubscriptionTag) apiModel.PlcSubscriptionRequestBuilder {
d.tagNames = append(d.tagNames, name)
d.tags[name] = tag
d.types[name] = apiModel.SubscriptionChangeOfState
return d
}
func (d *DefaultPlcSubscriptionRequestBuilder) AddEventTagAddress(name string, tagAddress string) apiModel.PlcSubscriptionRequestBuilder {
d.tagNames = append(d.tagNames, name)
d.tagAddresses[name] = tagAddress
d.types[name] = apiModel.SubscriptionEvent
return d
}
func (d *DefaultPlcSubscriptionRequestBuilder) AddEventTag(name string, tag apiModel.PlcSubscriptionTag) apiModel.PlcSubscriptionRequestBuilder {
d.tagNames = append(d.tagNames, name)
d.tags[name] = tag
d.types[name] = apiModel.SubscriptionEvent
return d
}
func (d *DefaultPlcSubscriptionRequestBuilder) AddPreRegisteredConsumer(name string, consumer apiModel.PlcSubscriptionEventConsumer) apiModel.PlcSubscriptionRequestBuilder {
if d.preRegisteredConsumers[name] == nil {
d.preRegisteredConsumers[name] = make([]apiModel.PlcSubscriptionEventConsumer, 0)
}
d.preRegisteredConsumers[name] = append(d.preRegisteredConsumers[name], consumer)
return d
}
func (d *DefaultPlcSubscriptionRequestBuilder) Build() (apiModel.PlcSubscriptionRequest, error) {
for _, name := range d.tagNames {
if tagAddress, ok := d.tagAddresses[name]; ok {
tag, err := d.tagHandler.ParseTag(tagAddress)
if err != nil {
return nil, errors.Wrapf(err, "Error parsing tag query: %s", tagAddress)
}
if tag == nil {
continue
}
d.tags[name], ok = tag.(apiModel.PlcSubscriptionTag)
if !ok {
return nil, errors.Errorf("%T isn't a PlcSubscriptionTag", tag)
}
}
}
return NewDefaultPlcSubscriptionRequest(d.subscriber, d.tagNames, d.tags, d.types, d.intervals, d.preRegisteredConsumers), nil
}
//go:generate go tool plc4xGenerator -type=DefaultPlcSubscriptionRequest
type DefaultPlcSubscriptionRequest struct {
*DefaultPlcTagRequest
types map[string]apiModel.PlcSubscriptionType
intervals map[string]time.Duration
preRegisteredConsumers map[string][]apiModel.PlcSubscriptionEventConsumer `ignore:"true"`
subscriber spi.PlcSubscriber
}
func NewDefaultPlcSubscriptionRequest(subscriber spi.PlcSubscriber, tagNames []string, tags map[string]apiModel.PlcSubscriptionTag, types map[string]apiModel.PlcSubscriptionType, intervals map[string]time.Duration, preRegisteredConsumers map[string][]apiModel.PlcSubscriptionEventConsumer) apiModel.PlcSubscriptionRequest {
_tags := map[string]apiModel.PlcTag{}
for s, tag := range tags {
_tags[s] = tag
}
return &DefaultPlcSubscriptionRequest{NewDefaultPlcTagRequest(_tags, tagNames), types, intervals, preRegisteredConsumers, subscriber}
}
func (d *DefaultPlcSubscriptionRequest) Execute() <-chan apiModel.PlcSubscriptionRequestResult {
return d.ExecuteWithContext(context.Background())
}
func (d *DefaultPlcSubscriptionRequest) ExecuteWithContext(ctx context.Context) <-chan apiModel.PlcSubscriptionRequestResult {
return d.subscriber.Subscribe(ctx, d)
}
func (d *DefaultPlcSubscriptionRequest) GetType(name string) apiModel.PlcSubscriptionType {
return d.types[name]
}
func (d *DefaultPlcSubscriptionRequest) GetInterval(name string) time.Duration {
return d.intervals[name]
}
func (d *DefaultPlcSubscriptionRequest) GetTag(name string) apiModel.PlcSubscriptionTag {
if tag, ok := d.tags[name].(apiModel.PlcSubscriptionTag); ok {
return tag
}
return nil
}
func (d *DefaultPlcSubscriptionRequest) GetPreRegisteredConsumers(name string) []apiModel.PlcSubscriptionEventConsumer {
return d.preRegisteredConsumers[name]
}