module Docs where
import Control.Monad (forM)
import Control.Monad.Error (liftIO, throwError)
import qualified Data.Aeson as Json
import qualified Data.ByteString.Lazy.Char8 as BS
import System.Directory (createDirectoryIfMissing)
import System.FilePath (dropFileName)
import qualified CommandLine.Helpers as Cmd
import qualified Elm.Docs as Docs
import qualified Elm.Package.Description as Desc
import qualified Elm.Package.Paths as Path
import qualified Manager
generate :: Desc.Description -> Manager.Manager [Docs.Documentation]
generate description =
do exposedModules <- Desc.locateExposedModules description
chunks <-
forM (prep exposedModules) $ \(seperator, path) ->
do json <- Cmd.run "elm-doc" [path]
return (seperator ++ json)
let json = BS.pack (concat chunks ++ "\n]")
case Json.eitherDecode json of
Left err ->
throwError $ "Error generating documentation:\n" ++ err
Right docs ->
do liftIO $ do
createDirectoryIfMissing True (dropFileName Path.documentation)
BS.writeFile Path.documentation json
return docs
prep exposedModules =
zip ("[\n" : repeat ",\n") (map snd exposedModules)