countries_instance.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #pragma once
  8. namespace Countries {
  9. struct CallingCodeInfo {
  10. QString callingCode;
  11. std::vector<QString> prefixes;
  12. std::vector<QString> patterns;
  13. };
  14. struct Info {
  15. QString name;
  16. QString iso2;
  17. QString alternativeName;
  18. std::vector<CallingCodeInfo> codes;
  19. bool isHidden = false;
  20. };
  21. struct FormatResult {
  22. QString formatted;
  23. QVector<int> groups;
  24. QString code;
  25. };
  26. struct FormatArgs {
  27. QString phone;
  28. bool onlyGroups = false;
  29. bool skipCode = false;
  30. bool incomplete = false;
  31. bool onlyCode = false;
  32. };
  33. class CountriesInstance final {
  34. public:
  35. using Map = QHash<QString, const Info *>;
  36. CountriesInstance();
  37. [[nodiscard]] const std::vector<Info> &list() const;
  38. void setList(std::vector<Info> &&infos);
  39. [[nodiscard]] const Map &byCode() const;
  40. [[nodiscard]] const Map &byISO2() const;
  41. [[nodiscard]] QString validPhoneCode(QString fullCode) const;
  42. [[nodiscard]] QString countryNameByISO2(const QString &iso) const;
  43. [[nodiscard]] QString countryISO2ByPhone(const QString &phone) const;
  44. [[nodiscard]] QString flagEmojiByISO2(const QString &iso) const;
  45. [[nodiscard]] FormatResult format(FormatArgs args) const;
  46. [[nodiscard]] rpl::producer<> updated() const;
  47. private:
  48. mutable std::vector<Info> _list;
  49. mutable Map _byCode;
  50. mutable Map _byISO2;
  51. rpl::event_stream<> _updated;
  52. };
  53. CountriesInstance &Instance();
  54. [[nodiscard]] QString ExtractPhoneCode(const QString &phone);
  55. [[nodiscard]] QVector<int> Groups(const QString &phone);
  56. } // namespace Countries