6#include <userver/compiler/impl/lifetime.hpp>
7#include <userver/engine/impl/task_context_factory.hpp>
8#include <userver/engine/task/shared_task_with_result.hpp>
9#include <userver/engine/task/task_with_result.hpp>
10#include <userver/utils/impl/span_wrap_call.hpp>
12USERVER_NAMESPACE_BEGIN
18struct TaskBuilderOptions
final {
19 engine::TaskProcessor* task_processor{
nullptr};
21 engine::Deadline deadline;
22 bool inherit_variables{
true};
25struct TaskBuilderWithoutSelectedSpanOptions
final {};
27struct TaskBuilderWithSpanOptions
final {
28 std::string span_name;
31struct TaskBuilderHideSpanOptions
final {};
33struct TaskBuilderNoSpanOptions
final {};
35template <
typename Task>
36engine::
impl::TaskConfig MakeTaskConfig(
const TaskBuilderOptions& options) {
37 return {options.task_processor, options.importance, Task::kWaitMode, options.deadline};
40template <
typename Task,
typename Function,
typename... Args>
42 const TaskBuilderOptions&,
43 const TaskBuilderWithoutSelectedSpanOptions&,
44 const utils::impl::SourceLocation&,
50 "Exactly one of the following methods of TaskBuilder must be called: SpanName(), NoSpan(), HideSpan()"
54template <
typename Task,
typename Function,
typename... Args>
56 const TaskBuilderOptions& options,
57 const TaskBuilderWithSpanOptions& options_ext,
58 const utils::impl::SourceLocation& source_location,
62 return Task{engine::
impl::MakeTask(
63 impl::MakeTaskConfig<Task>(options),
64 utils::impl::SpanLazyPrvalue(
65 std::string{options_ext.span_name},
66 utils::impl::SpanWrapCall::InheritVariables{options.inherit_variables},
67 utils::impl::SpanWrapCall::HideSpan::kNo,
70 std::forward<Function>(f),
71 std::forward<Args>(args)...
75template <
typename Task,
typename Function,
typename... Args>
77 const TaskBuilderOptions& options,
78 const TaskBuilderHideSpanOptions&,
79 const utils::impl::SourceLocation& source_location,
83 return Task{engine::
impl::MakeTask(
84 impl::MakeTaskConfig<Task>(options),
85 utils::impl::SpanLazyPrvalue(
87 utils::impl::SpanWrapCall::InheritVariables{options.inherit_variables},
88 utils::impl::SpanWrapCall::HideSpan::kYes,
91 std::forward<Function>(f),
92 std::forward<Args>(args)...
96template <
typename Task,
typename Function,
typename... Args>
98 const TaskBuilderOptions& options,
99 const TaskBuilderNoSpanOptions&,
100 const utils::impl::SourceLocation&,
105 UINVARIANT(!options.inherit_variables,
"Task-inherited variables without span are not supported at the moment");
107 return Task{engine::
impl::MakeTask(
108 impl::MakeTaskConfig<Task>(options),
109 std::forward<Function>(f),
110 std::forward<Args>(args)...
116template <
typename OptionsImpl>
120using TaskBuilderWithSpan =
TaskBuilder<impl::TaskBuilderWithSpanOptions>;
123using TaskBuilderHideSpan =
TaskBuilder<impl::TaskBuilderHideSpanOptions>;
126using TaskBuilderNoSpan =
TaskBuilder<impl::TaskBuilderNoSpanOptions>;
129using TaskBuilderBase =
TaskBuilder<impl::TaskBuilderWithoutSelectedSpanOptions>;
151template <
typename OptionsImpl>
155 requires std::same_as<
TaskBuilder, TaskBuilderBase>
166 requires std::same_as<
TaskBuilder, TaskBuilderBase>
168 return TaskBuilderWithSpan{*
this, impl::TaskBuilderWithSpanOptions{.span_name = std::move(name)}};
176 requires std::same_as<
TaskBuilder, TaskBuilderBase>
178 return TaskBuilderHideSpan{*
this, impl::TaskBuilderHideSpanOptions{}};
185 requires std::same_as<
TaskBuilder, TaskBuilderBase>
187 return TaskBuilderNoSpan{*
this, impl::TaskBuilderNoSpanOptions{}};
201 options_.task_processor = &tp;
209 options_.deadline = deadline;
217 options_.inherit_variables =
false;
228 template <
typename Function,
typename... Args>
229 [[nodiscard]]
auto Build(Function&& f, Args&&... args)
const;
238 template <
typename Function,
typename... Args>
239 [[nodiscard]]
auto BuildShared(Function&& f, Args&&... args)
const;
242 template <
typename OtherOptions>
245 template <
typename OtherOptions>
246 TaskBuilder(
const TaskBuilder<OtherOptions>& other, OptionsImpl&& options_ext)
247 : options_(other.options_),
248 options_ext_(std::move(options_ext))
251 impl::TaskBuilderOptions options_{};
259template <
typename Function,
typename... Args>
261 using Task = engine::
TaskWithResult<std::invoke_result_t<Function, Args...>>;
262 return impl::BuildTask<Task>(
265 utils::impl::SourceLocation::Current(),
266 std::forward<Function>(f),
267 std::forward<Args>(args)...
272template <
typename Function,
typename... Args>
275 return impl::BuildTask<Task>(
278 utils::impl::SourceLocation::Current(),
279 std::forward<Function>(f),
280 std::forward<Args>(args)...
284extern template class TaskBuilder<impl::TaskBuilderWithoutSelectedSpanOptions>;
285extern template class TaskBuilder<impl::TaskBuilderWithSpanOptions>;
286extern template class TaskBuilder<impl::TaskBuilderHideSpanOptions>;
287extern template class TaskBuilder<impl::TaskBuilderNoSpanOptions>;