Update part10

This commit is contained in:
Richard Feldman
2018-05-05 05:41:45 -04:00
parent e6ec9a6584
commit af4ad8e46b
20 changed files with 132 additions and 73 deletions

View File

@@ -1,5 +1,5 @@
{
"rtfeldman/elm-validate": "2.0.0",
"rtfeldman/elm-validate": "3.0.0",
"rtfeldman/selectlist": "1.0.0",
"elm-lang/navigation": "2.1.0",
"elm-lang/virtual-dom": "2.0.4",

View File

@@ -16,7 +16,7 @@ type alias Model =
{ name : String, email : String, age : String, selections : List String }
modelValidator : Validator Model String
modelValidator : Validator String Model
modelValidator =
Validate.all
[ ifBlank .name "Please enter a name."
@@ -28,8 +28,7 @@ modelValidator =
validate modelValidator
{ name = "Sam", email = "", age = "abc", selections = [ "cats" ] }
== [ "Please enter an email address.", "Age must be a whole number." ]
--> True
--> [ "Please enter an email address.", "Age must be a whole number." ]
```
You can represent your errors however you like. One nice approach is to use
@@ -56,8 +55,7 @@ type alias Model =
validate modelValidator
{ name = "Sam", email = "", age = "abc", selections = [ "cats" ] }
== [ ( Email, "Please enter an email address." )
, ( Age, "Age must be a whole number." )
]
--> True
--> [ ( Email, "Please enter an email address." )
--> , ( Age, "Age must be a whole number." )
--> ]
```

View File

@@ -1,5 +1,5 @@
{
"version": "2.0.0",
"version": "3.0.0",
"summary": "Convenience functions for validating data.",
"repository": "https://github.com/rtfeldman/elm-validate.git",
"license": "BSD-3-Clause",

View File

@@ -4,6 +4,7 @@ module Validate
, all
, any
, firstError
, fromErrors
, ifBlank
, ifEmptyDict
, ifEmptyList
@@ -21,7 +22,7 @@ module Validate
{-| Convenience functions for validating data.
import Validate exposing (ifBlank, ifNotInt, validate)
import Validate exposing (Validator, ifBlank, ifNotInt, validate)
type Field = Name | Email | Age
@@ -49,7 +50,7 @@ module Validate
# Creating validators
@docs ifBlank, ifNotInt, ifEmptyList, ifEmptyDict, ifEmptySet, ifNothing, ifInvalidEmail, ifTrue, ifFalse
@docs ifBlank, ifNotInt, ifEmptyList, ifEmptyDict, ifEmptySet, ifNothing, ifInvalidEmail, ifTrue, ifFalse, fromErrors
# Combining validators
@@ -86,7 +87,7 @@ type Validator error subject
{-| Return an error if the given predicate returns `True` for the given
subject.
import Validate exposing (ifBlank, ifNotInt, validate)
import Validate exposing (Validator, ifBlank, ifNotInt, validate)
type Field = Name | Email | Age
@@ -116,7 +117,7 @@ validate (Validator getErrors) subject =
{-| Return an error if the given `String` is empty, or if it contains only
whitespace characters.
import Validate exposing (ifBlank, ifNotInt)
import Validate exposing (Validator, ifBlank)
modelValidator : Validator Model String
modelValidator =
@@ -132,10 +133,31 @@ ifBlank subjectToString error =
{-| Return an error if the given `String` cannot be parsed as an `Int`.
import Validate exposing (Validator, ifNotInt)
modelValidator : Validator Model String
modelValidator =
Validate.all
[ ifNotInt .followers (\_ -> "Please enter a whole number for followers.")
, ifNotInt .stars (\stars -> "Stars was \"" ++ stars ++ "\", but it needs to be a whole number.")"
]
-}
ifNotInt : (subject -> String) -> error -> Validator error subject
ifNotInt subjectToString error =
ifFalse (\subject -> isInt (subjectToString subject)) error
ifNotInt : (subject -> String) -> (String -> error) -> Validator error subject
ifNotInt subjectToString errorFromString =
let
getErrors subject =
let
str =
subjectToString subject
in
if isInt str then
[]
else
[ errorFromString str ]
in
Validator getErrors
{-| Return an error if a `List` is empty.
@@ -167,16 +189,65 @@ ifNothing subjectToMaybe error =
{-| Return an error if an email address is malformed.
import Validate exposing (Validator, ifBlank, ifNotInt)
modelValidator : Validator Model String
modelValidator =
Validate.all
[ ifInvalidEmail .primaryEmail (\_ -> "Please enter a valid primary email address.")
, ifInvalidEmail .superSecretEmail (\email -> "Unfortunately, \"" ++ email ++ "\" is not a valid Super Secret Email Address.")
]
-}
ifInvalidEmail : (subject -> String) -> error -> Validator error subject
ifInvalidEmail subjectToEmail error =
ifFalse (\subject -> isValidEmail (subjectToEmail subject)) error
ifInvalidEmail : (subject -> String) -> (String -> error) -> Validator error subject
ifInvalidEmail subjectToEmail errorFromEmail =
let
getErrors subject =
let
email =
subjectToEmail subject
in
if isValidEmail email then
[]
else
[ errorFromEmail email ]
in
Validator getErrors
{-| Create a custom validator, by providing a function that returns a list of
errors given a subject.
import Validate exposing (Validator, fromErrors)
modelValidator : Validator Model String
modelValidator =
fromErrors modelToErrors
modelToErrors : Model -> List String
modelToErrors model =
let
usernameLength =
String.length model.username
in
if usernameLength < minUsernameChars then
[ "Username not long enough" ]
else if usernameLength > maxUsernameChars then
[ "Username too long" ]
else
[]
-}
fromErrors : (subject -> List error) -> Validator error subject
fromErrors toErrors =
Validator toErrors
{-| Return an error if a predicate returns `True` for the given
subject.
import Validate exposing (ifTrue)
import Validate exposing (Validator, ifTrue)
modelValidator : Validator Model String
modelValidator =
@@ -199,7 +270,7 @@ ifTrue test error =
{-| Return an error if a predicate returns `False` for the given
subject.
import Validate exposing (ifFalse)
import Validate exposing (Validator, ifFalse)
modelValidator : Validator Model String
modelValidator =
@@ -226,7 +297,7 @@ ifFalse test error =
{-| Run each of the given validators, in order, and return their concatenated
error lists.
import Validate exposing (ifBlank, ifNotInt)
import Validate exposing (Validator, ifBlank, ifNotInt)
modelValidator : Validator Model String
modelValidator =
@@ -253,7 +324,7 @@ all validators =
{-| Run each of the given validators, in order, stopping after the first error
and returning it. If no errors are encountered, return `Nothing`.
import Validate exposing (ifBlank, ifInvalidEmail, ifNotInt)
import Validate exposing (Validator, ifBlank, ifInvalidEmail, ifNotInt)
type alias Model =
@@ -337,7 +408,7 @@ isBlank str =
Regex.contains lacksNonWhitespaceChars str
{-| Returns `True` if the email is malformed.
{-| Returns `True` if the email is valid.
[`ifInvalidEmail`](#ifInvalidEmail) uses this under the hood.