| 30 | namespace { |
| 31 | template<typename Func> |
| 32 | auto wrap(char **err, Func f) -> decltype(f()) { |
| 33 | try { |
| 34 | return f(); |
| 35 | } |
| 36 | catch (std::exception const& e) { |
| 37 | *err = strdup(e.what()); |
| 38 | } |
| 39 | catch (agi::Exception const& e) { |
| 40 | *err = strndup(e.GetMessage()); |
| 41 | } |
| 42 | catch (...) { |
| 43 | *err = strdup("Unknown error"); |
| 44 | } |
| 45 | return 0; |
| 46 | } |
| 47 | |
| 48 | template<typename Ret> |
| 49 | bool setter(const char *path, char **err, Ret (*f)(agi::fs::path const&)) { |