diff --git a/hikaru.cabal b/hikaru.cabal index 8559e1f7c6924efd3874485589cf9081a03749cf..a306e4f72f8972f54af38e3efd38e8e6424d5cbc 100644 --- a/hikaru.cabal +++ b/hikaru.cabal @@ -55,7 +55,7 @@ library DisambiguateRecordFields NoFieldSelectors OverloadedRecordDot ghc-options: - -Wall -Wcompat -Wincomplete-uni-patterns + -Wall -Wcompat -Wincomplete-uni-patterns -Wpartial-fields -Wincomplete-record-updates -Widentities -Wredundant-constraints -Wunused-packages @@ -69,6 +69,7 @@ library containers >=0.6, cookie >=0.4, foreign-store >=0.2, + HsOpenSSL >=0.11, http-types >=0.12, hvect >=0.4, lucid >=2.9, @@ -82,8 +83,7 @@ library wai >=3.2, wai-extra >=3.0, wai-websockets >=3.0, - websockets >=0.12, - HsOpenSSL >=0.11 + websockets >=0.12 test-suite spec type: exitcode-stdio-1.0 @@ -111,7 +111,7 @@ test-suite spec DisambiguateRecordFields NoFieldSelectors OverloadedRecordDot ghc-options: - -Wall -Wcompat -Wincomplete-uni-patterns + -Wall -Wcompat -Wincomplete-uni-patterns -Wpartial-fields -Wincomplete-record-updates -Widentities -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N @@ -125,6 +125,8 @@ test-suite spec containers >=0.6, cookie >=0.4, foreign-store >=0.2, + hikaru, + hspec, http-types >=0.12, hvect >=0.4, lucid >=2.9, @@ -138,6 +140,4 @@ test-suite spec wai >=3.2, wai-extra >=3.0, wai-websockets >=3.0, - websockets >=0.12, - hikaru, - hspec + websockets >=0.12 diff --git a/lib/Hikaru/CSRF.hs b/lib/Hikaru/CSRF.hs index 0d1f2eccb43e9966034de75a13faaa2aa86ce87c..d99a1b8fed7ce55962a6ea3e8aaa8223f903fbd5 100644 --- a/lib/Hikaru/CSRF.hs +++ b/lib/Hikaru/CSRF.hs @@ -18,17 +18,15 @@ where import Praha import Praha.Config.Environment - import System.IO.Unsafe + import Hikaru.Action + import Data.Text (splitOn) + import Data.Time.Clock.POSIX (getPOSIXTime) import OpenSSL - import OpenSSL.Random import OpenSSL.EVP.Base64 import OpenSSL.EVP.Digest - - import Data.Text (splitOn) - import Data.Time.Clock.POSIX (getPOSIXTime) - - import Hikaru.Action + import OpenSSL.Random + import System.IO.Unsafe sha256 :: Digest diff --git a/lib/Hikaru/Dispatch.hs b/lib/Hikaru/Dispatch.hs index f19237e4d4237795beab2b98a3661e5a38d68549..1052d94175f289ffdf72287b57ff075eb5bf85e7 100644 --- a/lib/Hikaru/Dispatch.hs +++ b/lib/Hikaru/Dispatch.hs @@ -34,12 +34,11 @@ where import Hikaru.Action (abortMiddleware) import Hikaru.Route - import Network.HTTP.Types.Status + import Data.List (sortOn, reverse, lookup) import Network.HTTP.Types.Header + import Network.HTTP.Types.Status import Network.Wai - import Data.List (reverse, lookup, sortOn) - -- | -- Since routes do not share a common type (due to their captured parameters diff --git a/lib/Hikaru/Link.hs b/lib/Hikaru/Link.hs index eae4ab15f9ce71737273f849c27e31bb2cc52bec..5de3cb1759041f41504a42b95b47572f35fea345 100644 --- a/lib/Hikaru/Link.hs +++ b/lib/Hikaru/Link.hs @@ -24,15 +24,12 @@ where import Hikaru.Route import Hikaru.Types - import Network.HTTP.Types.URI - import Data.Binary.Builder + import Data.HVect import Data.List (map, filter) import Data.Maybe (isJust) - - import Data.HVect - import Lucid + import Network.HTTP.Types.URI -- | diff --git a/lib/Hikaru/Media.hs b/lib/Hikaru/Media.hs index b8d3620cb67b55ba9538186da20b3f5c55613921..63901d3ac1c0186c57352c741ced8dc9f6b89818 100644 --- a/lib/Hikaru/Media.hs +++ b/lib/Hikaru/Media.hs @@ -27,10 +27,9 @@ module Hikaru.Media where import Praha - import Data.List (filter, lookup, sortOn) - - import Data.Char import Data.Attoparsec.Text + import Data.Char + import Data.List (filter, lookup, sortOn) -- | diff --git a/lib/Hikaru/Route.hs b/lib/Hikaru/Route.hs index cfd6b8d6455316a60be079a24b881e2375f61bff..9a74029fb795360d764788eff7cb510c8d873c57 100644 --- a/lib/Hikaru/Route.hs +++ b/lib/Hikaru/Route.hs @@ -55,18 +55,17 @@ module Hikaru.Route ) where import Praha hiding (curry) + import Hikaru.Media import Hikaru.Types + import Data.HVect hiding (reverse) + import Data.List (nub, reverse, lookup) + import Data.Typeable (TypeRep, typeRep) import Network.HTTP.Types.Header import Network.Wai import Network.Wai.Handler.WebSockets - import Data.List (reverse, nub, lookup) - import Data.Typeable (TypeRep, typeRep) - - import Data.HVect hiding (reverse) - -- | -- Route combines path description with a handler that gets saturated diff --git a/lib/Hikaru/Widget.hs b/lib/Hikaru/Widget.hs index d3ac9d9bd81d3398a39be837f7fa3450ff7494e8..d2b06f88b05b87f87c0bcbcb6f91bea1c68ac308 100644 --- a/lib/Hikaru/Widget.hs +++ b/lib/Hikaru/Widget.hs @@ -54,6 +54,7 @@ module Hikaru.Widget -- * Building Widgets , WidgetT + , getPrefix , getArguments , getArgumentMaybe , getArgumentDefault @@ -64,11 +65,12 @@ module Hikaru.Widget ) where import Praha - import Data.Text (stripPrefix) + import Data.List (lookup, filter) - import Lucid - import Hikaru.Types + import Data.Text (stripPrefix) import Hikaru.Action + import Hikaru.Types + import Lucid -- | @@ -161,6 +163,15 @@ where } + -- | + -- Obtain widget prefix as text. + -- + getPrefix :: (Monad m) => WidgetT m Text + getPrefix = WidgetT do + Env{prefix} <- ask + return prefix + + -- | -- Obtain all widget arguments as pieces of text. -- diff --git a/test/Hikaru/Demo.hs b/test/Hikaru/Demo.hs index 2def3760b77acc88f1a340c9a80e034923a6ff03..d5c006dbe8e91e3f4f9dd2c5bbd1b8c461ed2c0a 100644 --- a/test/Hikaru/Demo.hs +++ b/test/Hikaru/Demo.hs @@ -16,13 +16,12 @@ where import Hikaru - import UnliftIO.MVar import Data.Aeson (Value) + import Data.Text (unlines) import Lucid import Network.HTTP.Types.Header import Network.HTTP.Types.Status - import Network.Wai - import Data.Text (unlines) + import UnliftIO.MVar -- Action ------------------------------------------------------------------ @@ -39,10 +38,10 @@ where deriving (Functor, Applicative, Monad, MonadIO) instance MonadAction Action where - getActionEnv = Action (demoActionEnv <$> ask) + getActionEnv = Action ((.demoActionEnv) <$> ask) instance MonadModel Action where - getModelEnv = Action (demoModelEnv <$> ask) + getModelEnv = Action ((.demoModelEnv) <$> ask) data DemoEnv @@ -74,7 +73,7 @@ where countVisitor :: (MonadModel m) => m Word countVisitor = do - counter <- modelCounter <$> getModelEnv + counter <- (.modelCounter) <$> getModelEnv liftIO do modifyMVar_ counter (return . (+ 1)) readMVar counter @@ -82,7 +81,7 @@ where addCase :: (MonadModel m) => AddCase -> m Case addCase AddCase{..} = do - nextId <- liftIO . readMVar . modelCounter =<< getModelEnv + nextId <- liftIO . readMVar . (.modelCounter) =<< getModelEnv let case' = Case { caseId = nextId , caseName = acName @@ -91,7 +90,7 @@ where , caseActive = acActive } - cases <- modelCases <$> getModelEnv + cases <- (.modelCases) <$> getModelEnv liftIO do modifyMVar_ cases (return . (<> [case'])) @@ -110,7 +109,7 @@ where runAction :: ModelEnv -> Action () -> Application runAction me act = do respond \ae -> do - runReaderT (unAction act) (DemoEnv ae me) + runReaderT ((.unAction) act) (DemoEnv ae me) makeApplication :: ModelEnv -> Application @@ -215,7 +214,7 @@ where handle = do setHeader hCacheControl "no-store" - cases <- liftIO . readMVar . modelCases =<< getModelEnv + cases <- liftIO . readMVar . (.modelCases) =<< getModelEnv sendHTML do h1_ "Cases" @@ -361,18 +360,18 @@ where (\(x1, x2) x3 x4 -> AddCase x1 x2 x3 x4) <$> element MsgCaseName do (,) - <$> input "name" acName do + <$> input "name" (.acName) do return () - <*> input "recno" acRecNo do + <*> input "recno" (.acRecNo) do return () <*> element MsgCaseMode do - select "mode" acMode do + select "mode" (.acMode) do return () <*> element MsgCaseEnabled do - select "active" acActive do + select "active" (.acActive) do hint RenderExpanded