di 0.1.0
Loading...
Searching...
No Matches
writer_format_context.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/format/prelude.h"
5#include "di/util/bit_cast.h"
7
8namespace di::io {
9template<Impl<Writer> Writer, concepts::Encoding Enc>
11public:
12 using Encoding = Enc;
13 using SupportsStyle = void;
14
15 constexpr explicit WriterFormatContext(Writer& writer, Enc enc) : m_writer(writer), m_encoding(enc) {
16 m_print_colors = interactive_device(writer);
17 }
18
19 constexpr ~WriterFormatContext() { (void) flush(m_writer); }
20
21 constexpr void output(meta::EncodingCodePoint<Enc> code_point) {
22 auto code_units = container::string::encoding::convert_to_code_units(m_encoding, code_point);
23
24 for (auto code_unit : code_units) {
25 auto bytes = util::bit_cast<Array<Byte, sizeof(code_unit)>>(code_unit);
26 (void) write_some(m_writer, bytes.span());
27 }
28 }
29
31 if (!m_print_colors) {
32 return inner();
33 }
34
35 auto [before, after] = style.render_to_ansi_escapes<Enc>();
36 for (auto code_point : before) {
37 output(code_point);
38 }
39 DI_TRY(inner());
40 for (auto code_point : after) {
41 output(code_point);
42 }
43 return {};
44 }
45
46 constexpr auto encoding() const { return m_encoding; }
47
48private:
49 Writer& m_writer;
50 [[no_unique_address]] Enc m_encoding;
51 bool m_print_colors { false };
52};
53}
Definition style.h:45
Enc Encoding
Definition writer_format_context.h:12
constexpr ~WriterFormatContext()
Definition writer_format_context.h:19
constexpr auto with_style(format::Style style, concepts::InvocableTo< Result< void > > auto inner) -> Result< void >
Definition writer_format_context.h:30
constexpr void output(meta::EncodingCodePoint< Enc > code_point)
Definition writer_format_context.h:21
void SupportsStyle
Definition writer_format_context.h:13
constexpr auto encoding() const
Definition writer_format_context.h:46
constexpr WriterFormatContext(Writer &writer, Enc enc)
Definition writer_format_context.h:15
Definition invoke.h:69
#define DI_TRY(...)
Definition monad_try.h:13
constexpr auto convert_to_code_units
Definition encoding.h:139
Definition reader.h:7
constexpr auto flush
Definition writer.h:82
constexpr auto interactive_device
Definition writer.h:83
meta::List< WriteSome, Flush, InteractiveDevice > Writer
Definition writer.h:85
constexpr auto write_some
Definition writer.h:81
RemoveCVRef< T >::CodePoint EncodingCodePoint
Definition encoding.h:19
std::byte Byte
Definition byte.h:63
Expected< T, Error > Result
Definition result.h:8
Definition array.h:27