Iros
 
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 if constexpr (requires { writer.interactive_device(); }) {
17 m_print_colors = writer.interactive_device();
18 }
19 }
20
21 constexpr ~WriterFormatContext() { (void) flush(m_writer); }
22
23 constexpr void output(meta::EncodingCodePoint<Enc> code_point) {
24 auto code_units = container::string::encoding::convert_to_code_units(m_encoding, code_point);
25
26 for (auto code_unit : code_units) {
27 auto bytes = util::bit_cast<Array<Byte, sizeof(code_unit)>>(code_unit);
28 (void) write_some(m_writer, bytes.span());
29 }
30 }
31
33 if (!m_print_colors) {
34 return inner();
35 }
36
37 auto [before, after] = style.render_to_ansi_escapes<Enc>();
38 for (auto code_point : before) {
39 output(code_point);
40 }
41 DI_TRY(inner());
42 for (auto code_point : after) {
43 output(code_point);
44 }
45 return {};
46 }
47
48 constexpr auto encoding() const { return m_encoding; }
49
50private:
51 Writer& m_writer;
52 [[no_unique_address]] Enc m_encoding;
53 bool m_print_colors { false };
54};
55}
Definition style.h:45
Enc Encoding
Definition writer_format_context.h:12
constexpr ~WriterFormatContext()
Definition writer_format_context.h:21
constexpr auto with_style(format::Style style, concepts::InvocableTo< Result< void > > auto inner) -> Result< void >
Definition writer_format_context.h:32
constexpr void output(meta::EncodingCodePoint< Enc > code_point)
Definition writer_format_context.h:23
void SupportsStyle
Definition writer_format_context.h:13
constexpr auto encoding() const
Definition writer_format_context.h:48
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:57
meta::List< WriteSome, Flush > Writer
Definition writer.h:59
constexpr auto write_some
Definition writer.h:56
RemoveCVRef< T >::CodePoint EncodingCodePoint
Definition encoding.h:19
std::byte Byte
Definition byte.h:63
Expected< T, Error > Result
Definition result.h:8
Definition span_fixed_size.h:37