mod.rs 6.1 KB
Newer Older
P
Phodal Huang 已提交
1 2
pub mod factory;

P
Phodal Huang 已提交
3
use crate::inter::{ILocation, IRawGrammar, IRawRepository};
P
Phodal Huang 已提交
4
use crate::reg_exp_source::{RegExpSource, RegExpSourceList};
P
Phodal Huang 已提交
5
use crate::rule::factory::ICompilePatternsResult;
P
Phodal Huang 已提交
6
use core::fmt;
P
Phodal Huang 已提交
7
use dyn_clone::{clone_trait_object, DynClone};
8
use serde::{Serialize, Serializer};
9

P
Phodal Huang 已提交
10
#[derive(Clone, Debug, Serialize)]
11
pub struct Rule {
P
Phodal Huang 已提交
12
    pub location: Option<ILocation>,
13 14 15 16 17 18
    pub id: i32,
    pub name: Option<String>,
    pub content_name: Option<String>,
}

impl Rule {
P
Phodal Huang 已提交
19 20 21 22 23 24 25 26 27 28 29 30
    pub fn new(
        location: ILocation,
        id: i32,
        name: Option<String>,
        content_name: Option<String>,
    ) -> Self {
        Rule {
            location: Some(location),
            id,
            name,
            content_name,
        }
31
    }
32
}
33

P
Phodal Huang 已提交
34
pub trait AbstractRule: DynClone + erased_serde::Serialize {
P
Phodal Huang 已提交
35 36
    fn type_of(&self) -> String;
}
37

38 39
serialize_trait_object!(AbstractRule);

P
Phodal Huang 已提交
40 41 42 43 44 45
impl fmt::Debug for dyn AbstractRule {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "AbstractRule")
    }
}

46 47
clone_trait_object!(AbstractRule);

P
Phodal Huang 已提交
48
#[derive(Clone, Debug, Serialize)]
49
pub struct IncludeOnlyRule {
P
Phodal Huang 已提交
50
    pub rule: Rule,
P
Phodal Huang 已提交
51 52 53 54 55 56 57 58
    pub captures: ICompilePatternsResult,
}

impl IncludeOnlyRule {
    pub fn new(
        location: Option<ILocation>,
        id: i32,
        name: Option<String>,
P
Phodal Huang 已提交
59
        content_name: Option<String>,
P
Phodal Huang 已提交
60 61 62 63 64 65 66 67 68 69 70 71
        captures: ICompilePatternsResult,
    ) -> Self {
        IncludeOnlyRule {
            rule: Rule {
                location,
                id,
                name,
                content_name: None,
            },
            captures,
        }
    }
P
Phodal Huang 已提交
72
}
P
Phodal Huang 已提交
73

P
Phodal Huang 已提交
74 75 76 77 78
impl AbstractRule for IncludeOnlyRule {
    fn type_of(&self) -> String {
        String::from("IncludeOnlyRule")
    }
}
79

P
Phodal Huang 已提交
80
#[derive(Clone, Debug, Serialize)]
81
pub struct BeginWhileRule {
P
Phodal Huang 已提交
82
    pub rule: Rule,
83 84
}

P
Phodal Huang 已提交
85
impl BeginWhileRule {
P
Phodal Huang 已提交
86 87 88 89 90 91
    pub fn new(
        location: Option<ILocation>,
        id: i32,
        name: Option<String>,
        content_name: Option<String>,
        begin: Option<String>,
P
Phodal Huang 已提交
92
        begin_captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
93
        _while: Option<String>,
P
Phodal Huang 已提交
94
        while_captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
95 96
        patterns: ICompilePatternsResult,
    ) -> BeginEndRule {
P
Phodal Huang 已提交
97
        BeginEndRule {
P
Phodal Huang 已提交
98 99 100 101 102 103
            rule: Rule {
                location,
                id,
                name,
                content_name,
            },
P
Phodal Huang 已提交
104 105 106 107 108 109
            _begin: RegExpSource::new(begin.unwrap().clone(), id.clone()),
            begin_captures: None,
            _end: None,
            end_captures: None,
            apply_end_pattern_last: None,
            patterns: None,
P
Phodal Huang 已提交
110
            cached_compiled_patterns: None,
P
Phodal Huang 已提交
111 112 113 114
        }
    }
}

P
Phodal Huang 已提交
115 116 117 118 119
impl AbstractRule for BeginWhileRule {
    fn type_of(&self) -> String {
        String::from("BeginWhileRule")
    }
}
120

P
Phodal Huang 已提交
121
#[derive(Clone, Debug, Serialize)]
122
pub struct MatchRule {
P
Phodal Huang 已提交
123 124
    pub rule: Rule,
    pub _match: RegExpSource,
P
Phodal Huang 已提交
125
    pub captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
126 127 128
}

impl MatchRule {
P
Phodal Huang 已提交
129 130 131 132 133
    pub fn new(
        location: Option<ILocation>,
        id: i32,
        name: Option<String>,
        match_s: String,
P
Phodal Huang 已提交
134
        captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
135
    ) -> Self {
P
Phodal Huang 已提交
136
        MatchRule {
P
Phodal Huang 已提交
137 138 139 140 141 142
            rule: Rule {
                location,
                id,
                name,
                content_name: None,
            },
P
Phodal Huang 已提交
143
            _match: RegExpSource::new(match_s, id),
P
Phodal Huang 已提交
144 145 146
            captures,
        }
    }
147 148
}

P
Phodal Huang 已提交
149 150 151 152 153
impl AbstractRule for MatchRule {
    fn type_of(&self) -> String {
        String::from("MatchRule")
    }
}
154

P
Phodal Huang 已提交
155
#[derive(Clone, Debug, Serialize)]
156
pub struct BeginEndRule {
P
Phodal Huang 已提交
157
    pub rule: Rule,
P
Phodal Huang 已提交
158
    pub _begin: RegExpSource,
P
Phodal Huang 已提交
159
    pub begin_captures: Option<Vec<Box<dyn AbstractRule>>>,
P
Phodal Huang 已提交
160 161
    pub _end: Option<RegExpSource>,
    // pub endHasBackReferences: Option<bool>,
P
Phodal Huang 已提交
162
    pub end_captures: Option<Vec<Box<dyn AbstractRule>>>,
P
Phodal Huang 已提交
163 164 165 166 167 168 169 170 171 172 173 174 175
    pub apply_end_pattern_last: Option<bool>,
    // pub hasMissingPatterns: Option<bool>,
    pub patterns: Option<i32>,
    pub cached_compiled_patterns: Option<RegExpSourceList>,
}

impl BeginEndRule {
    pub fn new(
        location: Option<ILocation>,
        id: i32,
        name: Option<String>,
        content_name: Option<String>,
        begin: String,
P
Phodal Huang 已提交
176
        begin_captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
177
        _while: Option<String>,
P
Phodal Huang 已提交
178
        while_captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
179
        apply_end_pattern_last: Option<bool>,
180
        // patterns: ICompilePatternsResult,
P
Phodal Huang 已提交
181 182
    ) -> BeginEndRule {
        BeginEndRule {
P
Phodal Huang 已提交
183 184 185 186 187 188
            rule: Rule {
                location,
                id,
                name,
                content_name,
            },
P
Phodal Huang 已提交
189 190 191 192 193 194
            _begin: RegExpSource::new(begin.clone(), id.clone()),
            begin_captures: None,
            _end: None,
            end_captures: None,
            apply_end_pattern_last,
            patterns: None,
P
Phodal Huang 已提交
195
            cached_compiled_patterns: None,
P
Phodal Huang 已提交
196 197
        }
    }
198 199
}

P
Phodal Huang 已提交
200 201 202 203 204
impl AbstractRule for BeginEndRule {
    fn type_of(&self) -> String {
        String::from("BeginEndRule")
    }
}
205

P
Phodal Huang 已提交
206
#[derive(Clone, Debug, Serialize)]
207
pub struct CaptureRule {
P
Phodal Huang 已提交
208
    pub rule: Rule,
209 210
}

211 212 213
impl CaptureRule {
    pub fn new() -> Self {
        CaptureRule {
P
Phodal Huang 已提交
214 215 216 217 218 219
            rule: Rule {
                location: None,
                id: 0,
                name: None,
                content_name: None,
            },
220 221 222 223
        }
    }
}

P
Phodal Huang 已提交
224 225 226 227 228
impl AbstractRule for CaptureRule {
    fn type_of(&self) -> String {
        String::from("CaptureRule")
    }
}
229

P
Phodal Huang 已提交
230
#[derive(Clone, Debug, Serialize)]
P
Phodal Huang 已提交
231
pub struct NoneRule {}
P
Phodal Huang 已提交
232

P
Phodal Huang 已提交
233 234 235 236 237
impl AbstractRule for NoneRule {
    fn type_of(&self) -> String {
        String::from("NoneRule")
    }
}
P
Phodal Huang 已提交
238

P
Phodal Huang 已提交
239 240 241
// todo: trait with types
// https://users.rust-lang.org/t/impl-trait-with-generic-function-for-generic-struct/27083/2
pub trait IRuleRegistry {
P
Phodal Huang 已提交
242 243 244
    // type Output;
    // fn method(&self) -> Self::Output;

P
Phodal Huang 已提交
245
    fn register_id(&mut self) -> i32;
246
    fn get_rule(&self, pattern_id: i32) -> Box<dyn AbstractRule>;
P
Phodal Huang 已提交
247
    fn register_rule(&mut self, result: Box<dyn AbstractRule>) -> Box<dyn AbstractRule>;
P
Phodal Huang 已提交
248 249 250
}

pub trait IGrammarRegistry {
P
Phodal Huang 已提交
251 252 253 254 255
    fn get_external_grammar(
        &self,
        scope_name: String,
        repository: IRawRepository,
    ) -> Option<IRawGrammar>;
P
Phodal Huang 已提交
256 257 258
}

pub trait IRuleFactoryHelper: IGrammarRegistry + IRuleRegistry {}