8#include <userver/compiler/impl/lifetime.hpp>
9#include <userver/engine/async.hpp>
10#include <userver/engine/impl/task_context_factory.hpp>
11#include <userver/engine/task/shared_task_with_result.hpp>
12#include <userver/engine/task/task_with_result.hpp>
13#include <userver/utils/impl/span_wrap_call.hpp>
14#include <userver/utils/overloaded.hpp>
16USERVER_NAMESPACE_BEGIN
27class TaskBuilder
final {
29 TaskBuilder() =
default;
31 TaskBuilder(
const TaskBuilder&) =
default;
33 TaskBuilder(TaskBuilder&&) =
default;
35 TaskBuilder& operator=(
const TaskBuilder&) =
default;
37 TaskBuilder& operator=(TaskBuilder&&) =
default;
41 TaskBuilder&
Critical() USERVER_IMPL_LIFETIME_BOUND;
45 TaskBuilder&
SpanName(std::string&& name) USERVER_IMPL_LIFETIME_BOUND;
51 TaskBuilder&
HideSpan() USERVER_IMPL_LIFETIME_BOUND;
56 TaskBuilder&
NoSpan() USERVER_IMPL_LIFETIME_BOUND;
61 TaskBuilder&
TaskProcessor(engine::TaskProcessor& tp) USERVER_IMPL_LIFETIME_BOUND;
66 TaskBuilder&
Deadline(engine::Deadline deadline) USERVER_IMPL_LIFETIME_BOUND;
80 template <
typename Function,
typename... Args>
81 auto Build(Function&& f, Args&&... args);
90 template <
typename Function,
typename... Args>
94 engine::impl::TaskConfig MakeConfig()
const;
98 utils::impl::SpanWrapCall::HideSpan hide_span,
99 const utils::impl::SourceLocation& location = utils::impl::SourceLocation::Current()
102 template <
typename Task,
typename Function,
typename... Args>
103 Task BuildTask(Function&& f, Args&&... args);
107 struct HideSpanTag {};
110 engine::TaskProcessor* tp_{
nullptr};
111 engine::Task::Importance importance_{engine::Task::Importance::kNormal};
112 engine::Task::WaitMode wait_mode_{engine::Task::WaitMode::kSingleWaiter};
113 engine::Deadline deadline_;
114 std::optional<std::variant<std::string, NoSpanTag, HideSpanTag>> span_;
115 utils::impl::SpanWrapCall::InheritVariables inherit_variables_{utils::impl::SpanWrapCall::InheritVariables::kYes};
118inline auto TaskBuilder::MakeSpanFunctor(
120 utils::impl::SpanWrapCall::HideSpan hide_span,
121 const utils::impl::SourceLocation& location
123 return utils::impl::SpanLazyPrvalue(std::move(name), inherit_variables_, hide_span, location);
126template <
typename Function,
typename... Args>
127auto TaskBuilder::
Build(Function&& f, Args&&... args) {
128 using Task = engine::TaskWithResult<std::invoke_result_t<Function, Args...>>;
129 return BuildTask<Task>(std::forward<Function>(f), std::forward<Args>(args)...);
132template <
typename Function,
typename... Args>
135 return BuildTask<Task>(std::forward<Function>(f), std::forward<Args>(args)...);
138template <
typename Task,
typename Function,
typename... Args>
139Task TaskBuilder::BuildTask(Function&& f, Args&&... args) {
142 "Exactly one of the following methods of TaskBuilder must be called: SpanName(), NoSpan(), HideSpan()"
145 using HideSpan = utils::impl::SpanWrapCall::HideSpan;
149 [&](
const std::string& name) {
150 return Task{engine::impl::MakeTask(
152 MakeSpanFunctor({name}, HideSpan::kNo),
153 std::forward<Function>(f),
154 std::forward<Args>(args)...
158 return Task{engine::impl::MakeTask(MakeConfig(), std::forward<Function>(f), std::forward<Args>(args)...)};
161 return Task{engine::impl::MakeTask(
163 MakeSpanFunctor({}, HideSpan::kYes),
164 std::forward<Function>(f),
165 std::forward<Args>(args)...