git.iko.soy/typeable/octopod
on master help sign in
Added haskell-language-server support in nix-shell (#4)
commit47495459e379610cda16fff4bc18301d04062e42 authoriko <ilyakooo0@gmail.com> dateFri 11 Dec 2020, 16:31 (6 years ago) parent3af33a7
13 files changed+453−86
.vscode/settings.json+3 default.nix+33−49 hie.yaml+7−4 nix/haskell-language-server-overrides.nix+240 nix/octo.nix+13−18 nix/octopod-overrides.nix+91 nix/sources.json+36−12 octopod-api/src/Octopod/API.hs+1−2 octopod-frontend/octopod-frontend.cabal+5 octopod-frontend/src/Frontend/API.hs+1 octopod-frontend/src/Servant/Reflex/Extra.hs+17 shell.nix+1 stack.yaml+5−1
.vscode/settings.jsonnew file+3
@@ -0,0 +1,3 @@
1+{
2+ "nixEnvSelector.nixShellConfig": "${workspaceRoot}/shell.nix"
3+}
default.nix+33−49
@@ -1,54 +1,38 @@
11{ sources ? import ./nix/sources.nix
22, reflex-platform ? sources.reflex-platform
3+, hls ? false
34}:
4−(import reflex-platform { }).project ({ pkgs, ... }: {
5− useWarp = true;
5+(import reflex-platform { }).project ({ pkgs, ... }:
6+ let foldOs = pkgs.lib.foldl' pkgs.lib.composeExtensions (self: super: { });
7+ in
8+ {
9+ useWarp = true;
610
7− packages = {
8− octopod-common = ./octopod-common;
9− octopod-frontend = ./octopod-frontend;
10− octopod-backend = ./octopod-backend;
11− octo-cli = ./octo-cli;
12− octopod-api = ./octopod-api;
13− };
11+ packages = {
12+ octopod-common = ./octopod-common;
13+ octopod-frontend = ./octopod-frontend;
14+ octopod-backend = ./octopod-backend;
15+ octo-cli = ./octo-cli;
16+ octopod-api = ./octopod-api;
17+ };
1418
15− overrides = hself: hsuper: {
16− servant-reflex = hsuper.callCabal2nix "servant-reflex" sources.servant-reflex { };
17− tabulation = hsuper.callCabal2nix "tabulation" "${sources.obelisk}/lib/tabulation" { };
18− obelisk-executable-config-lookup = hsuper.callCabal2nix "obelisk-executable-config-lookup" "${sources.obelisk}/lib/executable-config/lookup" { };
19− obelisk-route = hsuper.callCabal2nix "obelisk-route" "${sources.obelisk}/lib/route" { };
20− hspec-webdriver = hsuper.callCabal2nix "hspec-webdriver" sources.hspec-webdriver-clone { };
21− servant = pkgs.haskell.lib.overrideCabal hsuper.servant (old: {
22− postInstall = "";
23− });
24− servant-websockets = hsuper.callHackageDirect
25− {
26− pkg = "servant-websockets";
27− ver = "2.0.0";
28− sha256 = "01bmwg3ysj8gijcqghykxfsd62sqz1pfby2irpzh5ybwyh285pvg";
29− } { };
30− deriving-aeson = hsuper.callHackageDirect
31− {
32− pkg = "deriving-aeson";
33− ver = "0.2.3";
34− sha256 = "0ckwdi9pr4aqp9psag4mdbx30nygxkkpdf21rg9rfz16cz8079j7";
35− } { };
36− table-layout = hsuper.callHackageDirect
37− {
38− pkg = "table-layout";
39− ver = "0.9.0.1";
40− sha256 = "12nllfnh6b5mjda9qxfy192v0r0sx181w9zc9j70kvjdn7hgrb0y";
41− } { };
42− data-default-instances-base = hsuper.callHackageDirect
43− {
44− pkg = "data-default-instances-base";
45− ver = "0.1.0.1";
46− sha256 = "18basdy4qjn246phw008ll9zbi3rpdn6bh2dk0i81a60gsmyn58q";
47− } { };
48− };
49−
50− shells = {
51− ghc = [ "octopod-common" "octopod-backend" "octopod-frontend" "octopod-api" "octo-cli" ];
52− ghcjs = [ "octopod-common" "octopod-frontend" ];
53− };
54−})
19+ overrides = foldOs [
20+ (import ./nix/haskell-language-server-overrides.nix {
21+ inherit (pkgs.haskell) lib;
22+ inherit sources;
23+ }
24+ )
25+ (import ./nix/octopod-overrides.nix {
26+ inherit (pkgs.haskell) lib;
27+ inherit sources;
28+ }
29+ )
30+ ];
31+ shellToolOverrides = ghc: super:
32+ if hls then { inherit (ghc) haskell-language-server; }
33+ else { };
34+ shells = {
35+ ghc = [ "octopod-common" "octopod-backend" "octopod-frontend" "octopod-api" "octo-cli" ];
36+ ghcjs = [ "octopod-common" "octopod-frontend" ];
37+ };
38+ })
hie.yaml+7−4
@@ -1,13 +1,13 @@
11cradle:
2− stack:
2+ cabal:
33 - path: "octo-cli/src"
44 component: "octo-cli:exe:octo"
55
66 - path: "octopod-api/src"
7− component: "octopod-api:lib"
7+ component: "lib:octopod-api"
88
99 - path: "octopod-backend/src"
10− component: "octopod-backend:lib"
10+ component: "lib:octopod-backend"
1111
1212 - path: "octopod-backend/app"
1313 component: "octopod-backend:exe:octopod-exe"
@@ -16,4 +16,7 @@ cradle:
1616 component: "octopod-backend:test:octopod-test"
1717
1818 - path: "octopod-common/src"
19− component: "octopod-common:lib"
19+ component: "lib:octopod-common"
20+
21+ - path: "octopod-frontend/src"
22+ component: "octopod-frontend:exe:frontend"
nix/haskell-language-server-overrides.nixnew file+240
@@ -0,0 +1,240 @@
1+{ lib, sources ? import ./sources.nix }: hself: hsuper:
2+{
3+ haskell-language-server = lib.dontCheck (hsuper.callCabal2nix "haskell-language-server" (sources.haskell-language-server) { });
4+ hls-hlint-plugin = hsuper.callCabal2nix "hls-hlint-plugin" (sources.haskell-language-server + "/plugins/hls-hlint-plugin") { };
5+ hls-explicit-imports-plugin = hsuper.callCabal2nix "hls-explicit-imports-plugin" (sources.haskell-language-server + "/plugins/hls-explicit-imports-plugin") { };
6+ hls-retrie-plugin = hsuper.callCabal2nix "hls-retrie-plugin" (sources.haskell-language-server + "/plugins/hls-retrie-plugin") { };
7+ hls-plugin-api = hsuper.callCabal2nix "hls-plugin-api" (sources.haskell-language-server + "/hls-plugin-api") { };
8+ hls-tactics-plugin = hsuper.callCabal2nix "hls-tactics-plugin" (sources.haskell-language-server + "/plugins/tactics") { };
9+ ghcide = lib.dontCheck (hsuper.callCabal2nix "ghcide" sources.ghcide { });
10+ hie-compat = hsuper.callCabal2nix "hie-compat" (sources.ghcide + "/hie-compat") { };
11+ fourmolu = lib.doJailbreak (hsuper.callHackageDirect
12+ {
13+ pkg = "fourmolu";
14+ ver = "0.3.0.0";
15+ sha256 = "sha256-SFBwhkXfDArITiBSxGSp2qf8gl+yBpWHglBB5aKeaBU=";
16+ } { }
17+ );
18+ ormolu =
19+ hsuper.callHackageDirect
20+ {
21+ pkg = "ormolu";
22+ ver = "0.1.4.1";
23+ sha256 = "07gfag591dsys33q2i80f3afxjqny2zpiq4z35d1ajyp7di73m7z";
24+ } { };
25+ ghc-check =
26+ hsuper.callHackageDirect
27+ {
28+ pkg = "ghc-check";
29+ ver = "0.5.0.1";
30+ sha256 = "1zlbss7h6infzhhpilvkpk50gxypkb2li8fspi69jlll5l7wqi3d";
31+ } { };
32+ implicit-hie-cradle =
33+ hsuper.callHackageDirect
34+ {
35+ pkg = "implicit-hie-cradle";
36+ ver = "0.3.0.2";
37+ sha256 = "1fhc8zccd7g7ixka05cba3cd4qf5jvq1zif29bhn593dfkzy89lz";
38+ } { };
39+ implicit-hie =
40+ hsuper.callHackageDirect
41+ {
42+ pkg = "implicit-hie";
43+ ver = "0.1.2.5";
44+ sha256 = "1l0rz4r4hamvmqlb68a7y4s3n73y6xx76zyprksd0pscd9axznnv";
45+ } { };
46+ lsp-test = lib.dontCheck (
47+ hsuper.callHackageDirect
48+ {
49+ pkg = "lsp-test";
50+ ver = "0.11.0.6";
51+ sha256 = "19mbbkjpgpmkna26i4y1jvp305srv3kwa5b62x30rlb3rqf2vy5v";
52+ } { }
53+ );
54+ floskell = lib.dontCheck (
55+ hsuper.callHackageDirect
56+ {
57+ pkg = "floskell";
58+ ver = "0.10.4";
59+ sha256 = "0n1gy6yf7lzzh9l67712rr7bjliyifi9xjnc6i9rppiv5adj2xyf";
60+ } { }
61+ );
62+ monad-dijkstra = lib.dontCheck (lib.doJailbreak (
63+ hsuper.callHackageDirect
64+ {
65+ pkg = "monad-dijkstra";
66+ ver = "0.1.1.2";
67+ sha256 = "1vyw7az18yy5s9jwi3icq76zvi9myr0y9gja3jaywlykcdn6frsz";
68+ } { }
69+ ));
70+ HsYAML-aeson = lib.doJailbreak (
71+ hsuper.callHackageDirect
72+ {
73+ pkg = "HsYAML-aeson";
74+ ver = "0.2.0.0";
75+ sha256 = "0zgcp93y93h7rsg9dv202hf3l6sqr95iadd67lmfclb0npfs640m";
76+ } { }
77+ );
78+ ghc-lib-parser-ex =
79+ hsuper.callHackageDirect
80+ {
81+ pkg = "ghc-lib-parser-ex";
82+ ver = "8.10.0.16";
83+ sha256 = "0dp8plj708ss3im6rmp41kpj0df71kjzpw1kqkpn0dhms9yr1g0x";
84+ } { };
85+ retrie = lib.dontCheck (
86+ hsuper.callHackageDirect
87+ {
88+ pkg = "retrie";
89+ ver = "0.1.1.1";
90+ sha256 = "0gnp6j35jnk1gcglrymvvn13sawir0610vh0z8ya6599kyddmw7l";
91+ } { }
92+ );
93+ ghc-lib =
94+ hsuper.callHackageDirect
95+ {
96+ pkg = "ghc-lib";
97+ ver = "8.10.2.20200916";
98+ sha256 = "1gx0ijay9chachmd1fbb61md3zlvj24kk63fk3dssx8r9c2yp493";
99+ } { };
100+ ghc-lib-parser =
101+ hsuper.callHackageDirect
102+ {
103+ pkg = "ghc-lib-parser";
104+ ver = "8.10.2.20200916";
105+ sha256 = "1apm9zn484sm6b8flbh6a2kqnv1wjan4l58b81cic5fc1jsqnyjk";
106+ } { };
107+ haskell-lsp =
108+ hsuper.callHackageDirect
109+ {
110+ pkg = "haskell-lsp";
111+ ver = "0.22.0.0";
112+ sha256 = "1q3w46qcvzraxgmw75s7bl0qvb2fvff242r5vfx95sqska566b4m";
113+ } { };
114+ parser-combinators =
115+ hsuper.callHackageDirect
116+ {
117+ pkg = "parser-combinators";
118+ ver = "1.2.1";
119+ sha256 = "1990d6c1zm2wq4w9521bx7l3arg4ly02hq1ass9n19gs273bxx5h";
120+ } { };
121+ haskell-lsp-types =
122+ hsuper.callHackageDirect
123+ {
124+ pkg = "haskell-lsp-types";
125+ ver = "0.22.0.0";
126+ sha256 = "1apjclphi2v6ggrdnbc0azxbb1gkfj3x1vkwpc8qd6lsrbyaf0n8";
127+ } { };
128+ regex-tdfa =
129+ hsuper.callHackageDirect
130+ {
131+ pkg = "regex-tdfa";
132+ ver = "1.3.1.0";
133+ sha256 = "1a0l7kdjzp98smfp969mgkwrz60ph24xy0kh2dajnymnr8vd7b8g";
134+ } { };
135+ regex-posix =
136+ hsuper.callHackageDirect
137+ {
138+ pkg = "regex-posix";
139+ ver = "0.96.0.0";
140+ sha256 = "0js977ahpz10642sbpb55mw9h01pilai6z201wgkncgkg2d69hl3";
141+ } { };
142+ ansi-terminal =
143+ hsuper.callHackageDirect
144+ {
145+ pkg = "ansi-terminal";
146+ ver = "0.10.3";
147+ sha256 = "1aa8lh7pl054kz7i59iym49s8w473nhdqgc3pq16cp5v4358hw5k";
148+ } { };
149+ ghc-exactprint =
150+ hsuper.callHackageDirect
151+ {
152+ pkg = "ghc-exactprint";
153+ ver = "0.6.3.2";
154+ sha256 = "0l9piqqgdi8xd46nj1jizp0r0v526d7f61y05xm8k4aamjaj59d0";
155+ } { };
156+ stylish-haskell =
157+ hsuper.callHackageDirect
158+ {
159+ pkg = "stylish-haskell";
160+ ver = "0.12.2.0";
161+ sha256 = "1ck8i550rvzbvzrm7dvgir73slai8zmvfppg3n5v4igi7y3jy0mr";
162+ } { };
163+ optparse-applicative =
164+ hsuper.callHackageDirect
165+ {
166+ pkg = "optparse-applicative";
167+ ver = "0.15.1.0";
168+ sha256 = "1mii408cscjvids2xqdcy2p18dvanb0qc0q1bi7234r23wz60ajk";
169+ } { };
170+ shake = lib.dontCheck (
171+ hsuper.callHackageDirect
172+ {
173+ pkg = "shake";
174+ ver = "0.19.2";
175+ sha256 = "03p5hq0sg13ii39j9hf3nvy8v20mkh8czb59djn6zrg7fypy9ivv";
176+ } { }
177+ );
178+ regex-base =
179+ hsuper.callHackageDirect
180+ {
181+ pkg = "regex-base";
182+ ver = "0.94.0.0";
183+ sha256 = "0x2ip8kn3sv599r7yc9dmdx7hgh5x632m45ga99ib5rnbn6kvn8x";
184+ } { };
185+ extra =
186+ hsuper.callHackageDirect
187+ {
188+ pkg = "extra";
189+ ver = "1.7.3";
190+ sha256 = "08j4gg2n5cl7ycr943hmyfimgby0xhf5vp8nwrwflg6lrn1s388c";
191+ } { };
192+ quickcheck-instances =
193+ hsuper.callHackageDirect
194+ {
195+ pkg = "quickcheck-instances";
196+ ver = "0.3.22";
197+ sha256 = "05mam3x4x7c881bqbq8lcbclmz914yziqh6s04icxzp12zq7c7ks";
198+ } { };
199+ apply-refact =
200+ hsuper.callHackageDirect
201+ {
202+ pkg = "apply-refact";
203+ ver = "0.8.2.1";
204+ sha256 = "0nnprv5lbk7c8w1pa4kywk0cny6prjaml4vnw70s8v6c1r1dx2rx";
205+ } { };
206+ hlint =
207+ hsuper.callHackageDirect
208+ {
209+ pkg = "hlint";
210+ ver = "3.2";
211+ sha256 = "0y2agj9y4nwhypv9ss97n26mc28pcynfynwilcyj2lwfabhr9pzc";
212+ } { };
213+ Diff =
214+ hsuper.callHackageDirect
215+ {
216+ pkg = "Diff";
217+ ver = "0.4.0";
218+ sha256 = "1phz4cz7i53jx3d1bj0xnx8vpkk482g4ph044zv5c6ssirnzq3ng";
219+ } { };
220+ refinery = lib.dontCheck (
221+ hsuper.callHackageDirect
222+ {
223+ pkg = "refinery";
224+ ver = "0.3.0.0";
225+ sha256 = "08s5pw6j3ncz96zfc2j0cna2zbf4vy7045d6jpzmq2sa161qnpgi";
226+ } { }
227+ );
228+ hie-bios = lib.dontCheck (
229+ hsuper.callHackageDirect
230+ {
231+ pkg = "hie-bios";
232+ ver = "0.7.1";
233+ sha256 = "137f1dy0fmlrzngwcmgnxghcih7f2rfq5bdnizbwy9534dn4dr42";
234+ } { }
235+ );
236+ test-framework = lib.doJailbreak hsuper.test-framework;
237+ aeson = lib.dontCheck hsuper.aeson;
238+ tree-diff = lib.doJailbreak hsuper.tree-diff;
239+ brittany = hsuper.callCabal2nix "brittany" sources.brittany { };
240+}
nix/octo.nix+13−18
@@ -4,6 +4,7 @@
44, static-haskell-nix ? sources.static-haskell-nix
55}:
66let
7+ foldOs = normalPkgs.lib.foldl' normalPkgs.lib.composeExtensions (self: super: { });
78 normalPkgs = import pkgs-expr {
89 overlays = [
910 (self: super: {
@@ -11,24 +12,18 @@ let
1112 packages = super.haskell.packages // {
1213 "${compiler}" = super.haskell.packages."${compiler}".override {
1314 overrides =
14− (hself: hsuper: {
15− octo-cli = hsuper.callCabal2nix "octo-cli" ../octo-cli { };
16− octopod-api = hsuper.callCabal2nix "octopod-api" ../octopod-api { };
17− octopod-common = hsuper.callCabal2nix "octopod-common" ../octopod-common { };
18− hspec-wai = hsuper.callHackage "hspec-wai" "0.9.2" { };
19− table-layout = hsuper.callHackageDirect
20− {
21− pkg = "table-layout";
22− ver = "0.9.0.1";
23− sha256 = "12nllfnh6b5mjda9qxfy192v0r0sx181w9zc9j70kvjdn7hgrb0y";
24− } { };
25− data-default-instances-base = hsuper.callHackageDirect
26− {
27− pkg = "data-default-instances-base";
28− ver = "0.1.0.1";
29− sha256 = "18basdy4qjn246phw008ll9zbi3rpdn6bh2dk0i81a60gsmyn58q";
30− } { };
31− });
15+ foldOs [
16+ (import ./octopod-overrides.nix {
17+ inherit (normalPkgs.haskell) lib;
18+ inherit sources;
19+ }
20+ )
21+ (hself: hsuper: {
22+ octo-cli = hsuper.callCabal2nix "octo-cli" ../octo-cli { };
23+ octopod-api = hsuper.callCabal2nix "octopod-api" ../octopod-api { };
24+ octopod-common = hsuper.callCabal2nix "octopod-common" ../octopod-common { };
25+ })
26+ ];
3227 };
3328 };
3429 };
nix/octopod-overrides.nixnew file+91
@@ -0,0 +1,91 @@
1+{ lib, sources ? import ./sources.nix }: hself: hsuper:
2+{
3+ tabulation = hsuper.callCabal2nix "tabulation" "${sources.obelisk}/lib/tabulation" { };
4+ obelisk-executable-config-lookup = hsuper.callCabal2nix "obelisk-executable-config-lookup" "${sources.obelisk}/lib/executable-config/lookup" { };
5+ obelisk-route = hsuper.callCabal2nix "obelisk-route" "${sources.obelisk}/lib/route" { };
6+ hspec-webdriver = hsuper.callCabal2nix "hspec-webdriver" sources.hspec-webdriver-clone { };
7+ servant-reflex = lib.doJailbreak (hsuper.callHackageDirect
8+ {
9+ pkg = "servant-reflex";
10+ ver = "0.3.5";
11+ sha256 = "1cj5b7hl4jhsqxfg8vdw50z8zvfxkj42f41hmyx217w6bv3s3fdb";
12+ } { }
13+ );
14+ servant = hsuper.callHackageDirect
15+ {
16+ pkg = "servant";
17+ ver = "0.18.2";
18+ sha256 = "0l2k895nxvw2ngr9201g3br6s9zab7mk5mhpjibyg8mxfbv75a8y";
19+ } { };
20+ servant-client-core = hsuper.callHackageDirect
21+ {
22+ pkg = "servant-client-core";
23+ ver = "0.18.2";
24+ sha256 = "1hazxk1laklpm2c65zgkk2gn8mvlp682437071s04bqggk9b59sx";
25+ } { };
26+ servant-server = hsuper.callHackageDirect
27+ {
28+ pkg = "servant-server";
29+ ver = "0.18.2";
30+ sha256 = "1kynxl7qg5z45bhi0k61sxn79xkgnq1z97ccqqs39wjyf45fj5yy";
31+ } { };
32+ servant-client = hsuper.callHackageDirect
33+ {
34+ pkg = "servant-client";
35+ ver = "0.18.2";
36+ sha256 = "0yip2s63ivrlrpficdipq60j2a6czg8agn18lpkkaxf3n55j4jr3";
37+ } { };
38+ servant-websockets = hsuper.callHackageDirect
39+ {
40+ pkg = "servant-websockets";
41+ ver = "2.0.0";
42+ sha256 = "01bmwg3ysj8gijcqghykxfsd62sqz1pfby2irpzh5ybwyh285pvg";
43+ } { };
44+ deriving-aeson = hsuper.callHackageDirect
45+ {
46+ pkg = "deriving-aeson";
47+ ver = "0.2.3";
48+ sha256 = "0ckwdi9pr4aqp9psag4mdbx30nygxkkpdf21rg9rfz16cz8079j7";
49+ } { };
50+ table-layout = hsuper.callHackageDirect
51+ {
52+ pkg = "table-layout";
53+ ver = "0.9.0.1";
54+ sha256 = "12nllfnh6b5mjda9qxfy192v0r0sx181w9zc9j70kvjdn7hgrb0y";
55+ } { };
56+ data-default-instances-base = hsuper.callHackageDirect
57+ {
58+ pkg = "data-default-instances-base";
59+ ver = "0.1.0.1";
60+ sha256 = "18basdy4qjn246phw008ll9zbi3rpdn6bh2dk0i81a60gsmyn58q";
61+ } { };
62+ postgresql-simple = hsuper.callHackageDirect
63+ {
64+ pkg = "postgresql-simple";
65+ ver = "0.6.3";
66+ sha256 = "16kk1bc23gc23cd79c2iy90zh03x5n6b9r2kinjspy7hl9jlzs2a";
67+ } { };
68+ concurrent-output = hsuper.callHackageDirect
69+ {
70+ pkg = "concurrent-output";
71+ ver = "1.10.12";
72+ sha256 = "1ysvahlf6frjfxpv6lwzxn05ps6b4zy1f5xb0yg6z688wbw1f6a7";
73+ } { };
74+ hspec-wai = hsuper.callHackageDirect
75+ {
76+ pkg = "hspec-wai";
77+ ver = "0.11.0";
78+ sha256 = "1kqbk2by70smhd9p1zff6ilimvvxc54dkh2l0wpn03zqvydjnwl2";
79+ } { };
80+ patch = lib.doJailbreak (hsuper.callHackageDirect
81+ {
82+ pkg = "patch";
83+ ver = "0.0.3.2";
84+ sha256 = "10alg64zwx72lz42z9i5hfwdpk0r79zfli57l41akyznj4pwrvgh";
85+ } { }
86+ );
87+ reflex = lib.dontCheck (lib.doJailbreak hsuper.reflex);
88+ reflex-dom-core = lib.dontCheck hsuper.reflex-dom-core;
89+ chronos = lib.doJailbreak hsuper.chronos;
90+ hedgehog = lib.doJailbreak hsuper.hedgehog;
91+}
nix/sources.json+36−12
@@ -1,4 +1,40 @@
11{
2+ "brittany": {
3+ "branch": "c59655f10d5ad295c2481537fc8abf0a297d9d1c",
4+ "description": "haskell source code formatter",
5+ "homepage": "",
6+ "owner": "bubba",
7+ "repo": "brittany",
8+ "rev": "c59655f10d5ad295c2481537fc8abf0a297d9d1c",
9+ "sha256": "1rkk09f8750qykrmkqfqbh44dbx1p8aq1caznxxlw8zqfvx39cxl",
10+ "type": "tarball",
11+ "url": "https://github.com/bubba/brittany/archive/c59655f10d5ad295c2481537fc8abf0a297d9d1c.tar.gz",
12+ "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
13+ },
14+ "ghcide": {
15+ "branch": "9b8aaf9b06846571cc0b5d46680e686e4f9153a3",
16+ "description": "A library for building Haskell IDE tooling",
17+ "homepage": "",
18+ "owner": "haskell",
19+ "repo": "ghcide",
20+ "rev": "9b8aaf9b06846571cc0b5d46680e686e4f9153a3",
21+ "sha256": "0clwg8fgnsgwzl6rbni7p6xifl117f6h5hjsdyy0swnbjkxkqpaa",
22+ "type": "tarball",
23+ "url": "https://github.com/haskell/ghcide/archive/9b8aaf9b06846571cc0b5d46680e686e4f9153a3.tar.gz",
24+ "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
25+ },
26+ "haskell-language-server": {
27+ "branch": "master",
28+ "description": "Integration point for ghcide and haskell-ide-engine. One IDE to rule them all.",
29+ "homepage": "",
30+ "owner": "haskell",
31+ "repo": "haskell-language-server",
32+ "rev": "b649b15b2d67a97d6a262eb65fee0002629b6dcb",
33+ "sha256": "1gxwkn3mqv20f061f9pg1y13k4ymsq6ji9gf475wdiikiql82z6a",
34+ "type": "tarball",
35+ "url": "https://github.com/haskell/haskell-language-server/archive/b649b15b2d67a97d6a262eb65fee0002629b6dcb.tar.gz",
36+ "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
37+ },
238 "hspec-webdriver-clone": {
339 "branch": "master",
440 "description": "Clone of hspec-webdriver, as the original source is inaccesible",
@@ -59,18 +95,6 @@
5995 "url": "https://github.com/reflex-frp/reflex-platform/archive/8d421e9e06b0477cbc065346aaf596c9db6cc387.tar.gz",
6096 "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
6197 },
62− "servant-reflex": {
63− "branch": "master",
64− "description": "Generate reflex client functions for querying a servant API",
65− "homepage": null,
66− "owner": "imalsogreg",
67− "repo": "servant-reflex",
68− "rev": "1109043c8437a375fc00bb48792e8dc377a84494",
69− "sha256": "0issnp95rnji3v9qifr0brypxsvmjkzanfq5lscj68lynnjv37g0",
70− "type": "tarball",
71− "url": "https://github.com/imalsogreg/servant-reflex/archive/1109043c8437a375fc00bb48792e8dc377a84494.tar.gz",
72− "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
73− },
7498 "static-haskell-nix": {
7599 "branch": "master",
76100 "description": "easily build most Haskell programs into fully static Linux executables",
octopod-api/src/Octopod/API.hs+1−2
@@ -30,8 +30,7 @@ type StatusEndpoint c = c :> "status" :> Get '[JSON] CurrentDeploymentStatus
3030type RestoreEndpoint c =
3131 c :> "restore" :> Patch '[JSON] CommandResponse
3232
33−type PingEndpoint =
34− "ping" :> GetNoContent '[PlainText] NoContent
33+type PingEndpoint = "ping" :> GetNoContent
3534type ProjectNameEndpoint =
3635 "project_name" :> Get '[JSON] ProjectName
3736
octopod-frontend/octopod-frontend.cabal+5
@@ -32,6 +32,7 @@ executable frontend
3232 , Page.Deployments
3333 , Page.Popup.EditDeployment
3434 , Page.Popup.NewDeployment
35+ , Servant.Reflex.Extra
3536 ghc-options: -Wall
3637 -Werror
3738 -Wno-missing-home-modules
@@ -57,6 +58,10 @@ executable frontend
5758 , RankNTypes
5859 , RecordWildCards
5960 , RecursiveDo
61+ , FlexibleInstances
62+ , MultiParamTypeClasses
63+ , TypeFamilies
64+ , UndecidableInstances
6065 -- other-extensions:
6166 build-depends: aeson
6267 , base >=4.12 && <4.13
octopod-frontend/src/Frontend/API.hs+1
@@ -21,6 +21,7 @@ import GHC.TypeLits
2121import Reflex.Dom as R
2222import Servant.API as S
2323import Servant.Reflex as SR
24+import Servant.Reflex.Extra ()
2425
2526import Common.Types
2627import Frontend.GHCJS
octopod-frontend/src/Servant/Reflex/Extra.hsnew file+17
@@ -0,0 +1,17 @@
1+{-# OPTIONS_GHC -Wno-orphans #-}
2+
3+module Servant.Reflex.Extra () where
4+
5+import qualified Data.Text.Encoding as E
6+import Servant.Reflex
7+import Servant.API
8+import Reflex.Dom
9+import Data.Proxy
10+import Data.Functor.Identity
11+
12+instance (SupportsServantReflex t m)
13+ => HasClient t m (NoContentVerb 'GET) tag where
14+ type Client t m (NoContentVerb 'GET) tag = Event t tag -> m (Event t (ReqResult tag NoContent))
15+ clientWithRouteAndResultHandler Proxy _ _ req baseurl opts wrap' trigs =
16+ wrap' =<< fmap runIdentity <$> performRequestsNoBody method (constDyn $ Identity req) baseurl opts trigs
17+ where method = E.decodeUtf8 $ reflectMethod (Proxy :: Proxy 'GET)
shell.nixnew file+1
@@ -0,0 +1 @@
1+(import ./default.nix { hls = true; }).shells.ghc
stack.yaml+5−1
@@ -7,8 +7,12 @@ packages:
77 - octopod-common
88
99extra-deps:
10− - deriving-aeson-0.2.2
10+ - deriving-aeson-0.2.3
1111 - servant-websockets-2.0.0
1212 - postgresql-error-codes-1.0.1
1313 - table-layout-0.9.0.1
1414 - data-default-instances-base-0.1.0.1
15+ - servant-0.18.2
16+ - servant-client-0.18.2
17+ - servant-client-core-0.18.2
18+ - servant-server-0.18.2