git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
.psci config file support
cf946bdPhil Freeman
RELEASE-0.5.md+1
@@ -34,6 +34,7 @@
34- PSCI history is in XDG config (joneshf)
34- PSCI history is in XDG config (joneshf)
35- PSCI allows loading of modules from ~ paths (joneshf)
35- PSCI allows loading of modules from ~ paths (joneshf)
36- PSCI can accept a list of modules to load on start from the command line (paf31)
36- PSCI can accept a list of modules to load on start from the command line (paf31)
37+- PSCI can now be configured using a `.psci` file in the current directory. If such a file exists, it should contain a list of commands to run on startup. (paf31)
37- Type class instances are now named, to enable easier interop with Javascript (paf31)
38- Type class instances are now named, to enable easier interop with Javascript (paf31)
38- Class names no longer need to be qualified in instance declarations (garyb)
39- Class names no longer need to be qualified in instance declarations (garyb)
39- Module exports can now be specified explicitly (garyb)
40- Module exports can now be specified explicitly (garyb)
psci/Main.hs+18−2
@@ -27,13 +27,14 @@ import Control.Monad.Trans.State.Strict
27
27
28import Data.List (intercalate, isPrefixOf, nub, sortBy)
28import Data.List (intercalate, isPrefixOf, nub, sortBy)
29import Data.Maybe (mapMaybe)
29import Data.Maybe (mapMaybe)
30+import Data.Foldable (traverse_)
30import Data.Traversable (traverse)
31import Data.Traversable (traverse)
31import Data.Version (showVersion)
32import Data.Version (showVersion)
32
33
33import Parser
34import Parser
34
35
35import System.Console.Haskeline
36import System.Console.Haskeline
36−import System.Directory (doesFileExist, findExecutable, getHomeDirectory)
37+import System.Directory (doesFileExist, findExecutable, getHomeDirectory, getCurrentDirectory)
37import System.Exit
38import System.Exit
38import System.Environment.XDG.BaseDir
39import System.Environment.XDG.BaseDir
39import System.FilePath ((</>), isPathSeparator)
40import System.FilePath ((</>), isPathSeparator)
@@ -45,7 +46,7 @@ import Text.Parsec (ParseError)
45import qualified Data.Map as M
46import qualified Data.Map as M
46import qualified Language.PureScript as P
47import qualified Language.PureScript as P
47import qualified Paths_purescript as Paths
48import qualified Paths_purescript as Paths
48−import qualified System.IO.UTF8 as U (readFile)
49+import qualified System.IO.UTF8 as U (print, readFile)
49
50
50-- |
51-- |
51-- The PSCI state.
52-- The PSCI state.
@@ -289,11 +290,25 @@ inputFiles :: Cmd.Term [FilePath]
289inputFiles = Cmd.value $ Cmd.posAny [] $ Cmd.posInfo { Cmd.posName = "file(s)"
290inputFiles = Cmd.value $ Cmd.posAny [] $ Cmd.posInfo { Cmd.posName = "file(s)"
290 , Cmd.posDoc = "Optional .purs files to load on start" }
291 , Cmd.posDoc = "Optional .purs files to load on start" }
291
292
293+loadUserConfig :: IO (Maybe [Command])
294+loadUserConfig = do
295+ configFile <- (</> ".psci") <$> getCurrentDirectory
296+ exists <- doesFileExist configFile
297+ if exists
298+ then do
299+ ls <- lines <$> U.readFile configFile
300+ case mapM parseCommand ls of
301+ Left err -> U.print err >> exitFailure
302+ Right cs -> return $ Just cs
303+ else
304+ return Nothing
305+
292-- |
306-- |
293-- The PSCI main loop.
307-- The PSCI main loop.
294--
308--
295loop :: [FilePath] -> IO ()
309loop :: [FilePath] -> IO ()
296loop files = do
310loop files = do
311+ config <- loadUserConfig
297 preludeFilename <- getPreludeFilename
312 preludeFilename <- getPreludeFilename
298 modulesOrFirstError <- fmap concat . sequence <$> mapM loadModule (preludeFilename : files)
313 modulesOrFirstError <- fmap concat . sequence <$> mapM loadModule (preludeFilename : files)
299 case modulesOrFirstError of
314 case modulesOrFirstError of
@@ -303,6 +318,7 @@ loop files = do
303 let settings = defaultSettings {historyFile = Just historyFilename}
318 let settings = defaultSettings {historyFile = Just historyFilename}
304 flip evalStateT (PSCiState (preludeFilename : files) defaultImports modules []) . runInputT (setComplete completion settings) $ do
319 flip evalStateT (PSCiState (preludeFilename : files) defaultImports modules []) . runInputT (setComplete completion settings) $ do
305 outputStrLn prologueMessage
320 outputStrLn prologueMessage
321+ traverse_ (mapM_ handleCommand) config
306 go
322 go
307 where
323 where
308 go :: InputT (StateT PSCiState IO) ()
324 go :: InputT (StateT PSCiState IO) ()