packages feed

hsdev-0.1.3.2: tools/hsinspect.hs

{-# LANGUAGE OverloadedStrings, ViewPatterns #-}

module Main (
	main
	) where

import Control.Applicative
import Control.Monad (liftM)
import Control.Monad.IO.Class
import Data.Aeson (toJSON)
import System.Directory (canonicalizePath)
import System.FilePath (takeExtension)

import HsDev.Project (readProject)
import HsDev.Scan (scanModule)
import HsDev.Inspect (inspectContents)
import HsDev.Symbols.Location (ModuleLocation(..), Cabal(..))

import Tool

main :: IO ()
main = toolMain "hsinspect" [
	jsonCmd "" ["what"] [ghcOpts] "depending of what <what> is, inspect installed module, source file (.hs), cabal file (.cabal) or contents, passes as input if no <what> specified" inspect']
	where
		ghcOpts = list "ghc" "option" `short` ['g'] `desc` "options to pass to GHC"
		ghcs = listArg "ghc"

		inspect' (Args [] opts) = liftIO getContents >>= liftM toJSON . inspectContents "stdin" (ghcs opts)
		inspect' (Args [fname@(takeExtension -> ".hs")] opts) = do
			fname' <- liftIO $ canonicalizePath fname
			toJSON <$> scanModule (ghcs opts) (FileModule fname' Nothing)
		inspect' (Args [fcabal@(takeExtension -> ".cabal")] _) = do
			fcabal' <- liftIO $ canonicalizePath fcabal
			toJSON <$> readProject fcabal'
		inspect' (Args [mname] opts) = toJSON <$> scanModule (ghcs opts) (CabalModule Cabal Nothing mname)
		inspect' _ = toolError "Specify module name or file name (.hs or .cabal)"