Skip to content

Commit f1ec6da

Browse files
bors[bot]WRRburrbull
authored
Merge #80
80: Serde r=therealprof a=burrbull Rebased and shortened #76 Co-authored-by: WRR <-@-> Co-authored-by: Andrey Zgarbul <zgarbul.andrey@gmail.com>
2 parents 0061f56 + b898cda commit f1ec6da

24 files changed

+75
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1111
and added into `Peripheral` and `ClusterInfo`
1212
- Updated dependencies, use `Edition 2018`
1313
- Added missing `zeroToToggle`
14+
- Added serializing/deserializing with `serde`
1415

1516
## [v0.7.0] - 2019-01-11
1617

Cargo.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,15 @@ unproven = []
1616
either = "1.5"
1717
xmltree = "0.8"
1818
failure = "0.1"
19+
20+
[dependencies.serde]
21+
version = "1.0"
22+
features = ["derive"]
23+
optional = true
24+
25+
[dev-dependencies]
26+
serde_json = "1.0"
27+
28+
[[example]]
29+
name = "svd2json"
30+
required-features = ["serde"]

examples/svd2json.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
use serde_json as json;
2+
use svd_parser as svd;
3+
4+
use json::Value;
5+
use std::env::args;
6+
use std::fs::File;
7+
use std::io::{Read, Write};
8+
9+
fn main() {
10+
// Collect command-line arguments.
11+
let argv: Vec<String> = args().collect();
12+
// Expect exactly one argument, with the name of the SVD file.
13+
// (Arg #0 is this program's name, Arg #1 is the actual argument)
14+
if argv.len() != 2 {
15+
println!("Usage: (svd2json) file.svd");
16+
return;
17+
}
18+
let svd_fn: String = argv[1].clone();
19+
20+
// Open the XML-formatted SVD file and read it into a String.
21+
let svd_xml = &mut String::new();
22+
File::open(&svd_fn)
23+
.expect("Failed to open SVD input file")
24+
.read_to_string(svd_xml)
25+
.expect("Failed to read SVD input file to a String");
26+
27+
// Use the 'svd_parser' crate to parse the file.
28+
let device = svd::parse(svd_xml).expect("Failed to parse the SVD file into Rust structs");
29+
30+
// Convert the parsed data into JSON format.
31+
let v: Value = json::to_value(device).expect("Failed to parse Rust structs into JSON format");
32+
33+
// Write the JSON-formatted device description to a file.
34+
let json_fn: String = svd_fn + ".json";
35+
File::create(json_fn)
36+
.expect("Failed to open JSON output file")
37+
.write_all(json::to_string_pretty(&v).unwrap().as_bytes())
38+
.expect("Failed to write to JSON output file");
39+
}

src/svd/access.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::error::*;
88
use crate::new_element;
99
use crate::types::Parse;
1010

11+
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
1112
#[derive(Clone, Copy, Debug, PartialEq)]
1213
pub enum Access {
1314
ReadOnly,

src/svd/addressblock.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use crate::error::SVDError;
1212
#[cfg(feature = "unproven")]
1313
use crate::new_element;
1414

15+
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
1516
#[derive(Clone, Debug, PartialEq)]
1617
pub struct AddressBlock {
1718
pub offset: u32,

src/svd/bitrange.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ use crate::error::*;
66
use crate::new_element;
77
use crate::types::Parse;
88

9+
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
910
#[derive(Clone, Copy, Debug, PartialEq)]
1011
pub struct BitRange {
1112
pub offset: u32,
1213
pub width: u32,
1314
pub range_type: BitRangeType,
1415
}
1516

17+
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
1618
#[derive(Clone, Copy, Debug, PartialEq)]
1719
pub enum BitRangeType {
1820
BitRange,

src/svd/cluster.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use crate::svd::{
1313
registerclusterarrayinfo::RegisterClusterArrayInfo,
1414
};
1515

16+
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
1617
#[derive(Clone, Debug, PartialEq)]
1718
pub enum Cluster {
1819
Single(ClusterInfo),

src/svd/clusterinfo.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use crate::svd::{
1414
registerproperties::RegisterProperties,
1515
};
1616

17+
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
1718
#[derive(Clone, Debug, PartialEq)]
1819
pub struct ClusterInfo {
1920
pub name: String,

src/svd/cpu.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use crate::new_element;
1212
use crate::svd::endian::Endian;
1313
use crate::types::Parse;
1414

15+
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
1516
#[derive(Clone, Debug, PartialEq)]
1617
pub struct Cpu {
1718
pub name: String,

src/svd/device.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use crate::svd::{
1717
peripheral::Peripheral,
1818
};
1919

20+
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
2021
#[derive(Clone, Debug)]
2122
pub struct Device {
2223
pub name: String,

0 commit comments

Comments
 (0)