1bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// Copyright (C) 2014 Google Inc.
2bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//
3bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// Licensed under the Apache License, Version 2.0 (the "License");
4bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// you may not use this file except in compliance with the License.
5bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// You may obtain a copy of the License at
6bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//
7bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// http://www.apache.org/licenses/LICENSE-2.0
8bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//
9bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// Unless required by applicable law or agreed to in writing, software
10bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// distributed under the License is distributed on an "AS IS" BASIS,
11bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// See the License for the specific language governing permissions and
13bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// limitations under the License.
14bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
15bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#ifndef I18N_ADDRESSINPUT_VALIDATION_TASK_H_
16bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#define I18N_ADDRESSINPUT_VALIDATION_TASK_H_
17bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
18bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <libaddressinput/address_field.h>
19bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <libaddressinput/address_problem.h>
20bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <libaddressinput/address_validator.h>
219693f6426f3500db74dcfc766a130a747a571e5eroubert@google.com#include <libaddressinput/supplier.h>
22bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <libaddressinput/util/basictypes.h>
23bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <libaddressinput/util/scoped_ptr.h>
24bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
259f47fe3ed525accac995b095d408a825673a2ee1roubert@google.com#include <string>
269f47fe3ed525accac995b095d408a825673a2ee1roubert@google.com
27bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comnamespace i18n {
28bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comnamespace addressinput {
29bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
30bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comclass LookupKey;
31bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comstruct AddressData;
32bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
33bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// A ValidationTask object encapsulates the information necessary to perform
34bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// validation of one particular address and call a callback when that has been
35bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// done. Calling the Run() method will load required metadata, then perform
36bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// validation, call the callback and delete the ValidationTask object itself.
37bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comclass ValidationTask {
38bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com public:
39bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  ValidationTask(const AddressData& address,
40bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com                 bool allow_postal,
41bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com                 bool require_name,
42bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com                 const FieldProblemMap* filter,
43bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com                 FieldProblemMap* problems,
44bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com                 const AddressValidator::Callback& validated);
45bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
46bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  ~ValidationTask();
47bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
48396ee7878c98be2ad9de7120ff6e7e3745530029roubert@google.com  // Calls supplier->Load(), with Validate() as callback.
499693f6426f3500db74dcfc766a130a747a571e5eroubert@google.com  void Run(Supplier* supplier) const;
50bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
51bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com private:
52bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  friend class ValidationTaskTest;
53bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
54bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // Uses the address metadata of |hierarchy| to validate |address_|, writing
55bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // problems found into |problems_|, then calls the |validated_| callback and
56bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // deletes this ValidationTask object.
57bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  void Validate(bool success,
58bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com                const LookupKey& lookup_key,
599693f6426f3500db74dcfc766a130a747a571e5eroubert@google.com                const Supplier::RuleHierarchy& hierarchy);
60bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
61bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // Checks all fields for UNEXPECTED_FIELD problems.
62b1b5b1fcaaaa95129f1f351641dd20d14bc667e3roubert@google.com  void CheckUnexpectedField(const std::string& region_code) const;
63bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
64bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // Checks all fields for MISSING_REQUIRED_FIELD problems.
65b1b5b1fcaaaa95129f1f351641dd20d14bc667e3roubert@google.com  void CheckMissingRequiredField(const std::string& region_code) const;
66bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
67bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // Checks the hierarchical fields for UNKNOWN_VALUE problems.
68000aa6dbb70273ccefa77a5d4cd1a400939a2666roubert@google.com  void CheckUnknownValue(const Supplier::RuleHierarchy& hierarchy) const;
69bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
70bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // Checks the POSTAL_CODE field for problems.
71bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  void CheckPostalCodeFormatAndValue(
729693f6426f3500db74dcfc766a130a747a571e5eroubert@google.com      const Supplier::RuleHierarchy& hierarchy) const;
73bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
74bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // Checks the STREET_ADDRESS field for USES_P_O_BOX problems.
75000aa6dbb70273ccefa77a5d4cd1a400939a2666roubert@google.com  void CheckUsesPoBox(const Supplier::RuleHierarchy& hierarchy) const;
76bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
77bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // Writes (|field|,|problem|) to |problems_|.
78bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  void ReportProblem(AddressField field, AddressProblem problem) const;
79bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
80bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // Writes (|field|,|problem|) to |problems_|, if this pair should be reported.
81bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  void ReportProblemMaybe(AddressField field, AddressProblem problem) const;
82bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
83bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // Returns whether (|field|,|problem|) should be reported.
84bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  bool ShouldReport(AddressField field, AddressProblem problem) const;
85bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
86bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  const AddressData& address_;
87bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  const bool allow_postal_;
88bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  const bool require_name_;
89bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  const FieldProblemMap* filter_;
90bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  FieldProblemMap* const problems_;
91bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  const AddressValidator::Callback& validated_;
929693f6426f3500db74dcfc766a130a747a571e5eroubert@google.com  const scoped_ptr<const Supplier::Callback> supplied_;
93bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  const scoped_ptr<LookupKey> lookup_key_;
94bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
95bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  DISALLOW_COPY_AND_ASSIGN(ValidationTask);
96bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com};
97bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
98bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com}  // namespace addressinput
99bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com}  // namespace i18n
100bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
101bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#endif  // I18N_ADDRESSINPUT_VALIDATION_TASK_H_
102