1 /*
2  * Copyright © 2019-today Peter M. Stahl pemistahl@gmail.com
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either expressed or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #![allow(deprecated)]
18 
19 use crate::regexp::Feature;
20 
21 #[derive(Clone, Debug, Hash, Ord, PartialOrd, Eq, PartialEq)]
22 pub struct RegExpConfig {
23     pub(crate) conversion_features: Vec<Feature>,
24     pub(crate) minimum_repetitions: u32,
25     pub(crate) minimum_substring_length: u32,
26     pub(crate) is_digit_converted: bool,
27     pub(crate) is_non_digit_converted: bool,
28     pub(crate) is_space_converted: bool,
29     pub(crate) is_non_space_converted: bool,
30     pub(crate) is_word_converted: bool,
31     pub(crate) is_non_word_converted: bool,
32     pub(crate) is_repetition_converted: bool,
33     pub(crate) is_case_insensitive_matching: bool,
34     pub(crate) is_capturing_group_enabled: bool,
35     pub(crate) is_non_ascii_char_escaped: bool,
36     pub(crate) is_astral_code_point_converted_to_surrogate: bool,
37     pub(crate) is_verbose_mode_enabled: bool,
38     pub(crate) is_start_anchor_disabled: bool,
39     pub(crate) is_end_anchor_disabled: bool,
40     pub(crate) is_output_colorized: bool,
41 }
42 
43 impl RegExpConfig {
new() -> Self44     pub(crate) fn new() -> Self {
45         Self {
46             conversion_features: vec![],
47             minimum_repetitions: 1,
48             minimum_substring_length: 1,
49             is_digit_converted: false,
50             is_non_digit_converted: false,
51             is_space_converted: false,
52             is_non_space_converted: false,
53             is_word_converted: false,
54             is_non_word_converted: false,
55             is_repetition_converted: false,
56             is_case_insensitive_matching: false,
57             is_capturing_group_enabled: false,
58             is_non_ascii_char_escaped: false,
59             is_astral_code_point_converted_to_surrogate: false,
60             is_verbose_mode_enabled: false,
61             is_start_anchor_disabled: false,
62             is_end_anchor_disabled: false,
63             is_output_colorized: false,
64         }
65     }
66 
is_digit_converted(&self) -> bool67     pub(crate) fn is_digit_converted(&self) -> bool {
68         self.is_digit_converted || self.conversion_features.contains(&Feature::Digit)
69     }
70 
is_non_digit_converted(&self) -> bool71     pub(crate) fn is_non_digit_converted(&self) -> bool {
72         self.is_non_digit_converted || self.conversion_features.contains(&Feature::NonDigit)
73     }
74 
is_space_converted(&self) -> bool75     pub(crate) fn is_space_converted(&self) -> bool {
76         self.is_space_converted || self.conversion_features.contains(&Feature::Space)
77     }
78 
is_non_space_converted(&self) -> bool79     pub(crate) fn is_non_space_converted(&self) -> bool {
80         self.is_non_space_converted || self.conversion_features.contains(&Feature::NonSpace)
81     }
82 
is_word_converted(&self) -> bool83     pub(crate) fn is_word_converted(&self) -> bool {
84         self.is_word_converted || self.conversion_features.contains(&Feature::Word)
85     }
86 
is_non_word_converted(&self) -> bool87     pub(crate) fn is_non_word_converted(&self) -> bool {
88         self.is_non_word_converted || self.conversion_features.contains(&Feature::NonWord)
89     }
90 
is_repetition_converted(&self) -> bool91     pub(crate) fn is_repetition_converted(&self) -> bool {
92         self.is_repetition_converted || self.conversion_features.contains(&Feature::Repetition)
93     }
94 
is_case_insensitive_matching(&self) -> bool95     pub(crate) fn is_case_insensitive_matching(&self) -> bool {
96         self.is_case_insensitive_matching
97             || self
98                 .conversion_features
99                 .contains(&Feature::CaseInsensitivity)
100     }
101 
is_capturing_group_enabled(&self) -> bool102     pub(crate) fn is_capturing_group_enabled(&self) -> bool {
103         self.is_capturing_group_enabled
104             || self.conversion_features.contains(&Feature::CapturingGroup)
105     }
106 
is_char_class_feature_enabled(&self) -> bool107     pub(crate) fn is_char_class_feature_enabled(&self) -> bool {
108         self.is_digit_converted
109             || self.is_non_digit_converted
110             || self.is_space_converted
111             || self.is_non_space_converted
112             || self.is_word_converted
113             || self.is_non_word_converted
114             || self.is_case_insensitive_matching
115             || self.is_capturing_group_enabled
116             || self.conversion_features.iter().any(|it| it.is_char_class())
117     }
118 }
119