packages feed

log2json-0.1: Main.hs

{-
    Main.hs
    Copyright (C) 2012 Harold Lee

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-}
module Main where

import Text.LogFormat

import Data.Map ( toList )
import System.Environment ( getArgs )
import System.IO
import Text.JSON
import Text.Parsec

main = do args <- getArgs
          logFormat <- if length args < 1
                         then do putStrLn "Enter your LogFormat string:"
                                 getLine
                         else return (head args)
          parser <- compileLogFormat logFormat
          let multiParser = many parser
          if length args < 2
             then processFileHandle multiParser "stdin" stdin
             else do sequence $ map (processFile multiParser) (tail args)
                     return ()

processFile parser filename = withFile filename ReadMode (processFileHandle parser filename)

processFileHandle parser filename fh =
  do contents <- hGetContents fh
     case (parse parser name contents) of
       Left parseErr ->
         fail $ invalidThingMessage "log file" filename parseErr
       Right maps ->
         let json = encode $ map (toJSObject . toList) maps in
           putStrLn json
  where name = "LogFormat parser for file " ++ filename

-- Parse the LogFormat string to get a log record parser.
compileLogFormat logFormat =
  case (logFormatParser logFormat) of
     Left parseErr ->
       fail $ invalidThingMessage "LogFormat string" logFormat parseErr
     Right parser ->
       return parser

-- Ask for a log record, parse it, and print the resulting JSON object.
parseALogRecord logFormat parser inputLine =
  case (parse parser ("LogFormat Tool [" ++ logFormat ++ "]") inputLine) of
    Left parseErr ->
      fail $ invalidThingMessage "log record" inputLine parseErr
    Right map ->
      putStrLn $ encode $ toJSObject $ toList map

invalidThingMessage thing input parseError =
  "Invalid " ++ thing ++ " \"" ++ input ++ "\": " ++ (show parseError)