#include #include namespace mbgl { namespace style { namespace conversion { optional Converter::operator()(const Convertible& value, Error& error) const { optional converted = toBool(value); if (!converted) { error.message = "value must be a boolean"; return nullopt; } return *converted; } optional Converter::operator()(const Convertible& value, Error& error) const { optional converted = toNumber(value); if (!converted) { error.message = "value must be a number"; return nullopt; } return *converted; } optional Converter::operator()(const Convertible& value, Error& error) const { optional converted = toString(value); if (!converted) { error.message = "value must be a string"; return nullopt; } return *converted; } template optional Converter::value>>::operator()(const Convertible& value, Error& error) const { optional string = toString(value); if (!string) { error.message = "value must be a string"; return nullopt; } const auto result = Enum::toEnum(*string); if (!result) { error.message = "value must be a valid enumeration value"; return nullopt; } return *result; } template auto Converter, typename std::enable_if_t::value>>::operator()(const Convertible& value, Error& error) const -> optional> { if (!isArray(value)) { error.message = "value must be an array"; return nullopt; } std::vector result; result.reserve(arrayLength(value)); for (std::size_t i = 0; i < arrayLength(value); ++i) { optional enumItem = Converter{}(arrayMember(value, i), error); if (!enumItem) { return nullopt; } result.push_back(*enumItem); } return result; } template optional Converter::operator()(const Convertible&, Error&) const; template optional Converter::operator()(const Convertible&, Error&) const; template optional Converter::operator()(const Convertible&, Error&) const; template optional Converter::operator()(const Convertible&, Error&) const; template optional Converter::operator()(const Convertible&, Error&) const; template optional Converter::operator()(const Convertible&, Error&) const; template optional Converter::operator()(const Convertible&, Error&) const; template optional Converter::operator()(const Convertible&, Error&) const; template optional Converter::operator()(const Convertible&, Error&) const; template optional Converter::operator()(const Convertible&, Error&) const; template optional Converter::operator()(const Convertible&, Error&) const; template optional Converter::operator()(const Convertible&, Error&) const; template optional Converter::operator()(const Convertible&, Error&) const; template optional Converter::operator()(const Convertible&, Error&) const; template optional Converter::operator()(const Convertible&, Error&) const; template optional> Converter>::operator()(const Convertible&, Error&) const; optional Converter::operator()(const Convertible& value, Error& error) const { optional string = toString(value); if (!string) { error.message = "value must be a string"; return nullopt; } optional color = Color::parse(*string); if (!color) { error.message = "value must be a valid color"; return nullopt; } return *color; } template optional> Converter>::operator()(const Convertible& value, Error& error) const { if (!isArray(value) || arrayLength(value) != N) { error.message = "value must be an array of " + util::toString(N) + " numbers"; return nullopt; } std::array result; for (size_t i = 0; i < N; i++) { optional n = toNumber(arrayMember(value, i)); if (!n) { error.message = "value must be an array of " + util::toString(N) + " numbers"; return nullopt; } result[i] = *n; } return result; } template optional> Converter>::operator()(const Convertible&, Error&) const; template optional> Converter>::operator()(const Convertible&, Error&) const; template optional> Converter>::operator()(const Convertible&, Error&) const; optional> Converter>::operator()(const Convertible& value, Error& error) const { if (!isArray(value)) { error.message = "value must be an array"; return nullopt; } std::vector result; result.reserve(arrayLength(value)); for (std::size_t i = 0; i < arrayLength(value); ++i) { optional number = toNumber(arrayMember(value, i)); if (!number) { error.message = "value must be an array of numbers"; return nullopt; } result.push_back(*number); } return result; } optional> Converter>::operator()(const Convertible& value, Error& error) const { if (!isArray(value)) { error.message = "value must be an array"; return nullopt; } std::vector result; result.reserve(arrayLength(value)); for (std::size_t i = 0; i < arrayLength(value); ++i) { optional string = toString(arrayMember(value, i)); if (!string) { error.message = "value must be an array of strings"; return nullopt; } result.push_back(*string); } return result; } optional Converter::operator()(const Convertible& value, Error& error) const { Converter> arrayConverter; if (auto val = arrayConverter(value, error)) { RadialOffsetType result = std::move(*val); return result; } Converter numberConverter; if (auto val = numberConverter(value, error)) { RadialOffsetType result(2, *val); return result; } error.message = "value must be an array of numbers or a number"; return nullopt; } } // namespace conversion } // namespace style } // namespace mbgl