Skip to content

Commit 2e554c8

Browse files
committed
feat: handlebars error handling
1 parent a2e033b commit 2e554c8

21 files changed

+3072
-1252
lines changed

include/mrdox/Dom/Function.hpp

+6
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,12 @@ class MRDOX_DECL
224224
template<class... Args>
225225
Value operator()(Args&&... args) const;
226226

227+
/** Invoke the function.
228+
*/
229+
template<class... Args>
230+
Expected<Value>
231+
try_invoke(Args&&... args) const;
232+
227233
/** Swap two objects.
228234
*/
229235
void swap(Function& other) noexcept

include/mrdox/Dom/Function.ipp

+40-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ template<class... Args>
3232
Value
3333
Function::
3434
operator()(Args&&... args) const
35+
{
36+
return try_invoke(std::forward<Args>(args)...).value();
37+
}
38+
39+
template<class... Args>
40+
Expected<Value>
41+
Function::
42+
try_invoke(Args&&... args) const
3543
{
3644
typename Array::storage_type elements;
3745
elements.reserve(sizeof...(Args));
@@ -42,7 +50,7 @@ operator()(Args&&... args) const
4250
std::forward<Args>(args)), 0)... };
4351
}
4452
return call(newArray<DefaultArrayImpl>(
45-
std::move(elements))).value();
53+
std::move(elements)));
4654
}
4755

4856
//------------------------------------------------
@@ -169,6 +177,17 @@ call_impl(
169177
>::get(clone[I])...);
170178
return Value(Kind::Undefined);
171179
}
180+
else if constexpr (std::same_as<R, Expected<void>>)
181+
{
182+
auto exp = f_(arg_type<std::decay_t<
183+
std::tuple_element_t<I, args_type> >
184+
>::get(clone[I])...);
185+
if (!exp)
186+
{
187+
return Unexpected(exp.error());
188+
}
189+
return Value(Kind::Undefined);
190+
}
172191
else
173192
{
174193
return f_(arg_type<std::decay_t<
@@ -183,6 +202,17 @@ call_impl(
183202
>::get(args[I])...);
184203
return Value(Kind::Undefined);
185204
}
205+
else if constexpr (std::same_as<R, Expected<void>>)
206+
{
207+
auto exp = f_(arg_type<std::decay_t<
208+
std::tuple_element_t<I, args_type> >
209+
>::get(args[I])...);
210+
if (!exp)
211+
{
212+
return Unexpected(exp.error());
213+
}
214+
return Value(Kind::Undefined);
215+
}
186216
else
187217
{
188218
return f_(arg_type<std::decay_t<
@@ -205,6 +235,15 @@ call(Array const& args) const ->
205235
f_(args);
206236
return Value(Kind::Undefined);
207237
}
238+
else if constexpr (std::is_same_v<R, Expected<void>>)
239+
{
240+
auto exp = f_(args);
241+
if (!exp)
242+
{
243+
return Unexpected(exp.error());
244+
}
245+
return Value(Kind::Undefined);
246+
}
208247
else
209248
{
210249
return f_(args);

0 commit comments

Comments
 (0)