packages feed

keera-posture-0.1.4.4: src/Controller/Conditions/LanguageConfig.hs

-- | Reads/Writes the language in a configuration file.
module Controller.Conditions.LanguageConfig (installHandlers) where

import qualified Control.Exception       as E
import           Control.Exception.Extra
import           Control.Monad
import           System.FilePath
import           System.Directory

import CombinedEnvironment
import Model.Model (Language(..))
import Hails.MVC.Model.ProtectedModel.Reactive

-- | Reads the language config on startup and saves it when modified.
installHandlers :: CEnv -> IO()
installHandlers cenv = do
  let pm = model cenv
  onEvent pm Initialised     $ conditionRead cenv
  onEvent pm LanguageChanged $ conditionSave cenv

-- | Saves the currently selected language ID String in a configuration file
conditionSave :: CEnv -> IO ()
conditionSave cenv = onViewAsync $ void $ handleAllExceptions (return ()) $ do -- E.handle (anyway (return ())) $ do

  -- Directory and file where results will be saved
  dir <- getAppUserDataDirectory "keera-posture"
  createDirectoryIfMissing True dir
  let file = dir </> "default-language"

  -- Get cur language from the model
  let pm = model cenv
  language <- getter languageField pm

  -- Save
  writeFile file $ languageToLanguageString language

-- | Reads the currently selected language ID String from a configuration file
conditionRead :: CEnv -> IO ()
conditionRead cenv = onViewAsync $ void $ handleAllExceptions (return ()) $ do -- E.handle (anyway (return ())) $ do
  
  -- Directory and file where results will be read
  dir <- getAppUserDataDirectory "keera-posture"
  let file = dir </> "default-language"

  -- Read the language string
  lang <- E.handle (anyway (return "")) $ do
             cs <- fmap lines $ readFile file
             return $ if null cs then "" else head cs
  let language = languageStringToLanguage lang

  -- Update the model
  let pm = model cenv
  setter languageField pm language

-- | Determines the language based on the language string
languageStringToLanguage :: String -> Maybe Language
languageStringToLanguage "en" = Just English
languageStringToLanguage "es" = Just Spanish
languageStringToLanguage "gl" = Just Galician
languageStringToLanguage _    = Nothing

-- | Determines the language string id based on the language
languageToLanguageString :: Maybe Language -> String
languageToLanguageString (Just English)  = "en"
languageToLanguageString (Just Galician) = "gl"
languageToLanguageString (Just Spanish)  = "es"
languageToLanguageString _               = ""