1 #pragma once
2 
3 #include <mbgl/style/conversion.hpp>
4 #include <mbgl/style/sources/custom_geometry_source.hpp>
5 
6 namespace mbgl {
7 namespace style {
8 namespace conversion {
9 
10 template <>
11 struct Converter<CustomGeometrySource::Options> {
12 
13     template <class V>
operator ()mbgl::style::conversion::Converter14     optional<CustomGeometrySource::Options> operator()(const V& value, Error& error) const {
15         CustomGeometrySource::Options options;
16 
17         const auto minzoomValue = objectMember(value, "minzoom");
18         if (minzoomValue) {
19             if (toNumber(*minzoomValue)) {
20                 options.zoomRange.min = static_cast<uint8_t>(*toNumber(*minzoomValue));
21             } else {
22                 error = { "GeoJSON source minzoom value must be a number" };
23                 return {};
24             }
25         }
26 
27         const auto maxzoomValue = objectMember(value, "maxzoom");
28         if (maxzoomValue) {
29             if (toNumber(*maxzoomValue)) {
30                 options.zoomRange.max = static_cast<uint8_t>(*toNumber(*maxzoomValue));
31             } else {
32                 error = { "GeoJSON source maxzoom value must be a number" };
33                 return {};
34             }
35         }
36 
37         const auto bufferValue = objectMember(value, "buffer");
38         if (bufferValue) {
39             if (toNumber(*bufferValue)) {
40                 options.tileOptions.buffer = static_cast<uint16_t>(*toNumber(*bufferValue));
41             } else {
42                 error = { "GeoJSON source buffer value must be a number" };
43                 return {};
44             }
45         }
46 
47         const auto toleranceValue = objectMember(value, "tolerance");
48         if (toleranceValue) {
49             if (toNumber(*toleranceValue)) {
50                 options.tileOptions.tolerance = static_cast<double>(*toNumber(*toleranceValue));
51             } else {
52                 error = { "GeoJSON source tolerance value must be a number" };
53                 return {};
54             }
55         }
56 
57         const auto wrapValue = objectMember(value, "wrap");
58         if (wrapValue) {
59             if (toBool(*wrapValue)) {
60                 options.tileOptions.wrap = static_cast<bool>(*toBool(*wrapValue));
61             } else {
62                 error = { "CustomGeometrySource TileOptions wrap value must be a boolean" };
63                 return {};
64             }
65         }
66 
67         const auto clipValue = objectMember(value, "clip");
68         if (clipValue) {
69             if (toBool(*clipValue)) {
70                 options.tileOptions.clip = static_cast<double>(*toBool(*clipValue));
71             } else {
72                 error = { "CustomGeometrySource TileOptiosn clip value must be a boolean" };
73                 return {};
74             }
75         }
76 
77         return { options };
78     }
79 
80 };
81 
82 } // namespace conversion
83 } // namespace style
84 } // namespace mbgl
85