Skip to content

Commit 6b0747f

Browse files
authored
Try #119:
2 parents 13229c0 + 6983ada commit 6b0747f

File tree

6 files changed

+23
-24
lines changed

6 files changed

+23
-24
lines changed

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ xmltree = "0.8"
2222
anyhow = "1.0.19"
2323
thiserror = "1.0.5"
2424
rayon = "1.3.0"
25+
once_cell = "1.3.1"
26+
regex = "1"
2527

2628
[dependencies.serde]
2729
version = "1.0"

src/error.rs

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
//! This module defines error types and messages for SVD parsing and encoding
33
44
pub use anyhow::{Context, Result};
5+
use once_cell::sync::Lazy;
6+
use regex::Regex;
57
use xmltree::Element;
68

79
#[allow(clippy::large_enum_variant)]
@@ -72,25 +74,20 @@ pub enum NameError {
7274
Invalid(String, String),
7375
}
7476

75-
pub(crate) fn is_valid_name(name: &str) -> bool {
76-
let mut chars = name.chars();
77-
if let Some(first) = chars.next() {
78-
if !(first.is_ascii_alphabetic() || first == '_') {
79-
return false;
80-
}
81-
for c in chars {
82-
if !(c.is_ascii_alphanumeric() || c == '_' || c == '%') {
83-
return false;
84-
}
85-
}
86-
true
77+
pub(crate) fn check_name(name: &str, tag: &str) -> Result<()> {
78+
static PATTERN: Lazy<Regex> = Lazy::new(|| Regex::new("^[_A-Za-z0-9]*$").unwrap());
79+
if PATTERN.is_match(name) {
80+
Ok(())
8781
} else {
88-
false
82+
Err(NameError::Invalid(name.to_string(), tag.to_string()).into())
8983
}
9084
}
9185

92-
pub(crate) fn check_name(name: &str, tag: &str) -> Result<()> {
93-
if is_valid_name(name) {
86+
pub(crate) fn check_dimable_name(name: &str, tag: &str) -> Result<()> {
87+
static PATTERN: Lazy<Regex> = Lazy::new(|| {
88+
Regex::new("^((%s)|(%s)[_A-Za-z]{1}[_A-Za-z0-9]*)|([_A-Za-z]{1}[_A-Za-z0-9]*(\\[%s\\])?)|([_A-Za-z]{1}[_A-Za-z0-9]*(%s)?[_A-Za-z0-9]*)$").unwrap()
89+
});
90+
if PATTERN.is_match(name) {
9491
Ok(())
9592
} else {
9693
Err(NameError::Invalid(name.to_string(), tag.to_string()).into())

src/svd/clusterinfo.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,9 @@ impl ClusterInfoBuilder {
109109

110110
impl ClusterInfo {
111111
fn validate(self) -> Result<Self> {
112-
check_name(&self.name, "name")?;
112+
check_dimable_name(&self.name, "name")?;
113113
if let Some(name) = self.derived_from.as_ref() {
114-
check_name(name, "derivedFrom")?;
114+
check_dimable_name(name, "derivedFrom")?;
115115
} else {
116116
if self.children.is_empty() {
117117
return Err(SVDError::EmptyCluster)?;

src/svd/fieldinfo.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,9 @@ impl FieldInfoBuilder {
127127

128128
impl FieldInfo {
129129
fn validate(self) -> Result<Self> {
130-
check_name(&self.name, "name")?;
130+
check_dimable_name(&self.name, "name")?;
131131
if let Some(name) = self.derived_from.as_ref() {
132-
check_name(name, "derivedFrom")?;
132+
check_dimable_name(name, "derivedFrom")?;
133133
}
134134
for ev in &self.enumerated_values {
135135
ev.check_range(0..2_u32.pow(self.bit_range.width))?;

src/svd/peripheral.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,9 @@ impl PeripheralBuilder {
159159
impl Peripheral {
160160
fn validate(self) -> Result<Self> {
161161
// TODO
162-
check_name(&self.name, "name")?;
162+
check_dimable_name(&self.name, "name")?;
163163
if let Some(name) = self.derived_from.as_ref() {
164-
check_name(name, "derivedFrom")?;
164+
check_dimable_name(name, "derivedFrom")?;
165165
} else if let Some(registers) = self.registers.as_ref() {
166166
if registers.is_empty() {
167167
return Err(SVDError::EmptyRegisters)?;

src/svd/registerinfo.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,15 +182,15 @@ impl RegisterInfoBuilder {
182182

183183
impl RegisterInfo {
184184
fn validate(self) -> Result<Self> {
185-
check_name(&self.name, "name")?;
185+
check_dimable_name(&self.name, "name")?;
186186
if let Some(name) = self.alternate_group.as_ref() {
187187
check_name(name, "alternateGroup")?;
188188
}
189189
if let Some(name) = self.alternate_register.as_ref() {
190-
check_name(name, "alternateRegister")?;
190+
check_dimable_name(name, "alternateRegister")?;
191191
}
192192
if let Some(name) = self.derived_from.as_ref() {
193-
check_name(name, "derivedFrom")?;
193+
check_dimable_name(name, "derivedFrom")?;
194194
} else if let Some(fields) = self.fields.as_ref() {
195195
if fields.is_empty() {
196196
return Err(SVDError::EmptyFields)?;

0 commit comments

Comments
 (0)