mod.rs 6.6 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
    #[serde(skip_serializing_if="Option::is_none")]
P
Phodal Huang 已提交
13
    pub location: Option<ILocation>,
14
    pub id: i32,
P
Phodal Huang 已提交
15
    #[serde(skip_serializing_if="Option::is_none")]
16
    pub name: Option<String>,
P
Phodal Huang 已提交
17
    #[serde(skip_serializing_if="Option::is_none")]
18 19 20 21
    pub content_name: Option<String>,
}

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

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

41 42
serialize_trait_object!(AbstractRule);

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

49 50
clone_trait_object!(AbstractRule);

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

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

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

P
Phodal Huang 已提交
84
#[derive(Clone, Debug, Serialize)]
85
pub struct BeginWhileRule {
P
Phodal Huang 已提交
86
    pub rule: Rule,
87 88
}

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

P
Phodal Huang 已提交
119 120 121 122 123
impl AbstractRule for BeginWhileRule {
    fn type_of(&self) -> String {
        String::from("BeginWhileRule")
    }
}
124

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

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

P
Phodal Huang 已提交
153 154 155 156 157
impl AbstractRule for MatchRule {
    fn type_of(&self) -> String {
        String::from("MatchRule")
    }
}
158

P
Phodal Huang 已提交
159
#[derive(Clone, Debug, Serialize)]
160
pub struct BeginEndRule {
P
Phodal Huang 已提交
161
    #[serde(flatten)]
P
Phodal Huang 已提交
162
    pub rule: Rule,
P
Phodal Huang 已提交
163 164 165
    pub begin: RegExpSource,

    #[serde(skip_serializing_if="Option::is_none")]
P
Phodal Huang 已提交
166
    pub begin_captures: Option<Vec<Box<dyn AbstractRule>>>,
P
Phodal Huang 已提交
167 168 169

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

P
Phodal Huang 已提交
213 214 215 216 217
impl AbstractRule for BeginEndRule {
    fn type_of(&self) -> String {
        String::from("BeginEndRule")
    }
}
218

P
Phodal Huang 已提交
219
#[derive(Clone, Debug, Serialize)]
220
pub struct CaptureRule {
P
Phodal Huang 已提交
221
    pub rule: Rule,
222 223
}

224 225 226
impl CaptureRule {
    pub fn new() -> Self {
        CaptureRule {
P
Phodal Huang 已提交
227 228 229 230 231 232
            rule: Rule {
                location: None,
                id: 0,
                name: None,
                content_name: None,
            },
233 234 235 236
        }
    }
}

P
Phodal Huang 已提交
237 238 239 240 241
impl AbstractRule for CaptureRule {
    fn type_of(&self) -> String {
        String::from("CaptureRule")
    }
}
242

P
Phodal Huang 已提交
243
#[derive(Clone, Debug, Serialize)]
P
Phodal Huang 已提交
244
pub struct NoneRule {}
P
Phodal Huang 已提交
245

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

P
Phodal Huang 已提交
252 253 254
// 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 已提交
255 256 257
    // type Output;
    // fn method(&self) -> Self::Output;

P
Phodal Huang 已提交
258
    fn register_id(&mut self) -> i32;
259
    fn get_rule(&self, pattern_id: i32) -> Box<dyn AbstractRule>;
P
Phodal Huang 已提交
260
    fn register_rule(&mut self, result: Box<dyn AbstractRule>) -> Box<dyn AbstractRule>;
P
Phodal Huang 已提交
261 262 263
}

pub trait IGrammarRegistry {
P
Phodal Huang 已提交
264 265 266 267 268
    fn get_external_grammar(
        &self,
        scope_name: String,
        repository: IRawRepository,
    ) -> Option<IRawGrammar>;
P
Phodal Huang 已提交
269 270 271
}

pub trait IRuleFactoryHelper: IGrammarRegistry + IRuleRegistry {}