lib/faker/core/phone_number.ex

defmodule Faker.Core.PhoneNumber do
  use Faker.Core.Generator

  defmacro __using__(_) do
    quote do
      @doc """
      * @see https://github.com/giggsey/libphonenumber-for-php/blob/master/src/CountryCodeToRegionCodeMap.php
      * @see https://libphonenumber.appspot.com/phonenumberparser?number=%2B4576597442
      """

      @formats [
        "+1##########",
        "+7##########",
        "+20##########",
        "+27##########",
        "+30##########",
        "+31##########",
        "+32#########",
        "+33#########",
        "+34#########",
        "+36#########",
        "+39##########",
        "+40#########",
        "+41#########",
        "+43##########",
        "+44##########",
        "+45########",
        "+46##########",
        "+47########",
        "+48##########",
        "+49##########",
        "+51#########",
        "+52##########",
        "+53##########",
        "+54##########",
        "+55#########",
        "+56##########",
        "+57##########",
        "+58##########",
        "+60##########",
        "+61##########",
        "+62##########",
        "+63##########",
        "+64##########",
        "+65##########",
        "+66##########",
        "+81##########",
        "+82##########",
        "+84##########",
        "+86##########",
        "+90##########",
        "+91##########",
        "+92##########",
        "+93#########",
        "+94#########",
        "+95##########",
        "+98##########",
        "+211#########",
        "+212#########",
        "+213#########",
        "+216########",
        "+218#########",
        "+220#######",
        "+221#########",
        "+222########",
        "+223########",
        "+224#########",
        "+225##########",
        "+226########",
        "+227########",
        "+228########",
        "+229########",
        "+230########",
        "+231#########",
        "+232########",
        "+233#########",
        "+234##########",
        "+235########",
        "+236########",
        "+237#########",
        "+238#######",
        "+239#######",
        "+240#########",
        "+241########",
        "+242#########",
        "+243#########",
        "+244#########",
        "+245#########",
        "+246#######",
        "+247######",
        "+248#######",
        "+249#########",
        "+250#########",
        "+251#########",
        "+252#########",
        "+253########",
        "+254##########",
        "+255#########",
        "+256#########",
        "+257########",
        "+258#########",
        "+260#########",
        "+261#########",
        "+262#########",
        "+263##########",
        "+264#########",
        "+265#########",
        "+266########",
        "+267##########",
        "+268#########",
        "+269#######",
        "+290#####",
        "+291#######",
        "+297#######",
        "+298######",
        "+299######",
        "+350########",
        "+351#########",
        "+352##########",
        "+353##########",
        "+354#########",
        "+355#########",
        "+356########",
        "+357########",
        "+358##########",
        "+359#########",
        "+370########",
        "+371########",
        "+372##########",
        "+373########",
        "+374########",
        "+375##########",
        "+376#########",
        "+377#########",
        "+378##########",
        "+380##########",
        "+381##########",
        "+382#########",
        "+383#########",
        "+385#########",
        "+386########",
        "+387#########",
        "+389########",
        "+420#########",
        "+421#########",
        "+423#########",
        "+500#####",
        "+501#######",
        "+502########",
        "+503########",
        "+504########",
        "+505########",
        "+506########",
        "+507##########",
        "+508#########",
        "+509########",
        "+590#########",
        "+591#########",
        "+592#######",
        "+593##########",
        "+594#########",
        "+595##########",
        "+596#########",
        "+597#######",
        "+598##########",
        "+599########",
        "+670########",
        "+672######",
        "+673#######",
        "+674#######",
        "+675########",
        "+676#######",
        "+677#######",
        "+678#######",
        "+679#######",
        "+680#######",
        "+681#########",
        "+682#####",
        "+683#######",
        "+685##########",
        "+686########",
        "+687######",
        "+688#######",
        "+689#########",
        "+690#######",
        "+691#######",
        "+692#######",
        "+800########",
        "+808########",
        "+850##########",
        "+852#########",
        "+853########",
        "+855##########",
        "+856##########",
        "+870#########",
        "+878############",
        "+880##########",
        "+881#########",
        "+882##########",
        "+883#########",
        "+886##########",
        "+888###########",
        "+960##########",
        "+961########",
        "+962#########",
        "+963#########",
        "+964##########",
        "+965########",
        "+966##########",
        "+967#########",
        "+968#########",
        "+970##########",
        "+971##########",
        "+972##########",
        "+973########",
        "+974########",
        "+975########",
        "+976##########",
        "+977##########",
        "+979#########",
        "+992#########",
        "+993########",
        "+994#########",
        "+995#########",
        "+996#########",
        "+998#########"
      ]

      # Localised format
      @mobile_formats [
        "07#########",
        "07### ######",
        "07### ### ###"
      ]

      @e164_formats [
        "+44##########"
      ]

      def mobile_number(:localized) do
        @mobile_formats
        |> Enum.at(0)
        |> numerify()
      end

      def mobile_number(:localized_format) do
        @mobile_formats
        |> Enum.at(1)
        |> numerify()
      end

      def mobile_number(:localized_pretify) do
        @mobile_formats
        |> Enum.at(2)
        |> numerify()
      end

      def mobile_number() do
        @formats
        |> random_element()
        |> numerify()
      end

      @doc """
      Returns random phone_number

      Example: +11134567890
      """
      def e164_phone_number() do
        @e164_formats
        |> random_element()
        |> numerify()
      end

      @doc """
        * International Mobile Equipment Identity (IMEI)
         *
         * @see http://en.wikipedia.org/wiki/International_Mobile_Station_Equipment_Identity
         * @see http://imei-number.com/imei-validation-check/
         *
         * @example "720084494799532"
         *
         * @return int $imei
      """
      def imei() do
        numerify("##############")
      end
    end
  end
end