git.iko.soy/typeable/http-api-data
on master help sign in
Add LenientData
a5f4e27Oleg Grenrus
src/Web/HttpApiData.hs+3
@@ -35,6 +35,9 @@ module Web.HttpApiData (
35 parseBoundedEnumOfI,
35 parseBoundedEnumOfI,
36 parseBoundedTextData,
36 parseBoundedTextData,
37
37
38+ -- * Lenient data
39+ LenientData (..),
40+
38 -- * Other helpers
41 -- * Other helpers
39 showTextData,
42 showTextData,
40 readTextData,
43 readTextData,
src/Web/Internal/HttpApiData.hs+18
@@ -1,5 +1,9 @@
1{-# LANGUAGE CPP #-}
1{-# LANGUAGE CPP #-}
2{-# LANGUAGE DefaultSignatures #-}
2{-# LANGUAGE DefaultSignatures #-}
3+{-# LANGUAGE DeriveDataTypeable #-}
4+{-# LANGUAGE DeriveFunctor #-}
5+{-# LANGUAGE DeriveFoldable #-}
6+{-# LANGUAGE DeriveTraversable #-}
3{-# LANGUAGE FlexibleInstances #-}
7{-# LANGUAGE FlexibleInstances #-}
4{-# LANGUAGE OverloadedStrings #-}
8{-# LANGUAGE OverloadedStrings #-}
5{-# LANGUAGE ScopedTypeVariables #-}
9{-# LANGUAGE ScopedTypeVariables #-}
@@ -11,6 +15,7 @@ module Web.Internal.HttpApiData where
11
15
12#if __GLASGOW_HASKELL__ < 710
16#if __GLASGOW_HASKELL__ < 710
13import Control.Applicative
17import Control.Applicative
18+import Data.Foldable (Foldable)
14import Data.Traversable (Traversable(traverse))
19import Data.Traversable (Traversable(traverse))
15#endif
20#endif
16
21
@@ -48,6 +53,9 @@ import TextShow (TextShow, showt)
48
53
49import qualified Data.UUID.Types as UUID
54import qualified Data.UUID.Types as UUID
50
55
56+import Data.Typeable (Typeable)
57+import Data.Data (Data)
58+
51-- $setup
59-- $setup
52-- >>> data BasicAuthToken = BasicAuthToken Text deriving (Show)
60-- >>> data BasicAuthToken = BasicAuthToken Text deriving (Show)
53-- >>> instance FromHttpApiData BasicAuthToken where parseHeader h = BasicAuthToken <$> parseHeaderWithPrefix "Basic " h; parseQueryParam p = BasicAuthToken <$> parseQueryParam p
61-- >>> instance FromHttpApiData BasicAuthToken where parseHeader h = BasicAuthToken <$> parseHeaderWithPrefix "Basic " h; parseQueryParam p = BasicAuthToken <$> parseQueryParam p
@@ -586,3 +594,13 @@ instance ToHttpApiData UUID.UUID where
586instance FromHttpApiData UUID.UUID where
594instance FromHttpApiData UUID.UUID where
587 parseUrlPiece = maybe (Left "invalid UUID") Right . UUID.fromText
595 parseUrlPiece = maybe (Left "invalid UUID") Right . UUID.fromText
588 parseHeader = maybe (Left "invalid UUID") Right . UUID.fromASCIIBytes
596 parseHeader = maybe (Left "invalid UUID") Right . UUID.fromASCIIBytes
597+
598+
599+-- | Lenient parameters. 'FromHttpApiData' combinators always return `Right`.
600+newtype LenientData a = LenientData { getLenientData :: Either Text a }
601+ deriving (Eq, Ord, Show, Read, Typeable, Data, Functor, Foldable, Traversable)
602+
603+instance FromHttpApiData a => FromHttpApiData (LenientData a) where
604+ parseUrlPiece = Right . LenientData . parseUrlPiece
605+ parseHeader = Right . LenientData . parseHeader
606+ parseQueryParam = Right . LenientData . parseQueryParam