xref: /openbmc/sdbusplus/example/calculator-aserver.cpp (revision c53fe51ca59c5a1d7711aa5c1c7eb5b5ac6e6850)
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:
83a363a6aSPatrick Williams     explicit Calculator(sdbusplus::async::context& ctx, auto path) :
93a363a6aSPatrick Williams         sdbusplus::aserver::net::poettering::Calculator<Calculator>(ctx, path)
103a363a6aSPatrick 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     {
2243fcd1ceSPatrick Williams         using sdbusplus::error::net::poettering::calculator::DivisionByZero;
233a363a6aSPatrick Williams         if (y == 0)
243a363a6aSPatrick Williams         {
253a363a6aSPatrick Williams             status(State::Error);
263a363a6aSPatrick Williams             throw DivisionByZero();
273a363a6aSPatrick Williams         }
283a363a6aSPatrick 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     {
363a363a6aSPatrick Williams         auto v = last_result();
37e15ff88bSPatrick Williams         last_result(0);
383a363a6aSPatrick Williams         cleared(v);
39e15ff88bSPatrick Williams         co_return;
40e15ff88bSPatrick Williams     }
41bf0283aeSPatrick Williams };
42bf0283aeSPatrick Williams 
43bf0283aeSPatrick Williams int main()
44bf0283aeSPatrick Williams {
45b4bae8f6SPatrick Williams     constexpr auto path = Calculator::instance_path;
463a363a6aSPatrick Williams 
47bf0283aeSPatrick Williams     sdbusplus::async::context ctx;
483a363a6aSPatrick Williams     sdbusplus::server::manager_t manager{ctx, path};
493a363a6aSPatrick Williams 
503a363a6aSPatrick Williams     Calculator c{ctx, path};
513a363a6aSPatrick Williams 
523a363a6aSPatrick Williams     ctx.spawn([](sdbusplus::async::context& ctx) -> sdbusplus::async::task<> {
53*c53fe51cSPatrick Williams         ctx.request_name(Calculator::default_service);
543a363a6aSPatrick Williams         co_return;
553a363a6aSPatrick Williams     }(ctx));
56bf0283aeSPatrick Williams 
57bf0283aeSPatrick Williams     ctx.run();
58bf0283aeSPatrick Williams 
59bf0283aeSPatrick Williams     return 0;
60bf0283aeSPatrick Williams }
61