Skip to content

Commit 45253ad

Browse files
Merge #207
207: feat: add advanced encoder options `Config` r=burrbull a=duskmoon314 - Add `convert_case` to dependencies - Add advanced encoder options `Config` BREAKING CHANGE - `Encode` trait needs to implement `encode_with_config` Co-authored-by: Campbell He <campbell.he@icloud.com>
2 parents 0fea6c3 + 0147f37 commit 45253ad

38 files changed

+1149
-195
lines changed

svd-encoder/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
88
## Unreleased
99

1010
- Bump MSRV to 1.56.0 (2021)
11+
- Add advanced encoder options `Config`
12+
- BREAKING: `Encode` trait needs to implement `encode_with_config`
1113

1214
## [v0.13.1] - 2022-02-12
1315

svd-encoder/Cargo.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
[package]
2-
authors = [
3-
"The Tools Team <tools@teams.rust-embedded.org>",
4-
]
2+
authors = ["The Tools Team <tools@teams.rust-embedded.org>"]
53
description = "A CMSIS-SVD file encoder"
64
documentation = "https://docs.rs/svd-encoder"
75
keywords = ["CMSIS", "SVD", "encoder"]
@@ -14,6 +12,7 @@ version = "0.13.1"
1412
readme = "README.md"
1513

1614
[dependencies]
15+
convert_case = "0.5.0"
1716
svd-rs = { version = "0.13.1", path = "../svd-rs" }
1817
thiserror = "1.0.30"
1918

svd-encoder/src/access.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
use super::{Element, Encode, EncodeError, XMLNode};
1+
use super::{Config, Element, Encode, EncodeError, XMLNode};
22

33
impl Encode for crate::svd::Access {
44
type Error = EncodeError;
55

6-
fn encode(&self) -> Result<Element, EncodeError> {
6+
fn encode_with_config(&self, _config: &Config) -> Result<Element, EncodeError> {
77
let mut elem = Element::new("access");
88
elem.children.push(XMLNode::Text(self.as_str().to_string()));
99
Ok(elem)

svd-encoder/src/addressblock.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
1-
use super::{new_node, Element, Encode, EncodeError, XMLNode};
1+
use crate::config::format_number;
2+
3+
use super::{new_node, Config, Element, Encode, EncodeError, XMLNode};
24

35
impl Encode for crate::svd::AddressBlock {
46
type Error = EncodeError;
57

6-
fn encode(&self) -> Result<Element, EncodeError> {
8+
fn encode_with_config(&self, config: &Config) -> Result<Element, EncodeError> {
79
let mut children = vec![
8-
new_node("offset", format!("0x{:X}", self.offset)),
9-
new_node("size", format!("0x{:X}", self.size)),
10+
new_node(
11+
"offset",
12+
format_number(self.offset, config.address_block_offset),
13+
),
14+
new_node("size", format_number(self.size, config.address_block_size)),
1015
self.usage.encode_node()?,
1116
];
1217
if let Some(v) = &self.protection {
@@ -21,7 +26,7 @@ impl Encode for crate::svd::AddressBlock {
2126
impl Encode for crate::svd::AddressBlockUsage {
2227
type Error = EncodeError;
2328

24-
fn encode(&self) -> Result<Element, EncodeError> {
29+
fn encode_with_config(&self, _config: &Config) -> Result<Element, EncodeError> {
2530
let mut elem = Element::new("usage");
2631
elem.children.push(XMLNode::Text(self.as_str().to_string()));
2732
Ok(elem)

svd-encoder/src/bitrange.rs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
1-
use super::{new_node, EncodeError, XMLNode};
2-
use crate::svd::{BitRange, BitRangeType};
1+
use super::{new_node, Config, EncodeError, XMLNode};
2+
use crate::{
3+
config::FieldBitRangeFormat,
4+
svd::{BitRange, BitRangeType},
5+
};
36

47
// TODO: Encode method differs from Encode trait as it acts on a set of possible children, create an interface or decide how to better do this
5-
pub fn encode_bitrange(br: &BitRange) -> Result<Vec<XMLNode>, EncodeError> {
6-
match br.range_type {
7-
BitRangeType::BitRange => Ok(vec![new_node(
8-
"bitRange",
9-
format!("[{}:{}]", br.msb(), br.lsb()),
10-
)]),
11-
BitRangeType::MsbLsb => Ok(vec![
12-
new_node("lsb", format!("{}", br.lsb())),
13-
new_node("msb", format!("{}", br.msb())),
14-
]),
15-
BitRangeType::OffsetWidth => Ok(vec![
8+
pub fn encode_bitrange(br: &BitRange, config: &Config) -> Result<Vec<XMLNode>, EncodeError> {
9+
match (config.field_bit_range, br.range_type) {
10+
(Some(FieldBitRangeFormat(BitRangeType::BitRange)), _) | (None, BitRangeType::BitRange) => {
11+
Ok(vec![new_node("bitRange", br.bit_range())])
12+
}
13+
(Some(FieldBitRangeFormat(BitRangeType::MsbLsb)), _) | (None, BitRangeType::MsbLsb) => {
14+
Ok(vec![
15+
new_node("lsb", format!("{}", br.lsb())),
16+
new_node("msb", format!("{}", br.msb())),
17+
])
18+
}
19+
(Some(FieldBitRangeFormat(BitRangeType::OffsetWidth)), _)
20+
| (None, BitRangeType::OffsetWidth) => Ok(vec![
1621
new_node("bitOffset", format!("{}", br.offset)),
1722
new_node("bitWidth", format!("{}", br.width)),
1823
]),

svd-encoder/src/cluster.rs

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
1-
use super::{new_node, Element, ElementMerge, Encode, EncodeChildren, EncodeError, XMLNode};
1+
use super::{
2+
new_node, Config, Element, ElementMerge, Encode, EncodeChildren, EncodeError, XMLNode,
3+
};
24

3-
use crate::svd::{Cluster, ClusterInfo};
5+
use crate::{
6+
config::{change_case, format_number},
7+
svd::{Cluster, ClusterInfo},
8+
};
49

510
impl Encode for Cluster {
611
type Error = EncodeError;
712

8-
fn encode(&self) -> Result<Element, EncodeError> {
13+
fn encode_with_config(&self, config: &Config) -> Result<Element, EncodeError> {
914
match self {
10-
Self::Single(i) => i.encode(),
15+
Self::Single(i) => i.encode_with_config(config),
1116
Self::Array(i, a) => {
1217
let mut e = Element::new("cluster");
13-
e.merge(&a.encode()?);
14-
e.merge(&i.encode()?);
18+
e.merge(&a.encode_with_config(config)?);
19+
e.merge(&i.encode_with_config(config)?);
1520
Ok(e)
1621
}
1722
}
@@ -21,17 +26,23 @@ impl Encode for Cluster {
2126
impl Encode for ClusterInfo {
2227
type Error = EncodeError;
2328

24-
fn encode(&self) -> Result<Element, EncodeError> {
29+
fn encode_with_config(&self, config: &Config) -> Result<Element, EncodeError> {
2530
let mut e = Element::new("cluster");
2631

27-
e.children.push(new_node("name", self.name.clone()));
32+
e.children.push(new_node(
33+
"name",
34+
change_case(&self.name, config.cluster_name),
35+
));
2836

2937
if let Some(v) = &self.description {
3038
e.children.push(new_node("description", v.clone()));
3139
}
3240

3341
if let Some(v) = &self.alternate_cluster {
34-
e.children.push(new_node("alternateCluster", v.clone()));
42+
e.children.push(new_node(
43+
"alternateCluster",
44+
change_case(v, config.cluster_name),
45+
));
3546
}
3647

3748
if let Some(v) = &self.header_struct_name {
@@ -40,19 +51,24 @@ impl Encode for ClusterInfo {
4051

4152
e.children.push(new_node(
4253
"addressOffset",
43-
format!("{}", self.address_offset),
54+
format_number(self.address_offset, config.cluster_address_offset),
4455
));
4556

46-
e.children
47-
.extend(self.default_register_properties.encode()?);
57+
e.children.extend(
58+
self.default_register_properties
59+
.encode_with_config(config)?,
60+
);
4861

4962
for c in &self.children {
50-
e.children.push(XMLNode::Element(c.encode()?));
63+
e.children
64+
.push(XMLNode::Element(c.encode_with_config(config)?));
5165
}
5266

5367
if let Some(v) = &self.derived_from {
54-
e.attributes
55-
.insert(String::from("derivedFrom"), v.to_string());
68+
e.attributes.insert(
69+
String::from("derivedFrom"),
70+
change_case(v, config.cluster_name),
71+
);
5672
}
5773

5874
Ok(e)

0 commit comments

Comments
 (0)