packages feed

ghc-bench-0.2.0: process-result/Main.hs

{-# OPTIONS_GHC -Wno-orphans #-}
module Main (main) where

import Imports

import Data.Ord (comparing)
import Data.Yaml (ToJSON)
import Data.Yaml.Pretty qualified as Yaml
import Data.ByteString qualified as B
import System.Environment (getArgs)
import System.Directory (createDirectoryIfMissing)
import System.FilePath (takeDirectory)

import Result
import SystemInfo

fieldOrder :: [(Text, Int)]
fieldOrder = flip zip [1..] [
    "time"
  , "concurrency"
  , "os"
  , "arch"
  , "category"
  , "chassis_type"
  , "name"
  , "cores"
  , "threads"
  , "vendor"
  , "family"
  , "model"
  , "stepping"
  , "version"
  , "product"
  , "board"
  , "cpu"
  , "ram"
  ]

instance ToJSON Result
deriving newtype instance ToJSON Concurrency
instance ToJSON SystemInfo
instance ToJSON Product
instance ToJSON Board
instance ToJSON Cpu

main :: IO ()
main = do
  [body, timestamp] <- getArgs

  let
    result :: Result
    result = parseFromIssueBody (pack body)

    path :: FilePath
    path = resultPath (fromString timestamp) result.system

  encodeFile path result

encodeFile :: FilePath -> Result -> IO ()
encodeFile file result = do
  ensureDirectory file
  B.writeFile file $ Yaml.encodePretty conf result
  where
    conf :: Yaml.Config
    conf = Yaml.setConfCompare (comparing byFieldOrder) Yaml.defConfig

    byFieldOrder :: Text -> Int
    byFieldOrder name = fromMaybe maxBound (lookup name fieldOrder)

ensureDirectory :: FilePath -> IO ()
ensureDirectory = createDirectoryIfMissing True . takeDirectory