1e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// Copyright (C) 2014 Google Inc.
2e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com//
3e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// Licensed under the Apache License, Version 2.0 (the "License");
4e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// you may not use this file except in compliance with the License.
5e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// You may obtain a copy of the License at
6e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com//
7e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// http://www.apache.org/licenses/LICENSE-2.0
8e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com//
9e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// Unless required by applicable law or agreed to in writing, software
10e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// distributed under the License is distributed on an "AS IS" BASIS,
11e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// See the License for the specific language governing permissions and
13e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// limitations under the License.
14e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com//
15e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// A struct for storing address data: country code, administrative area,
16e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// locality, etc. The field names correspond to the OASIS xAL standard:
17e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com// https://www.oasis-open.org/committees/ciq/download.shtml
18e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com
19e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com#ifndef I18N_ADDRESSINPUT_ADDRESS_DATA_H_
20e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com#define I18N_ADDRESSINPUT_ADDRESS_DATA_H_
21e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com
22e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com#include <libaddressinput/address_field.h>
23e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com
246e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com#include <iosfwd>
25e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com#include <string>
26e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com#include <vector>
27e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com
28e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.comnamespace i18n {
29e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.comnamespace addressinput {
30e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com
31e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.comstruct AddressData {
32e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  // CLDR (Common Locale Data Repository) region code.
33e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  std::string region_code;
34e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com
35e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  // The address lines represent the most specific part of any address.
36e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  std::vector<std::string> address_line;
37e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com
38e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  // Top-level administrative subdivision of this country.
39e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  std::string administrative_area;
40e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com
41e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  // Generally refers to the city/town portion of an address.
42e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  std::string locality;
43e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com
44e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  // Dependent locality or sublocality. Used for UK dependent localities, or
45e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  // neighborhoods or boroughs in other locations.
46e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  std::string dependent_locality;
47e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com
48e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  // Values are frequently alphanumeric.
49e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  std::string postal_code;
50e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com
51e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  // This corresponds to the SortingCode sub-element of the xAL
52e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  // PostalServiceElements element. Use is very country-specific.
53e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  std::string sorting_code;
54e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com
55e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  // Language code of the address. Should be in BCP-47 format.
56e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  std::string language_code;
57e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com
58b52a2aeb63a28914850f3ed81cd7fd26ecdd4cdcrouslan@chromium.org  // The organization, firm, company, or institution at this address. This
59b52a2aeb63a28914850f3ed81cd7fd26ecdd4cdcrouslan@chromium.org  // corresponds to the FirmName sub-element of the xAL FirmType element.
60b52a2aeb63a28914850f3ed81cd7fd26ecdd4cdcrouslan@chromium.org  std::string organization;
61b52a2aeb63a28914850f3ed81cd7fd26ecdd4cdcrouslan@chromium.org
62e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  // Name of recipient or contact person. Not present in xAL.
63e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  std::string recipient;
64e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com
65e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  // Returns whether the |field| is empty.
66e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  bool IsFieldEmpty(AddressField field) const;
67e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com
68e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  // Returns the value of the |field|. The parameter must not be STREET_ADDRESS,
69e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  // which comprises multiple fields (will crash otherwise).
70e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  const std::string& GetFieldValue(AddressField field) const;
71e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com
722fbc3617221414ff659533aaf8033526443b3773rouslan@chromium.org  // Copies |value| into the |field|. The parameter must not be STREET_ADDRESS,
732fbc3617221414ff659533aaf8033526443b3773rouslan@chromium.org  // which comprises multiple fields (will crash otherwise).
742fbc3617221414ff659533aaf8033526443b3773rouslan@chromium.org  void SetFieldValue(AddressField field, const std::string& value);
752fbc3617221414ff659533aaf8033526443b3773rouslan@chromium.org
76e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  // Returns the value of the |field|. The parameter must be STREET_ADDRESS,
77e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  // which comprises multiple fields (will crash otherwise).
78e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com  const std::vector<std::string>& GetRepeatedFieldValue(
79e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com      AddressField field) const;
80e66bf12636bf12067bd8b199b8e6c1035315d2aakeghani@google.com
816e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com  bool operator==(const AddressData& other) const;
826e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com
83e66bf12636bf12067bd8b199b8e6c1035315d2aakeghani@google.com  // Returns true if the parameter comprises multiple fields, false otherwise.
84e66bf12636bf12067bd8b199b8e6c1035315d2aakeghani@google.com  // Use it to determine whether to call |GetFieldValue| or
85e66bf12636bf12067bd8b199b8e6c1035315d2aakeghani@google.com  // |GetRepeatedFieldValue|.
86e66bf12636bf12067bd8b199b8e6c1035315d2aakeghani@google.com  static bool IsRepeatedFieldValue(AddressField field);
87e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com};
88e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com
89e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com}  // namespace addressinput
90e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com}  // namespace i18n
91e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com
926e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com// Produces human-readable output in logging, for example in unit tests.
936e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comstd::ostream& operator<<(std::ostream& o,
946e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com                         const i18n::addressinput::AddressData& address);
956e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com
96e0cd6d6862db732f3fd035cdebd3a5d0ee8701c7roubert@google.com#endif  // I18N_ADDRESSINPUT_ADDRESS_DATA_H_
97