xref: /openbmc/sdbusplus/example/calculator-aserver.cpp (revision 3a363a6a5f50b6406ea2292cb4e48bf1ab7b55c4)
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