Support loading and saving to JSON, step 5

This commit is contained in:
fr33domlover 2016-02-02 12:31:36 +00:00
parent c8e5de868c
commit 6440550f48
2 changed files with 40 additions and 1 deletions

View file

@ -36,6 +36,7 @@ module Vervis
, Project (..)
, Vervis ()
, runVervis
, saveState
, Server (..)--TODO remove this type later...
, subdirs
, lastChange
@ -46,7 +47,7 @@ where
import Control.Monad (join)
import Control.Monad.Fix (MonadFix)
import Control.Monad.IO.Class (MonadIO)
import Control.Monad.IO.Class
import Control.Monad.Trans.RWS (RWST (..))
import Data.Aeson
import Data.CaseInsensitive (CI)
@ -61,15 +62,43 @@ import Data.Hourglass
import Data.JsonState
import Data.Maybe (fromMaybe, mapMaybe)
import Data.Text (Text)
import Data.Time.Units
import GHC.Generics
import System.Directory.Tree hiding (name, file, err)
import System.FilePath ((</>))
import System.Hourglass (dateCurrent)
import qualified Control.Monad.Trans.RWS as RWS
import qualified Data.CaseInsensitive as CI
import qualified Data.HashMap.Lazy as M
import qualified Data.Text as T
-- | Fetch the value of the environment.
ask :: Vervis (VervisEnv)
ask = Vervis RWS.ask
-- | Retrieve a function of the current environment.
asks :: (VervisEnv -> a) -> Vervis a
asks = Vervis . RWS.asks
-- | Fetch the current value of the state within the monad.
get :: Vervis (VervisState)
get = Vervis RWS.get
-- | Get a specific component of the state, using a projection function
-- supplied.
gets :: (VervisState -> a) -> Vervis a
gets = Vervis . RWS.gets
-- | @'put' s@ sets the state within the monad to @s@.
put :: VervisState -> Vervis ()
put = Vervis . RWS.put
-- | @'modify' f@ is an action that updates the state to the result of
-- applying @f@ to the current state.
modify :: (VervisState -> VervisState) -> Vervis ()
modify = Vervis . RWS.modify
instance (CI.FoldCase a, FromJSON a) => FromJSON (CI a) where
parseJSON v = CI.mk <$> parseJSON v
@ -197,6 +226,7 @@ instance FromJSON Project
data VervisEnv = VervisEnv
{ veName :: Text
, veDir :: FilePath
, veSave :: VervisState -> Vervis ()
}
data VervisState = VervisState
@ -232,13 +262,21 @@ runVervis name file dir comp = do
Left (False, err) -> error $ "Loading JSON state failed: " ++ err
Left (True, err) -> error $ "Parsing JSON state failed: " ++ err
Right vstate -> do
save <- mkSaveState (3 :: Second) file
let venv = VervisEnv
{ veName = name
, veDir = dir
, veSave = liftIO . save
}
(a, _s) <- runVervis' venv vstate comp
return a
saveState :: Vervis ()
saveState = do
save <- asks veSave
vstate <- get
save vstate
data Server = Server
{ serverName :: Text
, serverDir :: FilePath

View file

@ -39,6 +39,7 @@ library
, hashable
, hourglass
, text >=1
, time-units
, transformers >=0.4.2
, unordered-containers >=0.2.5
hs-source-dirs: src