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// The public interface to the address validation features of libaddressinput.
16bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// The AddressValidator will examine an AddressData struct and return a map of
17bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// the problems found with the different fields of this struct.
18bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
19bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#ifndef I18N_ADDRESSINPUT_ADDRESS_VALIDATOR_H_
20bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#define I18N_ADDRESSINPUT_ADDRESS_VALIDATOR_H_
21bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
22bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <libaddressinput/address_field.h>
23bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <libaddressinput/address_problem.h>
24bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <libaddressinput/callback.h>
25bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <libaddressinput/util/basictypes.h>
26bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
27bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#include <map>
28bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
29bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comnamespace i18n {
30bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comnamespace addressinput {
31bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
329693f6426f3500db74dcfc766a130a747a571e5eroubert@google.comclass Supplier;
33bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comstruct AddressData;
34bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
35bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comtypedef std::multimap<AddressField, AddressProblem> FieldProblemMap;
36bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
37bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com// Validates an AddressData struct. Sample usage:
38bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//    class MyClass {
39bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//     public:
40bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//      MyClass()
418466869ca5e66ec41d133c8ca2f25789028ef4dfroubert@google.com//          : supplier_(new MySupplier),
428466869ca5e66ec41d133c8ca2f25789028ef4dfroubert@google.com//            validator_(new AddressValidator(supplier_.get())),
43bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//            validated_(BuildCallback(this, &MyClass::Validated)) {}
44bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//
45bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//      virtual ~MyClass() {}
46bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//
47bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//      void ValidateAddress() const {
48bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//        address_.region_code = "US";
49bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//        address_.administrative_area = "CA";
50bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//        validator_.Validate(address_, filter_, &problems_, *validated_);
51bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//      }
52bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//
53bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//      void Validated(bool success,
54bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//                     const AddressData& address,
55bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//                     const FieldProblemMap& problems) {
56bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//        if (success && problems.empty()) {
57bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//          ...
58bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//        }
59bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//      }
60bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//
61bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//     private:
62bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//      AddressData address_;
63bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//      FieldProblemMap filter_;
64bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//      FieldProblemMap problems_;
658466869ca5e66ec41d133c8ca2f25789028ef4dfroubert@google.com//      const scoped_ptr<Supplier> supplier_;
668466869ca5e66ec41d133c8ca2f25789028ef4dfroubert@google.com//      const scoped_ptr<AddressValidator> validator_;
67bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//      const scoped_ptr<const AddressValidator::Callback> validated_;
68bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com//    };
69bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.comclass AddressValidator {
70bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com public:
718c9b0e35847b85f4cc7434058e4e4ec5d5560c40roubert@google.com  typedef i18n::addressinput::Callback<const AddressData&,
728c9b0e35847b85f4cc7434058e4e4ec5d5560c40roubert@google.com                                       const FieldProblemMap&> Callback;
73bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
74af2251ef30326d338a413850ec8b4e6253498b2croubert@google.com  // Does not take ownership of |supplier|.
75af2251ef30326d338a413850ec8b4e6253498b2croubert@google.com  AddressValidator(Supplier* supplier);
76af2251ef30326d338a413850ec8b4e6253498b2croubert@google.com
77bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  ~AddressValidator();
78bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
79bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // Validates the |address| and populates |problems| with the validation
80bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // problems, filtered according to the |filter| parameter.
81bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  //
82bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // Set |allow_postal| to allow postal addresses, rather than only addresses
83bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // describing physical locations.
84bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  //
85bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // Set |require_name| if recipient should be considered a required field.
86bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  //
87bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // If the |filter| is NULL or empty, then all discovered validation problems
88bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // are returned. If the |filter| contains problem elements, then only those
89bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // field-problem pairs present in the |filter| will be returned.
90bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  //
91bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // Calls the |validated| callback when validation is done. All objects passed
92bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // as parameters must be kept available until the callback has been called.
93bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  //
94bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // The |success| parameter of the callback indicates whether it was possible
95bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // to perform validation. If |success| is true, then |problems| will contain
96bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  // information about any problems found with the |address|.
97bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  void Validate(const AddressData& address,
98bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com                bool allow_postal,
99bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com                bool require_name,
100bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com                const FieldProblemMap* filter,
101bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com                FieldProblemMap* problems,
102bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com                const Callback& validated) const;
103bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
104bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com private:
105af2251ef30326d338a413850ec8b4e6253498b2croubert@google.com  Supplier* const supplier_;
106bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
107bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com  DISALLOW_COPY_AND_ASSIGN(AddressValidator);
108bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com};
109bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
110bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com}  // namespace addressinput
111bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com}  // namespace i18n
112bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com
113bb96489d0f6066c96a5388a2a91d30ca6bc87ba8roubert@google.com#endif  // I18N_ADDRESSINPUT_ADDRESS_VALIDATOR_H_
114