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