From 9e323f16eb3a47902a702d4bc2e2fd55e42a8278 Mon Sep 17 00:00:00 2001 From: Alex Zolotarev Date: Wed, 6 Apr 2016 19:35:27 +0300 Subject: [PATCH] Basic validation of house numbers. --- indexer/editable_map_object.cpp | 30 ++++++++++++++++++++++++++++-- indexer/editable_map_object.hpp | 2 ++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/indexer/editable_map_object.cpp b/indexer/editable_map_object.cpp index cd689ca92b..c12443590f 100644 --- a/indexer/editable_map_object.cpp +++ b/indexer/editable_map_object.cpp @@ -4,6 +4,9 @@ #include "indexer/ftypes_matcher.hpp" #include "base/macros.hpp" +#include "base/string_utils.hpp" + +#include "std/cctype.hpp" namespace osm { @@ -94,12 +97,35 @@ void EditableMapObject::SetNearbyStreets(vector && streets) { m_nearbyStreets = move(streets); } + +// static +bool EditableMapObject::ValidateHouseNumber(string const & houseNumber) +{ + if (houseNumber.empty()) + return true; + + strings::UniString us = strings::MakeUniString(houseNumber); + // TODO: Improve this basic limit - it was choosen by @Zverik. + auto constexpr kMaxHouseNumberLength = 15; + if (us.size() > kMaxHouseNumberLength) + return false; + + // TODO: Should we allow arabic numbers like U+0661 ١ Arabic-Indic Digit One? + strings::NormalizeDigits(us); + for (strings::UniChar const c : us) + { + // Valid house numbers contain at least one number. + if (c >= '0' && c <= '9') + return true; + } + return false; +} + void EditableMapObject::SetHouseNumber(string const & houseNumber) { - // TODO(AlexZ): Check house number for validity with feature::IsHouseNumber ? - // TODO(AlexZ): Store edited house number as house name if feature::IsHouseNumber() returned false. m_houseNumber = houseNumber; } + void EditableMapObject::SetPostcode(string const & postcode) { m_metadata.Set(feature::Metadata::FMD_POSTCODE, postcode); diff --git a/indexer/editable_map_object.hpp b/indexer/editable_map_object.hpp index 3649670b98..c29fbd834a 100644 --- a/indexer/editable_map_object.hpp +++ b/indexer/editable_map_object.hpp @@ -72,6 +72,8 @@ public: // void SetTypes(feature::TypesHolder const & types); void SetStreet(string const & street); void SetNearbyStreets(vector && streets); + /// @returns false if house number fails validation. + static bool ValidateHouseNumber(string const & houseNumber); void SetHouseNumber(string const & houseNumber); void SetPostcode(string const & postcode); void SetPhone(string const & phone);