blob: 929b401c96e3b42966d183dc2bdb1272c1deb202 [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 options
import "fmt"
// WithDiscoveryOption is a marker interface for options regarding discovery
type WithDiscoveryOption interface {
isDiscoveryOption() bool
}
func WithDiscoveryOptionProtocol(protocolName string) WithDiscoveryOption {
return discoveryOptionProtocol{
protocolName: protocolName,
}
}
func WithDiscoveryOptionTransport(transportName string) WithDiscoveryOption {
return discoveryOptionTransport{
transportName: transportName,
}
}
func WithDiscoveryOptionDeviceName(deviceName string) WithDiscoveryOption {
return discoveryOptionDeviceName{
deviceName: deviceName,
}
}
func WithDiscoveryOptionLocalAddress(localAddress string) WithDiscoveryOption {
return discoveryOptionLocalAddress{
localAddress: localAddress,
}
}
func WithDiscoveryOptionRemoteAddress(remoteAddress string) WithDiscoveryOption {
return discoveryOptionRemoteAddress{
remoteAddress: remoteAddress,
}
}
func WithDiscoveryOptionProtocolSpecific(key string, value any) WithDiscoveryOption {
return discoveryOptionProtocolSpecific{
key: key,
value: value,
}
}
func FilterDiscoveryOptionsProtocol(options []WithDiscoveryOption) []DiscoveryOptionProtocol {
var filtered []DiscoveryOptionProtocol
for _, option := range options {
switch option.(type) {
case discoveryOptionProtocol:
filtered = append(filtered, option.(DiscoveryOptionProtocol))
}
}
return filtered
}
func FilterDiscoveryOptionsTransport(options []WithDiscoveryOption) []DiscoveryOptionTransport {
var filtered []DiscoveryOptionTransport
for _, option := range options {
switch option.(type) {
case discoveryOptionTransport:
filtered = append(filtered, option.(DiscoveryOptionTransport))
}
}
return filtered
}
func FilterDiscoveryOptionsDeviceName(options []WithDiscoveryOption) []DiscoveryOptionDeviceName {
var filtered []DiscoveryOptionDeviceName
for _, option := range options {
switch option.(type) {
case discoveryOptionDeviceName:
filtered = append(filtered, option.(DiscoveryOptionDeviceName))
}
}
return filtered
}
func FilterDiscoveryOptionsLocalAddress(options []WithDiscoveryOption) []DiscoveryOptionLocalAddress {
var filtered []DiscoveryOptionLocalAddress
for _, option := range options {
switch option.(type) {
case discoveryOptionLocalAddress:
filtered = append(filtered, option.(DiscoveryOptionLocalAddress))
}
}
return filtered
}
func FilterDiscoveryOptionsRemoteAddress(options []WithDiscoveryOption) []DiscoveryOptionRemoteAddress {
var filtered []DiscoveryOptionRemoteAddress
for _, option := range options {
switch option.(type) {
case discoveryOptionRemoteAddress:
filtered = append(filtered, option.(DiscoveryOptionRemoteAddress))
}
}
return filtered
}
func FilterDiscoveryOptionProtocolSpecific(options []WithDiscoveryOption) []DiscoveryOptionProtocolSpecific {
var filtered []DiscoveryOptionProtocolSpecific
for _, option := range options {
switch option := option.(type) {
case discoveryOptionProtocolSpecific:
filtered = append(filtered, option)
}
}
return filtered
}
///////////////////////////////////////
///////////////////////////////////////
//
// Internal section
//
type discoveryOption struct {
}
func (_ discoveryOption) isDiscoveryOption() bool {
return true
}
type DiscoveryOptionProtocol interface {
GetProtocolName() string
}
type discoveryOptionProtocol struct {
discoveryOption
protocolName string
}
func (d discoveryOptionProtocol) GetProtocolName() string {
return d.protocolName
}
func (d discoveryOptionProtocol) String() string {
return d.protocolName
}
type DiscoveryOptionTransport interface {
GetTransportName() string
}
type discoveryOptionTransport struct {
discoveryOption
transportName string
}
func (d discoveryOptionTransport) GetTransportName() string {
return d.transportName
}
func (d discoveryOptionTransport) String() string {
return d.transportName
}
type DiscoveryOptionDeviceName interface {
GetDeviceName() string
}
type discoveryOptionDeviceName struct {
discoveryOption
deviceName string
}
func (d discoveryOptionDeviceName) GetDeviceName() string {
return d.deviceName
}
func (d discoveryOptionDeviceName) String() string {
return d.deviceName
}
type DiscoveryOptionLocalAddress interface {
GetLocalAddress() string
}
type discoveryOptionLocalAddress struct {
discoveryOption
localAddress string
}
func (d discoveryOptionLocalAddress) GetLocalAddress() string {
return d.localAddress
}
func (d discoveryOptionLocalAddress) String() string {
return d.localAddress
}
type DiscoveryOptionRemoteAddress interface {
GetRemoteAddress() string
}
type discoveryOptionRemoteAddress struct {
discoveryOption
remoteAddress string
}
func (d discoveryOptionRemoteAddress) GetRemoteAddress() string {
return d.remoteAddress
}
func (d discoveryOptionRemoteAddress) String() string {
return d.remoteAddress
}
type DiscoveryOptionProtocolSpecific interface {
GetKey() string
GetValue() any
}
type discoveryOptionProtocolSpecific struct {
discoveryOption
key string
value any
}
func (d discoveryOptionProtocolSpecific) GetKey() string {
return d.key
}
func (d discoveryOptionProtocolSpecific) GetValue() any {
return d.value
}
func (d discoveryOptionProtocolSpecific) String() any {
return fmt.Sprintf("%s:%v", d.key, d.value)
}
//
// Internal section
//
///////////////////////////////////////
///////////////////////////////////////