1 #pragma once 2 3 #include <mbgl/style/conversion.hpp> 4 #include <mbgl/util/color.hpp> 5 #include <mbgl/util/enum.hpp> 6 #include <mbgl/util/string.hpp> 7 8 #include <array> 9 #include <string> 10 #include <vector> 11 12 namespace mbgl { 13 namespace style { 14 namespace conversion { 15 16 template <> 17 struct Converter<bool> { 18 optional<bool> operator()(const Convertible& value, Error& error) const; 19 }; 20 21 template <> 22 struct Converter<float> { 23 optional<float> operator()(const Convertible& value, Error& error) const; 24 }; 25 26 template <> 27 struct Converter<std::string> { 28 optional<std::string> operator()(const Convertible& value, Error& error) const; 29 }; 30 31 template <class T> 32 struct Converter<T, typename std::enable_if_t<std::is_enum<T>::value>> { operator ()mbgl::style::conversion::Converter33 optional<T> operator()(const Convertible& value, Error& error) const { 34 optional<std::string> string = toString(value); 35 if (!string) { 36 error = { "value must be a string" }; 37 return {}; 38 } 39 40 const auto result = Enum<T>::toEnum(*string); 41 if (!result) { 42 error = { "value must be a valid enumeration value" }; 43 return {}; 44 } 45 46 return *result; 47 } 48 }; 49 50 template <> 51 struct Converter<Color> { 52 optional<Color> operator()(const Convertible& value, Error& error) const; 53 }; 54 55 template <size_t N> 56 struct Converter<std::array<float, N>> { operator ()mbgl::style::conversion::Converter57 optional<std::array<float, N>> operator()(const Convertible& value, Error& error) const { 58 if (!isArray(value) || arrayLength(value) != N) { 59 error = { "value must be an array of " + util::toString(N) + " numbers" }; 60 return {}; 61 } 62 63 std::array<float, N> result; 64 for (size_t i = 0; i < N; i++) { 65 optional<float> n = toNumber(arrayMember(value, i)); 66 if (!n) { 67 error = { "value must be an array of " + util::toString(N) + " numbers" }; 68 return {}; 69 } 70 result[i] = *n; 71 } 72 return result; 73 } 74 }; 75 76 template <> 77 struct Converter<std::vector<float>> { 78 optional<std::vector<float>> operator()(const Convertible& value, Error& error) const; 79 }; 80 81 template <> 82 struct Converter<std::vector<std::string>> { 83 optional<std::vector<std::string>> operator()(const Convertible& value, Error& error) const; 84 }; 85 86 } // namespace conversion 87 } // namespace style 88 } // namespace mbgl 89