Skip to content

Commit 8291147

Browse files
committed
Allow querying datafolder via gprc
1 parent 387a275 commit 8291147

File tree

2 files changed

+54
-31
lines changed

2 files changed

+54
-31
lines changed

Diff for: ls/builder.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -177,15 +177,14 @@ func (ls *INOLanguageServer) generateBuildEnvironment(ctx context.Context, logge
177177

178178
var success bool
179179
if config.CliPath == nil {
180-
// Establish a connection with the gRPC server, started with the command:
181-
// arduino-cli daemon
180+
// Establish a connection with the arduino-cli gRPC server
182181
conn, err := grpc.Dial(config.CliDaemonAddress, grpc.WithInsecure(), grpc.WithBlock())
183182
if err != nil {
184183
return false, fmt.Errorf("error connecting to arduino-cli rpc server: %w", err)
185184
}
186185
defer conn.Close()
187-
188186
client := rpc.NewArduinoCoreServiceClient(conn)
187+
189188
compileReq := &rpc.CompileRequest{
190189
Instance: &rpc.Instance{Id: int32(config.CliInstanceNumber)},
191190
Fqbn: config.Fqbn,

Diff for: ls/ls.go

+52-28
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"time"
1414

1515
"github.com/arduino/arduino-cli/executils"
16+
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/settings/v1"
1617
"github.com/arduino/arduino-language-server/sourcemapper"
1718
"github.com/arduino/arduino-language-server/streams"
1819
"github.com/arduino/go-paths-helper"
@@ -22,6 +23,7 @@ import (
2223
"go.bug.st/lsp"
2324
"go.bug.st/lsp/jsonrpc"
2425
"go.bug.st/lsp/textedits"
26+
"google.golang.org/grpc"
2527
)
2628

2729
// INOLanguageServer is a JSON-RPC handler that delegates messages to clangd.
@@ -1019,36 +1021,58 @@ func (ls *INOLanguageServer) CleanUp() {
10191021
}
10201022

10211023
func (ls *INOLanguageServer) extractDataFolderFromArduinoCLI(logger jsonrpc.FunctionLogger) (*paths.Path, error) {
1022-
// XXX: do this from IDE or via gRPC
1023-
args := []string{ls.config.CliPath.String(),
1024-
"--config-file", ls.config.CliConfigPath.String(),
1025-
"config",
1026-
"dump",
1027-
"--format", "json",
1028-
}
1029-
cmd, err := executils.NewProcess(args...)
1030-
if err != nil {
1031-
return nil, errors.Errorf("running %s: %s", strings.Join(args, " "), err)
1032-
}
1033-
cmdOutput := &bytes.Buffer{}
1034-
cmd.RedirectStdoutTo(cmdOutput)
1035-
logger.Logf("running: %s", strings.Join(args, " "))
1036-
if err := cmd.Run(); err != nil {
1037-
return nil, errors.Errorf("running %s: %s", strings.Join(args, " "), err)
1038-
}
1024+
if ls.config.CliPath == nil {
1025+
// Establish a connection with the arduino-cli gRPC server
1026+
conn, err := grpc.Dial(ls.config.CliDaemonAddress, grpc.WithInsecure(), grpc.WithBlock())
1027+
if err != nil {
1028+
return nil, fmt.Errorf("error connecting to arduino-cli rpc server: %w", err)
1029+
}
1030+
defer conn.Close()
1031+
client := rpc.NewSettingsServiceClient(conn)
10391032

1040-
type cmdRes struct {
1041-
Directories struct {
1042-
Data string `json:"data"`
1043-
} `json:"directories"`
1044-
}
1045-
var res cmdRes
1046-
if err := json.Unmarshal(cmdOutput.Bytes(), &res); err != nil {
1047-
return nil, errors.Errorf("parsing arduino-cli output: %s", err)
1033+
resp, err := client.GetValue(context.Background(), &rpc.GetValueRequest{
1034+
Key: "directories.data",
1035+
})
1036+
if err != nil {
1037+
return nil, fmt.Errorf("error getting arduino data dir: %w", err)
1038+
}
1039+
var dataDir string
1040+
if err := json.Unmarshal([]byte(resp.JsonData), &dataDir); err != nil {
1041+
return nil, fmt.Errorf("error getting arduino data dir: %w", err)
1042+
}
1043+
logger.Logf("Arduino Data Dir -> %s", dataDir)
1044+
return paths.New(dataDir), nil
1045+
} else {
1046+
args := []string{ls.config.CliPath.String(),
1047+
"--config-file", ls.config.CliConfigPath.String(),
1048+
"config",
1049+
"dump",
1050+
"--format", "json",
1051+
}
1052+
cmd, err := executils.NewProcess(args...)
1053+
if err != nil {
1054+
return nil, errors.Errorf("running %s: %s", strings.Join(args, " "), err)
1055+
}
1056+
cmdOutput := &bytes.Buffer{}
1057+
cmd.RedirectStdoutTo(cmdOutput)
1058+
logger.Logf("running: %s", strings.Join(args, " "))
1059+
if err := cmd.Run(); err != nil {
1060+
return nil, errors.Errorf("running %s: %s", strings.Join(args, " "), err)
1061+
}
1062+
1063+
type cmdRes struct {
1064+
Directories struct {
1065+
Data string `json:"data"`
1066+
} `json:"directories"`
1067+
}
1068+
var res cmdRes
1069+
if err := json.Unmarshal(cmdOutput.Bytes(), &res); err != nil {
1070+
return nil, errors.Errorf("parsing arduino-cli output: %s", err)
1071+
}
1072+
// Return only the build path
1073+
logger.Logf("Arduino Data Dir -> %s", res.Directories.Data)
1074+
return paths.New(res.Directories.Data), nil
10481075
}
1049-
// Return only the build path
1050-
logger.Logf("Arduino Data Dir -> %s", res.Directories.Data)
1051-
return paths.New(res.Directories.Data), nil
10521076
}
10531077

10541078
func (ls *INOLanguageServer) didClose(logger jsonrpc.FunctionLogger, inoDidClose *lsp.DidCloseTextDocumentParams) (*lsp.DidCloseTextDocumentParams, error) {

0 commit comments

Comments
 (0)