duckling/Duckling/CreditCardNumber/Rules.hs
Julien Odent bf89e34365 Relicense to BSD3
Reviewed By: JoelMarcey

Differential Revision: D15439223

fbshipit-source-id: c5af3cb06318748142fe503945b38beffadfc28a
2019-05-22 10:46:39 -07:00

73 lines
1.9 KiB
Haskell

-- Copyright (c) 2016-present, Facebook, Inc.
-- All rights reserved.
--
-- This source code is licensed under the BSD-style license found in the
-- LICENSE file in the root directory of this source tree.
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
module Duckling.CreditCardNumber.Rules
( rules ) where
import Prelude
import Data.String
import Data.Text (Text)
import Data.Bool
import qualified Data.Text as T
import qualified Data.Char as C
import Duckling.Dimensions.Types
import Duckling.CreditCardNumber.Helpers
import qualified Duckling.CreditCardNumber.Types as TCreditCardNumber
import Duckling.Regex.Types
import Duckling.Types
creditCards :: [(Text, PatternItem, TCreditCardNumber.Issuer)]
creditCards =
[ ( "visa credit card number"
, regex visaCreditCardNumberRegex
, TCreditCardNumber.Visa
)
, ( "amex card number"
, regex amexCreditCardNumberRegex
, TCreditCardNumber.Amex
)
, ( "discover card number"
, regex discoverCreditCardNumberRegex
, TCreditCardNumber.Discover
)
, ( "mastercard card number"
, regex mastercardCreditCardNumberRegex
, TCreditCardNumber.Mastercard
)
, ( "diner club card number"
, regex dinerClubCreditCardNumberRegex
, TCreditCardNumber.DinerClub
)
, ( "credit card number"
, regex otherCreditCardNumberRegex
, TCreditCardNumber.Other
)
]
rules :: [Rule]
rules = map go creditCards
where
go :: (Text, PatternItem, TCreditCardNumber.Issuer) -> Rule
go (name, regexPattern, i) = Rule
{ name = name
, pattern = [ regexPattern ]
, prod = \case
(Token RegexMatch (GroupMatch (ccNumGroup:_)):_) ->
bool
Nothing
(Just $ Token CreditCardNumber $ creditCard ccNum i)
(isValidCreditCardNumber ccNum)
where
ccNum = T.filter C.isDigit ccNumGroup
_ -> Nothing
}