Files
kopia/internal/feature/feature.go
Julio López c262998173 chore(general): misc cleanups (#3982)
* chore(general): remove unused `Behavior` type
* chore(test): leverage `testutil.ServerParameters` in server test
2024-07-11 17:18:44 -07:00

69 lines
2.1 KiB
Go

// Package feature tracks features that are supported by Kopia client to ensure forwards and backwards
// compatibility.
package feature
import (
"fmt"
)
// IfNotUnderstood describes the behavior of Kopia when a required feature is not understood.
type IfNotUnderstood struct {
Warn bool `json:"warn"` // warn instead of failing
Message string `json:"message,omitempty"` // message to show to users
URL string `json:"url,omitempty"` // URL to show to users
UpgradeToVersion string `json:"upgradeToVersion,omitempty"` // suggest upgrading to a particular version
}
// Feature identifies a feature that particular Kopia client must understand.
type Feature string
// Required describes a single required feature that a client must understand
// along with desired behavior when not understood.
type Required struct {
Feature Feature `json:"feature"`
IfNotUnderstood IfNotUnderstood `json:"ifNotUnderstood"`
}
// UnsupportedMessage returns a message to display to users if the feature is unsupported.
func (r Required) UnsupportedMessage() string {
msg := fmt.Sprintf("This version of Kopia does not support feature '%v'.", r.Feature)
if r.IfNotUnderstood.Message != "" {
msg += "\n" + r.IfNotUnderstood.Message
}
if r.IfNotUnderstood.URL != "" {
msg += "\nSee: " + r.IfNotUnderstood.URL
}
if r.IfNotUnderstood.UpgradeToVersion != "" {
msg += "\nPlease upgrade to version " + r.IfNotUnderstood.UpgradeToVersion + " or newer."
}
return msg
}
// GetUnsupportedFeatures compares the provided list of required features to the list of supported features
// and returns the list of []RequireFeature that are not supported.
func GetUnsupportedFeatures(required []Required, supported []Feature) []Required {
var result []Required
for _, req := range required {
if !isSupported(req, supported) {
result = append(result, req)
}
}
return result
}
func isSupported(req Required, supported []Feature) bool {
for _, s := range supported {
if req.Feature == s {
return true
}
}
return false
}