• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

tstack / lnav / 17589970077-2502

09 Sep 2025 05:00PM UTC coverage: 65.196% (-5.0%) from 70.225%
17589970077-2502

push

github

tstack
[format] add fields for source file/line

Knowing the source file/line context in a log
message can help find log messages when using
log2src.

56 of 70 new or added lines in 2 files covered. (80.0%)

13954 existing lines in 210 files now uncovered.

45516 of 69814 relevant lines covered (65.2%)

404154.37 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

82.22
/src/base/string_attr_type.hh
1
/**
2
 * Copyright (c) 2020, Timothy Stack
3
 *
4
 * All rights reserved.
5
 *
6
 * Redistribution and use in source and binary forms, with or without
7
 * modification, are permitted provided that the following conditions are met:
8
 *
9
 * * Redistributions of source code must retain the above copyright notice, this
10
 * list of conditions and the following disclaimer.
11
 * * Redistributions in binary form must reproduce the above copyright notice,
12
 * this list of conditions and the following disclaimer in the documentation
13
 * and/or other materials provided with the distribution.
14
 * * Neither the name of Timothy Stack nor the names of its contributors
15
 * may be used to endorse or promote products derived from this software
16
 * without specific prior written permission.
17
 *
18
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ''AS IS'' AND ANY
19
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
22
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
 */
29

30
#ifndef lnav_string_attr_type_hh
31
#define lnav_string_attr_type_hh
32

33
#include <memory>
34
#include <optional>
35
#include <string>
36
#include <utility>
37

38
#include <stdint.h>
39

40
#include "base/file_range.hh"
41
#include "base/intern_string.hh"
42
#include "base/string_util.hh"
43
#include "color_spaces.hh"
44
#include "enum_util.hh"
45
#include "mapbox/variant.hpp"
46
#include "text_format_enum.hh"
47

48
class logfile;
49
struct bookmark_metadata;
50

51
enum class ui_icon_t : int32_t {
52
    hidden,
53
    ok,
54
    info,
55
    warning,
56
    error,
57

58
    log_level_trace,
59
    log_level_debug,
60
    log_level_info,
61
    log_level_stats,
62
    log_level_notice,
63
    log_level_warning,
64
    log_level_error,
65
    log_level_critical,
66
    log_level_fatal,
67

68
    play,
69
    edit,
70
};
71

72
constexpr auto ui_icon_count = lnav::enums::to_underlying(ui_icon_t::edit) + 1;
73

74
/** Roles that can be mapped to curses attributes using attrs_for_role() */
75
enum class role_t : int32_t {
76
    VCR_NONE = -1,
77

78
    VCR_TEXT, /*< Raw text. */
79
    VCR_IDENTIFIER,
80
    VCR_SEARCH, /*< A search hit. */
81
    VCR_OK,
82
    VCR_INFO,
83
    VCR_ERROR, /*< An error message. */
84
    VCR_WARNING, /*< A warning message. */
85
    VCR_ALT_ROW, /*< Highlight for alternating rows in a list */
86
    VCR_HIDDEN,
87
    VCR_CURSOR_LINE,
88
    VCR_DISABLED_CURSOR_LINE,
89
    VCR_ADJUSTED_TIME,
90
    VCR_SKEWED_TIME,
91
    VCR_OFFSET_TIME,
92
    VCR_TIME_COLUMN,
93
    VCR_TIME_COLUMN_TO_TEXT,
94
    VCR_FILE_OFFSET,
95
    VCR_INVALID_MSG,
96
    VCR_STATUS, /*< Normal status line text. */
97
    VCR_WARN_STATUS,
98
    VCR_ALERT_STATUS, /*< Alert status line text. */
99
    VCR_ACTIVE_STATUS, /*< */
100
    VCR_ACTIVE_STATUS2, /*< */
101
    VCR_STATUS_TITLE,
102
    VCR_STATUS_SUBTITLE,
103
    VCR_STATUS_INFO,
104
    VCR_STATUS_STITCH_TITLE_TO_SUB,
105
    VCR_STATUS_STITCH_SUB_TO_TITLE,
106
    VCR_STATUS_STITCH_SUB_TO_NORMAL,
107
    VCR_STATUS_STITCH_NORMAL_TO_SUB,
108
    VCR_STATUS_STITCH_TITLE_TO_NORMAL,
109
    VCR_STATUS_STITCH_NORMAL_TO_TITLE,
110
    VCR_STATUS_TITLE_HOTKEY,
111
    VCR_STATUS_DISABLED_TITLE,
112
    VCR_STATUS_HOTKEY,
113
    VCR_INACTIVE_STATUS,
114
    VCR_INACTIVE_ALERT_STATUS,
115
    VCR_SCROLLBAR,
116
    VCR_SCROLLBAR_ERROR,
117
    VCR_SCROLLBAR_WARNING,
118
    VCR_FOCUSED,
119
    VCR_DISABLED_FOCUSED,
120
    VCR_POPUP,
121
    VCR_POPUP_BORDER,
122
    VCR_COLOR_HINT,
123

124
    VCR_QUOTED_CODE,
125
    VCR_CODE_BORDER,
126
    VCR_KEYWORD,
127
    VCR_STRING,
128
    VCR_COMMENT,
129
    VCR_DOC_DIRECTIVE,
130
    VCR_VARIABLE,
131
    VCR_SYMBOL,
132
    VCR_NULL,
133
    VCR_ASCII_CTRL,
134
    VCR_NON_ASCII,
135
    VCR_NUMBER,
136
    VCR_RE_SPECIAL,
137
    VCR_RE_REPEAT,
138
    VCR_FILE,
139

140
    VCR_DIFF_DELETE, /*< Deleted line in a diff. */
141
    VCR_DIFF_ADD, /*< Added line in a diff. */
142
    VCR_DIFF_SECTION, /*< Section marker in a diff. */
143

144
    VCR_LOW_THRESHOLD,
145
    VCR_MED_THRESHOLD,
146
    VCR_HIGH_THRESHOLD,
147

148
    VCR_H1,
149
    VCR_H2,
150
    VCR_H3,
151
    VCR_H4,
152
    VCR_H5,
153
    VCR_H6,
154

155
    VCR_HR,
156
    VCR_HYPERLINK,
157
    VCR_LIST_GLYPH,
158
    VCR_BREADCRUMB,
159
    VCR_TABLE_BORDER,
160
    VCR_TABLE_HEADER,
161
    VCR_QUOTE_BORDER,
162
    VCR_QUOTED_TEXT,
163
    VCR_FOOTNOTE_BORDER,
164
    VCR_FOOTNOTE_TEXT,
165
    VCR_SNIPPET_BORDER,
166
    VCR_INDENT_GUIDE,
167
    VCR_INLINE_CODE,
168
    VCR_FUNCTION,
169
    VCR_TYPE,
170
    VCR_SEP_REF_ACC,
171
    VCR_SUGGESTION,
172
    VCR_SELECTED_TEXT,
173
    VCR_FUZZY_MATCH,
174

175
    VCR_OBJECT_KEY,
176

177
    VCR__MAX
178
};
179

180
struct text_attrs {
181
    enum class style : uint32_t {
182
        none = 0x0000,
183
        struck = 0x0001u,
184
        bold = 0x0002u,
185
        undercurl = 0x0004u,
186
        underline = 0x0008u,
187
        italic = 0x0010u,
188
        altcharset = 0x0020u,
189
        blink = 0x0040u,
190
        reverse = 0x1000u,
191
    };
192

193
    static text_attrs with_struck()
567✔
194
    {
195
        return text_attrs{
567✔
196
            lnav::enums::to_underlying(style::struck),
197
        };
567✔
198
    }
199

200
    static text_attrs with_bold()
757✔
201
    {
202
        return text_attrs{
757✔
203
            lnav::enums::to_underlying(style::bold),
204
        };
757✔
205
    }
206

207
    static text_attrs with_undercurl()
208
    {
209
        return text_attrs{
210
            lnav::enums::to_underlying(style::undercurl),
211
        };
212
    }
213

214
    static text_attrs with_underline()
3,804✔
215
    {
216
        return text_attrs{
3,804✔
217
            lnav::enums::to_underlying(style::underline),
218
        };
3,804✔
219
    }
220

221
    static text_attrs with_italic()
567✔
222
    {
223
        return text_attrs{
567✔
224
            lnav::enums::to_underlying(style::italic),
225
        };
567✔
226
    }
227

228
    static text_attrs with_reverse()
23,279✔
229
    {
230
        return text_attrs{
23,279✔
231
            lnav::enums::to_underlying(style::reverse),
232
        };
23,279✔
233
    }
234

235
    static text_attrs with_altcharset()
236
    {
UNCOV
237
        return text_attrs{
×
238
            lnav::enums::to_underlying(style::altcharset),
239
        };
240
    }
241

242
    static text_attrs with_blink()
243
    {
UNCOV
244
        return text_attrs{
×
245
            lnav::enums::to_underlying(style::blink),
246
        };
247
    }
248

249
    template<typename... Args>
250
    static text_attrs with_styles(Args... args)
228✔
251
    {
252
        auto retval = text_attrs{};
228✔
253

254
        for (auto arg : {args...}) {
684✔
255
            retval.ta_attrs |= lnav::enums::to_underlying(arg);
456✔
256
        }
257
        return retval;
228✔
258
    }
259

260
    bool empty() const
45,699✔
261
    {
262
        return this->ta_attrs == 0 && this->ta_fg_color.empty()
36,209✔
263
            && this->ta_bg_color.empty();
81,908✔
264
    }
265

266
    text_attrs operator|(const text_attrs& other) const
39,906✔
267
    {
268
        return text_attrs{
79,812✔
269
            this->ta_attrs | other.ta_attrs,
39,906✔
270
            !this->ta_fg_color.empty() ? this->ta_fg_color : other.ta_fg_color,
39,906✔
271
            !this->ta_bg_color.empty() ? this->ta_bg_color : other.ta_bg_color,
39,906✔
272
        };
39,906✔
273
    }
274

275
    text_attrs operator|(const style other) const
816✔
276
    {
UNCOV
277
        return text_attrs{
×
278
            this->ta_attrs | lnav::enums::to_underlying(other),
816✔
279
            this->ta_fg_color,
816✔
280
            this->ta_bg_color,
816✔
281
        };
816✔
282
    }
283

284
    text_attrs& operator|=(const style other)
606,260✔
285
    {
286
        this->ta_attrs |= lnav::enums::to_underlying(other);
606,260✔
287
        return *this;
606,260✔
288
    }
289

UNCOV
290
    void clear_style(style other)
×
291
    {
UNCOV
292
        this->ta_attrs &= ~lnav::enums::to_underlying(other);
×
293
    }
294

295
    bool has_style(style other) const
19,867✔
296
    {
297
        return this->ta_attrs & lnav::enums::to_underlying(other);
19,867✔
298
    }
299

UNCOV
300
    bool operator==(const text_attrs& other) const
×
301
    {
UNCOV
302
        return this->ta_attrs == other.ta_attrs
×
UNCOV
303
            && this->ta_fg_color == other.ta_fg_color
×
UNCOV
304
            && this->ta_bg_color == other.ta_bg_color;
×
305
    }
306

307
    uint32_t ta_attrs{0};
308
    styling::color_unit ta_fg_color{styling::color_unit::EMPTY};
309
    styling::color_unit ta_bg_color{styling::color_unit::EMPTY};
310
    std::optional<text_align_t> ta_align;
311
};
312

313
struct block_elem_t {
314
    char32_t value;
315
    role_t role;
316

317
    bool operator==(const block_elem_t& rhs) const
318
    {
319
        return this->value == rhs.value && this->role == rhs.role;
320
    }
321
};
322

323
struct ui_command {
324
    source_location uc_location;
325
    std::string uc_command;
326

327
    bool operator==(const ui_command& rhs) const
328
    {
329
        return this->uc_location == rhs.uc_location
330
            && this->uc_command == rhs.uc_command;
331
    }
332
};
333

334
using string_attr_value = mapbox::util::variant<int64_t,
335
                                                role_t,
336
                                                text_attrs,
337
                                                intern_string_t,
338
                                                std::string,
339
                                                std::shared_ptr<logfile>,
340
                                                bookmark_metadata*,
341
                                                string_fragment,
342
                                                block_elem_t,
343
                                                styling::color_unit,
344
                                                ui_icon_t,
345
                                                const char*,
346
                                                ui_command,
347
                                                text_format_t>;
348

349
class string_attr_type_base {
350
public:
351
    explicit constexpr string_attr_type_base(const char* name) noexcept
352
        : sat_name(name)
353
    {
354
    }
355

356
    const char* const sat_name;
357
};
358

359
using string_attr_pair
360
    = std::pair<const string_attr_type_base*, string_attr_value>;
361

362
template<typename T>
363
class string_attr_type : public string_attr_type_base {
364
public:
365
    using value_type = T;
366

367
    explicit constexpr string_attr_type(const char* name) noexcept
368
        : string_attr_type_base(name)
369
    {
370
    }
371

372
    template<typename U = T>
373
    std::enable_if_t<std::is_void_v<U>, string_attr_pair> value() const
115,009✔
374
    {
375
        return std::make_pair(this, string_attr_value{mapbox::util::no_init{}});
115,009✔
376
    }
377

378
    template<std::size_t N>
379
    std::enable_if_t<(N > 0) && std::is_same_v<std::string, T>,
380
                     string_attr_pair>
381
    value(const char (&val)[N]) const
16✔
382
    {
383
        return std::make_pair(this, std::string(val));
32✔
384
    }
385

386
    template<typename U = T>
387
    constexpr std::enable_if_t<!std::is_void_v<U>
388
                                   && std::is_convertible_v<U, T>,
389
                               string_attr_pair>
390
    value(U&& val) const
1,143,405✔
391
    {
392
        if constexpr (std::is_same_v<const char*, U>
393
                      && std::is_same_v<std::string, T>)
394
        {
395
            return std::make_pair(this, std::string(val));
396
        }
397
        return std::make_pair(this, val);
1,143,405✔
398
    }
399
};
400

401
extern const string_attr_type<void> SA_ORIGINAL_LINE;
402
extern const string_attr_type<void> SA_BODY;
403
extern const string_attr_type<void> SA_SRC_FILE;
404
extern const string_attr_type<void> SA_SRC_LINE;
405
extern const string_attr_type<void> SA_EXTRA_CONTENT;
406
extern const string_attr_type<ui_icon_t> SA_HIDDEN;
407
extern const string_attr_type<void> SA_REPLACED;
408
extern const string_attr_type<intern_string_t> SA_FORMAT;
409
extern const string_attr_type<void> SA_REMOVED;
410
extern const string_attr_type<void> SA_PREFORMATTED;
411
extern const string_attr_type<std::string> SA_INVALID;
412
extern const string_attr_type<std::string> SA_ERROR;
413
extern const string_attr_type<int64_t> SA_LEVEL;
414
extern const string_attr_type<int64_t> SA_ORIGIN_OFFSET;
415
extern const string_attr_type<text_format_t> SA_QUOTED_TEXT;
416

417
extern const string_attr_type<std::string> VC_ANCHOR;
418
extern const string_attr_type<role_t> VC_ROLE;
419
extern const string_attr_type<role_t> VC_ROLE_FG;
420
extern const string_attr_type<text_attrs> VC_STYLE;
421
extern const string_attr_type<const char*> VC_GRAPHIC;
422
extern const string_attr_type<block_elem_t> VC_BLOCK_ELEM;
423
extern const string_attr_type<styling::color_unit> VC_FOREGROUND;
424
extern const string_attr_type<styling::color_unit> VC_BACKGROUND;
425
extern const string_attr_type<std::string> VC_HYPERLINK;
426
extern const string_attr_type<ui_icon_t> VC_ICON;
427
extern const string_attr_type<ui_command> VC_COMMAND;
428

429
namespace lnav {
430

431
namespace string::attrs {
432

433
template<typename S>
434
std::pair<S, string_attr_pair>
435
preformatted(S str)
436
{
437
    return std::make_pair(std::move(str), SA_PREFORMATTED.value());
438
}
439

440
template<typename S>
441
std::pair<S, string_attr_pair>
442
href(S str, std::string href)
15✔
443
{
444
    return std::make_pair(std::move(str), VC_HYPERLINK.value(std::move(href)));
15✔
445
}
446

447
}  // namespace string::attrs
448

449
namespace roles {
450

451
template<typename S>
452
std::pair<S, string_attr_pair>
UNCOV
453
for_flag(S str, bool flag)
×
454
{
455
    return std::make_pair(
456
        std::move(str),
×
457
        VC_ROLE.value(flag ? role_t::VCR_OK : role_t::VCR_ERROR));
×
458
}
459

460
template<typename S>
461
std::pair<S, string_attr_pair>
462
error(S str)
506✔
463
{
464
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_ERROR));
506✔
465
}
466

467
template<typename S>
468
std::pair<S, string_attr_pair>
469
warning(S str)
315✔
470
{
471
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_WARNING));
315✔
472
}
473

474
template<typename S>
475
std::pair<S, string_attr_pair>
476
status(S str)
477
{
478
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_STATUS));
479
}
480

481
template<typename S>
482
std::pair<S, string_attr_pair>
483
inactive_status(S str)
484
{
485
    return std::make_pair(std::move(str),
486
                          VC_ROLE.value(role_t::VCR_INACTIVE_STATUS));
487
}
488

489
template<typename S>
490
std::pair<S, string_attr_pair>
UNCOV
491
status_title(S str)
×
492
{
UNCOV
493
    return std::make_pair(std::move(str),
×
UNCOV
494
                          VC_ROLE.value(role_t::VCR_STATUS_TITLE));
×
495
}
496

497
template<typename S>
498
std::pair<S, string_attr_pair>
499
status_subtitle(S str)
500
{
501
    return std::make_pair(std::move(str),
502
                          VC_ROLE.value(role_t::VCR_STATUS_SUBTITLE));
503
}
504

505
template<typename S>
506
std::pair<S, string_attr_pair>
507
ok(S str)
3✔
508
{
509
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_OK));
3✔
510
}
511

512
template<typename S>
513
std::pair<S, string_attr_pair>
514
hidden(S str)
1✔
515
{
516
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_HIDDEN));
1✔
517
}
518

519
template<typename S>
520
std::pair<S, string_attr_pair>
521
file(S str)
343✔
522
{
523
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_FILE));
343✔
524
}
525

526
template<typename S>
527
std::pair<S, string_attr_pair>
528
symbol(S str)
15,290✔
529
{
530
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_SYMBOL));
15,290✔
531
}
532

533
template<typename S>
534
std::pair<S, string_attr_pair>
535
keyword(S str)
150✔
536
{
537
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_KEYWORD));
150✔
538
}
539

540
template<typename S>
541
std::pair<S, string_attr_pair>
542
variable(S str)
2,452✔
543
{
544
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_VARIABLE));
2,452✔
545
}
546

547
template<typename S>
548
std::pair<S, string_attr_pair>
549
number(S str)
3,829✔
550
{
551
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_NUMBER));
3,829✔
552
}
553

554
template<typename S>
555
std::pair<S, string_attr_pair>
556
comment(S str)
2✔
557
{
558
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_COMMENT));
2✔
559
}
560

561
template<typename S>
562
std::pair<S, string_attr_pair>
563
identifier(S str)
2,511✔
564
{
565
    return std::make_pair(std::move(str),
2,511✔
566
                          VC_ROLE.value(role_t::VCR_IDENTIFIER));
5,022✔
567
}
568

569
template<typename S>
570
std::pair<S, string_attr_pair>
571
string(S str)
1✔
572
{
573
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_STRING));
1✔
574
}
575

576
template<typename S>
577
std::pair<S, string_attr_pair>
578
hr(S str)
×
579
{
UNCOV
580
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_HR));
×
581
}
582

583
template<typename S>
584
std::pair<S, string_attr_pair>
585
hyperlink(S str)
285✔
586
{
587
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_HYPERLINK));
285✔
588
}
589

590
template<typename S>
591
std::pair<S, string_attr_pair>
592
list_glyph(S str)
330✔
593
{
594
    return std::make_pair(std::move(str),
330✔
595
                          VC_ROLE.value(role_t::VCR_LIST_GLYPH));
660✔
596
}
597

598
template<typename S>
599
std::pair<S, string_attr_pair>
600
breadcrumb(S str)
601
{
602
    return std::make_pair(std::move(str),
603
                          VC_ROLE.value(role_t::VCR_BREADCRUMB));
604
}
605

606
template<typename S>
607
std::pair<S, string_attr_pair>
608
quoted_code(S str)
2,582✔
609
{
610
    return std::make_pair(std::move(str),
2,582✔
611
                          VC_ROLE.value(role_t::VCR_QUOTED_CODE));
5,164✔
612
}
613

614
template<typename S>
615
std::pair<S, string_attr_pair>
616
code_border(S str)
617
{
618
    return std::make_pair(std::move(str),
619
                          VC_ROLE.value(role_t::VCR_CODE_BORDER));
620
}
621

622
template<typename S>
623
std::pair<S, string_attr_pair>
624
snippet_border(S str)
1✔
625
{
626
    return std::make_pair(std::move(str),
1✔
627
                          VC_ROLE.value(role_t::VCR_SNIPPET_BORDER));
2✔
628
}
629

630
template<typename S>
631
std::pair<S, string_attr_pair>
632
table_border(S str)
872✔
633
{
634
    return std::make_pair(std::move(str),
872✔
635
                          VC_ROLE.value(role_t::VCR_TABLE_BORDER));
1,744✔
636
}
637

638
template<typename S>
639
std::pair<S, string_attr_pair>
UNCOV
640
table_header(S str)
×
641
{
UNCOV
642
    return std::make_pair(std::move(str),
×
UNCOV
643
                          VC_ROLE.value(role_t::VCR_TABLE_HEADER));
×
644
}
645

646
template<typename S>
647
std::pair<S, string_attr_pair>
648
quote_border(S str)
649
{
650
    return std::make_pair(std::move(str),
651
                          VC_ROLE.value(role_t::VCR_QUOTE_BORDER));
652
}
653

654
template<typename S>
655
std::pair<S, string_attr_pair>
656
quoted_text(S str)
657
{
658
    return std::make_pair(std::move(str),
659
                          VC_ROLE.value(role_t::VCR_QUOTED_TEXT));
660
}
661

662
template<typename S>
663
std::pair<S, string_attr_pair>
664
footnote_border(S str)
665
{
666
    return std::make_pair(std::move(str),
667
                          VC_ROLE.value(role_t::VCR_FOOTNOTE_BORDER));
668
}
669

670
template<typename S>
671
std::pair<S, string_attr_pair>
672
footnote_text(S str)
566✔
673
{
674
    return std::make_pair(std::move(str),
566✔
675
                          VC_ROLE.value(role_t::VCR_FOOTNOTE_TEXT));
1,132✔
676
}
677

678
template<typename S>
679
std::pair<S, string_attr_pair>
680
h1(S str)
681
{
682
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_H1));
683
}
684

685
template<typename S>
686
std::pair<S, string_attr_pair>
687
h2(S str)
63✔
688
{
689
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_H2));
63✔
690
}
691

692
template<typename S>
693
std::pair<S, string_attr_pair>
694
h3(S str)
×
695
{
UNCOV
696
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_H3));
×
697
}
698

699
template<typename S>
700
std::pair<S, string_attr_pair>
701
h4(S str)
702
{
703
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_H4));
704
}
705

706
template<typename S>
707
std::pair<S, string_attr_pair>
UNCOV
708
h5(S str)
×
709
{
UNCOV
710
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_H5));
×
711
}
712

713
template<typename S>
714
std::pair<S, string_attr_pair>
715
h6(S str)
716
{
717
    return std::make_pair(std::move(str), VC_ROLE.value(role_t::VCR_H6));
718
}
719

720
template<typename S>
721
std::pair<S, string_attr_pair>
722
suggestion(S str)
723
{
724
    return std::make_pair(std::move(str),
725
                          VC_ROLE.value(role_t::VCR_SUGGESTION));
726
}
727

728
namespace literals {
729

730
constexpr std::pair<string_fragment, role_t> operator"" _ok(const char* str,
5✔
731
                                                            std::size_t len)
732
{
733
    return std::make_pair(string_fragment{str, 0, (int) len}, role_t::VCR_OK);
5✔
734
}
735

736
constexpr std::pair<string_fragment, role_t> operator"" _error(const char* str,
7✔
737
                                                               std::size_t len)
738
{
739
    return std::make_pair(string_fragment{str, 0, (int) len},
7✔
740
                          role_t::VCR_ERROR);
14✔
741
}
742

743
constexpr std::pair<string_fragment, role_t> operator"" _warning(
6✔
744
    const char* str, std::size_t len)
745
{
746
    return std::make_pair(string_fragment{str, 0, (int) len},
6✔
747
                          role_t::VCR_WARNING);
12✔
748
}
749

750
constexpr std::pair<string_fragment, role_t> operator"" _info(const char* str,
5✔
751
                                                              std::size_t len)
752
{
753
    return std::make_pair(string_fragment{str, 0, (int) len}, role_t::VCR_INFO);
5✔
754
}
755

756
constexpr std::pair<string_fragment, role_t> operator"" _status_title(
757
    const char* str, std::size_t len)
758
{
759
    return std::make_pair(string_fragment{str, 0, (int) len},
760
                          role_t::VCR_STATUS_TITLE);
761
}
762

UNCOV
763
constexpr std::pair<string_fragment, role_t> operator"" _status_subtitle(
×
764
    const char* str, std::size_t len)
765
{
UNCOV
766
    return std::make_pair(string_fragment{str, 0, (int) len},
×
UNCOV
767
                          role_t::VCR_STATUS_SUBTITLE);
×
768
}
769

770
constexpr std::pair<string_fragment, role_t> operator"" _symbol(const char* str,
38✔
771
                                                                std::size_t len)
772
{
773
    return std::make_pair(string_fragment{str, 0, (int) len},
38✔
774
                          role_t::VCR_SYMBOL);
76✔
775
}
776

777
constexpr std::pair<string_fragment, role_t> operator"" _keyword(
4✔
778
    const char* str, std::size_t len)
779
{
780
    return std::make_pair(string_fragment{str, 0, (int) len},
4✔
781
                          role_t::VCR_KEYWORD);
8✔
782
}
783

784
constexpr std::pair<string_fragment, role_t> operator"" _variable(
193✔
785
    const char* str, std::size_t len)
786
{
787
    return std::make_pair(string_fragment{str, 0, (int) len},
193✔
788
                          role_t::VCR_VARIABLE);
386✔
789
}
790

791
constexpr std::pair<string_fragment, role_t> operator"" _comment(
52✔
792
    const char* str, std::size_t len)
793
{
794
    return std::make_pair(string_fragment{str, 0, (int) len},
52✔
795
                          role_t::VCR_COMMENT);
104✔
796
}
797

798
constexpr std::pair<string_fragment, role_t> operator"" _hotkey(const char* str,
644✔
799
                                                                std::size_t len)
800
{
801
    return std::make_pair(string_fragment{str, 0, (int) len},
644✔
802
                          role_t::VCR_STATUS_HOTKEY);
1,288✔
803
}
804

805
constexpr std::pair<string_fragment, role_t> operator"" _h1(const char* str,
44✔
806
                                                            std::size_t len)
807
{
808
    return std::make_pair(string_fragment{str, 0, (int) len}, role_t::VCR_H1);
44✔
809
}
810

811
constexpr std::pair<string_fragment, role_t> operator"" _h2(const char* str,
96✔
812
                                                            std::size_t len)
813
{
814
    return std::make_pair(string_fragment{str, 0, (int) len}, role_t::VCR_H2);
96✔
815
}
816

UNCOV
817
constexpr std::pair<string_fragment, role_t> operator"" _h3(const char* str,
×
818
                                                            std::size_t len)
819
{
UNCOV
820
    return std::make_pair(string_fragment{str, 0, (int) len}, role_t::VCR_H3);
×
821
}
822

823
constexpr std::pair<string_fragment, role_t> operator"" _h4(const char* str,
1,803✔
824
                                                            std::size_t len)
825
{
826
    return std::make_pair(string_fragment{str, 0, (int) len}, role_t::VCR_H4);
1,803✔
827
}
828

829
constexpr std::pair<string_fragment, role_t> operator"" _h5(const char* str,
30✔
830
                                                            std::size_t len)
831
{
832
    return std::make_pair(string_fragment{str, 0, (int) len}, role_t::VCR_H5);
30✔
833
}
834

835
constexpr std::pair<string_fragment, role_t> operator"" _hr(const char* str,
836
                                                            std::size_t len)
837
{
838
    return std::make_pair(string_fragment{str, 0, (int) len}, role_t::VCR_HR);
839
}
840

841
constexpr std::pair<string_fragment, role_t> operator"" _hyperlink(
1✔
842
    const char* str, std::size_t len)
843
{
844
    return std::make_pair(string_fragment{str, 0, (int) len},
1✔
845
                          role_t::VCR_HYPERLINK);
2✔
846
}
847

848
constexpr std::pair<string_fragment, role_t> operator"" _list_glyph(
651✔
849
    const char* str, std::size_t len)
850
{
851
    return std::make_pair(string_fragment{str, 0, (int) len},
651✔
852
                          role_t::VCR_LIST_GLYPH);
1,302✔
853
}
854

UNCOV
855
constexpr std::pair<string_fragment, role_t> operator"" _breadcrumb(
×
856
    const char* str, std::size_t len)
857
{
UNCOV
858
    return std::make_pair(string_fragment{str, 0, (int) len},
×
UNCOV
859
                          role_t::VCR_BREADCRUMB);
×
860
}
861

862
constexpr std::pair<string_fragment, role_t> operator"" _quoted_code(
1✔
863
    const char* str, std::size_t len)
864
{
865
    return std::make_pair(string_fragment{str, 0, (int) len},
1✔
866
                          role_t::VCR_QUOTED_CODE);
2✔
867
}
868

869
constexpr std::pair<string_fragment, role_t> operator"" _code_border(
295✔
870
    const char* str, std::size_t len)
871
{
872
    return std::make_pair(string_fragment{str, 0, (int) len},
295✔
873
                          role_t::VCR_CODE_BORDER);
590✔
874
}
875

876
constexpr std::pair<string_fragment, role_t> operator"" _table_header(
27✔
877
    const char* str, std::size_t len)
878
{
879
    return std::make_pair(string_fragment{str, 0, (int) len},
27✔
880
                          role_t::VCR_TABLE_HEADER);
54✔
881
}
882

883
constexpr std::pair<string_fragment, role_t> operator"" _table_border(
884
    const char* str, std::size_t len)
885
{
886
    return std::make_pair(string_fragment{str, 0, (int) len},
887
                          role_t::VCR_TABLE_BORDER);
888
}
889

890
constexpr std::pair<string_fragment, role_t> operator"" _quote_border(
86✔
891
    const char* str, std::size_t len)
892
{
893
    return std::make_pair(string_fragment{str, 0, (int) len},
86✔
894
                          role_t::VCR_QUOTE_BORDER);
172✔
895
}
896

897
constexpr std::pair<string_fragment, role_t> operator"" _quoted_text(
898
    const char* str, std::size_t len)
899
{
900
    return std::make_pair(string_fragment{str, 0, (int) len},
901
                          role_t::VCR_QUOTED_TEXT);
902
}
903

904
constexpr std::pair<string_fragment, role_t> operator"" _footnote_border(
287✔
905
    const char* str, std::size_t len)
906
{
907
    return std::make_pair(string_fragment{str, 0, (int) len},
287✔
908
                          role_t::VCR_FOOTNOTE_BORDER);
574✔
909
}
910

911
constexpr std::pair<string_fragment, role_t> operator"" _footnote_text(
912
    const char* str, std::size_t len)
913
{
914
    return std::make_pair(string_fragment{str, 0, (int) len},
915
                          role_t::VCR_FOOTNOTE_BORDER);
916
}
917

918
constexpr std::pair<string_fragment, role_t> operator"" _snippet_border(
1,761✔
919
    const char* str, std::size_t len)
920
{
921
    return std::make_pair(string_fragment{str, 0, (int) len},
1,761✔
922
                          role_t::VCR_SNIPPET_BORDER);
3,522✔
923
}
924

925
inline std::pair<std::string, string_attr_pair> operator"" _link(
926
    const char* str, std::size_t len)
927
{
928
    return std::make_pair(std::string(str, len),
929
                          VC_HYPERLINK.value(std::string(str, len)));
930
}
931

932
}  // namespace literals
933

934
}  // namespace roles
935
}  // namespace lnav
936

937
#endif
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc