octane-0.5.1: library/Octane/Main.hs
module Octane.Main (main) where
import qualified Control.DeepSeq as DeepSeq
import qualified Control.Monad as Monad
import qualified Control.Newtype as Newtype
import qualified Data.Aeson.Encode.Pretty as Aeson
import qualified Data.Binary as Binary
import qualified Data.Binary.Get as Binary
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as BSL
import qualified Data.ByteString.Lazy.Char8 as BSL8
import Data.Function ((&))
import qualified Data.Map as Map
import qualified Data.Text as Text
import qualified Octane.Parser as Parser
import qualified Octane.Type as Type
import qualified System.Environment as Environment
import qualified System.IO as IO
main :: IO ()
main = do
files <- Environment.getArgs
contents <- mapM BS.readFile files
results <- mapM Binary.decodeFileOrFail files
mapM_ debug (zip3 files contents results)
debug :: (String, BS.ByteString, Either (Binary.ByteOffset, String) Type.Replay)
-> IO ()
debug (file,contents,result) =
case result of
Left (offset,message) ->
IO.hPutStrLn
IO.stderr
(file ++ " @ byte " ++ show offset ++ " - " ++ message)
Right replay -> do
DeepSeq.deepseq replay (IO.hPutStrLn IO.stderr "evaluated replay")
let inputSize = contents & BS.length & fromIntegral
let outputSize = replay & Binary.encode & BSL.length
Monad.when (inputSize /= outputSize) $
do IO.hPutStrLn
IO.stderr
("input size (" ++
show inputSize ++
") not equal to output size (" ++
show outputSize ++ ")!")
let config =
Aeson.defConfig
{ Aeson.confCompare = compare
}
putStrLn "{\"meta\":\n"
replay & Aeson.encodePretty' config & BSL8.putStrLn
putStrLn ",\"frames\":\n"
let frames = Parser.parseFrames replay
DeepSeq.deepseq frames (IO.hPutStrLn IO.stderr "evaluated frames")
let expectedFrames = replay & Type.replayProperties & Newtype.unpack & Map.lookup ("NumFrames" & Text.pack & Newtype.pack)
let actualFrames = frames & length & fromIntegral & Newtype.pack & Type.IntProperty (Newtype.pack 4) & Just
Monad.when (expectedFrames /= actualFrames) $ IO.hPutStrLn IO.stderr ("expected " ++ show expectedFrames ++ " frames but found " ++ show actualFrames ++ " frames!")
frames & Aeson.encodePretty' config & BSL8.putStrLn
putStrLn "}"