-
Notifications
You must be signed in to change notification settings - Fork 137
/
Copy pathvalidate.go
77 lines (65 loc) · 2.16 KB
/
validate.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
package command
import (
"context"
"fmt"
"github.com/creachadair/jrpc2/code"
lsctx "github.com/hashicorp/terraform-ls/internal/context"
"github.com/hashicorp/terraform-ls/internal/document"
"github.com/hashicorp/terraform-ls/internal/langserver/cmd"
"github.com/hashicorp/terraform-ls/internal/langserver/diagnostics"
"github.com/hashicorp/terraform-ls/internal/langserver/errors"
"github.com/hashicorp/terraform-ls/internal/langserver/progress"
"github.com/hashicorp/terraform-ls/internal/state"
"github.com/hashicorp/terraform-ls/internal/terraform/module"
"github.com/hashicorp/terraform-ls/internal/uri"
)
func (h *CmdHandler) TerraformValidateHandler(ctx context.Context, args cmd.CommandArgs) (interface{}, error) {
dirUri, ok := args.GetString("uri")
if !ok || dirUri == "" {
return nil, fmt.Errorf("%w: expected module uri argument to be set", code.InvalidParams.Err())
}
if !uri.IsURIValid(dirUri) {
return nil, fmt.Errorf("URI %q is not valid", dirUri)
}
dirHandle := document.DirHandleFromURI(dirUri)
mod, err := h.StateStore.Modules.ModuleByPath(dirHandle.Path())
if err != nil {
if state.IsModuleNotFound(err) {
err = h.StateStore.Modules.Add(dirHandle.Path())
if err != nil {
return nil, err
}
mod, err = h.StateStore.Modules.ModuleByPath(dirHandle.Path())
if err != nil {
return nil, err
}
} else {
return nil, err
}
}
tfExec, err := module.TerraformExecutorForModule(ctx, mod.Path)
if err != nil {
return nil, errors.EnrichTfExecError(err)
}
notifier, err := lsctx.DiagnosticsNotifier(ctx)
if err != nil {
return nil, err
}
progress.Begin(ctx, "Validating")
defer func() {
progress.End(ctx, "Finished")
}()
progress.Report(ctx, "Running terraform validate ...")
jsonDiags, err := tfExec.Validate(ctx)
if err != nil {
return nil, err
}
diags := diagnostics.NewDiagnostics()
validateDiags := diagnostics.HCLDiagsFromJSON(jsonDiags)
diags.EmptyRootDiagnostic()
diags.Append("terraform validate", validateDiags)
diags.Append("HCL", mod.ModuleDiagnostics.AsMap())
diags.Append("HCL", mod.VarsDiagnostics.AutoloadedOnly().AsMap())
notifier.PublishHCLDiags(ctx, mod.Path, diags)
return nil, nil
}