29 lines
882 B
Go
29 lines
882 B
Go
package domain
|
|
|
|
import (
|
|
"errors"
|
|
|
|
rvboxv1 "github.com/rvbox/rvbox/gen/go/rvbox/v1"
|
|
)
|
|
|
|
var ErrNoCompatibleProtocol = errors.New("no compatible protocol version")
|
|
|
|
// SelectProtocol chooses the highest mutually supported minor version.
|
|
func SelectProtocol(server, client *rvboxv1.ProtocolRange) (*rvboxv1.ProtocolVersion, error) {
|
|
if server == nil || client == nil || server.Major == 0 || client.Major == 0 || server.Major != client.Major || server.MinMinor > server.MaxMinor || client.MinMinor > client.MaxMinor {
|
|
return nil, ErrNoCompatibleProtocol
|
|
}
|
|
minimum := server.MinMinor
|
|
if client.MinMinor > minimum {
|
|
minimum = client.MinMinor
|
|
}
|
|
maximum := server.MaxMinor
|
|
if client.MaxMinor < maximum {
|
|
maximum = client.MaxMinor
|
|
}
|
|
if minimum > maximum {
|
|
return nil, ErrNoCompatibleProtocol
|
|
}
|
|
return &rvboxv1.ProtocolVersion{Major: server.Major, Minor: maximum}, nil
|
|
}
|