1//! Set of structures required to implement a stylesheet
2//!
3//! In order to provide additional styling information for the
4//! formatter, a structs can implement `Stylesheet` and `Style`
5//! traits.
6//!
7use std::fmt;
8
9/// StyleClass is a collection of named variants of style classes
10pub enum StyleClass {
11 /// Message indicating an error.
12 Error,
13 /// Message indicating a warning.
14 Warning,
15 /// Message indicating an information.
16 Info,
17 /// Message indicating a note.
18 Note,
19 /// Message indicating a help.
20 Help,
21
22 /// Style for line numbers.
23 LineNo,
24
25 /// Parts of the text that are to be emphasised.
26 Emphasis,
27
28 /// Parts of the text that are regular. Usually a no-op.
29 None,
30}
31
32/// This trait implements a return value for the `Stylesheet::get_style`.
33pub trait Style {
34 /// The method used to write text with formatter
35 fn paint(&self, text: &str, f: &mut fmt::Formatter<'_>) -> fmt::Result;
36 /// The method used to write display function with formatter
37 fn paint_fn<'a>(
38 &self,
39 c: Box<dyn FnOnce(&mut fmt::Formatter<'_>) -> fmt::Result + 'a>,
40 f: &mut fmt::Formatter<'_>,
41 ) -> fmt::Result;
42 /// The method used by the `Formatter` to display the message in bold font.
43 fn bold(&self) -> Box<dyn Style>;
44}
45
46/// Trait to annotate structs that can provide `Style` implementations for
47/// every `StyleClass` variant.
48pub trait Stylesheet {
49 /// Returns a `Style` implementer based on the requested `StyleClass` variant.
50 fn get_style(&self, class: StyleClass) -> Box<dyn Style>;
51}
52