Skip to content

Commit 92d122b

Browse files
committed
Perform one request to get all versions
1 parent 7035da1 commit 92d122b

File tree

10 files changed

+145
-96
lines changed

10 files changed

+145
-96
lines changed

ui/frontend/.eslintrc.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ module.exports = {
8282
'reducers/output/meta.ts',
8383
'reducers/output/mir.ts',
8484
'reducers/output/wasm.ts',
85+
'reducers/versions.ts',
8586
'reducers/websocket.ts',
8687
'websocketActions.ts',
8788
'websocketMiddleware.ts',

ui/frontend/.prettierignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ node_modules
3333
!reducers/output/meta.ts
3434
!reducers/output/mir.ts
3535
!reducers/output/wasm.ts
36+
!reducers/versions.ts
3637
!reducers/websocket.ts
3738
!websocketActions.ts
3839
!websocketMiddleware.ts

ui/frontend/actions.ts

Lines changed: 1 addition & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import {
2727
ProcessAssembly,
2828
Position,
2929
makePosition,
30-
Version,
3130
Crate,
3231
} from './types';
3332

@@ -48,14 +47,7 @@ export const routes = {
4847
macroExpansion: '/macro-expansion',
4948
meta: {
5049
crates: '/meta/crates',
51-
version: {
52-
stable: '/meta/version/stable',
53-
beta: '/meta/version/beta',
54-
nightly: '/meta/version/nightly',
55-
rustfmt: '/meta/version/rustfmt',
56-
clippy: '/meta/version/clippy',
57-
miri: '/meta/version/miri',
58-
},
50+
versions: '/meta/versions',
5951
gistSave: '/meta/gist',
6052
gistLoad: '/meta/gist/id',
6153
},
@@ -103,8 +95,6 @@ export enum ActionType {
10395
MacroExpansionFailed = 'MACRO_EXPANSION_FAILED',
10496
RequestCratesLoad = 'REQUEST_CRATES_LOAD',
10597
CratesLoadSucceeded = 'CRATES_LOAD_SUCCEEDED',
106-
RequestVersionsLoad = 'REQUEST_VERSIONS_LOAD',
107-
VersionsLoadSucceeded = 'VERSIONS_LOAD_SUCCEEDED',
10898
NotificationSeen = 'NOTIFICATION_SEEN',
10999
BrowserWidthChanged = 'BROWSER_WIDTH_CHANGED',
110100
}
@@ -488,42 +478,6 @@ export function performCratesLoad(): ThunkAction {
488478
};
489479
}
490480

491-
const requestVersionsLoad = () =>
492-
createAction(ActionType.RequestVersionsLoad);
493-
494-
const receiveVersionsLoadSuccess = ({
495-
stable, beta, nightly, rustfmt, clippy, miri,
496-
}: {
497-
stable: Version, beta: Version, nightly: Version, rustfmt: Version, clippy: Version, miri: Version,
498-
}) =>
499-
createAction(ActionType.VersionsLoadSucceeded, { stable, beta, nightly, rustfmt, clippy, miri });
500-
501-
export function performVersionsLoad(): ThunkAction {
502-
return function(dispatch) {
503-
dispatch(requestVersionsLoad());
504-
505-
const stable = jsonGet(routes.meta.version.stable);
506-
const beta = jsonGet(routes.meta.version.beta);
507-
const nightly = jsonGet(routes.meta.version.nightly);
508-
const rustfmt = jsonGet(routes.meta.version.rustfmt);
509-
const clippy = jsonGet(routes.meta.version.clippy);
510-
const miri = jsonGet(routes.meta.version.miri);
511-
512-
const all = Promise.all([stable, beta, nightly, rustfmt, clippy, miri]);
513-
514-
return all
515-
.then(([stable, beta, nightly, rustfmt, clippy, miri]) => dispatch(receiveVersionsLoadSuccess({
516-
stable,
517-
beta,
518-
nightly,
519-
rustfmt,
520-
clippy,
521-
miri,
522-
})));
523-
// TODO: Failure case
524-
};
525-
}
526-
527481
const notificationSeen = (notification: Notification) =>
528482
createAction(ActionType.NotificationSeen, { notification });
529483

@@ -654,8 +608,6 @@ export type Action =
654608
| ReturnType<typeof receiveMacroExpansionFailure>
655609
| ReturnType<typeof requestCratesLoad>
656610
| ReturnType<typeof receiveCratesLoadSuccess>
657-
| ReturnType<typeof requestVersionsLoad>
658-
| ReturnType<typeof receiveVersionsLoadSuccess>
659611
| ReturnType<typeof notificationSeen>
660612
| ReturnType<typeof browserWidthChanged>
661613
| ReturnType<typeof wsExecuteRequest>

ui/frontend/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import {
1515
selectText,
1616
addImport,
1717
performCratesLoad,
18-
performVersionsLoad,
1918
reExecuteWithBacktrace,
2019
browserWidthChanged,
2120
} from './actions';
@@ -27,6 +26,7 @@ import { featureFlagsForceDisableAll, featureFlagsForceEnableAll } from './reduc
2726
import { disableSyncChangesToStorage } from './reducers/globalConfiguration';
2827
import Router from './Router';
2928
import configureStore from './configureStore';
29+
import { performVersionsLoad } from './reducers/versions';
3030

3131
const store = configureStore(window);
3232

ui/frontend/reducers/versions.ts

Lines changed: 37 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,37 @@
1-
import { Action, ActionType } from '../actions';
2-
import { Version } from '../types';
3-
4-
const DEFAULT: State = {
5-
};
6-
7-
export interface State {
8-
stable?: Version;
9-
beta?: Version;
10-
nightly?: Version;
11-
rustfmt?: Version;
12-
clippy?: Version;
13-
miri?: Version;
14-
}
15-
16-
export default function crates(state = DEFAULT, action: Action) {
17-
switch (action.type) {
18-
case ActionType.VersionsLoadSucceeded: {
19-
const { stable, beta, nightly, rustfmt, clippy, miri } = action;
20-
return { stable, beta, nightly, rustfmt, clippy, miri };
21-
}
22-
default:
23-
return state;
24-
}
25-
}
1+
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
2+
import * as z from 'zod';
3+
4+
import { adaptFetchError, jsonGet, routes } from '../actions';
5+
import { ChannelVersion } from '../types';
6+
7+
const sliceName = 'versions';
8+
9+
const initialState: State = {};
10+
11+
type State = Partial<Response>;
12+
13+
const Response = z.object({
14+
stable: ChannelVersion,
15+
beta: ChannelVersion,
16+
nightly: ChannelVersion,
17+
});
18+
19+
type Response = z.infer<typeof Response>;
20+
21+
export const performVersionsLoad = createAsyncThunk(sliceName, async () => {
22+
const d = await adaptFetchError(() => jsonGet(routes.meta.versions));
23+
return Response.parseAsync(d);
24+
});
25+
26+
const slice = createSlice({
27+
name: sliceName,
28+
initialState,
29+
reducers: {},
30+
extraReducers: (builder) => {
31+
builder.addCase(performVersionsLoad.fulfilled, (state, versions) => {
32+
Object.assign(state, versions.payload);
33+
});
34+
},
35+
});
36+
37+
export default slice.reducer;

ui/frontend/selectors/index.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,12 @@ const LABELS: { [index in PrimaryActionCore]: string } = {
9999

100100
export const getExecutionLabel = createSelector(primaryActionSelector, primaryAction => LABELS[primaryAction]);
101101

102-
const getStable = (state: State) => state.versions?.stable;
103-
const getBeta = (state: State) => state.versions?.beta;
104-
const getNightly = (state: State) => state.versions?.nightly;
105-
const getRustfmt = (state: State) => state.versions?.rustfmt;
106-
const getClippy = (state: State) => state.versions?.clippy;
107-
const getMiri = (state: State) => state.versions?.miri;
102+
const getStable = (state: State) => state.versions.stable?.rustc;
103+
const getBeta = (state: State) => state.versions.beta?.rustc;
104+
const getNightly = (state: State) => state.versions.nightly?.rustc;
105+
const getRustfmt = (state: State) => state.versions.nightly?.rustfmt;
106+
const getClippy = (state: State) => state.versions.nightly?.clippy;
107+
const getMiri = (state: State) => state.versions?.nightly?.miri;
108108

109109
const versionNumber = (v: Version | undefined) => v ? v.version : '';
110110
export const stableVersionText = createSelector(getStable, versionNumber);

ui/frontend/types.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import * as z from 'zod';
2+
13
export type Page = 'index' | 'help';
24

35
export interface Position {
@@ -19,11 +21,22 @@ export interface Crate {
1921
version: string;
2022
}
2123

22-
export interface Version {
23-
version: string;
24-
hash: string;
25-
date: string;
26-
}
24+
export const Version = z.object({
25+
version: z.string(),
26+
hash: z.string(),
27+
date: z.string(),
28+
});
29+
30+
export type Version = z.infer<typeof Version>;
31+
32+
export const ChannelVersion = z.object({
33+
rustc: Version,
34+
rustfmt: Version,
35+
clippy: Version,
36+
miri: Version.optional(),
37+
});
38+
39+
export type ChannelVersion = z.infer<typeof ChannelVersion>;
2740

2841
export interface CommonEditorProps {
2942
code: string;

ui/src/main.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,22 @@ struct MetaCratesResponse {
429429
crates: Arc<[CrateInformation]>,
430430
}
431431

432+
#[derive(Debug, Clone, PartialEq, Serialize)]
433+
struct MetaVersionsResponse {
434+
stable: MetaChannelVersionResponse,
435+
beta: MetaChannelVersionResponse,
436+
nightly: MetaChannelVersionResponse,
437+
}
438+
439+
#[derive(Debug, Clone, PartialEq, Serialize)]
440+
struct MetaChannelVersionResponse {
441+
rustc: MetaVersionResponse,
442+
rustfmt: MetaVersionResponse,
443+
clippy: MetaVersionResponse,
444+
#[serde(skip_serializing_if = "Option::is_none")]
445+
miri: Option<MetaVersionResponse>,
446+
}
447+
432448
#[derive(Debug, Clone, PartialEq, Serialize)]
433449
struct MetaVersionResponse {
434450
version: Arc<str>,

ui/src/metrics.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ pub(crate) enum Endpoint {
5656
Clippy,
5757
MacroExpansion,
5858
MetaCrates,
59+
MetaVersions,
5960
MetaVersionStable,
6061
MetaVersionBeta,
6162
MetaVersionNightly,

0 commit comments

Comments
 (0)