{-# LANGUAGE OverloadedStrings #-} module Elm.File ( Spec(..) , specsToDir ) where import Data.List import Data.Monoid import Data.Text (Text) import qualified Data.Text as T import qualified Data.Text.IO as T import Formatting as F import System.Directory makePath :: [Text] -> Text makePath = T.intercalate "/" data Spec = Spec { namespace :: [Text] , declarations :: [Text] } pathForSpec :: FilePath -> Spec -> [Text] pathForSpec rootDir spec = T.pack rootDir : namespace spec ensureDirectory :: FilePath -> Spec -> IO () ensureDirectory rootDir spec = let dir = makePath . Data.List.init $ pathForSpec rootDir spec in createDirectoryIfMissing True (T.unpack dir) specToFile :: FilePath -> Spec -> IO () specToFile rootDir spec = let path = pathForSpec rootDir spec file = makePath path <> ".elm" namespaceText = T.intercalate "." (namespace spec) body = T.intercalate "\n\n" (sformat ("module " % F.stext % " exposing (..)") namespaceText : declarations spec) in do fprint ("Writing: " % F.stext % "\n") file T.writeFile (T.unpack file) body specsToDir :: [Spec] -> FilePath -> IO () specsToDir specs rootDir = mapM_ processSpec specs where processSpec = ensureDirectory rootDir >> specToFile rootDir