{-# LANGUAGE OverloadedStrings #-}

module IpeDb.Main (defaultMain) where

import Data.Text (Text)
import qualified Data.Text as Text
import qualified Data.Text.IO as Text
import IpeDb.InfoProv
import qualified IpeDb.Options as Opts
import IpeDb.Query

defaultMain :: IO ()
defaultMain :: IO ()
defaultMain = do
  opts <- IO Options
Opts.parseOptions
  case opts.command of
    Opts.Query QueryOptions
query -> FilePath -> (InfoProvDb -> IO ()) -> IO ()
forall a. FilePath -> (InfoProvDb -> IO a) -> IO a
withInfoProvDb Options
opts.databaseFp ((InfoProvDb -> IO ()) -> IO ()) -> (InfoProvDb -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \InfoProvDb
db -> do
      InfoProvDb -> IpeId -> IO (Maybe InfoProv)
lookupInfoProv InfoProvDb
db QueryOptions
query.ipeId IO (Maybe InfoProv) -> (Maybe InfoProv -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Maybe InfoProv
Nothing -> Text -> IO ()
Text.putStrLn (Text -> IO ()) -> Text -> IO ()
forall a b. (a -> b) -> a -> b
$ Text
"No Info Prov found for " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> IpeId -> Text
forall a. Show a => a -> Text
Text.show QueryOptions
query.ipeId
        Just InfoProv
prov -> Text -> IO ()
Text.putStrLn (Text -> IO ()) -> Text -> IO ()
forall a b. (a -> b) -> a -> b
$ InfoProv -> Text
prettyInfoProv InfoProv
prov
    Opts.Index IndexOptions
index -> FilePath -> (InfoProvDb -> IO ()) -> IO ()
forall a. FilePath -> (InfoProvDb -> IO a) -> IO a
withInfoProvDb Options
opts.databaseFp ((InfoProvDb -> IO ()) -> IO ()) -> (InfoProvDb -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \InfoProvDb
db -> do
      InfoProvDb -> FilePath -> IO ()
populateFromEventlog InfoProvDb
db IndexOptions
index.eventlog

prettyInfoProv :: InfoProv -> Text
prettyInfoProv :: InfoProv -> Text
prettyInfoProv InfoProv
prov =
  [Text] -> Text
Text.unlines
    [ Text
"Info Table  " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> IpeId -> Text
prettyIpeId InfoProv
prov.infoId
    , Text
"  Table Name:      " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> InfoProv
prov.tableName
    , Text
"  Closure Desc:    " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Int64 -> Text
forall a. Show a => a -> Text
Text.show InfoProv
prov.closureDesc
    , Text
"  Type Desc:       " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> InfoProv
prov.typeDesc
    , Text
"  Label:           " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> InfoProv
prov.label
    , Text
"  Modulename:      " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> InfoProv
prov.moduleName
    , Text
"  Source Location: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> InfoProv
prov.srcLoc
    ]