go-emlid/reach/client/protocol/v2/protocol.go

54 lines
1.3 KiB
Go

package v2
import (
"context"
"forge.cadoles.com/cadoles/go-emlid/reach/client/protocol"
"forge.cadoles.com/cadoles/go-emlid/reach/client/protocol/v2/api"
"github.com/Masterminds/semver/v3"
"github.com/pkg/errors"
)
const Identifier protocol.Identifier = "v2"
const compatibleVersionConstraint = ">= 32"
type Protocol struct {
}
// Available implements protocol.Protocol.
func (p *Protocol) Available(ctx context.Context, addr string) (protocol.Operations, error) {
info, err := api.GetInfo(ctx, addr)
if err != nil {
return nil, errors.WithStack(err)
}
versionConstraint, err := semver.NewConstraint(compatibleVersionConstraint)
if err != nil {
return nil, errors.WithStack(err)
}
version, err := semver.NewVersion(info.Reachview.Version)
if err != nil {
return nil, errors.WithStack(err)
}
if !versionConstraint.Check(version) {
return nil, errors.Errorf("reachview version '%s' does not match constraint '%s'", info.Reachview.Version, compatibleVersionConstraint)
}
return &Operations{addr: addr}, nil
}
// Identifier implements protocol.Protocol.
func (p *Protocol) Identifier() protocol.Identifier {
return Identifier
}
// Operations implements protocol.Protocol.
func (p *Protocol) Operations(addr string) protocol.Operations {
return &Operations{addr: addr}
}
var _ protocol.Protocol = &Protocol{}