};
template<based::string_literal Tag, element::Type MyType>
class HEMPLATE_EXPORT element_builder : public element
class element_builder;
template<based::string_literal Tag>
class HEMPLATE_EXPORT element_builder<Tag, element::Type::Boolean>
: public element
{
static auto close() { return std::format("</{}>", Tag.data()); }
static auto open(const attribute_list& attrs = {})
{
return attrs.empty() ? std::format("<{}>", Tag.data())
: std::format("<{} {}>", Tag.data(), attrs);
}
public:
// NOLINTBEGIN *-no-array-decay
template<typename... Args>
explicit element_builder(Args&&... args)
: element(MyType, Tag.data(), std::forward<Args>(args)...)
explicit element_builder(std::string_view data)
: element(open(), close(), data)
{
}
explicit element_builder(const is_element auto&... children)
: element(open(), close(), children...)
{
}
explicit element_builder(std::span<const element> children)
: element(open(), close(), children)
{
}
explicit element_builder(const attribute_list& attrs, std::string_view data)
: element(open(attrs), close(), data)
{
}
explicit element_builder(
const attribute_list& attrs, const is_element auto&... children
)
: element(open(attrs), close(), children...)
{
}
explicit element_builder(
const attribute_list& attrs, std::span<const element> children
)
: element(open(attrs), close(), children)
{
}
};
template<based::string_literal Tag>
class HEMPLATE_EXPORT element_builder<Tag, element::Type::Atomic>
: public element
{
static auto open(const attribute_list& attrs = {})
{
return attrs.empty() ? std::format("<{} />", Tag.data())
: std::format("<{} {} />", Tag.data(), attrs);
}
public:
explicit element_builder(const attribute_list& list = {})
: element(open(list))
{
}
};
class HEMPLATE_EXPORT blank : public element
{
public:
explicit blank(std::string_view data)
: element("", "", data)
{
}
explicit blank(const is_element auto&... children)
: element("", "", children...)
{
}
template<typename... Args>
explicit element_builder(attribute_list list, Args&&... args)
: element(
MyType, Tag.data(), std::move(list), std::forward<Args>(args)...
)
explicit blank(std::span<const element> children)
: element("", "", children)
{
}
// NOLINTEND *-no-array-decay
};
} // namespace hemplate