-- | Functions and data types to handle Hoogle results
module Docs.CLI.Hoogle where
import Prelude hiding (mod)
import Data.Maybe (fromMaybe)
import Data.Aeson (FromJSON(..))
import Docs.CLI.Types
import Docs.CLI.Haddock (Html, parseHoogleHtml, HasCompletion(..), innerString)
import qualified Hoogle
data Item
= Declaration Declaration
| Module Module
| Package Package
deriving (Eq)
instance HasCompletion Item where
completion = \case
Declaration d -> dCompletion d
Module m -> mTitle m
Package p -> pTitle p
instance FromJSON Item where
parseJSON = fmap fromHoogleTarget . parseJSON
fromHoogleTarget :: Hoogle.Target -> Item
fromHoogleTarget target =
case Hoogle.targetType target of
"module" ->
let
(pkg, pkgUrl) = fromMaybe
(error "Hoogle module without package info")
(Hoogle.targetPackage target)
desc = parseHoogleHtml $ Hoogle.targetItem target
in
Module $ Module_
{ mUrl = ModuleUrl $ Hoogle.targetURL target
, mPackageUrl = PackageUrl pkgUrl
, mPackage = pkg
, mDescription = desc
, mDocs = parseHoogleHtml $ Hoogle.targetDocs target
, mTarget = target
, mTitle = innerString desc
}
"package" ->
let desc = parseHoogleHtml $ Hoogle.targetItem target
in
Package $ Package_
{ pUrl = PackageUrl $ Hoogle.targetURL target
, pDescription = desc
, pDocs = parseHoogleHtml $ Hoogle.targetDocs target
, pTarget = target
, pTitle = innerString desc
}
_ ->
let
(pkg, pkgUrl) = fromMaybe
(error "Hoogle declaration without package info")
(Hoogle.targetPackage target)
(mod, modUrl) = fromMaybe
(error "Hoogle declaration without module info")
(Hoogle.targetModule target)
anchor = fromMaybe
(error "Hoogle declaration without anchor in Link URL")
(takeAnchor $ Hoogle.targetURL target)
moduleUrl = ModuleUrl modUrl
desc = parseHoogleHtml $ Hoogle.targetItem target
in
Declaration $ Declaration_
{ dUrl = DeclUrl moduleUrl anchor
, dPackage = pkg
, dPackageUrl = PackageUrl pkgUrl
, dModule = mod
, dModuleUrl = moduleUrl
, dDescription = desc
, dDocs = parseHoogleHtml $ Hoogle.targetDocs target
, dCompletion = innerString desc
, dTarget = target
}
data Declaration = Declaration_
{ dUrl :: DeclUrl
, dPackage :: String
, dPackageUrl :: PackageUrl
, dModule :: String
, dModuleUrl :: ModuleUrl
, dDescription :: Html
, dDocs :: Html
, dTarget :: Hoogle.Target
, dCompletion :: String
}
deriving (Eq)
data Module = Module_
{ mUrl :: ModuleUrl
, mPackage :: String
, mPackageUrl :: PackageUrl
, mDescription :: Html
, mDocs :: Html
, mTarget :: Hoogle.Target
, mTitle :: String
}
deriving (Eq)
data Package = Package_
{ pUrl :: PackageUrl
, pDescription :: Html
, pDocs :: Html
, pTarget :: Hoogle.Target
, pTitle :: String
}
deriving (Eq)
description :: Item -> Html
description = \case
Declaration d -> dDescription d
Module m -> mDescription m
Package p -> pDescription p
docs :: Item -> Html
docs = \case
Declaration d -> dDocs d
Module m -> mDocs m
Package p -> pDocs p