mabel_eno/elements/
element.rs1use std::ops::RangeInclusive;
2
3use crate::{Attribute, Embed, Field, Flag, Item, Printer, Section};
4
5pub trait Element: std::fmt::Debug {
6 fn as_attribute(&self) -> Option<&Attribute> {
7 None
8 }
9 fn as_embed(&self) -> Option<&Embed> {
10 None
11 }
12 fn as_field(&self) -> Option<&Field> {
13 None
14 }
15 fn as_flag(&self) -> Option<&Flag> {
16 None
17 }
18 fn as_item(&self) -> Option<&Item> {
19 None
20 }
21 fn as_section(&self) -> Option<&Section> {
22 None
23 }
24 fn is_attribute(&self) -> bool {
25 false
26 }
27 fn is_embed(&self) -> bool {
28 false
29 }
30 fn is_field(&self) -> bool {
31 false
32 }
33 fn is_flag(&self) -> bool {
34 false
35 }
36 fn is_item(&self) -> bool {
37 false
38 }
39 fn is_section(&self) -> bool {
40 false
41 }
42 fn line_number(&self) -> u32;
43 fn snippet(&self) -> String;
44 fn snippet_with_options(&self, printer: &dyn Printer, gutter: bool) -> String;
45 fn touch(&self);
46}
47
48pub trait ElementImpl {
49 fn line_range(&self) -> RangeInclusive<u32>;
50 fn touched(&self) -> bool;
51}