#pragma once #include #include #include #include #include #include #include namespace mbgl { namespace style { namespace conversion { template optional> convertDefaultValue(const Convertible& value, Error& error) { auto defaultValueValue = objectMember(value, "default"); if (!defaultValueValue) { return optional(); } auto defaultValue = convert(*defaultValueValue, error); if (!defaultValue) { error = { R"(wrong type for "default": )" + error.message }; return {}; } return { *defaultValue }; } optional> convertCameraFunctionToExpression(expression::type::Type, const Convertible&, Error&); optional> convertSourceFunctionToExpression(expression::type::Type, const Convertible&, Error&); optional> convertCompositeFunctionToExpression(expression::type::Type, const Convertible&, Error&); template struct Converter> { optional> operator()(const Convertible& value, Error& error) const { auto expression = convertCameraFunctionToExpression(expression::valueTypeToExpressionType(), value, error); if (!expression) { return {}; } return CameraFunction(std::move(*expression), false); } }; template struct Converter> { optional> operator()(const Convertible& value, Error& error) const { auto expression = convertSourceFunctionToExpression(expression::valueTypeToExpressionType(), value, error); if (!expression) { return {}; } auto defaultValue = convertDefaultValue(value, error); if (!defaultValue) { return {}; } return SourceFunction(std::move(*expression), *defaultValue); } }; template struct Converter> { optional> operator()(const Convertible& value, Error& error) const { auto expression = convertCompositeFunctionToExpression(expression::valueTypeToExpressionType(), value, error); if (!expression) { return {}; } auto defaultValue = convertDefaultValue(value, error); if (!defaultValue) { return {}; } return CompositeFunction(std::move(*expression), *defaultValue); } }; } // namespace conversion } // namespace style } // namespace mbgl