@@ -18,7 +18,9 @@ import Control.Monad.Writer.Strict (runWriterT)
1818import qualified Data.Aeson as A
1919import Data.Aeson ((.=) )
2020import Data.Bifunctor (first , second , bimap )
21+ import qualified Data.ByteString as BS
2122import qualified Data.ByteString.Lazy as BL
23+ import qualified Data.ByteString.Lazy.Char8 as Char8
2224import Data.Default (def )
2325import Data.Function (on , fix )
2426import qualified Data.IORef as IORef
@@ -28,7 +30,9 @@ import qualified Data.Map as M
2830import Data.Text (Text )
2931import qualified Data.Text as T
3032import qualified Data.Text.Encoding as T
33+ import qualified Data.Text.Lazy as TL
3134import Data.Time.Clock (UTCTime )
35+ import qualified Data.Vector as V
3236import GHC.Generics (Generic )
3337import qualified Language.PureScript as P
3438import qualified Language.PureScript.CST as CST
@@ -43,7 +47,6 @@ import qualified Language.PureScript.Make as Make
4347import qualified Language.PureScript.Make.Cache as Cache
4448import qualified Language.PureScript.TypeChecker.TypeSearch as TS
4549import qualified Network.Wai.Handler.Warp as Warp
46- import qualified System.Directory as Directory
4750import System.Environment (getArgs )
4851import System.Exit (exitFailure )
4952import System.FilePath.Glob (glob )
@@ -115,53 +118,24 @@ buildMakeActions codegenRef =
115118 outputPrimDocs :: Make. Make ()
116119 outputPrimDocs = pure ()
117120
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+ -- \"
142138
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
165139
166140server :: [P. ExternsFile ] -> P. Env -> P. Environment -> Int -> IO ()
167141server externs initNamesEnv initEnv port = do
@@ -207,6 +181,35 @@ server externs initNamesEnv initEnv port = do
207181 Scotty. json $ A. object [ " error" .= err ]
208182 Right (warnings, comp) ->
209183 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))
210213
211214 get " /search" $ do
212215 query <- param " q"
@@ -290,4 +293,8 @@ main = do
290293 pure (exts, namesEnv, env)
291294 case e of
292295 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