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