Skip to content

Commit 3880d2f

Browse files
committed
Add /complete endpoint
1 parent 85d2c1d commit 3880d2f

File tree

2 files changed

+55
-48
lines changed

2 files changed

+55
-48
lines changed

server/Main.hs

+54-48
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ import Control.Monad.Writer.Strict (runWriterT)
1818
import qualified Data.Aeson as A
1919
import Data.Aeson ((.=))
2020
import Data.Bifunctor (first, second, bimap)
21+
import qualified Data.ByteString as BS
2122
import qualified Data.ByteString.Lazy as BL
23+
import qualified Data.ByteString.Lazy.Char8 as Char8
2224
import Data.Default (def)
2325
import Data.Function (on, fix)
2426
import qualified Data.IORef as IORef
@@ -28,7 +30,9 @@ import qualified Data.Map as M
2830
import Data.Text (Text)
2931
import qualified Data.Text as T
3032
import qualified Data.Text.Encoding as T
33+
import qualified Data.Text.Lazy as TL
3134
import Data.Time.Clock (UTCTime)
35+
import qualified Data.Vector as V
3236
import GHC.Generics (Generic)
3337
import qualified Language.PureScript as P
3438
import qualified Language.PureScript.CST as CST
@@ -43,7 +47,6 @@ import qualified Language.PureScript.Make as Make
4347
import qualified Language.PureScript.Make.Cache as Cache
4448
import qualified Language.PureScript.TypeChecker.TypeSearch as TS
4549
import qualified Network.Wai.Handler.Warp as Warp
46-
import qualified System.Directory as Directory
4750
import System.Environment (getArgs)
4851
import System.Exit (exitFailure)
4952
import 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

166140
server :: [P.ExternsFile] -> P.Env -> P.Environment -> Int -> IO ()
167141
server 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,7 @@ 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

trypurescript.cabal

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ executable trypurescript
3535
process -any,
3636
text -any,
3737
time -any,
38+
vector -any,
3839
warp -any
3940
hs-source-dirs: server
4041
main-is: Main.hs

0 commit comments

Comments
 (0)