packages feed

mem-info-0.4.0.0: test/MemInfo/Files/Root.hs

{-# LANGUAGE OverloadedStrings #-}

module MemInfo.Files.Root (
  -- * functions
  useTmp,
  writeRootedFile,
  initRoot,
  clearDirectory,
) where

import Data.Text (Text)
import qualified Data.Text.IO as Text
import Fmt ((+|), (|+))
import System.Directory (
  createDirectoryIfMissing,
  listDirectory,
  removePathForcibly,
 )
import System.FilePath (takeDirectory, (</>))
import System.IO.Temp (withSystemTempDirectory)
import System.MemInfo.SysInfo (
  KernelVersion,
 )


useTmp :: (FilePath -> IO a) -> IO a
useTmp = withSystemTempDirectory "mem-info"


writeRootedFile :: FilePath -> FilePath -> Text -> IO ()
writeRootedFile root path txt = do
  let target = root </> path
  createDirectoryIfMissing True $ takeDirectory target
  Text.writeFile target txt


initRoot :: FilePath -> KernelVersion -> IO ()
initRoot root version = do
  clearDirectory root
  writeRootedFile root "sys/kernel/osrelease" $ fmtKernelVersion version


clearDirectory :: FilePath -> IO ()
clearDirectory fp = listDirectory fp >>= mapM_ removePathForcibly


fmtKernelVersion :: KernelVersion -> Text
fmtKernelVersion (major, minor, patch) =
  "" +| toInteger major |+ "." +| toInteger minor |+ "." +| toInteger patch |+ ""