json - use unified error_handler accross grammars

This commit is contained in:
artemp 2015-11-02 13:10:40 +00:00
parent 25ed5d1e00
commit 58c7e5baa3
2 changed files with 18 additions and 34 deletions

View file

@ -59,13 +59,13 @@ struct apply_feature_callback
}
};
template <typename Iterator, typename FeatureType, typename FeatureCallback = default_feature_callback>
template <typename Iterator, typename FeatureType, typename FeatureCallback = default_feature_callback, typename ErrorHandler = error_handler<Iterator> >
struct feature_collection_grammar :
qi::grammar<Iterator, void(context_ptr const&, std::size_t&, FeatureCallback &), space_type>
{
feature_collection_grammar(mapnik::transcoder const& tr);
// grammars
feature_grammar<Iterator,FeatureType> feature_g;
feature_grammar<Iterator, FeatureType, ErrorHandler> feature_g;
// rules
qi::rule<Iterator, void(context_ptr const&, std::size_t&, FeatureCallback&), space_type> start; // START
qi::rule<Iterator, void(context_ptr const&, std::size_t&, FeatureCallback&), space_type> feature_collection;
@ -74,9 +74,11 @@ struct feature_collection_grammar :
qi::rule<Iterator, qi::locals<feature_ptr,int>, void(context_ptr const& ctx, std::size_t, FeatureCallback&), space_type> feature;
// phoenix functions
phoenix::function<apply_feature_callback> on_feature;
// error handler
boost::phoenix::function<ErrorHandler> const error_handler;
};
template <typename Iterator, typename FeatureType, typename FeatureCallback = default_feature_callback>
template <typename Iterator, typename FeatureType,typename FeatureCallback = default_feature_callback, typename ErrorHandler = error_handler<Iterator> >
struct feature_grammar_callback :
qi::grammar<Iterator, void(context_ptr const&, std::size_t&, FeatureCallback &), space_type>
{
@ -91,6 +93,8 @@ struct feature_grammar_callback :
// phoenix functions
phoenix::function<json::set_geometry_impl> set_geometry;
phoenix::function<apply_feature_callback> on_feature;
// error handler
boost::phoenix::function<ErrorHandler> const error_handler;
};

View file

@ -31,14 +31,14 @@
namespace mapnik { namespace json {
template <typename Iterator, typename FeatureType, typename FeatureCallback>
feature_collection_grammar<Iterator,FeatureType, FeatureCallback>::feature_collection_grammar(mapnik::transcoder const& tr)
template <typename Iterator, typename FeatureType, typename FeatureCallback, typename ErrorHandler>
feature_collection_grammar<Iterator,FeatureType, FeatureCallback,ErrorHandler>::feature_collection_grammar(mapnik::transcoder const& tr)
: feature_collection_grammar::base_type(start,"start"),
feature_g(tr)
{
qi::lit_type lit;
qi::eps_type eps;
//qi::_1_type _1;
qi::_1_type _1;
qi::_2_type _2;
qi::_3_type _3;
qi::_4_type _4;
@ -49,7 +49,8 @@ feature_collection_grammar<Iterator,FeatureType, FeatureCallback>::feature_colle
using phoenix::construct;
using phoenix::new_;
using phoenix::val;
using qi::on_error;
using qi::fail;
start = feature_collection(_r1, _r2, _r3)
;
@ -75,23 +76,12 @@ feature_collection_grammar<Iterator,FeatureType, FeatureCallback>::feature_colle
features.name("features");
feature.name("feature");
feature_g.name("feature-grammar");
qi::on_error<qi::fail>
(
start
, std::clog
<< phoenix::val("Error parsing GeoJSON ")
<< _4
<< phoenix::val(" here: \"")
<< construct<std::string>(_3, _2)
<< phoenix::val('\"')
<< std::endl
);
on_error<fail>(feature_collection, error_handler(_1, _2, _3, _4));
}
template <typename Iterator, typename FeatureType, typename FeatureCallback>
feature_grammar_callback<Iterator,FeatureType, FeatureCallback>::feature_grammar_callback(mapnik::transcoder const& tr)
template <typename Iterator, typename FeatureType, typename FeatureCallback, typename ErrorHandler>
feature_grammar_callback<Iterator,FeatureType, FeatureCallback,ErrorHandler>::feature_grammar_callback(mapnik::transcoder const& tr)
: feature_grammar_callback::base_type(start,"start"),
feature_g(tr)
{
@ -108,7 +98,8 @@ feature_grammar_callback<Iterator,FeatureType, FeatureCallback>::feature_grammar
using phoenix::construct;
using phoenix::new_;
using phoenix::val;
using qi::on_error;
using qi::fail;
start = feature_from_geometry(_r1, _r2, _r3) | feature(_r1, _r2, _r3)
;
@ -126,18 +117,7 @@ feature_grammar_callback<Iterator,FeatureType, FeatureCallback>::feature_grammar
feature_from_geometry.name("feature-from-geometry");
feature_g.name("feature-grammar");
geometry_g.name("geometry-grammar");
qi::on_error<qi::fail>
(
start
, std::clog
<< phoenix::val("Error parsing GeoJSON ")
<< _4
<< phoenix::val(" here: \"")
<< construct<std::string>(_3, _2)
<< phoenix::val('\"')
<< std::endl
);
on_error<fail>(feature, error_handler(_1, _2, _3, _4));
}
}}