mod.rs 6.9 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 _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,
90 91
}

P
Phodal Huang 已提交
92
impl BeginWhileRule {
P
Phodal Huang 已提交
93 94 95 96 97 98
    pub fn new(
        location: Option<ILocation>,
        id: i32,
        name: Option<String>,
        content_name: Option<String>,
        begin: Option<String>,
P
Phodal Huang 已提交
99
        begin_captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
100
        _while: Option<String>,
P
Phodal Huang 已提交
101
        while_captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
102 103
        patterns: ICompilePatternsResult,
    ) -> BeginEndRule {
P
Phodal Huang 已提交
104
        BeginEndRule {
P
Phodal Huang 已提交
105
            rule: Rule {
P
Phodal Huang 已提交
106
                _type: String::from("BeginEndRule"),
P
Phodal Huang 已提交
107 108 109 110 111
                location,
                id,
                name,
                content_name,
            },
P
Phodal Huang 已提交
112
            begin: RegExpSource::new(begin.unwrap().clone(), id.clone()),
P
Phodal Huang 已提交
113
            begin_captures: None,
P
Phodal Huang 已提交
114
            end: None,
P
Phodal Huang 已提交
115 116 117
            end_captures: None,
            apply_end_pattern_last: None,
            patterns: None,
P
Phodal Huang 已提交
118
            cached_compiled_patterns: None,
P
Phodal Huang 已提交
119 120 121 122
        }
    }
}

P
Phodal Huang 已提交
123 124 125 126 127
impl AbstractRule for BeginWhileRule {
    fn type_of(&self) -> String {
        String::from("BeginWhileRule")
    }
}
128

P
Phodal Huang 已提交
129
#[derive(Clone, Debug, Serialize)]
130
pub struct MatchRule {
P
Phodal Huang 已提交
131 132
    pub rule: Rule,
    pub _match: RegExpSource,
P
Phodal Huang 已提交
133
    pub captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
134 135 136
}

impl MatchRule {
P
Phodal Huang 已提交
137 138 139 140 141
    pub fn new(
        location: Option<ILocation>,
        id: i32,
        name: Option<String>,
        match_s: String,
P
Phodal Huang 已提交
142
        captures: Vec<Box<dyn AbstractRule>>,
P
Phodal Huang 已提交
143
    ) -> Self {
P
Phodal Huang 已提交
144
        MatchRule {
P
Phodal Huang 已提交
145
            rule: Rule {
P
Phodal Huang 已提交
146
                _type: String::from("MatchRule"),
P
Phodal Huang 已提交
147 148 149 150 151
                location,
                id,
                name,
                content_name: None,
            },
P
Phodal Huang 已提交
152
            _match: RegExpSource::new(match_s, id),
P
Phodal Huang 已提交
153 154 155
            captures,
        }
    }
156 157
}

P
Phodal Huang 已提交
158 159 160 161 162
impl AbstractRule for MatchRule {
    fn type_of(&self) -> String {
        String::from("MatchRule")
    }
}
163

P
Phodal Huang 已提交
164
#[derive(Clone, Debug, Serialize)]
165
pub struct BeginEndRule {
P
Phodal Huang 已提交
166
    #[serde(flatten)]
P
Phodal Huang 已提交
167
    pub rule: Rule,
P
Phodal Huang 已提交
168 169 170
    pub begin: RegExpSource,

    #[serde(skip_serializing_if="Option::is_none")]
P
Phodal Huang 已提交
171
    pub begin_captures: Option<Vec<Box<dyn AbstractRule>>>,
P
Phodal Huang 已提交
172 173 174

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

P
Phodal Huang 已提交
219 220 221 222 223
impl AbstractRule for BeginEndRule {
    fn type_of(&self) -> String {
        String::from("BeginEndRule")
    }
}
224

P
Phodal Huang 已提交
225
#[derive(Clone, Debug, Serialize)]
226
pub struct CaptureRule {
P
Phodal Huang 已提交
227
    pub rule: Rule,
228 229
}

230 231 232
impl CaptureRule {
    pub fn new() -> Self {
        CaptureRule {
P
Phodal Huang 已提交
233
            rule: Rule {
P
Phodal Huang 已提交
234
                _type: String::from("CaptureRule"),
P
Phodal Huang 已提交
235 236 237 238 239
                location: None,
                id: 0,
                name: None,
                content_name: None,
            },
240 241 242 243
        }
    }
}

P
Phodal Huang 已提交
244 245 246 247 248
impl AbstractRule for CaptureRule {
    fn type_of(&self) -> String {
        String::from("CaptureRule")
    }
}
249

P
Phodal Huang 已提交
250
#[derive(Clone, Debug, Serialize)]
P
Phodal Huang 已提交
251
pub struct NoneRule {}
P
Phodal Huang 已提交
252

P
Phodal Huang 已提交
253 254 255 256 257
impl AbstractRule for NoneRule {
    fn type_of(&self) -> String {
        String::from("NoneRule")
    }
}
P
Phodal Huang 已提交
258

P
Phodal Huang 已提交
259 260 261
// 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 已提交
262 263 264
    // type Output;
    // fn method(&self) -> Self::Output;

P
Phodal Huang 已提交
265
    fn register_id(&mut self) -> i32;
266
    fn get_rule(&self, pattern_id: i32) -> Box<dyn AbstractRule>;
P
Phodal Huang 已提交
267
    fn register_rule(&mut self, result: Box<dyn AbstractRule>) -> Box<dyn AbstractRule>;
P
Phodal Huang 已提交
268 269 270
}

pub trait IGrammarRegistry {
P
Phodal Huang 已提交
271 272 273 274 275
    fn get_external_grammar(
        &self,
        scope_name: String,
        repository: IRawRepository,
    ) -> Option<IRawGrammar>;
P
Phodal Huang 已提交
276 277 278
}

pub trait IRuleFactoryHelper: IGrammarRegistry + IRuleRegistry {}