{-# LANGUAGE OverloadedStrings, TupleSections #-}
module Main where
import System.Environment
import Haste.Module
import Haste.Config
import Haste.AST
import Haste.AST.PP
import Data.Maybe
import qualified Data.Map as M
import qualified Data.ByteString.Lazy.Char8 as BSL
import qualified Data.ByteString.Char8 as BS
main = do
as <- getArgs
if null as
then putStrLn "Usage: haste-cat package-id:Module.To.Inspect"
else mapM_ printModule as
printModule mpkg = do
let (pkg, (_:mn)) = break (== ':') mpkg
paths = "." : libPaths defaultConfig
mods <- mapM (\p -> (p, ) `fmap` readModule p pkg mn) paths
case filter (isJust . snd) mods of
((p, Just m):_) -> printDefs p pkg mn m
_ -> return ()
printDefs :: FilePath -> String -> String -> Module -> IO ()
printDefs path pkg mn m = do
putStrLn $ "Package: " ++ pkg
putStrLn $ "Module: " ++ mn
putStrLn $ "Path: " ++ path
putStrLn "---\n"
mapM_ printDef $ M.toList $ modDefs m
printDef (name, d) = do
let cfg = defaultConfig {
ppOpts = withPretty . withExtAnnotation $ withAnnotations defaultPPOpts
}
BS.putStrLn $ niceName name
BSL.putStrLn $ pretty cfg d
putStrLn ""
niceName (Name n (Just (pkg, m))) =
BS.concat [pkg, ":", m, ".", n]
niceName (Name n _) =
n