module Hhp.PkgDoc (packageDoc) where

import System.Process (readProcess)

import Hhp.GhcPkg
import Hhp.Types

-- | Obtaining the package name and the doc path of a module.
packageDoc
    :: Options
    -> Cradle
    -> ModuleString
    -> IO String
packageDoc :: Options -> Cradle -> [Char] -> IO [Char]
packageDoc Options
_ Cradle
cradle [Char]
mdl = Cradle -> [Char] -> IO [Char]
pkgDoc Cradle
cradle [Char]
mdl

pkgDoc :: Cradle -> String -> IO String
pkgDoc :: Cradle -> [Char] -> IO [Char]
pkgDoc Cradle
cradle [Char]
mdl = do
    [Char]
pkg <- [Char] -> [Char]
trim ([Char] -> [Char]) -> IO [Char] -> IO [Char]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Char] -> [[Char]] -> [Char] -> IO [Char]
readProcess [Char]
"ghc-pkg" [[Char]]
toModuleOpts []
    if [Char]
pkg [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
""
        then [Char] -> IO [Char]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [Char]
"\n"
        else do
            [Char]
htmlpath <- [Char] -> [[Char]] -> [Char] -> IO [Char]
readProcess [Char]
"ghc-pkg" ([Char] -> [[Char]]
toDocDirOpts [Char]
pkg) []
            let ret :: [Char]
ret = [Char]
pkg [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
14 [Char]
htmlpath
            [Char] -> IO [Char]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [Char]
ret
  where
    toModuleOpts :: [[Char]]
toModuleOpts =
        [[Char]
"find-module", [Char]
mdl, [Char]
"--simple-output"]
            [[Char]] -> [[Char]] -> [[Char]]
forall a. [a] -> [a] -> [a]
++ [GhcPkgDb] -> [[Char]]
ghcPkgDbStackOpts (Cradle -> [GhcPkgDb]
cradlePkgDbStack Cradle
cradle)
    toDocDirOpts :: [Char] -> [[Char]]
toDocDirOpts [Char]
pkg =
        [[Char]
"field", [Char]
pkg, [Char]
"haddock-html"]
            [[Char]] -> [[Char]] -> [[Char]]
forall a. [a] -> [a] -> [a]
++ [GhcPkgDb] -> [[Char]]
ghcPkgDbStackOpts (Cradle -> [GhcPkgDb]
cradlePkgDbStack Cradle
cradle)
    trim :: [Char] -> [Char]
trim = (Char -> Bool) -> [Char] -> [Char]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Char -> [Char] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Char]
" \n")