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 // FeatureCIDispatch is RunService.DispatchWorkflow (`ermite workflow run`).
44 FeatureCIDispatch = "ci.dispatch"
45 // FeatureCIWorkflows is RunService.ListWorkflows, DisableWorkflow and
46 // EnableWorkflow (`ermite workflow list|disable|enable`).
47 FeatureCIWorkflows = "ci.workflows"
48 // FeatureCIArtifacts is ArtifactService (`ermite run artifacts`,
49 // `run download`).
50 FeatureCIArtifacts = "ci.artifacts"
51 // FeatureCommitSignatures is TrustedKeyService and Commit.verification
52 // (`ermite signing-key trust`).
53 FeatureCommitSignatures = "commit_signatures"
54)
55
56// UsedFeatures lists the features the CLI uses, in the order they are reported.
57func UsedFeatures() []string {
58 return []string{FeatureRepoUpdate, FeatureEventsResume, FeatureMergeRequests, FeatureMergeDeleteBranch, FeatureSigningKey, FeatureSession, FeatureTokenBranchPrefixes, FeatureCIRuns, FeatureCIRunners, FeatureCISecrets, FeatureCIDispatch, FeatureCIWorkflows, FeatureCIArtifacts, FeaturePasskeys, FeatureCommitSignatures}
59}
60
61// MissingFeatures returns the features the CLI uses that have is lacking.
62func MissingFeatures(have []string) []string {
63 var missing []string
64 for _, f := range UsedFeatures() {
65 if !slices.Contains(have, f) {
66 missing = append(missing, f)
67 }
68 }
69 return missing
70}