defmodule EverFaker.Nato do import EverFaker, only: [sampler: 2] @moduledoc """ Functions for generating NATO alphabet data """ @doc """ Returns a random letter NATO code ## Examples iex> EverFaker.Nato.letter_code_word() "ECHO" iex> EverFaker.Nato.letter_code_word() "LIMA" iex> EverFaker.Nato.letter_code_word() "ROMEO" iex> EverFaker.Nato.letter_code_word() "CHARLIE" """ @spec letter_code_word :: String.t() sampler(:letter_code_word, [ "ALPHA", "BRAVO", "CHARLIE", "DELTA", "ECHO", "FOXTROT", "GOLF", "HOTEL", "INDIA", "JULIETT", "KILO", "LIMA", "MIKE", "NOVEMBER", "OSCAR", "PAPA", "QUEBEC", "ROMEO", "SIERRA", "TANGO", "UNIFORM", "VICTOR", "WHISKEY", "XRAY", "YANKEE", "ZULU" ]) @doc """ Returns a random digit NATO code ## Examples iex> EverFaker.Nato.digit_code_word() "ONE" iex> EverFaker.Nato.digit_code_word() "TWO" iex> EverFaker.Nato.digit_code_word() "SIX" iex> EverFaker.Nato.digit_code_word() "FIVE" """ @spec digit_code_word :: String.t() sampler(:digit_code_word, [ "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", "ZERO" ]) @doc """ Returns the NATO stop code ## Examples iex> EverFaker.Nato.stop_code_word() "STOP" """ @spec stop_code_word :: String.t() def stop_code_word, do: "STOP" @doc """ Returns a random NATO call sign of the form [alpha]-[alpha]-[digit] ## Examples iex> EverFaker.Nato.callsign() "ECHO-LIMA-SIX" iex> EverFaker.Nato.callsign() "CHARLIE-ECHO-SEVEN" iex> EverFaker.Nato.callsign() "SIERRA-GOLF-TWO" iex> EverFaker.Nato.callsign() "INDIA-WHISKEY-FOUR" """ @spec callsign() :: String.t() def callsign, do: format("?-?-#") @doc """ Formats a string using the NATO alphabet. It replaces `"#"` to a random NATO digit, `"?"` to random NATO letter and `"."` to the stop code. ## Examples iex> EverFaker.Nato.format("#-?-#-.") "ONE-LIMA-SIX-STOP" iex> EverFaker.Nato.format("#-?-#-.") "FIVE-ECHO-SEVEN-STOP" iex> EverFaker.Nato.format("#-?-#-.") "FIVE-GOLF-TWO-STOP" iex> EverFaker.Nato.format("#-?-#-.") "ONE-WHISKEY-FOUR-STOP" """ @spec format(String.t()) :: String.t() def format(str) when is_binary(str) do format(str, "") end defp format(<<"#"::utf8, tail::binary>>, acc) do format(tail, <>) end defp format(<<"?"::utf8, tail::binary>>, acc) do format(tail, <>) end defp format(<<"."::utf8, tail::binary>>, acc) do format(tail, <>) end defp format(<>, acc) do format(tail, <>) end defp format("", acc) do acc end end