@@ -18,7 +18,9 @@ import Control.Monad.Writer.Strict (runWriterT)
18
18
import qualified Data.Aeson as A
19
19
import Data.Aeson ((.=) )
20
20
import Data.Bifunctor (first , second , bimap )
21
+ import qualified Data.ByteString as BS
21
22
import qualified Data.ByteString.Lazy as BL
23
+ import qualified Data.ByteString.Lazy.Char8 as Char8
22
24
import Data.Default (def )
23
25
import Data.Function (on , fix )
24
26
import qualified Data.IORef as IORef
@@ -28,7 +30,9 @@ import qualified Data.Map as M
28
30
import Data.Text (Text )
29
31
import qualified Data.Text as T
30
32
import qualified Data.Text.Encoding as T
33
+ import qualified Data.Text.Lazy as TL
31
34
import Data.Time.Clock (UTCTime )
35
+ import qualified Data.Vector as V
32
36
import GHC.Generics (Generic )
33
37
import qualified Language.PureScript as P
34
38
import qualified Language.PureScript.CST as CST
@@ -43,7 +47,6 @@ import qualified Language.PureScript.Make as Make
43
47
import qualified Language.PureScript.Make.Cache as Cache
44
48
import qualified Language.PureScript.TypeChecker.TypeSearch as TS
45
49
import qualified Network.Wai.Handler.Warp as Warp
46
- import qualified System.Directory as Directory
47
50
import System.Environment (getArgs )
48
51
import System.Exit (exitFailure )
49
52
import System.FilePath.Glob (glob )
@@ -115,53 +118,24 @@ buildMakeActions codegenRef =
115
118
outputPrimDocs :: Make. Make ()
116
119
outputPrimDocs = pure ()
117
120
118
- exampleQuery str = " \
119
- \{ \" command\" : \" complete\" ,\
120
- \\" currentModule\" : \" Main\" ,\
121
- \\" matcher\" : {\
122
- \\" matcher\" : \" flex\" ,\
123
- \\" params\" : {\
124
- \\" search\" : \" " <> str <> " \" ,\
125
- \\" maxResults\" : 10\
126
- \}\
127
- \},\
128
- \\" params\" : {\
129
- \\" filters\" : [{\
130
- \\" filter\" : \" prefix\" ,\
131
- \\" params\" : {\
132
- \\" search\" : \" " <> str <> " \" \
133
- \}\
134
- \}],\
135
- \\" options\" : {\
136
- \\" maxResults\" : 20,\
137
- \\" groupReexports\" : true\
138
- \}\
139
- \}\
140
- \}\
141
- \"
121
+ -- mkCommand :: String -> String
122
+ -- mkCommand str = "\
123
+ -- \{ \"command\": \"complete\",\
124
+ -- \\"params\": {\
125
+ -- \\"filters\": [{\
126
+ -- \\"filter\": \"prefix\",\
127
+ -- \\"params\": {\
128
+ -- \\"search\": \"" <> str <> "\"\
129
+ -- \}\
130
+ -- \}],\
131
+ -- \\"options\": {\
132
+ -- \\"maxResults\": 20,\
133
+ -- \\"groupReexports\": true\
134
+ -- \}\
135
+ -- \}\
136
+ -- \}\
137
+ -- \"
142
138
143
- ideProcess :: IO ()
144
- ideProcess = do
145
- currentDirectory <- Directory. getCurrentDirectory
146
- let ideServer =
147
- (Process. proc " purs" [" ide" , " server" ])
148
- { Process. cwd = Just (currentDirectory <> " /staging" )
149
- }
150
- ideClient =
151
- Process. createProcess_ " purs-ide-client"
152
- (Process. proc " purs" [" ide" , " client" ])
153
- { Process. std_in = Process. CreatePipe
154
- , Process. std_out = Process. CreatePipe
155
- }
156
- Process. withCreateProcess ideServer $
157
- \ _ _ _ _ -> fix $ \ loop -> do
158
- getLine >>= \ case
159
- " STOP" -> pure ()
160
- arg -> do
161
- (Just handleIn, Just handleOut, _, _) <- ideClient
162
- IO. hPutStrLn handleIn (exampleQuery arg)
163
- IO. hGetContents handleOut >>= putStrLn
164
- loop
165
139
166
140
server :: [P. ExternsFile ] -> P. Env -> P. Environment -> Int -> IO ()
167
141
server externs initNamesEnv initEnv port = do
@@ -207,6 +181,35 @@ server externs initNamesEnv initEnv port = do
207
181
Scotty. json $ A. object [ " error" .= err ]
208
182
Right (warnings, comp) ->
209
183
Scotty. json $ A. object [ " js" .= comp, " warnings" .= warnings ]
184
+
185
+ get " /complete" $ do
186
+ query <- param " q"
187
+ Scotty. setHeader " Access-Control-Allow-Origin" " *"
188
+ Scotty. setHeader " Content-Type" " application/json"
189
+ let ideClient =
190
+ Process. createProcess_ " purs-ide-client"
191
+ (Process. proc " purs" [" ide" , " client" ])
192
+ { Process. std_in = Process. CreatePipe
193
+ , Process. std_out = Process. CreatePipe
194
+ }
195
+ mkCommand q = A. encode $ A. object
196
+ [ " command" .= (" complete" :: Text )
197
+ , " params" .= A. object
198
+ [ " filters" .= A. Array
199
+ ( V. fromList
200
+ [ A. object
201
+ [ " filter" .= (" prefix" :: Text )
202
+ , " params" .= A. object
203
+ [ " search" .= q]
204
+ ]
205
+ ]
206
+ )
207
+ ]
208
+ ]
209
+ (Just handleIn, Just handleOut, _, _) <- liftIO ideClient
210
+ liftIO $ Char8. hPutStrLn handleIn (mkCommand (query :: Text ))
211
+ result <- liftIO $ BS. hGetContents handleOut
212
+ Scotty. text (TL. fromStrict (T. decodeUtf8 result))
210
213
211
214
get " /search" $ do
212
215
query <- param " q"
@@ -290,4 +293,8 @@ main = do
290
293
pure (exts, namesEnv, env)
291
294
case e of
292
295
Left err -> print err >> exitFailure
293
- Right (exts, namesEnv, env) -> server exts namesEnv env port
296
+ Right (exts, namesEnv, env) -> do
297
+ let ideServer = Process. proc " purs" [" ide" , " server" ]
298
+ Process. withCreateProcess ideServer $
299
+ \ _ _ _ _ -> server exts namesEnv env port
300
+
0 commit comments