Skip to content

Commit ae5c890

Browse files
author
Akos Kitta
committed
feat: human readable error message
Signed-off-by: Akos Kitta <a.kitta@arduino.cc>
1 parent 0dec783 commit ae5c890

File tree

4 files changed

+35
-44
lines changed

4 files changed

+35
-44
lines changed

arduino-ide-extension/src/browser/config/config-service-client.ts

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@ import { FrontendApplicationStateService } from '@theia/core/lib/browser/fronten
33
import { DisposableCollection } from '@theia/core/lib/common/disposable';
44
import { Emitter, Event } from '@theia/core/lib/common/event';
55
import { MessageService } from '@theia/core/lib/common/message-service';
6-
import { Deferred } from '@theia/core/lib/common/promise-util';
6+
import { deepClone } from '@theia/core/lib/common/objects';
77
import URI from '@theia/core/lib/common/uri';
8-
import { inject, injectable } from '@theia/core/shared/inversify';
8+
import {
9+
inject,
10+
injectable,
11+
postConstruct,
12+
} from '@theia/core/shared/inversify';
913
import { Config, ConfigService, ConfigState } from '../../common/protocol';
1014
import { NotificationCenter } from '../notification-center';
1115

@@ -29,16 +33,17 @@ export class ConfigServiceClient implements FrontendApplicationContribution {
2933
this.didChangeDataDirUriEmitter
3034
);
3135

32-
private configFileUri: Deferred<URI> | undefined;
3336
private _config: ConfigState | undefined;
34-
private _dataDirUri: string | undefined;
35-
private _sketchDirUri: string | undefined;
3637

37-
onStart(): void {
38+
@postConstruct()
39+
protected init(): void {
3840
this.appStateService.reachedState('ready').then(async () => {
3941
const config = await this.fetchConfig();
4042
this.use(config);
4143
});
44+
}
45+
46+
onStart(): void {
4247
this.notificationCenter.onConfigDidChange((config) => this.use(config));
4348
}
4449

@@ -54,26 +59,6 @@ export class ConfigServiceClient implements FrontendApplicationContribution {
5459
return this.didChangeSketchDirUriEmitter.event;
5560
}
5661

57-
async getCliConfigFileUri(): Promise<URI> {
58-
if (!this.configFileUri) {
59-
this.configFileUri = new Deferred();
60-
setTimeout(async () => {
61-
try {
62-
const uri = await this.delegate.getCliConfigFileUri();
63-
this.configFileUri?.resolve(new URI(uri));
64-
} catch (err) {
65-
console.error(
66-
`Could not retrieve the URI of the CLI configuration file`,
67-
err
68-
);
69-
this.configFileUri?.reject(err);
70-
this.configFileUri = undefined;
71-
}
72-
});
73-
}
74-
return this.configFileUri.promise;
75-
}
76-
7762
async fetchConfig(): Promise<ConfigState> {
7863
return this.delegate.getConfiguration();
7964
}
@@ -90,32 +75,43 @@ export class ConfigServiceClient implements FrontendApplicationContribution {
9075
* `directories.user`
9176
*/
9277
tryGetSketchDirUri(): URI | undefined {
93-
return this._sketchDirUri ? new URI(this._sketchDirUri) : undefined;
78+
return this._config?.config?.sketchDirUri
79+
? new URI(this._config?.config?.sketchDirUri)
80+
: undefined;
9481
}
9582

9683
/**
9784
* `directories.data`
9885
*/
9986
tryGetDataDirUri(): URI | undefined {
100-
return this._dataDirUri ? new URI(this._dataDirUri) : undefined;
87+
return this._config?.config?.dataDirUri
88+
? new URI(this._config?.config?.dataDirUri)
89+
: undefined;
10190
}
10291

10392
private use(config: ConfigState): void {
93+
const oldConfig = deepClone(this._config);
10494
this._config = config;
105-
if (this._dataDirUri !== this._config?.config?.dataDirUri) {
106-
this._dataDirUri = this._config?.config?.dataDirUri;
95+
if (oldConfig?.config?.dataDirUri !== this._config?.config?.dataDirUri) {
10796
this.didChangeDataDirUriEmitter.fire(
108-
this._dataDirUri ? new URI(this._dataDirUri) : undefined
97+
this._config.config?.dataDirUri
98+
? new URI(this._config.config.dataDirUri)
99+
: undefined
109100
);
110101
}
111-
if (this._sketchDirUri !== this._config?.config?.sketchDirUri) {
112-
this._sketchDirUri = this._config?.config?.sketchDirUri;
102+
if (
103+
oldConfig?.config?.sketchDirUri !== this._config?.config?.sketchDirUri
104+
) {
113105
this.didChangeSketchDirUriEmitter.fire(
114-
this._sketchDirUri ? new URI(this._sketchDirUri) : undefined
106+
this._config.config?.sketchDirUri
107+
? new URI(this._config.config.sketchDirUri)
108+
: undefined
115109
);
116110
}
117111
if (this._config.messages?.length) {
118-
this.messageService.error(this._config.messages.join(' '));
112+
const message = this._config.messages.join(' ');
113+
// toast the error later otherwise it might not show up in IDE2
114+
setTimeout(() => this.messageService.error(message), 1_000);
119115
}
120116
}
121117
}

arduino-ide-extension/src/common/protocol/config-service.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ export interface ConfigService {
66
getVersion(): Promise<
77
Readonly<{ version: string; commit: string; status?: string }>
88
>;
9-
getCliConfigFileUri(): Promise<string>;
109
getConfiguration(): Promise<ConfigState>;
1110
setConfiguration(config: Config): Promise<void>;
1211
}

arduino-ide-extension/src/node/config-service-impl.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export class ConfigServiceImpl
6363
this.initConfig();
6464
}
6565

66-
async getCliConfigFileUri(): Promise<string> {
66+
private async getCliConfigFileUri(): Promise<string> {
6767
const configDirUri = await this.envVariablesServer.getConfigDirUri();
6868
return new URI(configDirUri).resolve(CLI_CONFIG).toString();
6969
}
@@ -262,26 +262,22 @@ export class ConfigServiceImpl
262262
const accessible = (folderPath: string) =>
263263
fs.access(folderPath, constants.R_OK | constants.W_OK);
264264
const toConfigErrors = (
265-
key: string,
266265
folderPath: string,
267266
result: PromiseSettledResult<unknown>
268267
) =>
269268
result.status === 'rejected'
270269
? [
271270
nls.localize(
272271
'arduino/configuration/cli/inaccessibleDirectory',
273-
"Could not access '{0}' folder at '{1}'. Reason: '{2}'",
274-
`directories.${key}`,
272+
"Could not access the sketchbook location at '{0}': {1}",
275273
folderPath,
276274
String(result.reason)
277275
),
278276
]
279277
: [];
280278
const { user } = directories;
281279
const [userAccessible] = await Promise.allSettled([accessible(user)]); // XXX: validate `directory.data` if required
282-
return ([] as string[]).concat(
283-
toConfigErrors('user', user, userAccessible)
284-
);
280+
return [...toConfigErrors(user, userAccessible)];
285281
}
286282

287283
private async updateDaemon(

i18n/en.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@
159159
},
160160
"configuration": {
161161
"cli": {
162-
"inaccessibleDirectory": "Could not access '{0}' folder at '{1}'. Reason: '{2}'"
162+
"inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}"
163163
}
164164
},
165165
"contributions": {

0 commit comments

Comments
 (0)