1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//mod aho_corasick;

mod locality;
pub use locality::{
    Snip, Local, Localize,
};

pub mod source;
pub use source::{
    Breaker,
    Source, IntoSource,
    StrSource,
    OptSource,
    Processed,
    EmptySource,
    ParserSource,
    SourceExt,
    SourceResult,
    SourceEvent,

    //Pipe, Filtered, IntoSeparator, Chain,
    //Shift,
};

pub mod parser;
pub use parser::{
    Parser,
    ParserExt,
    PipeParser,
    PipeParserExt,
    IntoPipeParser,
    ParserResult,
    ParserEvent,

    //Filter, Filtered, TryFilter, TryFiltered, IntoBreaker, TryIntoBreaker, PipeBreaker
    // Pipe
};

mod state;
pub use state::{
    NextResult, Next,
    StateMachine, Runtime,
};

pub mod entities {
    mod entities;
    mod parser;
    mod state;

    pub use parser::{Builder,EntityParser,PipedEntityParser};
}

pub mod tagger {
    mod tags;
    mod state;
    mod parser;

    pub use parser::{Builder,TagParser};
    pub use tags::{Tag,TagName,Closing,SpecTag};
}

pub mod paragraph {
    mod parser;
    mod state;

    pub use parser::{Builder,Paragraphs};
}


pub enum Error {
    EofInTag(Vec<Local<SourceEvent>>),
    EndBeforeBegin,
    NoBegin,
}

impl std::fmt::Debug for Error {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Error::EndBeforeBegin => f.debug_struct("EndBeforeBegin"),
            Error::NoBegin => f.debug_struct("NoBegin"),
            Error::EofInTag(v) => {
                let mut dbg = f.debug_struct("EofInTag");
                let mut iter = v.into_iter();
                if let Some(lse) = iter.next() {
                    let (local,se) = lse.into_inner();
                    let first = local;
                    let mut last = local;
                    let mut s = String::new();
                    push_s(se,&mut s);
                    for lse in iter {
                        let (local,se) = lse.into_inner();
                        last = local;
                        push_s(se,&mut s);
                    }                    
                    if let Ok(lc) = Local::from_segment(first,last) {
                        dbg.field("chars", &lc.chars())
                            .field("bytes", &lc.bytes());
                    }
                    dbg.field("data", &s);                    
                }
                dbg
            }
        }.finish()
    }
}

fn push_s(se: SourceEvent, s: &mut String) {
    match se {
        SourceEvent::Char(c) => s.push(c),
        SourceEvent::Breaker(Breaker::None) => {},
        SourceEvent::Breaker(_) => s.push(' '),
    }
}