{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ >= 902
{-# LANGUAGE FieldSelectors #-}
#else
{-# OPTIONS_GHC -Wno-name-shadowing #-}
#endif
-- | Data fields of t'PhoneNumber' objects.
module Data.PhoneNumber.Number
  ( PhoneNumber
  , pattern PhoneNumber
  , extension
  , rawInput
  , preferredDomesticCarrierCode
  , nationalNumber
  , countryCode
  , italianLeadingZero
  , countryCodeSource
  , numberOfLeadingZeros
  , CountryCode(..)
  , CountryCodeSource(..)
  ) where

import Data.ByteString (ByteString)
import Data.PhoneNumber.Internal.Number hiding
  ( pattern PhoneNumber
  , extension
  , rawInput
  , preferredDomesticCarrierCode
  , nationalNumber
  , countryCode
  , italianLeadingZero
  , countryCodeSource
  , numberOfLeadingZeros )
import qualified Data.PhoneNumber.Internal.Number as I

-- | A country calling code (International Subscriber Dialing code, ISD code),
-- e.g. @34@ for Spain.
--
-- Contrary to the name, doesn't always correspond to a unique country (e.g.
-- @7@ could be either Russia or Kazakhstan), or a country at all, and instead a
-- non-geographical entity (e.g. @800@ is a Universal International Freephone
-- Service dialing code).
newtype CountryCode = CountryCode Int
  deriving newtype (CountryCode -> CountryCode -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CountryCode -> CountryCode -> Bool
$c/= :: CountryCode -> CountryCode -> Bool
== :: CountryCode -> CountryCode -> Bool
$c== :: CountryCode -> CountryCode -> Bool
Eq, Eq CountryCode
CountryCode -> CountryCode -> Bool
CountryCode -> CountryCode -> Ordering
CountryCode -> CountryCode -> CountryCode
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CountryCode -> CountryCode -> CountryCode
$cmin :: CountryCode -> CountryCode -> CountryCode
max :: CountryCode -> CountryCode -> CountryCode
$cmax :: CountryCode -> CountryCode -> CountryCode
>= :: CountryCode -> CountryCode -> Bool
$c>= :: CountryCode -> CountryCode -> Bool
> :: CountryCode -> CountryCode -> Bool
$c> :: CountryCode -> CountryCode -> Bool
<= :: CountryCode -> CountryCode -> Bool
$c<= :: CountryCode -> CountryCode -> Bool
< :: CountryCode -> CountryCode -> Bool
$c< :: CountryCode -> CountryCode -> Bool
compare :: CountryCode -> CountryCode -> Ordering
$ccompare :: CountryCode -> CountryCode -> Ordering
Ord, Int -> CountryCode -> ShowS
[CountryCode] -> ShowS
CountryCode -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CountryCode] -> ShowS
$cshowList :: [CountryCode] -> ShowS
show :: CountryCode -> String
$cshow :: CountryCode -> String
showsPrec :: Int -> CountryCode -> ShowS
$cshowsPrec :: Int -> CountryCode -> ShowS
Show, Integer -> CountryCode
CountryCode -> CountryCode
CountryCode -> CountryCode -> CountryCode
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
fromInteger :: Integer -> CountryCode
$cfromInteger :: Integer -> CountryCode
signum :: CountryCode -> CountryCode
$csignum :: CountryCode -> CountryCode
abs :: CountryCode -> CountryCode
$cabs :: CountryCode -> CountryCode
negate :: CountryCode -> CountryCode
$cnegate :: CountryCode -> CountryCode
* :: CountryCode -> CountryCode -> CountryCode
$c* :: CountryCode -> CountryCode -> CountryCode
- :: CountryCode -> CountryCode -> CountryCode
$c- :: CountryCode -> CountryCode -> CountryCode
+ :: CountryCode -> CountryCode -> CountryCode
$c+ :: CountryCode -> CountryCode -> CountryCode
Num)

-- | Record pattern synonym for accessing data fields of the underlying C++
-- object. It can be used for record construction, record update, and record
-- pattern match. See t'PhoneNumber'.
pattern PhoneNumber
  :: Maybe ByteString
  -> Maybe ByteString
  -> Maybe ByteString
  -> Word
  -> CountryCode
  -> Maybe Bool
  -> Maybe CountryCodeSource
  -> Maybe Int
  -> PhoneNumber
pattern $bPhoneNumber :: Maybe ByteString
-> Maybe ByteString
-> Maybe ByteString
-> Word
-> CountryCode
-> Maybe Bool
-> Maybe CountryCodeSource
-> Maybe Int
-> PhoneNumber
$mPhoneNumber :: forall {r}.
PhoneNumber
-> (Maybe ByteString
    -> Maybe ByteString
    -> Maybe ByteString
    -> Word
    -> CountryCode
    -> Maybe Bool
    -> Maybe CountryCodeSource
    -> Maybe Int
    -> r)
-> ((# #) -> r)
-> r
PhoneNumber
  { PhoneNumber -> Maybe ByteString
extension
  , PhoneNumber -> Maybe ByteString
rawInput
  , PhoneNumber -> Maybe ByteString
preferredDomesticCarrierCode
  , PhoneNumber -> Word
nationalNumber
  , PhoneNumber -> CountryCode
countryCode
  , PhoneNumber -> Maybe Bool
italianLeadingZero
  , PhoneNumber -> Maybe CountryCodeSource
countryCodeSource
  , PhoneNumber -> Maybe Int
numberOfLeadingZeros
  }
  <- (toCPhoneNumber -> CPhoneNumber
    { I.nationalNumber = fromIntegral -> nationalNumber
    , I.countryCode = fromIntegral -> CountryCode -> countryCode
    , I.numberOfLeadingZeros = fmap fromIntegral -> numberOfLeadingZeros
    , .. })
  where
    PhoneNumber Maybe ByteString
extension Maybe ByteString
rawInput Maybe ByteString
preferredDomesticCarrierCode
      (forall a b. (Integral a, Num b) => a -> b
fromIntegral -> CULong
nationalNumber)
      (CountryCode (forall a b. (Integral a, Num b) => a -> b
fromIntegral -> CInt
countryCode)) Maybe Bool
italianLeadingZero
      Maybe CountryCodeSource
countryCodeSource (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (Integral a, Num b) => a -> b
fromIntegral -> Maybe CInt
numberOfLeadingZeros)
        = CPhoneNumber -> PhoneNumber
fromCPhoneNumber forall a b. (a -> b) -> a -> b
$ CPhoneNumber{Maybe Bool
Maybe CInt
Maybe ByteString
Maybe CountryCodeSource
CULong
CInt
numberOfLeadingZeros :: Maybe CInt
countryCodeSource :: Maybe CountryCodeSource
italianLeadingZero :: Maybe Bool
countryCode :: CInt
nationalNumber :: CULong
preferredDomesticCarrierCode :: Maybe ByteString
rawInput :: Maybe ByteString
extension :: Maybe ByteString
$sel:numberOfLeadingZeros:CPhoneNumber :: Maybe CInt
$sel:countryCodeSource:CPhoneNumber :: Maybe CountryCodeSource
$sel:italianLeadingZero:CPhoneNumber :: Maybe Bool
$sel:countryCode:CPhoneNumber :: CInt
$sel:nationalNumber:CPhoneNumber :: CULong
$sel:preferredDomesticCarrierCode:CPhoneNumber :: Maybe ByteString
$sel:rawInput:CPhoneNumber :: Maybe ByteString
$sel:extension:CPhoneNumber :: Maybe ByteString
..}

{-# COMPLETE PhoneNumber #-}

-- | E.g.:
--
-- @
-- 'Data.PhoneNumber.Util.parseNumber' 'Data.PhoneNumber.Util.Canonicalize' 'Nothing' "+1 800-234-5678 ext. 1234"
-- = 'Right' v'PhoneNumber' { 'extension' = 'Just' "1234", .. }
-- @
extension :: PhoneNumber -> Maybe ByteString

-- | E.g.:
--
-- @
-- 'Data.PhoneNumber.Util.parseNumber' 'Data.PhoneNumber.Util.KeepRawInput' 'Nothing' " + 1(2-3~4*5.6 "
-- = 'Right' v'PhoneNumber' { 'rawInput' = 'Just' " + 1(2-3~4*5.6 ", .. }
-- @
rawInput :: PhoneNumber -> Maybe ByteString

-- | E.g.:
--
-- @
-- 'Data.PhoneNumber.Util.parseNumber' 'Data.PhoneNumber.Util.KeepRawInput' ('Just' \"BR\") "0 41 (21) 2345-6789"
-- = 'Right' v'PhoneNumber' { 'preferredDomesticCarrierCode' = 'Just' "41", .. }
-- @
preferredDomesticCarrierCode :: PhoneNumber -> Maybe ByteString

-- | You probably want to use 'Data.PhoneNumber.Util.nationalSignificantNumber'
-- instead. E.g.:
--
-- @
-- 'Data.PhoneNumber.Util.parseNumber' 'Data.PhoneNumber.Util.Canonicalize' 'Nothing' "+800 0001 2345"
-- = 'Right' v'PhoneNumber' { 'nationalNumber' = 12345, 'numberOfLeadingZeros' = Just 3, .. }
-- @
nationalNumber :: PhoneNumber -> Word

-- | E.g.:
--
-- @
-- 'Data.PhoneNumber.Util.parseNumber' 'Data.PhoneNumber.Util.Canonicalize' ('Just' \"US\") "800-234-5678"
-- = 'Right' v'PhoneNumber' { 'countryCode' = 1, .. }
-- @
countryCode :: PhoneNumber -> CountryCode

-- | E.g.:
--
-- @
-- 'Data.PhoneNumber.Util.parseNumber' 'Data.PhoneNumber.Util.Canonicalize' 'Nothing' "+39 06 1234 5678"
-- = 'Right' v'PhoneNumber' { 'italianLeadingZero' = 'Just' 'True', .. }
-- @
italianLeadingZero :: PhoneNumber -> Maybe Bool

-- | E.g.:
--
-- @
-- 'Data.PhoneNumber.Util.parseNumber' 'Data.PhoneNumber.Util.KeepRawInput' ('Just' \"US\") "011 800 1234 5678"
-- = 'Right' v'PhoneNumber' { 'countryCodeSource' = 'Just' 'FromNumberWithIdd', .. }
-- @
countryCodeSource :: PhoneNumber -> Maybe CountryCodeSource

-- | E.g.:
--
-- @
-- 'Data.PhoneNumber.Util.parseNumber' 'Data.PhoneNumber.Util.Canonicalize' 'Nothing' "+800 0001 2345"
-- = 'Right' v'PhoneNumber' { 'numberOfLeadingZeros' = Just 3, 'nationalNumber' = 12345, .. }
-- @
numberOfLeadingZeros :: PhoneNumber -> Maybe Int