-
Notifications
You must be signed in to change notification settings - Fork 138
/
Copy pathmodule_providers.go
85 lines (68 loc) · 2.46 KB
/
module_providers.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package command
import (
"context"
"fmt"
"github.com/creachadair/jrpc2/code"
lsctx "github.com/hashicorp/terraform-ls/internal/context"
"github.com/hashicorp/terraform-ls/internal/langserver/cmd"
op "github.com/hashicorp/terraform-ls/internal/terraform/module/operation"
"github.com/hashicorp/terraform-ls/internal/uri"
tfaddr "github.com/hashicorp/terraform-registry-address"
)
const moduleProvidersVersion = 0
type moduleProvidersResponse struct {
FormatVersion int `json:"v"`
ProviderRequirements map[string]providerRequirement `json:"provider_requirements"`
InstalledProviders map[string]string `json:"installed_providers"`
}
type providerRequirement struct {
DisplayName string `json:"display_name"`
VersionConstraint string `json:"version_constraint,omitempty"`
DocsLink string `json:"docs_link,omitempty"`
}
func ModuleProvidersHandler(ctx context.Context, args cmd.CommandArgs) (interface{}, error) {
response := moduleProvidersResponse{
FormatVersion: moduleProvidersVersion,
ProviderRequirements: make(map[string]providerRequirement),
InstalledProviders: make(map[string]string),
}
modUri, ok := args.GetString("uri")
if !ok || modUri == "" {
return response, fmt.Errorf("%w: expected module uri argument to be set", code.InvalidParams.Err())
}
if !uri.IsURIValid(modUri) {
return response, fmt.Errorf("URI %q is not valid", modUri)
}
modPath, err := uri.PathFromURI(modUri)
if err != nil {
return response, err
}
mm, err := lsctx.ModuleFinder(ctx)
if err != nil {
return response, err
}
mod, _ := mm.ModuleByPath(modPath)
if mod == nil {
return response, nil
}
if mod.MetaState == op.OpStateUnknown || mod.MetaErr != nil {
return response, nil
}
for provider, version := range mod.Meta.ProviderRequirements {
response.ProviderRequirements[provider.String()] = providerRequirement{
DisplayName: provider.ForDisplay(),
VersionConstraint: version.String(),
DocsLink: getProviderDocumentationLink(provider),
}
}
for provider, version := range mod.InstalledProviders {
response.InstalledProviders[provider.String()] = version.String()
}
return response, nil
}
func getProviderDocumentationLink(provider tfaddr.Provider) string {
if provider.IsLegacy() || provider.IsBuiltIn() || provider.Hostname != "registry.terraform.io" {
return ""
}
return fmt.Sprintf(`https://registry.terraform.io/providers/%s/latest`, provider.ForDisplay())
}