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

P
Phodal Huang 已提交
3
use crate::inter::{ILocation, IRawGrammar, IRawRepository};
P
Phodal Huang 已提交
4
use crate::reg_exp_source::{RegExpSource, RegExpSourceList};
5
use crate::rule::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 _type: String,
P
Phodal Huang 已提交
13
    #[serde(skip_serializing_if="Option::is_none")]
P
Phodal Huang 已提交
14
    pub location: Option<ILocation>,
15
    pub id: i32,
P
Phodal Huang 已提交
16
    #[serde(skip_serializing_if="Option::is_none")]
17
    pub name: Option<String>,
P
Phodal Huang 已提交
18
    #[serde(skip_serializing_if="Option::is_none")]
19 20 21 22
    pub content_name: Option<String>,
}

impl Rule {
P
Phodal Huang 已提交
23 24 25 26 27 28 29
    pub fn new(
        location: ILocation,
        id: i32,
        name: Option<String>,
        content_name: Option<String>,
    ) -> Self {
        Rule {
P
Phodal Huang 已提交
30
            _type: "".to_string(),
P
Phodal Huang 已提交
31 32 33 34 35
            location: Some(location),
            id,
            name,
            content_name,
        }
36
    }
37
}
38

P
Phodal Huang 已提交
39
pub trait AbstractRule: DynClone + erased_serde::Serialize {
P
Phodal Huang 已提交
40 41
    fn type_of(&self) -> String;
}
42

43 44
serialize_trait_object!(AbstractRule);

P
Phodal Huang 已提交
45 46 47 48 49 50
impl fmt::Debug for dyn AbstractRule {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "AbstractRule")
    }
}

51 52
clone_trait_object!(AbstractRule);

P
Phodal Huang 已提交
53
#[derive(Clone, Debug, Serialize)]
54
pub struct IncludeOnlyRule {
P
Phodal Huang 已提交
55
    #[serde(flatten)]
P
Phodal Huang 已提交
56
    pub rule: Rule,
P
Phodal Huang 已提交
57 58 59 60 61 62 63 64
    pub captures: ICompilePatternsResult,
}

impl IncludeOnlyRule {
    pub fn new(
        location: Option<ILocation>,
        id: i32,
        name: Option<String>,
P
Phodal Huang 已提交
65
        content_name: Option<String>,
P
Phodal Huang 已提交
66 67 68 69
        captures: ICompilePatternsResult,
    ) -> Self {
        IncludeOnlyRule {
            rule: Rule {
P
Phodal Huang 已提交
70
                _type: String::from("IncludeOnlyRule"),
P
Phodal Huang 已提交
71 72 73 74 75 76 77 78
                location,
                id,
                name,
                content_name: None,
            },
            captures,
        }
    }
P
Phodal Huang 已提交
79
}
P
Phodal Huang 已提交
80

P
Phodal Huang 已提交
81 82 83 84 85
impl AbstractRule for IncludeOnlyRule {
    fn type_of(&self) -> String {
        String::from("IncludeOnlyRule")
    }
}
86

P
Phodal Huang 已提交
87
#[derive(Clone, Debug, Serialize)]
88
pub struct BeginWhileRule {
P
Phodal Huang 已提交
89
    pub rule: Rule,
P
Phodal Huang 已提交
90 91 92 93 94 95 96 97 98 99 100 101 102

    pub begin: RegExpSource,
    pub begin_captures: Vec<Box<dyn AbstractRule>>,

    pub while_s: Option<String>,
    pub while_captures: Vec<Box<dyn AbstractRule>>,

    #[serde(skip_serializing_if="Option::is_none")]
    pub apply_end_pattern_last: Option<bool>,

    pub patterns: ICompilePatternsResult,
    #[serde(skip_serializing_if="Option::is_none")]
    pub cached_compiled_patterns: Option<RegExpSourceList>,
103 104
}

P
Phodal Huang 已提交
105
impl BeginWhileRule {
P
Phodal Huang 已提交
106 107 108 109 110 111
    pub fn new(
        location: Option<ILocation>,
        id: i32,
        name: Option<String>,
        content_name: Option<String>,
        begin: Option<String>,
P
Phodal Huang 已提交
112
        begin_captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
113
        _while: Option<String>,
P
Phodal Huang 已提交
114
        while_captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
115
        patterns: ICompilePatternsResult,
P
Phodal Huang 已提交
116 117
    ) -> BeginWhileRule {
        BeginWhileRule {
P
Phodal Huang 已提交
118
            rule: Rule {
P
Phodal Huang 已提交
119
                _type: String::from("BeginEndRule"),
P
Phodal Huang 已提交
120 121 122 123 124
                location,
                id,
                name,
                content_name,
            },
P
Phodal Huang 已提交
125
            begin: RegExpSource::new(begin.unwrap().clone(), id.clone()),
P
Phodal Huang 已提交
126 127 128
            begin_captures,
            while_s: _while,
            while_captures,
P
Phodal Huang 已提交
129
            apply_end_pattern_last: None,
P
Phodal Huang 已提交
130
            patterns,
P
Phodal Huang 已提交
131
            cached_compiled_patterns: None,
P
Phodal Huang 已提交
132 133 134 135
        }
    }
}

P
Phodal Huang 已提交
136 137 138 139 140
impl AbstractRule for BeginWhileRule {
    fn type_of(&self) -> String {
        String::from("BeginWhileRule")
    }
}
141

P
Phodal Huang 已提交
142
#[derive(Clone, Debug, Serialize)]
143
pub struct MatchRule {
P
Phodal Huang 已提交
144 145
    pub rule: Rule,
    pub _match: RegExpSource,
P
Phodal Huang 已提交
146
    pub captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
147 148 149
}

impl MatchRule {
P
Phodal Huang 已提交
150 151 152 153 154
    pub fn new(
        location: Option<ILocation>,
        id: i32,
        name: Option<String>,
        match_s: String,
P
Phodal Huang 已提交
155
        captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
156
    ) -> Self {
P
Phodal Huang 已提交
157
        MatchRule {
P
Phodal Huang 已提交
158
            rule: Rule {
P
Phodal Huang 已提交
159
                _type: String::from("MatchRule"),
P
Phodal Huang 已提交
160 161 162 163 164
                location,
                id,
                name,
                content_name: None,
            },
P
Phodal Huang 已提交
165
            _match: RegExpSource::new(match_s, id),
P
Phodal Huang 已提交
166 167 168
            captures,
        }
    }
169 170
}

P
Phodal Huang 已提交
171 172 173 174 175
impl AbstractRule for MatchRule {
    fn type_of(&self) -> String {
        String::from("MatchRule")
    }
}
176

P
Phodal Huang 已提交
177
#[derive(Clone, Debug, Serialize)]
178
pub struct BeginEndRule {
P
Phodal Huang 已提交
179
    #[serde(flatten)]
P
Phodal Huang 已提交
180
    pub rule: Rule,
P
Phodal Huang 已提交
181
    pub begin: RegExpSource,
P
Phodal Huang 已提交
182 183
    pub begin_captures: Vec<Box<dyn AbstractRule>>,
    pub end: RegExpSource,
P
Phodal Huang 已提交
184
    // pub endHasBackReferences: Option<bool>,
P
Phodal Huang 已提交
185
    pub end_captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
186
    #[serde(skip_serializing_if="Option::is_none")]
P
Phodal Huang 已提交
187 188
    pub apply_end_pattern_last: Option<bool>,
    // pub hasMissingPatterns: Option<bool>,
P
Phodal Huang 已提交
189
    #[serde(skip_serializing_if="Option::is_none")]
P
Phodal Huang 已提交
190
    pub patterns: Option<i32>,
P
Phodal Huang 已提交
191
    #[serde(skip_serializing_if="Option::is_none")]
P
Phodal Huang 已提交
192 193 194 195 196 197 198 199 200 201
    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 已提交
202 203 204
        begin_captures: Vec<Box<dyn AbstractRule>>,
        _end: String,
        end_captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
205
        apply_end_pattern_last: Option<bool>,
206
        // patterns: ICompilePatternsResult,
P
Phodal Huang 已提交
207 208
    ) -> BeginEndRule {
        BeginEndRule {
P
Phodal Huang 已提交
209
            rule: Rule {
P
Phodal Huang 已提交
210
                _type: String::from("BeginEndRule"),
P
Phodal Huang 已提交
211 212 213 214 215
                location,
                id,
                name,
                content_name,
            },
P
Phodal Huang 已提交
216
            begin: RegExpSource::new(begin.clone(), id.clone()),
217
            begin_captures,
P
Phodal Huang 已提交
218
            end: RegExpSource::new(_end.clone(), id.clone()),
219
            end_captures,
P
Phodal Huang 已提交
220 221
            apply_end_pattern_last,
            patterns: None,
P
Phodal Huang 已提交
222
            cached_compiled_patterns: None,
P
Phodal Huang 已提交
223 224
        }
    }
225 226
}

P
Phodal Huang 已提交
227 228 229 230 231
impl AbstractRule for BeginEndRule {
    fn type_of(&self) -> String {
        String::from("BeginEndRule")
    }
}
232

P
Phodal Huang 已提交
233
#[derive(Clone, Debug, Serialize)]
234
pub struct CaptureRule {
P
Phodal Huang 已提交
235
    pub rule: Rule,
236 237
}

238
impl CaptureRule {
239
    pub fn empty() -> Self {
240
        CaptureRule {
P
Phodal Huang 已提交
241
            rule: Rule {
242
                _type: "".to_string(),
P
Phodal Huang 已提交
243 244 245
                location: None,
                id: 0,
                name: None,
246 247 248 249 250 251 252 253 254 255 256 257
                content_name: None
            }
        }
    }
    pub fn new(location: Option<ILocation>, id: i32, name: Option<String>, content_name: Option<String>) -> Self {
        CaptureRule {
            rule: Rule {
                _type: String::from("CaptureRule"),
                location,
                id,
                name,
                content_name,
P
Phodal Huang 已提交
258
            },
259 260 261 262
        }
    }
}

P
Phodal Huang 已提交
263 264 265 266 267
impl AbstractRule for CaptureRule {
    fn type_of(&self) -> String {
        String::from("CaptureRule")
    }
}
268

P
Phodal Huang 已提交
269
#[derive(Clone, Debug, Serialize)]
P
Phodal Huang 已提交
270
pub struct NoneRule {}
P
Phodal Huang 已提交
271

P
Phodal Huang 已提交
272 273 274 275 276
impl AbstractRule for NoneRule {
    fn type_of(&self) -> String {
        String::from("NoneRule")
    }
}
P
Phodal Huang 已提交
277

P
Phodal Huang 已提交
278 279 280
// 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 已提交
281 282 283
    // type Output;
    // fn method(&self) -> Self::Output;

P
Phodal Huang 已提交
284
    fn register_id(&mut self) -> i32;
285
    fn get_rule(&self, pattern_id: i32) -> Box<dyn AbstractRule>;
P
Phodal Huang 已提交
286
    fn register_rule(&mut self, result: Box<dyn AbstractRule>) -> Box<dyn AbstractRule>;
P
Phodal Huang 已提交
287 288 289
}

pub trait IGrammarRegistry {
P
Phodal Huang 已提交
290 291 292 293 294
    fn get_external_grammar(
        &self,
        scope_name: String,
        repository: IRawRepository,
    ) -> Option<IRawGrammar>;
P
Phodal Huang 已提交
295 296 297
}

pub trait IRuleFactoryHelper: IGrammarRegistry + IRuleRegistry {}