This is an automated email from the ASF dual-hosted git repository. sruehl pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/plc4x.git
The following commit(s) were added to refs/heads/develop by this push: new 4245c31 plc4go: refactor spi 4245c31 is described below commit 4245c318830c1db4da03e37d7caf3be2d84e559a Author: Sebastian Rühl <sru...@apache.org> AuthorDate: Fri Apr 16 18:47:11 2021 +0200 plc4go: refactor spi + Make Builders chainable + deduplicate code in spi.models + moved RequestInterceptor.go to interceptors and resolved cyclic import dependency + refactored examples to use chained builder --- .../discovery/hello_world_plc4go_knx_discovery.go | 24 ++--- .../hello_world_plc4go_knx_read_group_address.go | 8 +- .../hello_world_plc4go_knx_subscription.go | 110 ++++++++++----------- plc4go/examples/read/hello_world_plc4go_read.go | 6 +- plc4go/examples/write/hello_world_plc4go_write.go | 6 +- plc4go/internal/plc4go/ads/Connection.go | 13 ++- plc4go/internal/plc4go/knxnetip/Connection.go | 14 +-- plc4go/internal/plc4go/modbus/Connection.go | 13 ++- .../{model => interceptors}/RequestInterceptor.go | 2 +- .../interceptors/SingleItemRequestInterceptor.go | 54 ++++++---- .../plc4go/spi/model/DefaultBrowseRequest.go | 3 +- .../plc4go/spi/model/DefaultPlcReadRequest.go | 51 +++++----- .../plc4go/spi/model/DefaultPlcReadResponse.go | 18 ++-- .../spi/model/DefaultPlcSubscriptionEvent.go | 24 ++--- .../spi/model/DefaultPlcSubscriptionRequest.go | 47 ++++----- .../spi/model/DefaultPlcSubscriptionResponse.go | 12 +-- .../plc4go/spi/model/DefaultPlcWriteRequest.go | 32 +++--- .../plc4go/spi/model/DefaultPlcWriteResponse.go | 12 +-- .../plc4go/spi/model/DefaultRequest.go} | 33 +++---- .../plc4go/spi/model/DefaultResponse.go} | 29 ++---- plc4go/pkg/plc4go/model/plc_browse.go | 2 +- plc4go/pkg/plc4go/model/plc_read.go | 4 +- plc4go/pkg/plc4go/model/plc_subscription.go | 14 +-- plc4go/pkg/plc4go/model/plc_write.go | 4 +- 24 files changed, 249 insertions(+), 286 deletions(-) diff --git a/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go b/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go index e190eed..ff18277 100644 --- a/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go +++ b/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go @@ -51,11 +51,11 @@ func main() { defer connection.BlockingClose() // Try to find all KNX devices on the current network - browseRequestBuilder := connection.BrowseRequestBuilder() - //browseRequestBuilder.AddItem("allDevices", "[1-15].[1-15].[0-255]") - browseRequestBuilder.AddItem("allMyDevices", "[1-3].[1-6].[0-60]") - //browseRequestBuilder.AddItem("onlyOneDevice", "1.1.20") - browseRequest, err := browseRequestBuilder.Build() + browseRequest, err := connection.BrowseRequestBuilder(). + //AddItem("allDevices", "[1-15].[1-15].[0-255]"). + AddItem("allMyDevices", "[1-3].[1-6].[0-60]"). + //AddItem("onlyOneDevice", "1.1.20") + Build() if err != nil { log.Error().Err(err).Msg("error creating browse request") return @@ -66,9 +66,9 @@ func main() { log.Info().Msgf("Inspecting detected Device at KNX Address: %s", knxAddress) // Try to get all the com-objects and the group addresses they are attached to. - browseRequestBuilder = connection.BrowseRequestBuilder() - browseRequestBuilder.AddItem("comObjects", knxAddress+"#com-obj") - browseRequest, err := browseRequestBuilder.Build() + browseRequest, err := connection.BrowseRequestBuilder(). + AddItem("comObjects", knxAddress+"#com-obj"). + Build() if err != nil { log.Error().Err(err).Msg("error creating read request") return false @@ -99,10 +99,10 @@ func main() { log.Info().Msgf(" - %15s (%s) %s", result.Field.GetAddressString(), permissions, result.Name) } - readRequestBuilder := connection.ReadRequestBuilder() - readRequestBuilder.AddQuery("applicationProgramVersion", knxAddress+"#3/13") - readRequestBuilder.AddQuery("interfaceProgramVersion", knxAddress+"#4/13") - readRequest, err := readRequestBuilder.Build() + readRequest, err := connection.ReadRequestBuilder(). + AddQuery("applicationProgramVersion", knxAddress+"#3/13"). + AddQuery("interfaceProgramVersion", knxAddress+"#4/13"). + Build() if err != nil { log.Error().Msgf("Error creating read request for scanning %s", knxAddress) return false diff --git a/plc4go/examples/knx/groupAddressRead/hello_world_plc4go_knx_read_group_address.go b/plc4go/examples/knx/groupAddressRead/hello_world_plc4go_knx_read_group_address.go index 7ba5d76..b2be91b 100644 --- a/plc4go/examples/knx/groupAddressRead/hello_world_plc4go_knx_read_group_address.go +++ b/plc4go/examples/knx/groupAddressRead/hello_world_plc4go_knx_read_group_address.go @@ -49,10 +49,10 @@ func main() { defer connection.BlockingClose() // Prepare a read-request - rrb := connection.ReadRequestBuilder() - rrb.AddQuery("firstFlorTemperatures", "2/[1,2,4,6]/10:DPT_Value_Temp") - rrb.AddQuery("secondFlorTemperatures", "3/[2,3,4,6]/10:DPT_Value_Temp") - readRequest, err := rrb.Build() + readRequest, err := connection.ReadRequestBuilder(). + AddQuery("firstFlorTemperatures", "2/[1,2,4,6]/10:DPT_Value_Temp"). + AddQuery("secondFlorTemperatures", "3/[2,3,4,6]/10:DPT_Value_Temp"). + Build() if err != nil { fmt.Printf("error preparing read-request: %s", connectionResult.Err.Error()) return diff --git a/plc4go/examples/knx/subscribe/hello_world_plc4go_knx_subscription.go b/plc4go/examples/knx/subscribe/hello_world_plc4go_knx_subscription.go index 0d7a795..f51e5c1 100644 --- a/plc4go/examples/knx/subscribe/hello_world_plc4go_knx_subscription.go +++ b/plc4go/examples/knx/subscribe/hello_world_plc4go_knx_subscription.go @@ -52,68 +52,66 @@ func main() { defer connection.BlockingClose() // Prepare a subscription-request - srb := connection.SubscriptionRequestBuilder() - // Intentionally catching all without datatype and the temperature values of the first floor with type - srb.AddChangeOfStateQuery("all", "*/*/*") - srb.AddChangeOfStateQuery("firstFlorTemperatures", "2/[1,2,4,6]/10:DPT_Value_Temp") - srb.AddItemHandler(func(event model.PlcSubscriptionEvent) { - // Iterate over all fields that were triggered in the current event. - for _, fieldName := range event.GetFieldNames() { - if event.GetResponseCode(fieldName) == model.PlcResponseCode_OK { - address := event.GetAddress(fieldName) - value := event.GetValue(fieldName) - // If the plc-value was a raw-plcValue, we will try lazily decode the value - // In my installation all group addresses ending with "/10" are temperature values - // and ending on "/0" are light switch actions. - // So if I find a group address ending on that, decode it with a given type name, - // If not, simply output it as array of USINT values. - switch value.(type) { - case values.RawPlcValue: - rawValue := value.(values.RawPlcValue) - datatypeName := "USINT" - if strings.HasSuffix(address, "/10") { - datatypeName = "DPT_Value_Temp" - } else if strings.HasSuffix(address, "/0") { - datatypeName = "BOOL" + if subscriptionRequest, err := connection.SubscriptionRequestBuilder(). + // Intentionally catching all without datatype and the temperature values of the first floor with type + AddChangeOfStateQuery("all", "*/*/*"). + AddChangeOfStateQuery("firstFlorTemperatures", "2/[1,2,4,6]/10:DPT_Value_Temp"). + AddItemHandler(func(event model.PlcSubscriptionEvent) { + // Iterate over all fields that were triggered in the current event. + for _, fieldName := range event.GetFieldNames() { + if event.GetResponseCode(fieldName) == model.PlcResponseCode_OK { + address := event.GetAddress(fieldName) + value := event.GetValue(fieldName) + // If the plc-value was a raw-plcValue, we will try lazily decode the value + // In my installation all group addresses ending with "/10" are temperature values + // and ending on "/0" are light switch actions. + // So if I find a group address ending on that, decode it with a given type name, + // If not, simply output it as array of USINT values. + switch value.(type) { + case values.RawPlcValue: + rawValue := value.(values.RawPlcValue) + datatypeName := "USINT" + if strings.HasSuffix(address, "/10") { + datatypeName = "DPT_Value_Temp" + } else if strings.HasSuffix(address, "/0") { + datatypeName = "BOOL" + } + fmt.Printf("Got raw-value event for address %s: ", address) + if !rawValue.RawHasMore() { + fmt.Printf("nothing") + } + for rawValue.RawHasMore() { + value = rawValue.RawDecodeValue(datatypeName) + fmt.Printf(" '%s'", value.GetString()) + } + fmt.Printf("\n") + default: + fmt.Printf("Got event for address %s: %s\n", address, value.GetString()) } - fmt.Printf("Got raw-value event for address %s: ", address) - if !rawValue.RawHasMore() { - fmt.Printf("nothing") - } - for rawValue.RawHasMore() { - value = rawValue.RawDecodeValue(datatypeName) - fmt.Printf(" '%s'", value.GetString()) - } - fmt.Printf("\n") - default: - fmt.Printf("Got event for address %s: %s\n", address, value.GetString()) } } + }).Build(); err == nil { + // Execute a subscription-request + rrc := subscriptionRequest.Execute() + + // Wait for the response to finish + rrr := <-rrc + if rrr.Err != nil { + fmt.Printf("error executing subscription-request: %s", rrr.Err.Error()) + return } - }) - subscriptionRequest, err := srb.Build() - if err != nil { - fmt.Printf("error preparing subscription-request: %s", connectionResult.Err.Error()) - return - } - // Execute a subscription-request - rrc := subscriptionRequest.Execute() + // Do something with the response + for _, fieldName := range rrr.Response.GetFieldNames() { + if rrr.Response.GetResponseCode(fieldName) != model.PlcResponseCode_OK { + fmt.Printf("error an non-ok return code for field %s: %s\n", fieldName, rrr.Response.GetResponseCode(fieldName).GetName()) + continue + } + } - // Wait for the response to finish - rrr := <-rrc - if rrr.Err != nil { - fmt.Printf("error executing subscription-request: %s", rrr.Err.Error()) + time.Sleep(time.Minute * 5) + } else { + fmt.Printf("error preparing subscription-request: %s", connectionResult.Err.Error()) return } - - // Do something with the response - for _, fieldName := range rrr.Response.GetFieldNames() { - if rrr.Response.GetResponseCode(fieldName) != model.PlcResponseCode_OK { - fmt.Printf("error an non-ok return code for field %s: %s\n", fieldName, rrr.Response.GetResponseCode(fieldName).GetName()) - continue - } - } - - time.Sleep(time.Minute * 5) } diff --git a/plc4go/examples/read/hello_world_plc4go_read.go b/plc4go/examples/read/hello_world_plc4go_read.go index 05d391d..11cd142 100644 --- a/plc4go/examples/read/hello_world_plc4go_read.go +++ b/plc4go/examples/read/hello_world_plc4go_read.go @@ -45,9 +45,9 @@ func main() { defer connection.BlockingClose() // Prepare a read-request - rrb := connection.ReadRequestBuilder() - rrb.AddQuery("field", "holding-register:26:REAL") - readRequest, err := rrb.Build() + readRequest, err := connection.ReadRequestBuilder(). + AddQuery("field", "holding-register:26:REAL"). + Build() if err != nil { fmt.Printf("error preparing read-request: %s", connectionResult.Err.Error()) return diff --git a/plc4go/examples/write/hello_world_plc4go_write.go b/plc4go/examples/write/hello_world_plc4go_write.go index f549a80..22d7a0a 100644 --- a/plc4go/examples/write/hello_world_plc4go_write.go +++ b/plc4go/examples/write/hello_world_plc4go_write.go @@ -45,9 +45,9 @@ func main() { defer connection.BlockingClose() // Prepare a write-request - wrb := connection.WriteRequestBuilder() - wrb.AddQuery("field", "holding-register:26:REAL", 2.7182818284) - writeRequest, err := wrb.Build() + writeRequest, err := connection.WriteRequestBuilder(). + AddQuery("field", "holding-register:26:REAL", 2.7182818284). + Build() if err != nil { fmt.Printf("error preparing read-request: %s", connectionResult.Err.Error()) return diff --git a/plc4go/internal/plc4go/ads/Connection.go b/plc4go/internal/plc4go/ads/Connection.go index 5f97150..c0ddb05 100644 --- a/plc4go/internal/plc4go/ads/Connection.go +++ b/plc4go/internal/plc4go/ads/Connection.go @@ -33,7 +33,7 @@ import ( type Connection struct { _default.DefaultConnection messageCodec spi.MessageCodec - requestInterceptor internalModel.RequestInterceptor + requestInterceptor interceptors.RequestInterceptor configuration Configuration reader *Reader writer *Writer @@ -56,10 +56,13 @@ func NewConnection(messageCodec spi.MessageCodec, configuration Configuration, f &reader, ) connection := &Connection{ - messageCodec: messageCodec, - requestInterceptor: interceptors.NewSingleItemRequestInterceptor(), - reader: &reader, - writer: &writer, + messageCodec: messageCodec, + requestInterceptor: interceptors.NewSingleItemRequestInterceptor( + internalModel.NewDefaultPlcReadRequest, + internalModel.NewDefaultPlcReadResponse, + ), + reader: &reader, + writer: &writer, } connection.DefaultConnection = _default.NewDefaultConnection(connection, _default.WithPlcFieldHandler(fieldHandler), diff --git a/plc4go/internal/plc4go/knxnetip/Connection.go b/plc4go/internal/plc4go/knxnetip/Connection.go index 052a852..14319890 100644 --- a/plc4go/internal/plc4go/knxnetip/Connection.go +++ b/plc4go/internal/plc4go/knxnetip/Connection.go @@ -123,8 +123,7 @@ type Connection struct { TunnelingRequestExpectationId int32 DeviceConnections map[driverModel.KnxAddress]*KnxDeviceConnection - requestInterceptor internalModel.RequestInterceptor - plc4go.PlcConnection + requestInterceptor interceptors.RequestInterceptor sync.Mutex // indicates if the tunneling requests loop is running @@ -162,10 +161,13 @@ type InternalResult struct { func NewConnection(transportInstance transports.TransportInstance, options map[string][]string, fieldHandler spi.PlcFieldHandler) *Connection { connection := &Connection{ - options: options, - fieldHandler: fieldHandler, - valueHandler: NewValueHandler(), - requestInterceptor: interceptors.NewSingleItemRequestInterceptor(), + options: options, + fieldHandler: fieldHandler, + valueHandler: NewValueHandler(), + requestInterceptor: interceptors.NewSingleItemRequestInterceptor( + internalModel.NewDefaultPlcReadRequest, + internalModel.NewDefaultPlcReadResponse, + ), subscribers: []*Subscriber{}, valueCache: map[uint16][]int8{}, valueCacheMutex: sync.RWMutex{}, diff --git a/plc4go/internal/plc4go/modbus/Connection.go b/plc4go/internal/plc4go/modbus/Connection.go index a52aab8..90aabec 100644 --- a/plc4go/internal/plc4go/modbus/Connection.go +++ b/plc4go/internal/plc4go/modbus/Connection.go @@ -38,15 +38,18 @@ type Connection struct { unitIdentifier uint8 messageCodec spi.MessageCodec options map[string][]string - requestInterceptor internalModel.RequestInterceptor + requestInterceptor interceptors.RequestInterceptor } func NewConnection(unitIdentifier uint8, messageCodec spi.MessageCodec, options map[string][]string, fieldHandler spi.PlcFieldHandler) *Connection { connection := &Connection{ - unitIdentifier: unitIdentifier, - messageCodec: messageCodec, - options: options, - requestInterceptor: interceptors.NewSingleItemRequestInterceptor(), + unitIdentifier: unitIdentifier, + messageCodec: messageCodec, + options: options, + requestInterceptor: interceptors.NewSingleItemRequestInterceptor( + internalModel.NewDefaultPlcReadRequest, + internalModel.NewDefaultPlcReadResponse, + ), } connection.DefaultConnection = _default.NewDefaultConnection(connection, _default.WithDefaultTtl(time.Second*5), diff --git a/plc4go/internal/plc4go/spi/model/RequestInterceptor.go b/plc4go/internal/plc4go/spi/interceptors/RequestInterceptor.go similarity index 98% rename from plc4go/internal/plc4go/spi/model/RequestInterceptor.go rename to plc4go/internal/plc4go/spi/interceptors/RequestInterceptor.go index f865d4b..5fa730d 100644 --- a/plc4go/internal/plc4go/spi/model/RequestInterceptor.go +++ b/plc4go/internal/plc4go/spi/interceptors/RequestInterceptor.go @@ -17,7 +17,7 @@ // under the License. // -package model +package interceptors import ( "github.com/apache/plc4x/plc4go/pkg/plc4go/model" diff --git a/plc4go/internal/plc4go/spi/interceptors/SingleItemRequestInterceptor.go b/plc4go/internal/plc4go/spi/interceptors/SingleItemRequestInterceptor.go index 40eed70..442b88d 100644 --- a/plc4go/internal/plc4go/spi/interceptors/SingleItemRequestInterceptor.go +++ b/plc4go/internal/plc4go/spi/interceptors/SingleItemRequestInterceptor.go @@ -21,50 +21,64 @@ package interceptors import ( "errors" - "github.com/apache/plc4x/plc4go/internal/plc4go/spi/model" + "github.com/apache/plc4x/plc4go/internal/plc4go/spi" "github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils" - apiModel "github.com/apache/plc4x/plc4go/pkg/plc4go/model" + "github.com/apache/plc4x/plc4go/pkg/plc4go/model" "github.com/apache/plc4x/plc4go/pkg/plc4go/values" "github.com/rs/zerolog/log" ) +type ReaderExposer interface { + GetReader() spi.PlcReader +} + +type ReadRequestInterceptorExposer interface { + GetReadRequestInterceptor() ReadRequestInterceptor +} + +type requestFactory func(fields map[string]model.PlcField, fieldNames []string, reader spi.PlcReader, readRequestInterceptor ReadRequestInterceptor) model.PlcReadRequest + +type responseFactory func(request model.PlcReadRequest, responseCodes map[string]model.PlcResponseCode, values map[string]values.PlcValue) model.PlcReadResponse + type SingleItemRequestInterceptor struct { + requestFactory requestFactory + responseFactory responseFactory } -func NewSingleItemRequestInterceptor() SingleItemRequestInterceptor { - return SingleItemRequestInterceptor{} +func NewSingleItemRequestInterceptor(requestFactory requestFactory, responseFactory responseFactory) SingleItemRequestInterceptor { + return SingleItemRequestInterceptor{requestFactory, responseFactory} } -func (m SingleItemRequestInterceptor) InterceptReadRequest(readRequest apiModel.PlcReadRequest) []apiModel.PlcReadRequest { +func (m SingleItemRequestInterceptor) InterceptReadRequest(readRequest model.PlcReadRequest) []model.PlcReadRequest { // If this request just has one field, go the shortcut if len(readRequest.GetFieldNames()) == 1 { log.Debug().Msg("We got only one request, no splitting required") - return []apiModel.PlcReadRequest{readRequest} + return []model.PlcReadRequest{readRequest} } log.Trace().Msg("Splitting requests") // In all other cases, create a new read request containing only one item - defaultReadRequest := readRequest.(model.DefaultPlcReadRequest) - var readRequests []apiModel.PlcReadRequest + var readRequests []model.PlcReadRequest for _, fieldName := range readRequest.GetFieldNames() { log.Debug().Str("fieldName", fieldName).Msg("Splitting into own request") field := readRequest.GetField(fieldName) - subReadRequest := model.NewDefaultPlcReadRequest( - map[string]apiModel.PlcField{fieldName: field}, + subReadRequest := m.requestFactory( + map[string]model.PlcField{fieldName: field}, []string{fieldName}, - defaultReadRequest.Reader, - defaultReadRequest.ReadRequestInterceptor) + readRequest.(ReaderExposer).GetReader(), + readRequest.(ReadRequestInterceptorExposer).GetReadRequestInterceptor(), + ) readRequests = append(readRequests, subReadRequest) } return readRequests } -func (m SingleItemRequestInterceptor) ProcessReadResponses(readRequest apiModel.PlcReadRequest, readResults []apiModel.PlcReadRequestResult) apiModel.PlcReadRequestResult { +func (m SingleItemRequestInterceptor) ProcessReadResponses(readRequest model.PlcReadRequest, readResults []model.PlcReadRequestResult) model.PlcReadRequestResult { if len(readResults) == 1 { log.Debug().Msg("We got only one response, no merging required") return readResults[0] } log.Trace().Msg("Merging requests") - responseCodes := map[string]apiModel.PlcResponseCode{} + responseCodes := map[string]model.PlcResponseCode{} val := map[string]values.PlcValue{} var err error = nil for _, readResult := range readResults { @@ -87,18 +101,18 @@ func (m SingleItemRequestInterceptor) ProcessReadResponses(readRequest apiModel. } } } - return apiModel.PlcReadRequestResult{ + return model.PlcReadRequestResult{ Request: readRequest, - Response: model.NewDefaultPlcReadResponse(readRequest, responseCodes, val), + Response: m.responseFactory(readRequest, responseCodes, val), Err: err, } } -func (m SingleItemRequestInterceptor) InterceptWriteRequest(writeRequest apiModel.PlcWriteRequest) []apiModel.PlcWriteRequest { - return []apiModel.PlcWriteRequest{writeRequest} +func (m SingleItemRequestInterceptor) InterceptWriteRequest(writeRequest model.PlcWriteRequest) []model.PlcWriteRequest { + return []model.PlcWriteRequest{writeRequest} } -func (m SingleItemRequestInterceptor) ProcessWriteResponses(writeRequest apiModel.PlcWriteRequest, writeResponses []apiModel.PlcWriteRequestResult) apiModel.PlcWriteRequestResult { +func (m SingleItemRequestInterceptor) ProcessWriteResponses(writeRequest model.PlcWriteRequest, writeResponses []model.PlcWriteRequestResult) model.PlcWriteRequestResult { // TODO: unfinished implementation - return apiModel.PlcWriteRequestResult{} + return model.PlcWriteRequestResult{} } diff --git a/plc4go/internal/plc4go/spi/model/DefaultBrowseRequest.go b/plc4go/internal/plc4go/spi/model/DefaultBrowseRequest.go index 97468cb..9d03553 100644 --- a/plc4go/internal/plc4go/spi/model/DefaultBrowseRequest.go +++ b/plc4go/internal/plc4go/spi/model/DefaultBrowseRequest.go @@ -36,8 +36,9 @@ func NewDefaultPlcBrowseRequestBuilder(browser spi.PlcBrowser) *DefaultPlcBrowse } } -func (m *DefaultPlcBrowseRequestBuilder) AddItem(name string, query string) { +func (m *DefaultPlcBrowseRequestBuilder) AddItem(name string, query string) model.PlcBrowseRequestBuilder { m.queries[name] = query + return m } func (m *DefaultPlcBrowseRequestBuilder) Build() (model.PlcBrowseRequest, error) { diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcReadRequest.go b/plc4go/internal/plc4go/spi/model/DefaultPlcReadRequest.go index 5690bdd..b4cf699 100644 --- a/plc4go/internal/plc4go/spi/model/DefaultPlcReadRequest.go +++ b/plc4go/internal/plc4go/spi/model/DefaultPlcReadRequest.go @@ -22,6 +22,7 @@ package model import ( "encoding/xml" "github.com/apache/plc4x/plc4go/internal/plc4go/spi" + "github.com/apache/plc4x/plc4go/internal/plc4go/spi/interceptors" "github.com/apache/plc4x/plc4go/pkg/plc4go/model" "github.com/pkg/errors" "time" @@ -34,14 +35,14 @@ type DefaultPlcReadRequestBuilder struct { queryNames []string fields map[string]model.PlcField fieldNames []string - readRequestInterceptor ReadRequestInterceptor + readRequestInterceptor interceptors.ReadRequestInterceptor } func NewDefaultPlcReadRequestBuilder(fieldHandler spi.PlcFieldHandler, reader spi.PlcReader) *DefaultPlcReadRequestBuilder { return NewDefaultPlcReadRequestBuilderWithInterceptor(fieldHandler, reader, nil) } -func NewDefaultPlcReadRequestBuilderWithInterceptor(fieldHandler spi.PlcFieldHandler, reader spi.PlcReader, readRequestInterceptor ReadRequestInterceptor) *DefaultPlcReadRequestBuilder { +func NewDefaultPlcReadRequestBuilderWithInterceptor(fieldHandler spi.PlcFieldHandler, reader spi.PlcReader, readRequestInterceptor interceptors.ReadRequestInterceptor) *DefaultPlcReadRequestBuilder { return &DefaultPlcReadRequestBuilder{ reader: reader, fieldHandler: fieldHandler, @@ -53,14 +54,16 @@ func NewDefaultPlcReadRequestBuilderWithInterceptor(fieldHandler spi.PlcFieldHan } } -func (m *DefaultPlcReadRequestBuilder) AddQuery(name string, query string) { +func (m *DefaultPlcReadRequestBuilder) AddQuery(name string, query string) model.PlcReadRequestBuilder { m.queryNames = append(m.queryNames, name) m.queries[name] = query + return m } -func (m *DefaultPlcReadRequestBuilder) AddField(name string, field model.PlcField) { +func (m *DefaultPlcReadRequestBuilder) AddField(name string, field model.PlcField) model.PlcReadRequestBuilder { m.fieldNames = append(m.fieldNames, name) m.fields[name] = field + return m } func (m *DefaultPlcReadRequestBuilder) Build() (model.PlcReadRequest, error) { @@ -72,30 +75,31 @@ func (m *DefaultPlcReadRequestBuilder) Build() (model.PlcReadRequest, error) { } m.AddField(name, field) } - return DefaultPlcReadRequest{ - Fields: m.fields, - FieldNames: m.fieldNames, - Reader: m.reader, - ReadRequestInterceptor: m.readRequestInterceptor, - }, nil + return NewDefaultPlcReadRequest(m.fields, m.fieldNames, m.reader, m.readRequestInterceptor), nil } type DefaultPlcReadRequest struct { - Fields map[string]model.PlcField - FieldNames []string + DefaultRequest Reader spi.PlcReader - ReadRequestInterceptor ReadRequestInterceptor + ReadRequestInterceptor interceptors.ReadRequestInterceptor } -func NewDefaultPlcReadRequest(fields map[string]model.PlcField, fieldNames []string, reader spi.PlcReader, readRequestInterceptor ReadRequestInterceptor) DefaultPlcReadRequest { +func NewDefaultPlcReadRequest(fields map[string]model.PlcField, fieldNames []string, reader spi.PlcReader, readRequestInterceptor interceptors.ReadRequestInterceptor) model.PlcReadRequest { return DefaultPlcReadRequest{ - Fields: fields, - FieldNames: fieldNames, + DefaultRequest: NewDefaultRequest(fields, fieldNames), Reader: reader, ReadRequestInterceptor: readRequestInterceptor, } } +func (m DefaultPlcReadRequest) GetReader() spi.PlcReader { + return m.Reader +} + +func (m DefaultPlcReadRequest) GetReadRequestInterceptor() interceptors.ReadRequestInterceptor { + return m.ReadRequestInterceptor +} + func (m DefaultPlcReadRequest) Execute() <-chan model.PlcReadRequestResult { // Shortcut, if no interceptor is defined if m.ReadRequestInterceptor == nil { @@ -136,17 +140,6 @@ func (m DefaultPlcReadRequest) Execute() <-chan model.PlcReadRequestResult { return resultChannel } -func (m DefaultPlcReadRequest) GetFieldNames() []string { - return m.FieldNames -} - -func (m DefaultPlcReadRequest) GetField(name string) model.PlcField { - if field, ok := m.Fields[name]; ok { - return field - } - return nil -} - func (m DefaultPlcReadRequest) MarshalXML(e *xml.Encoder, start xml.StartElement) error { if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "PlcReadRequest"}}); err != nil { return err @@ -155,8 +148,8 @@ func (m DefaultPlcReadRequest) MarshalXML(e *xml.Encoder, start xml.StartElement if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "fields"}}); err != nil { return err } - for _, fieldName := range m.FieldNames { - field := m.Fields[fieldName] + for _, fieldName := range m.fieldNames { + field := m.fields[fieldName] if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: fieldName}}); err != nil { return err } diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcReadResponse.go b/plc4go/internal/plc4go/spi/model/DefaultPlcReadResponse.go index bd382ce..f911b3e 100644 --- a/plc4go/internal/plc4go/spi/model/DefaultPlcReadResponse.go +++ b/plc4go/internal/plc4go/spi/model/DefaultPlcReadResponse.go @@ -26,16 +26,16 @@ import ( ) type DefaultPlcReadResponse struct { - request model.PlcReadRequest - responseCodes map[string]model.PlcResponseCode - values map[string]values.PlcValue + DefaultResponse + request model.PlcReadRequest + values map[string]values.PlcValue } -func NewDefaultPlcReadResponse(request model.PlcReadRequest, responseCodes map[string]model.PlcResponseCode, values map[string]values.PlcValue) DefaultPlcReadResponse { +func NewDefaultPlcReadResponse(request model.PlcReadRequest, responseCodes map[string]model.PlcResponseCode, values map[string]values.PlcValue) model.PlcReadResponse { return DefaultPlcReadResponse{ - request: request, - responseCodes: responseCodes, - values: values, + DefaultResponse: NewDefaultResponse(responseCodes), + request: request, + values: values, } } @@ -54,10 +54,6 @@ func (m DefaultPlcReadResponse) GetRequest() model.PlcReadRequest { return m.request } -func (m DefaultPlcReadResponse) GetResponseCode(name string) model.PlcResponseCode { - return m.responseCodes[name] -} - func (m DefaultPlcReadResponse) GetValue(name string) values.PlcValue { return m.values[name] } diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionEvent.go b/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionEvent.go index cf87790..4ef16b4 100644 --- a/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionEvent.go +++ b/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionEvent.go @@ -27,22 +27,22 @@ import ( ) type DefaultPlcSubscriptionEvent struct { - fields map[string]model.PlcField - types map[string]SubscriptionType - intervals map[string]time.Duration - responseCodes map[string]model.PlcResponseCode - values map[string]values.PlcValue + DefaultResponse + fields map[string]model.PlcField + types map[string]SubscriptionType + intervals map[string]time.Duration + values map[string]values.PlcValue } func NewDefaultPlcSubscriptionEvent(fields map[string]model.PlcField, types map[string]SubscriptionType, intervals map[string]time.Duration, responseCodes map[string]model.PlcResponseCode, values map[string]values.PlcValue) DefaultPlcSubscriptionEvent { return DefaultPlcSubscriptionEvent{ - fields: fields, - types: types, - intervals: intervals, - responseCodes: responseCodes, - values: values, + DefaultResponse: NewDefaultResponse(responseCodes), + fields: fields, + types: types, + intervals: intervals, + values: values, } } @@ -66,10 +66,6 @@ func (m DefaultPlcSubscriptionEvent) GetInterval(name string) time.Duration { return m.intervals[name] } -func (m DefaultPlcSubscriptionEvent) GetResponseCode(name string) model.PlcResponseCode { - return m.responseCodes[name] -} - func (m DefaultPlcSubscriptionEvent) GetAddress(name string) string { panic("GetAddress not implemented") } diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionRequest.go b/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionRequest.go index b6fb8d3..f5b0552 100644 --- a/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionRequest.go +++ b/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionRequest.go @@ -61,46 +61,53 @@ func NewDefaultPlcSubscriptionRequestBuilder(fieldHandler spi.PlcFieldHandler, v } } -func (m *DefaultPlcSubscriptionRequestBuilder) AddCyclicQuery(name string, query string, interval time.Duration) { +func (m *DefaultPlcSubscriptionRequestBuilder) AddCyclicQuery(name string, query string, interval time.Duration) model.PlcSubscriptionRequestBuilder { m.queryNames = append(m.queryNames, name) m.queries[name] = query m.types[name] = SubscriptionCyclic m.intervals[name] = interval + return m } -func (m *DefaultPlcSubscriptionRequestBuilder) AddCyclicField(name string, field model.PlcField, interval time.Duration) { +func (m *DefaultPlcSubscriptionRequestBuilder) AddCyclicField(name string, field model.PlcField, interval time.Duration) model.PlcSubscriptionRequestBuilder { m.fieldNames = append(m.fieldNames, name) m.fields[name] = field m.types[name] = SubscriptionCyclic m.intervals[name] = interval + return m } -func (m *DefaultPlcSubscriptionRequestBuilder) AddChangeOfStateQuery(name string, query string) { +func (m *DefaultPlcSubscriptionRequestBuilder) AddChangeOfStateQuery(name string, query string) model.PlcSubscriptionRequestBuilder { m.queryNames = append(m.queryNames, name) m.queries[name] = query m.types[name] = SubscriptionChangeOfState + return m } -func (m *DefaultPlcSubscriptionRequestBuilder) AddChangeOfStateField(name string, field model.PlcField) { +func (m *DefaultPlcSubscriptionRequestBuilder) AddChangeOfStateField(name string, field model.PlcField) model.PlcSubscriptionRequestBuilder { m.fieldNames = append(m.fieldNames, name) m.fields[name] = field m.types[name] = SubscriptionChangeOfState + return m } -func (m *DefaultPlcSubscriptionRequestBuilder) AddEventQuery(name string, query string) { +func (m *DefaultPlcSubscriptionRequestBuilder) AddEventQuery(name string, query string) model.PlcSubscriptionRequestBuilder { m.queryNames = append(m.queryNames, name) m.queries[name] = query m.types[name] = SubscriptionEvent + return m } -func (m *DefaultPlcSubscriptionRequestBuilder) AddEventField(name string, field model.PlcField) { +func (m *DefaultPlcSubscriptionRequestBuilder) AddEventField(name string, field model.PlcField) model.PlcSubscriptionRequestBuilder { m.fieldNames = append(m.fieldNames, name) m.fields[name] = field m.types[name] = SubscriptionEvent + return m } -func (m *DefaultPlcSubscriptionRequestBuilder) AddItemHandler(eventHandler model.PlcSubscriptionEventHandler) { +func (m *DefaultPlcSubscriptionRequestBuilder) AddItemHandler(eventHandler model.PlcSubscriptionEventHandler) model.PlcSubscriptionRequestBuilder { m.eventHandler = eventHandler + return m } func (m *DefaultPlcSubscriptionRequestBuilder) Build() (model.PlcSubscriptionRequest, error) { @@ -113,35 +120,23 @@ func (m *DefaultPlcSubscriptionRequestBuilder) Build() (model.PlcSubscriptionReq m.fieldNames = append(m.fieldNames, name) m.fields[name] = field } - return DefaultPlcSubscriptionRequest{ - fields: m.fields, - fieldNames: m.fieldNames, - types: m.types, - intervals: m.intervals, - subscriber: m.subscriber, - eventHandler: m.eventHandler, - }, nil + return NewDefaultPlcSubscriptionRequest(m.fields, m.fieldNames, m.types, m.intervals, m.subscriber, m.eventHandler), nil } type DefaultPlcSubscriptionRequest struct { - fields map[string]model.PlcField - fieldNames []string + DefaultRequest types map[string]SubscriptionType intervals map[string]time.Duration - eventHandler model.PlcSubscriptionEventHandler subscriber spi.PlcSubscriber + eventHandler model.PlcSubscriptionEventHandler } -func (m DefaultPlcSubscriptionRequest) Execute() <-chan model.PlcSubscriptionRequestResult { - return m.subscriber.Subscribe(m) -} - -func (m DefaultPlcSubscriptionRequest) GetFieldNames() []string { - return m.fieldNames +func NewDefaultPlcSubscriptionRequest(fields map[string]model.PlcField, fieldNames []string, types map[string]SubscriptionType, intervals map[string]time.Duration, subscriber spi.PlcSubscriber, eventHandler model.PlcSubscriptionEventHandler) model.PlcSubscriptionRequest { + return DefaultPlcSubscriptionRequest{NewDefaultRequest(fields, fieldNames), types, intervals, subscriber, eventHandler} } -func (m DefaultPlcSubscriptionRequest) GetField(name string) model.PlcField { - return m.fields[name] +func (m DefaultPlcSubscriptionRequest) Execute() <-chan model.PlcSubscriptionRequestResult { + return m.subscriber.Subscribe(m) } func (m DefaultPlcSubscriptionRequest) GetEventHandler() model.PlcSubscriptionEventHandler { diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionResponse.go b/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionResponse.go index 4892f3b..19a1256 100644 --- a/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionResponse.go +++ b/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionResponse.go @@ -25,14 +25,14 @@ import ( ) type DefaultPlcSubscriptionResponse struct { - request model.PlcSubscriptionRequest - responseCodes map[string]model.PlcResponseCode + DefaultResponse + request model.PlcSubscriptionRequest } func NewDefaultPlcSubscriptionResponse(request model.PlcSubscriptionRequest, responseCodes map[string]model.PlcResponseCode) DefaultPlcSubscriptionResponse { return DefaultPlcSubscriptionResponse{ - request: request, - responseCodes: responseCodes, + DefaultResponse: NewDefaultResponse(responseCodes), + request: request, } } @@ -51,10 +51,6 @@ func (m DefaultPlcSubscriptionResponse) GetFieldNames() []string { return fieldNames } -func (m DefaultPlcSubscriptionResponse) GetResponseCode(name string) model.PlcResponseCode { - return m.responseCodes[name] -} - func (m DefaultPlcSubscriptionResponse) GetValue(name string) interface{} { panic("not implemented: implement me") } diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcWriteRequest.go b/plc4go/internal/plc4go/spi/model/DefaultPlcWriteRequest.go index 94c9484..ae5eb75 100644 --- a/plc4go/internal/plc4go/spi/model/DefaultPlcWriteRequest.go +++ b/plc4go/internal/plc4go/spi/model/DefaultPlcWriteRequest.go @@ -52,16 +52,18 @@ func NewDefaultPlcWriteRequestBuilder(fieldHandler spi.PlcFieldHandler, valueHan } } -func (m *DefaultPlcWriteRequestBuilder) AddQuery(name string, query string, value interface{}) { +func (m *DefaultPlcWriteRequestBuilder) AddQuery(name string, query string, value interface{}) model.PlcWriteRequestBuilder { m.queryNames = append(m.queryNames, name) m.queries[name] = query m.values[name] = value + return m } -func (m *DefaultPlcWriteRequestBuilder) AddField(name string, field model.PlcField, value interface{}) { +func (m *DefaultPlcWriteRequestBuilder) AddField(name string, field model.PlcField, value interface{}) model.PlcWriteRequestBuilder { m.fieldNames = append(m.fieldNames, name) m.fields[name] = field m.values[name] = value + return m } func (m *DefaultPlcWriteRequestBuilder) Build() (model.PlcWriteRequest, error) { @@ -84,31 +86,21 @@ func (m *DefaultPlcWriteRequestBuilder) Build() (model.PlcWriteRequest, error) { } plcValues[name] = value } - return DefaultPlcWriteRequest{ - fields: m.fields, - fieldNames: m.fieldNames, - values: plcValues, - writer: m.writer, - }, nil + return NewDefaultPlcWriteRequest(m.fields, m.fieldNames, plcValues, m.writer), nil } type DefaultPlcWriteRequest struct { - fields map[string]model.PlcField - fieldNames []string - values map[string]values.PlcValue - writer spi.PlcWriter + DefaultRequest + values map[string]values.PlcValue + writer spi.PlcWriter } -func (m DefaultPlcWriteRequest) Execute() <-chan model.PlcWriteRequestResult { - return m.writer.Write(m) -} - -func (m DefaultPlcWriteRequest) GetFieldNames() []string { - return m.fieldNames +func NewDefaultPlcWriteRequest(fields map[string]model.PlcField, fieldNames []string, values map[string]values.PlcValue, writer spi.PlcWriter) model.PlcWriteRequest { + return DefaultPlcWriteRequest{NewDefaultRequest(fields, fieldNames), values, writer} } -func (m DefaultPlcWriteRequest) GetField(name string) model.PlcField { - return m.fields[name] +func (m DefaultPlcWriteRequest) Execute() <-chan model.PlcWriteRequestResult { + return m.writer.Write(m) } func (m DefaultPlcWriteRequest) GetValue(name string) values.PlcValue { diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcWriteResponse.go b/plc4go/internal/plc4go/spi/model/DefaultPlcWriteResponse.go index c2367b7..c5fe0c3 100644 --- a/plc4go/internal/plc4go/spi/model/DefaultPlcWriteResponse.go +++ b/plc4go/internal/plc4go/spi/model/DefaultPlcWriteResponse.go @@ -25,14 +25,14 @@ import ( ) type DefaultPlcWriteResponse struct { - request model.PlcWriteRequest - responseCodes map[string]model.PlcResponseCode + DefaultResponse + request model.PlcWriteRequest } func NewDefaultPlcWriteResponse(request model.PlcWriteRequest, responseCodes map[string]model.PlcResponseCode) DefaultPlcWriteResponse { return DefaultPlcWriteResponse{ - request: request, - responseCodes: responseCodes, + DefaultResponse: NewDefaultResponse(responseCodes), + request: request, } } @@ -51,10 +51,6 @@ func (m DefaultPlcWriteResponse) GetRequest() model.PlcWriteRequest { return m.request } -func (m DefaultPlcWriteResponse) GetResponseCode(name string) model.PlcResponseCode { - return m.responseCodes[name] -} - func (m DefaultPlcWriteResponse) MarshalXML(e *xml.Encoder, start xml.StartElement) error { if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: "PlcWriteResponse"}}); err != nil { return err diff --git a/plc4go/pkg/plc4go/model/plc_read.go b/plc4go/internal/plc4go/spi/model/DefaultRequest.go similarity index 56% copy from plc4go/pkg/plc4go/model/plc_read.go copy to plc4go/internal/plc4go/spi/model/DefaultRequest.go index b603144..12ff0b3 100644 --- a/plc4go/pkg/plc4go/model/plc_read.go +++ b/plc4go/internal/plc4go/spi/model/DefaultRequest.go @@ -19,31 +19,24 @@ package model -import "github.com/apache/plc4x/plc4go/pkg/plc4go/values" +import "github.com/apache/plc4x/plc4go/pkg/plc4go/model" -type PlcReadRequestBuilder interface { - AddQuery(name string, query string) - AddField(name string, field PlcField) - Build() (PlcReadRequest, error) +type DefaultRequest struct { + fields map[string]model.PlcField + fieldNames []string } -type PlcReadRequestResult struct { - Request PlcReadRequest - Response PlcReadResponse - Err error +func NewDefaultRequest(Fields map[string]model.PlcField, FieldNames []string) DefaultRequest { + return DefaultRequest{Fields, FieldNames} } -type PlcReadRequest interface { - Execute() <-chan PlcReadRequestResult - GetFieldNames() []string - GetField(name string) PlcField - PlcRequest +func (m DefaultRequest) GetFieldNames() []string { + return m.fieldNames } -type PlcReadResponse interface { - GetRequest() PlcReadRequest - GetFieldNames() []string - GetResponseCode(name string) PlcResponseCode - GetValue(name string) values.PlcValue - PlcResponse +func (m DefaultRequest) GetField(name string) model.PlcField { + if field, ok := m.fields[name]; ok { + return field + } + return nil } diff --git a/plc4go/pkg/plc4go/model/plc_read.go b/plc4go/internal/plc4go/spi/model/DefaultResponse.go similarity index 56% copy from plc4go/pkg/plc4go/model/plc_read.go copy to plc4go/internal/plc4go/spi/model/DefaultResponse.go index b603144..a0ae83a 100644 --- a/plc4go/pkg/plc4go/model/plc_read.go +++ b/plc4go/internal/plc4go/spi/model/DefaultResponse.go @@ -19,31 +19,16 @@ package model -import "github.com/apache/plc4x/plc4go/pkg/plc4go/values" +import "github.com/apache/plc4x/plc4go/pkg/plc4go/model" -type PlcReadRequestBuilder interface { - AddQuery(name string, query string) - AddField(name string, field PlcField) - Build() (PlcReadRequest, error) +type DefaultResponse struct { + responseCodes map[string]model.PlcResponseCode } -type PlcReadRequestResult struct { - Request PlcReadRequest - Response PlcReadResponse - Err error +func (m DefaultResponse) GetResponseCode(name string) model.PlcResponseCode { + return m.responseCodes[name] } -type PlcReadRequest interface { - Execute() <-chan PlcReadRequestResult - GetFieldNames() []string - GetField(name string) PlcField - PlcRequest -} - -type PlcReadResponse interface { - GetRequest() PlcReadRequest - GetFieldNames() []string - GetResponseCode(name string) PlcResponseCode - GetValue(name string) values.PlcValue - PlcResponse +func NewDefaultResponse(responseCodes map[string]model.PlcResponseCode) DefaultResponse { + return DefaultResponse{responseCodes} } diff --git a/plc4go/pkg/plc4go/model/plc_browse.go b/plc4go/pkg/plc4go/model/plc_browse.go index f51ac1c..960992d 100644 --- a/plc4go/pkg/plc4go/model/plc_browse.go +++ b/plc4go/pkg/plc4go/model/plc_browse.go @@ -20,7 +20,7 @@ package model type PlcBrowseRequestBuilder interface { - AddItem(name string, query string) + AddItem(name string, query string) PlcBrowseRequestBuilder Build() (PlcBrowseRequest, error) } diff --git a/plc4go/pkg/plc4go/model/plc_read.go b/plc4go/pkg/plc4go/model/plc_read.go index b603144..8334d99 100644 --- a/plc4go/pkg/plc4go/model/plc_read.go +++ b/plc4go/pkg/plc4go/model/plc_read.go @@ -22,8 +22,8 @@ package model import "github.com/apache/plc4x/plc4go/pkg/plc4go/values" type PlcReadRequestBuilder interface { - AddQuery(name string, query string) - AddField(name string, field PlcField) + AddQuery(name string, query string) PlcReadRequestBuilder + AddField(name string, field PlcField) PlcReadRequestBuilder Build() (PlcReadRequest, error) } diff --git a/plc4go/pkg/plc4go/model/plc_subscription.go b/plc4go/pkg/plc4go/model/plc_subscription.go index d139762..0801d4b 100644 --- a/plc4go/pkg/plc4go/model/plc_subscription.go +++ b/plc4go/pkg/plc4go/model/plc_subscription.go @@ -36,13 +36,13 @@ type PlcSubscriptionEvent interface { type PlcSubscriptionEventHandler func(event PlcSubscriptionEvent) type PlcSubscriptionRequestBuilder interface { - AddCyclicQuery(name string, query string, interval time.Duration) - AddCyclicField(name string, field PlcField, interval time.Duration) - AddChangeOfStateQuery(name string, query string) - AddChangeOfStateField(name string, field PlcField) - AddEventQuery(name string, query string) - AddEventField(name string, field PlcField) - AddItemHandler(handler PlcSubscriptionEventHandler) + AddCyclicQuery(name string, query string, interval time.Duration) PlcSubscriptionRequestBuilder + AddCyclicField(name string, field PlcField, interval time.Duration) PlcSubscriptionRequestBuilder + AddChangeOfStateQuery(name string, query string) PlcSubscriptionRequestBuilder + AddChangeOfStateField(name string, field PlcField) PlcSubscriptionRequestBuilder + AddEventQuery(name string, query string) PlcSubscriptionRequestBuilder + AddEventField(name string, field PlcField) PlcSubscriptionRequestBuilder + AddItemHandler(handler PlcSubscriptionEventHandler) PlcSubscriptionRequestBuilder Build() (PlcSubscriptionRequest, error) } diff --git a/plc4go/pkg/plc4go/model/plc_write.go b/plc4go/pkg/plc4go/model/plc_write.go index c84395c..88d4f3c 100644 --- a/plc4go/pkg/plc4go/model/plc_write.go +++ b/plc4go/pkg/plc4go/model/plc_write.go @@ -22,8 +22,8 @@ package model import "github.com/apache/plc4x/plc4go/pkg/plc4go/values" type PlcWriteRequestBuilder interface { - AddQuery(name string, query string, value interface{}) - AddField(name string, field PlcField, value interface{}) + AddQuery(name string, query string, value interface{}) PlcWriteRequestBuilder + AddField(name string, field PlcField, value interface{}) PlcWriteRequestBuilder Build() (PlcWriteRequest, error) }