forma alternatives and similar packages
Based on the "Web" category.
Alternatively, view forma alternatives based on common mentions on social networks and blogs.
-
haskell-bitmex-rest
swagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition. -
swagger-petstore
swagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition. -
servant
Main repository for the servant libraries — DSL for describing, serving, querying, mocking, documenting web applications and more! -
neuron
Future-proof note-taking and publishing based on Zettelkasten (superseded by Emanote: https://github.com/srid/emanote) -
tagsoup
Haskell library for parsing and extracting information from (possibly malformed) HTML/XML documents -
keera-hails-reactive-htmldom
Keera Hails: Haskell on Rails - Reactive Programming Framework for Interactive Haskell applications -
ghcjs-base
base library for GHCJS for JavaScript interaction and marshalling, used by higher level libraries like JSC -
ghcjs-dom
Make Document Object Model (DOM) apps that run in any browser and natively using WebKitGtk
WorkOS - The modern identity platform for B2B SaaS
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of forma or a related project?
README
Forma
This library provides a tool for validation of forms in the JSON format. Sending forms in the JSON format via an AJAX request instead of traditional submitting of forms has a number of advantages:
Smoother user experience: no need to reload the whole page.
Form rendering is separated and lives only in GET handler, POST (or whatever method you deem appropriate for your use case) handler only handles validation and effects that form submission should initiate.
You get a chance to organize form input the way you want.
The task of validation of a form in the JSON format may seem simple, but it's not trivial to get it right. The library allows you to:
Define a form parser using type-safe applicative notation with field labels stored on the type label which guards against typos and will force all your field labels to be always up to date.
Parse JSON
Value
according to the definition of form you created.Stop parsing immediately if a form is malformed and cannot be processed.
Validate forms using any number of composable checkers that you write for your specific problem domain. Once you have a vocabulary of checkers, creation of new forms is just a matter of combining them.
Collect validation errors from multiple branches of parsing (a branch per form field) in parallel, so that validation errors in one branch do not prevent us from collecting validation errors from other branches. This allows for better user experience as the user can see all validation errors at the same time.
Use
optional
and(<|>)
fromControl.Applicative
in your form definitions instead of ad-hoc helpers.Perform validation using several form fields at once. You choose which “sub-region” of your form a given check will have access to, see
withCheck
.
Example of use
Here is a complete working example:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
import Control.Monad.Except
import Data.Aeson
import Data.Text (Text)
import qualified Data.Text as T
import Web.Forma
type LoginFields = '["username", "password", "remember_me"]
data LoginForm = LoginForm
{ loginUsername :: Text,
loginPassword :: Text,
loginRememberMe :: Bool
}
deriving (Show)
loginForm :: Monad m => FormParser LoginFields Text m LoginForm
loginForm =
LoginForm
<$> field #username notEmpty
<*> field #password notEmpty
<*> field' #remember_me
notEmpty :: Monad m => Text -> ExceptT Text m Text
notEmpty txt =
if T.null txt
then throwError "This field cannot be empty."
else return txt
myInput :: Value
myInput =
object
[ "username" .= ("Bob" :: Text),
"password" .= ("123" :: Text),
"remember_me" .= True
]
main :: IO ()
main = runForm loginForm myInput >>= print
You may want to play with it a bit before writing serious code.
Contribution
Issues, bugs, and questions may be reported in the GitHub issue tracker for this project.
Pull requests are also welcome.
License
Copyright © 2017–present Mark Karpov
Distributed under BSD 3 clause license.
*Note that all licence references and agreements mentioned in the forma README section above
are relevant to that project's source code only.