1 #include <net/poettering/Calculator/aserver.hpp>
2 #include <sdbusplus/async.hpp>
3 
4 #include <iostream>
5 
6 class Calculator :
7     public sdbusplus::aserver::net::poettering::Calculator<Calculator>
8 {
9   public:
10     explicit Calculator(sdbusplus::async::context& ctx, auto path) :
11         sdbusplus::aserver::net::poettering::Calculator<Calculator>(ctx, path)
12     {}
13 
14     auto method_call(multiply_t, auto x, auto y)
15     {
16         auto r = x * y;
17         last_result(r);
18         return r;
19     }
20 
21     auto method_call(divide_t, auto x,
22                      auto y) -> sdbusplus::async::task<divide_t::return_type>
23     {
24         using sdbusplus::error::net::poettering::calculator::DivisionByZero;
25         if (y == 0)
26         {
27             status(State::Error);
28             throw DivisionByZero();
29         }
30 
31         auto r = x / y;
32         last_result(r);
33         co_return r;
34     }
35 
36     auto method_call(clear_t) -> sdbusplus::async::task<>
37     {
38         auto v = last_result();
39         last_result(0);
40         cleared(v);
41         co_return;
42     }
43 
44     auto get_property(owner_t) const
45     {
46         std::cout << " get_property on owner\n";
47         return owner_;
48     }
49 
50     bool set_property(owner_t, auto owner)
51     {
52         std::cout << " set_property on owner\n";
53         std::swap(owner_, owner);
54         return owner_ == owner;
55     }
56 };
57 
58 int main()
59 {
60     constexpr auto path = Calculator::instance_path;
61 
62     sdbusplus::async::context ctx;
63     sdbusplus::server::manager_t manager{ctx, path};
64 
65     Calculator c{ctx, path};
66 
67     ctx.spawn([](sdbusplus::async::context& ctx) -> sdbusplus::async::task<> {
68         ctx.request_name(Calculator::default_service);
69         co_return;
70     }(ctx));
71 
72     ctx.run();
73 
74     return 0;
75 }
76