mirror of
https://github.com/facebook/duckling.git
synced 2025-01-06 04:53:13 +03:00
bf89e34365
Reviewed By: JoelMarcey Differential Revision: D15439223 fbshipit-source-id: c5af3cb06318748142fe503945b38beffadfc28a
73 lines
1.9 KiB
Haskell
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
|
|
}
|