yesod-ip-0.5.1: src/Yesod/Form/Net.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
module Yesod.Form.Net
( ipv4Field
, ipv4RangeField
, macField
, NetFormMessage(..)
, englishNetFormMessage
) where
import Data.Text (Text)
import Net.Types (IPv4, IPv4Range, Mac)
import Yesod.Core
import Yesod.Form.Fields
import Yesod.Form.Types
import qualified Net.IPv4 as IPv4
import qualified Net.Mac as Mac
data NetFormMessage
= MsgInvalidIPv4
| MsgInvalidIPv4Range
| MsgInvalidMac
englishNetFormMessage :: NetFormMessage -> Text
englishNetFormMessage x = case x of
MsgInvalidIPv4 -> "Please enter an IPv4 address in dot decimal notation."
MsgInvalidIPv4Range -> "Please enter an IPv4 range in CIDR notation."
MsgInvalidMac -> "Please enter a valid MAC address."
ipv4Field ::
( Monad m
, RenderMessage (HandlerSite m) NetFormMessage
, RenderMessage (HandlerSite m) FormMessage
) => Field m IPv4
ipv4Field = mapField IPv4.encode from textField
where
from t = case IPv4.decode t of
Nothing -> Left (SomeMessage MsgInvalidIPv4)
Just ipv4 -> Right ipv4
ipv4RangeField ::
( Monad m
, RenderMessage (HandlerSite m) NetFormMessage
, RenderMessage (HandlerSite m) FormMessage
) => Field m IPv4Range
ipv4RangeField = mapField IPv4.encodeRange from textField
where
from t = case IPv4.decodeRange t of
Nothing -> Left (SomeMessage MsgInvalidIPv4Range)
Just r -> Right r
macField :: ( Monad m
, RenderMessage (HandlerSite m) NetFormMessage
, RenderMessage (HandlerSite m) FormMessage
) => Field m Mac
macField = mapField Mac.encode from textField
where
from t = case Mac.decode t of
Nothing -> Left (SomeMessage MsgInvalidMac)
Just mac -> Right mac
mapField :: Monad m => (a -> b) -> (b -> Either (SomeMessage (HandlerSite m)) a) -> Field m b -> Field m a
mapField fwd bck (Field parse view enctype) = Field
(\ts fis -> do
eres <- parse ts fis
return $ eres >>= (\mb -> case mb of
Just b -> Just <$> bck b
Nothing -> Right Nothing)
)
(\a b c d e -> view a b c (fmap fwd d) e)
enctype