packages feed

hash-addressed-cli-2.0.0.0: library/HashAddressed/App/Meta/Initialization.hs

module HashAddressed.App.Meta.Initialization
  (
    defaultConfigINI, tryInitializeStore, initializeStore,
    InitializationType (..),
  )
  where

import Essentials
import HashAddressed.App.HashFunction.Naming
import HashAddressed.App.Meta.Paths
import HashAddressed.App.Verbosity.Printing
import HashAddressed.App.Verbosity.Type
import HashAddressed.App.Command.Type

import Control.Monad.IO.Class (liftIO)
import HashAddressed.HashFunction (HashFunction)
import Prelude (FilePath)

import qualified Data.ByteString as Strict.ByteString
import qualified Data.Ini as INI
import qualified Data.Text as Strict.Text
import qualified Data.Text.Encoding as Strict.Text
import qualified System.Directory as Directory

defaultConfigINI :: HashFunction -> INI.Ini
defaultConfigINI optHashFunction = INI.Ini mempty
    [ (Strict.Text.pack "version", Strict.Text.pack "1")
    , (Strict.Text.pack "hash function",
      Strict.Text.pack (showHashFunction optHashFunction))]

tryInitializeStore :: InitializationType -> Verbosity -> HashFunction -> FilePath -> CommandAction ()
tryInitializeStore initializationType optVerbosity optHashFunction optStoreDirectory = do
    liftIO (Directory.doesPathExist (metaDirectory optStoreDirectory)) >>= \case
        False -> initializeStore optHashFunction optStoreDirectory
        True -> case initializationType of
            CreateNew -> initializeStore optHashFunction optStoreDirectory
            CreateIfNotPresent ->
                putVerboseLn optVerbosity "Store is already initialized."

data InitializationType = CreateNew | CreateIfNotPresent

{-| Assumes a store does not already exist -}
initializeStore :: HashFunction -> FilePath -> CommandAction ()
initializeStore optHashFunction optStoreDirectory = do
    liftIO $ Directory.createDirectoryIfMissing True (metaDirectory optStoreDirectory)
    liftIO $ Strict.ByteString.writeFile (configFile optStoreDirectory) $
        Strict.Text.encodeUtf8 (INI.printIni (defaultConfigINI optHashFunction))