vimwiki_core/lang/elements/blocks/
headers.rs

1use crate::{
2    lang::elements::{
3        InlineElement, InlineElementContainer, IntoChildren, Located,
4    },
5    StrictEq,
6};
7use derive_more::{Constructor, Index, IndexMut, IntoIterator};
8use serde::{Deserialize, Serialize};
9
10#[derive(
11    Constructor,
12    Clone,
13    Debug,
14    Eq,
15    PartialEq,
16    Hash,
17    Index,
18    IndexMut,
19    IntoIterator,
20    Serialize,
21    Deserialize,
22)]
23pub struct Header<'a> {
24    /// Represents the content contained within the header
25    #[index]
26    #[index_mut]
27    #[into_iterator(owned, ref, ref_mut)]
28    pub content: InlineElementContainer<'a>,
29
30    /// Represents the level of the header (1, 2, 3, etc)
31    pub level: usize,
32
33    /// Represents whether or not the header is centered
34    pub centered: bool,
35}
36
37impl<'a> Header<'a> {
38    /// Represents the smallest a header's level can be
39    pub const MIN_LEVEL: usize = 1;
40
41    /// Represents teh largest a header's level can be
42    pub const MAX_LEVEL: usize = 6;
43}
44
45impl Header<'_> {
46    pub fn to_borrowed(&self) -> Header {
47        Header {
48            level: self.level,
49            content: self.content.to_borrowed(),
50            centered: self.centered,
51        }
52    }
53
54    pub fn into_owned(self) -> Header<'static> {
55        Header {
56            level: self.level,
57            content: self.content.into_owned(),
58            centered: self.centered,
59        }
60    }
61}
62
63impl<'a> IntoChildren for Header<'a> {
64    type Child = Located<InlineElement<'a>>;
65
66    fn into_children(self) -> Vec<Self::Child> {
67        self.content.into_children()
68    }
69}
70
71impl<'a> StrictEq for Header<'a> {
72    /// Performs strict_eq on level, centered status, and content
73    fn strict_eq(&self, other: &Self) -> bool {
74        self.level == other.level
75            && self.centered == other.centered
76            && self.content.strict_eq(&other.content)
77    }
78}