feat(users/Profpatsch): init HtmxExperiment
I’m playing around with htmx (server-side html snippet rendering), this is a simple registration form and some form validation that happens in-place. Change-Id: I29602a7881e66c3e4d1cc0ba8027f98e0bd3461c Reviewed-on: https://cl.tvl.fyi/c/depot/+/8660 Tested-by: BuildkiteCI Reviewed-by: Profpatsch <mail@profpatsch.de> Autosubmit: Profpatsch <mail@profpatsch.de>
This commit is contained in:
parent
6a15e8e71a
commit
ee21f725a3
9 changed files with 1104 additions and 0 deletions
40
users/Profpatsch/htmx-experiment/src/ValidationParseT.hs
Normal file
40
users/Profpatsch/htmx-experiment/src/ValidationParseT.hs
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
module ValidationParseT where
|
||||
|
||||
import Control.Monad.Logger (MonadLogger)
|
||||
import Control.Selective (Selective)
|
||||
import Data.Error.Tree
|
||||
import Data.Functor.Compose (Compose (..))
|
||||
import PossehlAnalyticsPrelude
|
||||
import ServerErrors
|
||||
|
||||
-- | A simple way to create an Applicative parser that parses from some environment.
|
||||
--
|
||||
-- Use with DerivingVia. Grep codebase for examples.
|
||||
newtype ValidationParseT env m a = ValidationParseT {unValidationParseT :: env -> m (Validation (NonEmpty Error) a)}
|
||||
deriving
|
||||
(Functor, Applicative, Selective)
|
||||
via ( Compose
|
||||
((->) env)
|
||||
(Compose m (Validation (NonEmpty Error)))
|
||||
)
|
||||
|
||||
-- | Helper that runs the given parser and throws a user error if the parsing failed.
|
||||
runValidationParseTOrUserError ::
|
||||
forall validationParseT env m a.
|
||||
( Coercible validationParseT (ValidationParseT env m a),
|
||||
MonadLogger m,
|
||||
MonadThrow m
|
||||
) =>
|
||||
-- | toplevel error message to throw if the parsing fails
|
||||
Error ->
|
||||
-- | The parser which should be run
|
||||
validationParseT ->
|
||||
-- | input to the parser
|
||||
env ->
|
||||
m a
|
||||
{-# INLINE runValidationParseTOrUserError #-}
|
||||
runValidationParseTOrUserError contextError parser env =
|
||||
(coerce @_ @(ValidationParseT _ _ _) parser).unValidationParseT env
|
||||
>>= \case
|
||||
Failure errs -> throwUserErrorTree (errorTree contextError errs)
|
||||
Success a -> pure a
|
||||
Loading…
Add table
Add a link
Reference in a new issue