1bf0283aeSPatrick Williams #include <net/poettering/Calculator/aserver.hpp> 2bf0283aeSPatrick Williams #include <sdbusplus/async.hpp> 3bf0283aeSPatrick Williams 4bf0283aeSPatrick Williams class Calculator : 5bf0283aeSPatrick Williams public sdbusplus::aserver::net::poettering::Calculator<Calculator> 6bf0283aeSPatrick Williams { 7bf0283aeSPatrick Williams public: 8*3a363a6aSPatrick Williams explicit Calculator(sdbusplus::async::context& ctx, auto path) : 9*3a363a6aSPatrick Williams sdbusplus::aserver::net::poettering::Calculator<Calculator>(ctx, path) 10*3a363a6aSPatrick Williams {} 1172f7116aSPatrick Williams 12e15ff88bSPatrick Williams auto method_call(multiply_t, auto x, auto y) 13e15ff88bSPatrick Williams { 14e15ff88bSPatrick Williams auto r = x * y; 15e15ff88bSPatrick Williams last_result(r); 16e15ff88bSPatrick Williams return r; 17e15ff88bSPatrick Williams } 18e15ff88bSPatrick Williams 19e15ff88bSPatrick Williams auto method_call(divide_t, auto x, auto y) 20e15ff88bSPatrick Williams -> sdbusplus::async::task<divide_t::return_type> 21e15ff88bSPatrick Williams { 22*3a363a6aSPatrick Williams using sdbusplus::net::poettering::Calculator::Error::DivisionByZero; 23*3a363a6aSPatrick Williams if (y == 0) 24*3a363a6aSPatrick Williams { 25*3a363a6aSPatrick Williams status(State::Error); 26*3a363a6aSPatrick Williams throw DivisionByZero(); 27*3a363a6aSPatrick Williams } 28*3a363a6aSPatrick Williams 29e15ff88bSPatrick Williams auto r = x / y; 30e15ff88bSPatrick Williams last_result(r); 31e15ff88bSPatrick Williams co_return r; 32e15ff88bSPatrick Williams } 33e15ff88bSPatrick Williams 34e15ff88bSPatrick Williams auto method_call(clear_t) -> sdbusplus::async::task<> 35e15ff88bSPatrick Williams { 36*3a363a6aSPatrick Williams auto v = last_result(); 37e15ff88bSPatrick Williams last_result(0); 38*3a363a6aSPatrick Williams cleared(v); 39e15ff88bSPatrick Williams co_return; 40e15ff88bSPatrick Williams } 41bf0283aeSPatrick Williams }; 42bf0283aeSPatrick Williams 43bf0283aeSPatrick Williams int main() 44bf0283aeSPatrick Williams { 45*3a363a6aSPatrick Williams constexpr auto path = "/net/poettering/calculator"; 46*3a363a6aSPatrick Williams 47bf0283aeSPatrick Williams sdbusplus::async::context ctx; 48*3a363a6aSPatrick Williams sdbusplus::server::manager_t manager{ctx, path}; 49*3a363a6aSPatrick Williams 50*3a363a6aSPatrick Williams Calculator c{ctx, path}; 51*3a363a6aSPatrick Williams 52*3a363a6aSPatrick Williams ctx.spawn([](sdbusplus::async::context& ctx) -> sdbusplus::async::task<> { 53*3a363a6aSPatrick Williams ctx.get_bus().request_name("net.poettering.Calculator"); 54*3a363a6aSPatrick Williams co_return; 55*3a363a6aSPatrick Williams }(ctx)); 56bf0283aeSPatrick Williams 57bf0283aeSPatrick Williams ctx.run(); 58bf0283aeSPatrick Williams 59bf0283aeSPatrick Williams return 0; 60bf0283aeSPatrick Williams } 61