load and save databases properly

This commit is contained in:
Jonathan Lamothe 2020-03-12 02:44:41 -04:00
parent 1e8473538a
commit ca06b0570e
4 changed files with 38 additions and 44 deletions

View File

@ -19,23 +19,15 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
-} -}
{-# LANGUAGE ScopedTypeVariables #-}
module Mtlstats (initState, mainLoop) where module Mtlstats (initState, mainLoop) where
import Control.Exception (IOException, catch)
import Control.Monad (void) import Control.Monad (void)
import Control.Monad.Extra (whenM) import Control.Monad.Extra (whenM)
import Control.Monad.IO.Class (liftIO)
import Control.Monad.Trans.Class (lift) import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.State (get, gets) import Control.Monad.Trans.State (get, gets)
import Data.Aeson (decodeFileStrict) import Data.Maybe (fromJust)
import Data.Maybe (fromJust, fromMaybe)
import Lens.Micro ((&), (.~))
import System.EasyFile (getAppUserDataDirectory, (</>))
import qualified UI.NCurses as C import qualified UI.NCurses as C
import Mtlstats.Config
import Mtlstats.Control import Mtlstats.Control
import Mtlstats.Types import Mtlstats.Types
@ -44,15 +36,7 @@ initState :: C.Curses ProgState
initState = do initState = do
C.setEcho False C.setEcho False
void $ C.setCursorMode C.CursorInvisible void $ C.setCursorMode C.CursorInvisible
db <- liftIO $ do return newProgState
dir <- getAppUserDataDirectory appName
let dbFile = dir </> dbFname
fromMaybe newDatabase <$> catch
(decodeFileStrict dbFile)
(\(_ :: IOException) -> return Nothing)
return
$ newProgState
& database .~ db
-- | Main program loop -- | Main program loop
mainLoop :: Action () mainLoop :: Action ()

View File

@ -19,7 +19,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
-} -}
{-# LANGUAGE LambdaCase #-} {-# LANGUAGE LambdaCase, ScopedTypeVariables #-}
module Mtlstats.Actions module Mtlstats.Actions
( startNewSeason ( startNewSeason
@ -43,12 +43,14 @@ module Mtlstats.Actions
, backHome , backHome
, scrollUp , scrollUp
, scrollDown , scrollDown
, loadDatabase
, saveDatabase , saveDatabase
) where ) where
import Control.Exception (IOException, catch)
import Control.Monad.IO.Class (liftIO) import Control.Monad.IO.Class (liftIO)
import Control.Monad.Trans.State (gets, modify) import Control.Monad.Trans.State (gets, modify)
import Data.Aeson (encodeFile) import Data.Aeson (decodeFileStrict, encodeFile)
import Data.Maybe (fromMaybe) import Data.Maybe (fromMaybe)
import Lens.Micro ((^.), (&), (.~), (%~)) import Lens.Micro ((^.), (&), (.~), (%~))
import System.EasyFile import System.EasyFile
@ -216,12 +218,27 @@ scrollUp = scrollOffset %~ max 0 . pred
scrollDown :: ProgState -> ProgState scrollDown :: ProgState -> ProgState
scrollDown = scrollOffset %~ succ scrollDown = scrollOffset %~ succ
-- | Loads the database
loadDatabase :: Action ()
loadDatabase = do
db <- gets (^.database)
dbFile <- dbSetup
db' <- liftIO $ catch
(fromMaybe db <$> decodeFileStrict dbFile)
(\(_ :: IOException) -> return db)
modify $ database .~ db'
-- | Saves the database -- | Saves the database
saveDatabase :: String -> Action () saveDatabase :: Action ()
saveDatabase fn = do saveDatabase = do
db <- gets (^.database) db <- gets (^.database)
dbFile <- dbSetup
liftIO $ encodeFile dbFile db
dbSetup :: Action String
dbSetup = do
fn <- gets (^.dbName)
liftIO $ do liftIO $ do
dir <- getAppUserDataDirectory appName dir <- getAppUserDataDirectory appName
let dbFile = dir </> fn
createDirectoryIfMissing True dir createDirectoryIfMissing True dir
encodeFile dbFile db return $ dir </> fn ++ ".json"

View File

@ -45,7 +45,6 @@ import qualified UI.NCurses as C
import Mtlstats.Actions import Mtlstats.Actions
import qualified Mtlstats.Actions.NewGame.GoalieInput as GI import qualified Mtlstats.Actions.NewGame.GoalieInput as GI
import Mtlstats.Actions.EditStandings import Mtlstats.Actions.EditStandings
import Mtlstats.Config
import Mtlstats.Format import Mtlstats.Format
import Mtlstats.Types import Mtlstats.Types
import Mtlstats.Types.Menu import Mtlstats.Types.Menu
@ -115,7 +114,7 @@ mainMenu = Menu "MASTER MENU" True
, MenuItem 'C' "EDIT MENU" $ , MenuItem 'C' "EDIT MENU" $
modify edit >> return True modify edit >> return True
, MenuItem 'E' "EXIT" $ , MenuItem 'E' "EXIT" $
saveDatabase dbFname >> return False saveDatabase >> return False
] ]
-- | The new season menu -- | The new season menu

View File

@ -186,21 +186,14 @@ dbNamePrompt pStr act = (strPrompt pStr act)
-- | Prompts the user for a filename to save a backup of the database -- | Prompts the user for a filename to save a backup of the database
-- to -- to
newSeasonPrompt :: Prompt newSeasonPrompt :: Prompt
newSeasonPrompt = prompt newSeasonPrompt = dbNamePrompt "Filename for new season: " $ \fn ->
{ promptProcessChar = \ch str -> if validChar ch if null fn
then str ++ [toUpper ch] then modify backHome
else str else do
} saveDatabase
where modify
$ (dbName .~ fn)
prompt = strPrompt "Filename to save database: " $ \fn -> . (progMode .~ NewSeason True)
if null fn
then modify backHome
else do
saveDatabase $ fn ++ ".json"
modify $ progMode .~ NewSeason True
validChar = (||) <$> isAlphaNum <*> (=='-')
-- | Builds a selection prompt -- | Builds a selection prompt
selectPrompt :: SelectParams a -> Prompt selectPrompt :: SelectParams a -> Prompt
@ -241,8 +234,9 @@ selectPrompt params = Prompt
-- | Prompts for the database to load -- | Prompts for the database to load
getDBPrompt :: Prompt getDBPrompt :: Prompt
getDBPrompt = dbNamePrompt "Season database to load: " $ getDBPrompt = dbNamePrompt "Season database to load: " $ \fn -> do
modify . (dbName .~) modify $ dbName .~ fn
loadDatabase
-- | Prompts for a new player's number -- | Prompts for a new player's number
playerNumPrompt :: Prompt playerNumPrompt :: Prompt