features.go RawHistoryFolder
1// SPDX-License-Identifier: AGPL-3.0-or-later
2
3package client
4
5import "slices"
6
7// Contract features this client relies on, as listed by
8// ServerService.GetVersion. A server without one still works for everything
9// else: the CLI warns instead of failing.
10const (
11 // FeatureRepoUpdate is RepoService.UpdateRepo (`ermite repo edit`).
12 FeatureRepoUpdate = "repo.update"
13 // FeatureEventsResume is EventService.Watch with resume_after, which
14 // `ermite watch` uses to continue after a reconnection.
15 FeatureEventsResume = "events.resume"
16 // FeatureMergeRequests is MergeRequestService (`ermite mr`).
17 FeatureMergeRequests = "merge_requests"
18 // FeatureMergeDeleteBranch is MergeMergeRequest with delete_source_branch
19 // (`ermite mr merge --delete-branch`).
20 FeatureMergeDeleteBranch = "merge_requests.delete_branch"
21 // FeatureSigningKey is ServerService.GetSigningKey (`ermite signing-key`).
22 FeatureSigningKey = "signing_key"
23 // FeatureSession is SessionService (`ermite web login`, `web logout`).
24 FeatureSession = "session"
25 // FeaturePasskeys is SessionService.ListPasskeys and RemovePasskey
26 // (`ermite web passkey`). A server lists it only when passkeys are
27 // available (https public URL with a DNS host name).
28 FeaturePasskeys = "passkeys"
29 // FeatureTokenBranchPrefixes is Token.branch_prefixes and
30 // CreateTokenRequest.branch_prefixes (`ermite token create --branch-prefix`).
31 // A server without it ignores the field and would create an unlimited
32 // token: `token create --branch-prefix` reads the features first and
33 // refuses when it is missing (the main guard), and also checks the token it
34 // gets back (a backstop).
35 FeatureTokenBranchPrefixes = "token.branch_prefixes"
36 // FeatureCIRuns is RunService (`ermite run`), FeatureCIRunners its runner
37 // calls (`ermite runner`).
38 FeatureCIRuns = "ci.runs"
39 FeatureCIRunners = "ci.runners"
40 // FeatureCISecrets is SecretService, VariableService and EnvironmentService
41 // (`ermite secret`, `variable`, `environment`).
42 FeatureCISecrets = "ci.secrets"
43)
44
45// UsedFeatures lists the features the CLI uses, in the order they are reported.
46func UsedFeatures() []string {
47 return []string{FeatureRepoUpdate, FeatureEventsResume, FeatureMergeRequests, FeatureMergeDeleteBranch, FeatureSigningKey, FeatureSession, FeatureTokenBranchPrefixes, FeatureCIRuns, FeatureCIRunners, FeatureCISecrets, FeaturePasskeys}
48}
49
50// MissingFeatures returns the features the CLI uses that have is lacking.
51func MissingFeatures(have []string) []string {
52 var missing []string
53 for _, f := range UsedFeatures() {
54 if !slices.Contains(have, f) {
55 missing = append(missing, f)
56 }
57 }
58 return missing
59}