@@ -3,7 +3,7 @@ module Main where
4import Control.Monad (msum,guard)
4import Control.Monad (msum,guard)
5import Control.Monad.Trans (MonadIO(liftIO))
5import Control.Monad.Trans (MonadIO(liftIO))
6−import Data.List (isPrefixOf, isSuffixOf)
6+import Data.List (isPrefixOf, isSuffixOf, (\\))
7import Data.Version (showVersion)
7import Data.Version (showVersion)
8import Happstack.Server
8import Happstack.Server
9import Happstack.Server.Compression
9import Happstack.Server.Compression
@@ -14,17 +14,18 @@ import Paths_elm_server
15runtime = "/elm-" ++ showVersion version ++ ".js"
15runtime = "/elm-" ++ showVersion version ++ ".js"
17−serve :: String -> IO ()
17+serve :: Int -> String -> IO ()
18−serve libLoc = do
18+serve portNumber libLoc = do
19 putStrLn ("Elm Server " ++ showVersion version ++
19 putStrLn ("Elm Server " ++ showVersion version ++
20− ": running at <http://localhost:8000>")
20+ ": running at <http://localhost:" ++ (show portNumber) ++ ">")
21 putStrLn "Just refresh a page to recompile it!"
21 putStrLn "Just refresh a page to recompile it!"
22− simpleHTTP nullConf $ do
22+ simpleHTTP httpConf $ do
23 _ <- compressedResponseFilter
23 _ <- compressedResponseFilter
24 msum [ uriRest serveElm
24 msum [ uriRest serveElm
25 , uriRest (serveLib libLoc)
25 , uriRest (serveLib libLoc)
26 , serveDirectory EnableBrowsing [] "."
26 , serveDirectory EnableBrowsing [] "."
28+ where httpConf = nullConf { port = portNumber }
29pageTitle :: String -> String
30pageTitle :: String -> String
30pageTitle = dropExtension . takeBaseName
31pageTitle = dropExtension . takeBaseName
@@ -44,12 +45,16 @@ main = getArgs >>= parse
44parse :: [String] -> IO ()
45parse :: [String] -> IO ()
45parse ("--help":_) = putStrLn usage
46parse ("--help":_) = putStrLn usage
46parse ("--version":_) = putStrLn ("The Elm Server " ++ showVersion version)
47parse ("--version":_) = putStrLn ("The Elm Server " ++ showVersion version)
47−parse [] = serve =<< Elm.runtime
48+parse args = if null remainingArgs
48−parse [arg]
49+ then serve portNumber =<< elmRuntime
49− | "--runtime-location=" `isPrefixOf` arg =
50+ else putStrLn usageMini
51+ where runtimeArg = filter (isPrefixOf "--runtime-location=") args
52+ portArg = filter (isPrefixOf "--port=") args
53+ remainingArgs = (args \\ runtimeArg) \\ portArg
50− serve . tail $ dropWhile (/='=') arg
55+ argValue arg = tail $ dropWhile (/= '=') (head arg)
51− | otherwise = putStrLn usageMini
56+ portNumber = if null portArg then 8000 else read (argValue portArg) :: Int
52−parse _ = putStrLn usageMini
57+ elmRuntime = if null runtimeArg then Elm.runtime else return $ argValue runtimeArg
54usageMini :: String
59usageMini :: String
55usageMini =
60usageMini =
@@ -62,6 +67,9 @@ usage =
62 \Compiles and serves .elm files from the current directory.\n\
67 \Compiles and serves .elm files from the current directory.\n\
63 \Example: elm-server\n\
68 \Example: elm-server\n\
70+ \Server configuration:\n\
71+ \ --port set the port to listen on (default: 8000)\n\
65 \Resource Locations:\n\
73 \Resource Locations:\n\
66 \ --runtime-location set the location of the Elm runtime\n\
74 \ --runtime-location set the location of the Elm runtime\n\