packages feed

cantor-0.4: src/Main.hs

{- |
Module : Main
Copyright : Copyright (C) 2014 Krzysztof Langner
License : BSD3

Maintainer : Krzysztof Langner <klangner@gmail.com>
Stability : alpha
Portability : portable

Main GUI application for gathering and presenting information..
-}
module Main where

import System.Environment
import System.Console.GetOpt
import System.Exit
import Paths_cantor (version)
import Data.Version (showVersion)
import Cantor.Project (Project, scanProject)
import Cantor.KnowledgeDB (KnowledgeDB, conceptUrl, loadKDB)
import Cantor.Analysis.Language (countSourceFiles)


data Flag = Version -- -v
          | Help -- --help
          | Build -- --build
          | Lang -- --languages
          | Modules -- --modules
          deriving (Eq,Ord,Enum,Show,Bounded)
        
        
main::IO ()
main = do
    argv <- getArgs
    case getOpt Permute flags argv of
        ([Version], _, []) -> printVersion
        ([Help], _, []) -> printUsageInfo
        ([], [src], []) -> analyzeProject [Lang] src
        (xs, [src], []) -> analyzeProject xs src
        (_, _, []) -> printUsageInfo
        (_, _, errs) -> errorAction errs
    
    

-- | Command line flags
flags :: [OptDescr Flag]
flags =
       [ Option "b" ["build"] (NoArg Build)
            "Check what build system is used by project."
       , Option "h" ["help"] (NoArg Help)
            "Print this help message."
       , Option "l" ["languages"] (NoArg Lang)
            "Check what languages is this application written in."
       , Option "m" ["modules"] (NoArg Modules)
            "Find independed modules in the project."
       , Option "v" ["version"] (NoArg Version)
            "Print version number."
       ]


-- | Print application version number
printVersion :: IO ()
printVersion =
    putStrLn $ "cantor version " ++ showVersion version
    
    
-- | This action prints errors
errorAction :: [String] -> IO ()
errorAction errs = do
    putStrLn (concat errs)
    exitWith (ExitFailure 1)
    
       
-- | Print usage info
printUsageInfo :: IO ()
printUsageInfo = do
    putStrLn "Usage: cantor <project_path>"
    putStrLn (usageInfo "" flags)
    

-- | Analize project and create report
-- What is analyzed depends on passed flags
analyzeProject :: [Flag] -> FilePath -> IO ()
analyzeProject xs src = do
    let db = loadKDB
    prj <- scanProject src
    mapM_ (\x -> (f x) db prj) xs
    return ()
    where f Build = analyzeBuildSystem
          f _ = analyzeLanguages



-- | Analize langauge used in project
analyzeLanguages :: KnowledgeDB -> Project -> IO ()
analyzeLanguages db prj = do
    putStrLn "Found source files:"
    let lc = countSourceFiles db prj
    mapM_ (\(l, n) -> putStrLn (l ++ ": " ++ show n)) lc
    let (lang, _) = foldl (\(l0, n0) (l, n) -> if(n > n0) then (l,n) else (l0,n0)) ("",0) lc
    putStrLn $ "This application is written in " ++ lang
    putStrLn $ "Check more about " ++ lang ++ " at:"
    putStrLn $ (conceptUrl db lang)
    return ()

-- | Analize build system used by project
analyzeBuildSystem :: KnowledgeDB -> Project -> IO ()
analyzeBuildSystem _ _ = do
    putStrLn $ "Build system used by project: " ++ "Unknown"
    return ()