{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}
module Main (main) where
import Api (Api)
import Data.Foldable (traverse_)
import Data.HashMap.Strict (HashMap)
import Data.JsonSpec.Elm.Servant (servantDefs)
import Data.Proxy (Proxy(Proxy))
import Data.Text (Text)
import Language.Elm.Name (Module)
import Language.Elm.Pretty (modules)
import Prelude (Bool(True), Functor(fmap), Semigroup((<>)), ($), (.),
FilePath, IO, init)
import Prettyprinter (defaultLayoutOptions, layoutPretty)
import Prettyprinter.Render.Text (renderStrict)
import Servant.API (ToServantApi)
import System.Directory (createDirectoryIfMissing)
import System.Process (callCommand)
import Test.Hspec (describe, hspec, it)
import qualified Data.HashMap.Strict as HM
import qualified Data.Set as Set
import qualified Data.Text as Text
import qualified Data.Text.IO as TIO
main :: IO ()
main =
hspec $ do
describe "thing" $ do
it "works" $
let
actual :: HashMap Module Text
actual =
fmap ((<> "\n") . renderStrict . layoutPretty defaultLayoutOptions)
. modules
. Set.toList
$ servantDefs (Proxy @(ToServantApi Api))
in do
traverse_ writeModule (HM.toList actual)
callCommand "(cd elm-test; elm-format src/ --yes)"
callCommand
"(\
\cd elm-test; \
\yes Y | (\
\elm init; \
\elm install rtfeldman/elm-iso8601-date-strings; \
\elm install elm/json; \
\elm install elm/url; \
\elm install elm/time; \
\elm install elm/http\
\); \
\elm make src/Api/Req.elm\
\)"
callCommand "rm -rf elm-test"
writeModule :: (Module, Text) -> IO ()
writeModule (module_, content) = do
createDirectoryIfMissing True dirname
TIO.writeFile filename content
where
pathName :: [Text] -> FilePath
pathName = ("elm-test/src/" <>) . Text.unpack . Text.intercalate "/"
filename :: FilePath
filename = pathName module_ <> ".elm"
dirname :: FilePath
dirname = pathName (init module_)