// Copyright (c) 2018-2019 Emil Dotchevski // Copyright (c) 2018-2019 Second Spectrum, Inc. // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include #include "_test_res.hpp" #include "boost/core/lightweight_test.hpp" namespace leaf = boost::leaf; template struct info { int value; }; res f( bool succeed ) { if( succeed ) return 42; else return make_error_code(errc_a::a0); } res g( bool succeed ) { if( auto r = f(succeed) ) return r; else return leaf::error_id(r.error()).propagate(info<42>{42}); } int main() { { res r = leaf::handle_some( [ ] { return g(true); } ); BOOST_TEST(r); BOOST_TEST_EQ(r.value(), 42); } { int called = 0; res r = leaf::handle_some( [&] { auto r = g(false); BOOST_TEST(!r); auto ec = r.error(); BOOST_TEST_EQ(ec.message(), "LEAF error, use with leaf::handle_some or leaf::handle_all."); BOOST_TEST(!std::strcmp(ec.category().name(),"LEAF error, use with leaf::handle_some or leaf::handle_all.")); return r; }, [&]( info<42> const & x, leaf::match, cond_x::x00> ec ) { called = 1; BOOST_TEST_EQ(x.value, 42); return ec.value(); } ); BOOST_TEST(!r); BOOST_TEST_EQ(r.error(), make_error_code(errc_a::a0)); BOOST_TEST(called); } return boost::report_errors(); }