git.iko.soy/typeable/credit-card
on master help sign in
Merge pull request #2 from typeable/add-store-and-flags
commit4c245c0e4e446b0db65030826d2f1df058265f71 authorVille Tirronen <ville.tirronen@jyu.fi> dateThu 4 Aug 2022, 09:29 (4 years ago) parent36b891635bbf59
2 files changed+48−2
credit-card.cabal+16−1 src/Data/CreditCard.hs+32−1
credit-card.cabal+16−1
@@ -5,6 +5,16 @@ synopsis: Credit card validation
55license-file: LICENSE
66build-type: Simple
77
8+Flag store
9+ Description: Enable Data.Store serialization support
10+ Default: False
11+ Manual: False
12+
13+Flag postgres
14+ Description: Enable Postgresql support
15+ Default: True
16+ Manual: False
17+
818library
919 hs-source-dirs: src
1020 ghc-options: -Wall
@@ -19,8 +29,13 @@ library
1929 , openapi3
2030 , text
2131 , time
22− if !impl(ghcjs)
32+ if !impl(ghcjs) && flag(postgres)
2333 build-depends: postgresql-simple
34+ if flag(store)
35+ build-depends:
36+ store
37+ cpp-options: -DUSE_STORE
38+ default-extensions: DeriveAnyClass
2439 default-language: Haskell2010
2540 default-extensions: GeneralizedNewtypeDeriving
2641 , DeriveGeneric
src/Data/CreditCard.hs+32−1
@@ -72,19 +72,29 @@ import Data.Text (Text)
7272import qualified Data.Text as T
7373import Data.Time
7474#ifndef ghcjs_HOST_OS
75+#ifdef USE_POSTGRES
7576import Database.PostgreSQL.Simple.FromField
7677import Database.PostgreSQL.Simple.ToField
7778#endif
79+#endif
7880import Formatting as F
7981import GHC.Generics (Generic)
8082import Numeric.Natural
8183import Test.QuickCheck.Arbitrary
8284import Test.QuickCheck.Gen
85+#ifdef USE_STORE
86+import qualified Data.Store
87+import qualified Data.Store.Internal
88+#endif
8389
8490
8591newtype ZipCode = ZipCode
8692 { unZipCode :: Text }
87− deriving (Show, Eq, Generic, ToJSON, FromJSON, ToSchema)
93+ deriving stock (Show, Eq, Generic)
94+ deriving newtype (ToJSON, FromJSON, ToSchema)
95+#ifdef USE_STORE
96+ deriving anyclass Data.Store.Store
97+#endif
8898
8999makePrisms ''ZipCode
90100
@@ -94,6 +104,9 @@ data CreditCardDate = CreditCardDate
94104 , _ccdMonth :: Int
95105 -- ^ Month number in range [1..12]
96106 } deriving (Eq, Show, Generic)
107+#ifdef USE_STORE
108+ deriving anyclass Data.Store.Store
109+#endif
97110
98111instance ToSchema CreditCardDate where
99112 declareNamedSchema _ = declareNamedSchema (Proxy @Text)
@@ -153,6 +166,7 @@ newtype CreditCardNumber = CreditCardNumber
153166 { unCreditCardNumber :: NonEmpty Digit }
154167 deriving (Eq, Generic)
155168
169+
156170instance ToSchema CreditCardNumber where
157171 declareNamedSchema _ = declareNamedSchema (Proxy @Text)
158172
@@ -167,6 +181,15 @@ parseCardNumber = preview (_DigitsText . from _CreditCardNumber)
167181apiCreditCardNumber :: Prism' Text CreditCardNumber
168182apiCreditCardNumber = prism' renderCardNumber parseCardNumber
169183
184+#ifdef USE_STORE
185+instance Data.Store.Store CreditCardNumber where
186+ poke = Data.Store.poke . renderCardNumber
187+ peek = do
188+ maybeNumber <- parseCardNumber <$> Data.Store.peek
189+ maybe (fail "invalid stored credit card number") pure maybeNumber
190+ size = Data.Store.VarSize (Data.Store.Internal.getSize . renderCardNumber)
191+#endif
192+
170193instance FromJSON CreditCardNumber where
171194 parseJSON = withText "CreditCardNumber" $ \s ->
172195 case parseCardNumber s of
@@ -208,9 +231,11 @@ panToBogusNumber (CreditCardPAN txt) =
208231 check = fromMaybe (error "Failed to parse PAN back to digits")
209232
210233#ifndef ghcjs_HOST_OS
234+#ifdef USE_CASSAVA
211235deriving instance FromField CreditCardPAN
212236deriving instance ToField CreditCardPAN
213237#endif
238+#endif
214239
215240mkCreditCardPan :: CreditCardNumber -> CreditCardPAN
216241mkCreditCardPan n = CreditCardPAN $ firstDigits <> stars <> lastDigits
@@ -224,6 +249,9 @@ newtype CreditCardSecurity = CreditCardSecurity
224249 { unCCSecurity :: Text }
225250 deriving (Eq, Ord, Generic)
226251 deriving newtype (ToJSON, FromJSON, ToSchema)
252+#ifdef USE_STORE
253+ deriving anyclass Data.Store.Store
254+#endif
227255
228256instance Arbitrary CreditCardSecurity where
229257 arbitrary = CreditCardSecurity . T.pack . concatMap (show :: Int -> String)
@@ -254,6 +282,9 @@ data CreditCard = CreditCard
254282 , _ccExpirationDate :: !(CreditCardDate)
255283 , _ccZipCode :: !(Maybe ZipCode)
256284 } deriving (Eq, Generic, Show)
285+#ifdef USE_STORE
286+ deriving anyclass Data.Store.Store
287+#endif
257288
258289instance ToSchema CreditCard where
259290 declareNamedSchema p = genericDeclareNamedSchema opts p