new: prototype with xml_schema_generator

generated structs are not so good. I'll write manually
This commit is contained in:
Wataru Otsubo 2025-01-29 04:12:03 +09:00
parent 637e96b7c5
commit 8a7991bfb2
5 changed files with 498 additions and 0 deletions

306
Cargo.lock generated Normal file
View file

@ -0,0 +1,306 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "anstream"
version = "0.6.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
dependencies = [
"anstyle",
"anstyle-parse",
"anstyle-query",
"anstyle-wincon",
"colorchoice",
"is_terminal_polyfill",
"utf8parse",
]
[[package]]
name = "anstyle"
version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
[[package]]
name = "anstyle-parse"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
dependencies = [
"windows-sys",
]
[[package]]
name = "anstyle-wincon"
version = "3.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e"
dependencies = [
"anstyle",
"once_cell",
"windows-sys",
]
[[package]]
name = "clap"
version = "4.5.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796"
dependencies = [
"clap_builder",
"clap_derive",
]
[[package]]
name = "clap_builder"
version = "4.5.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7"
dependencies = [
"anstream",
"anstyle",
"clap_lex",
"strsim",
]
[[package]]
name = "clap_derive"
version = "4.5.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c"
dependencies = [
"heck",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "clap_lex"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
[[package]]
name = "colorchoice"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
[[package]]
name = "convert_string"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9b537177af81d27b407c2f8d679181f51ce2fe2bf33d38b64efed1d9c6f9749"
[[package]]
name = "endcap-sl-register-interface-generator"
version = "0.1.0"
dependencies = [
"quick-xml",
"serde",
"xml_schema_generator",
]
[[package]]
name = "heck"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "is_terminal_polyfill"
version = "1.70.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
[[package]]
name = "log"
version = "0.4.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f"
[[package]]
name = "memchr"
version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "once_cell"
version = "1.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
[[package]]
name = "proc-macro2"
version = "1.0.93"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quick-xml"
version = "0.37.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003"
dependencies = [
"memchr",
"serde",
]
[[package]]
name = "quote"
version = "1.0.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
dependencies = [
"proc-macro2",
]
[[package]]
name = "serde"
version = "1.0.217"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.217"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "strsim"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "syn"
version = "2.0.96"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "unicode-ident"
version = "1.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034"
[[package]]
name = "utf8parse"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "windows-sys"
version = "0.59.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
dependencies = [
"windows-targets",
]
[[package]]
name = "windows-targets"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_gnullvm",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
name = "windows_i686_gnu"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
[[package]]
name = "windows_i686_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
name = "windows_i686_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
name = "windows_x86_64_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "xml_schema_generator"
version = "0.6.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54fd78b62ba42a5304f8a151b528b2725af9ac84462795dea704712b1f22f492"
dependencies = [
"clap",
"convert_string",
"log",
"quick-xml",
]

View file

@ -2,5 +2,18 @@
name = "endcap-sl-register-interface-generator"
version = "0.1.0"
edition = "2021"
build = "build.rs"
[[bin]]
name = "ri-generate"
path = "src/main.rs"
[lib]
[dependencies]
quick-xml = { version = "0.37.2", features = ["serialize"] }
serde = { version = "1.0.217", features = ["derive"] }
[build-dependencies]
quick-xml = { version = "0.37.2", features = ["serialize"] }
xml_schema_generator = "0.6.16"

18
build.rs Normal file
View file

@ -0,0 +1,18 @@
use std::{fs::File, io::BufWriter, io::Write};
use quick_xml::{self, Reader};
use xml_schema_generator::{self, Options};
const OUTFILEPATH: &str = "src/deserialize.rs";
fn main() {
eprintln!("Build script starts");
let mut reader = Reader::from_file("./csr.xml").expect("Failed to open xml");
let root = xml_schema_generator::into_struct(&mut reader).expect("Failed to parse xml");
let struct_as_string = root.to_serde_struct(&Options::quick_xml_de());
println!("{}", struct_as_string);
let outfile = File::create(OUTFILEPATH).expect("Failed to create out file");
let mut writer = BufWriter::new(outfile);
writeln!(writer, "use serde::{{Serialize, Deserialize}};").unwrap();
writeln!(writer, "{}", struct_as_string).unwrap();
}

160
src/deserialize.rs Normal file
View file

@ -0,0 +1,160 @@
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
pub struct Module {
#[serde(rename = "@name")]
pub name: String,
#[serde(rename = "@addr")]
pub addr: String,
#[serde(rename = "@size")]
pub size: String,
#[serde(rename = "@amod")]
pub amod: String,
#[serde(rename = "@type")]
pub module_type: String,
#[serde(rename = "@desc")]
pub desc: String,
#[serde(rename = "$text")]
pub text: Option<String>,
pub block: Vec<ModuleBlock>,
}
#[derive(Serialize, Deserialize)]
pub struct ModuleBlock {
#[serde(rename = "@name")]
pub name: String,
#[serde(rename = "@addr")]
pub addr: String,
#[serde(rename = "@size")]
pub size: String,
#[serde(rename = "@decoder")]
pub decoder: String,
#[serde(rename = "$text")]
pub text: Option<String>,
pub block: Vec<ModuleBlockBlock>,
}
#[derive(Serialize, Deserialize)]
pub struct ModuleBlockBlock {
#[serde(rename = "@name")]
pub name: String,
#[serde(rename = "@addr")]
pub addr: String,
#[serde(rename = "@size")]
pub size: String,
#[serde(rename = "@modf")]
pub modf: String,
#[serde(rename = "$text")]
pub text: Option<String>,
pub block: Vec<ModuleBlockBlockBlock>,
pub register: Vec<ModuleBlockBlockRegister>,
}
#[derive(Serialize, Deserialize)]
pub struct ModuleBlockBlockBlock {
#[serde(rename = "@name")]
pub name: String,
#[serde(rename = "@addr")]
pub addr: String,
#[serde(rename = "@size")]
pub size: String,
#[serde(rename = "@desc")]
pub desc: Option<String>,
#[serde(rename = "$text")]
pub text: Option<String>,
pub register: Vec<ModuleBlockBlockBlockRegister>,
pub block: Vec<ModuleBlockBlockBlockBlock>,
}
#[derive(Serialize, Deserialize)]
pub struct ModuleBlockBlockBlockRegister {
#[serde(rename = "@name")]
pub name: String,
#[serde(rename = "@addr")]
pub addr: String,
#[serde(rename = "@mask")]
pub mask: Option<String>,
#[serde(rename = "@offset")]
pub offset: Option<String>,
#[serde(rename = "@multiple")]
pub multiple: Option<String>,
#[serde(rename = "@default")]
pub default: Option<String>,
#[serde(rename = "$text")]
pub text: Option<String>,
pub field: Vec<ModuleBlockBlockBlockRegisterField>,
}
#[derive(Serialize, Deserialize)]
pub struct ModuleBlockBlockBlockRegisterField {
#[serde(rename = "@name")]
pub name: String,
#[serde(rename = "@mask")]
pub mask: String,
#[serde(rename = "@offset")]
pub offset: Option<String>,
#[serde(rename = "@multiple")]
pub multiple: Option<String>,
#[serde(rename = "@default")]
pub default: Option<String>,
#[serde(rename = "$text")]
pub text: Option<String>,
pub value: Vec<Value>,
}
#[derive(Serialize, Deserialize)]
pub struct Value {
#[serde(rename = "@name")]
pub name: String,
#[serde(rename = "@data")]
pub data: String,
}
#[derive(Serialize, Deserialize)]
pub struct ModuleBlockBlockBlockBlock {
#[serde(rename = "@name")]
pub name: String,
#[serde(rename = "$text")]
pub text: Option<String>,
pub register: Vec<ModuleBlockBlockBlockBlockRegister>,
}
#[derive(Serialize, Deserialize)]
pub struct ModuleBlockBlockBlockBlockRegister {
#[serde(rename = "@name")]
pub name: String,
#[serde(rename = "@addr")]
pub addr: String,
#[serde(rename = "@offset")]
pub offset: Option<String>,
#[serde(rename = "@multiple")]
pub multiple: Option<String>,
#[serde(rename = "@mask")]
pub mask: Option<String>,
#[serde(rename = "$text")]
pub text: Option<String>,
pub field: Vec<BlockBlockBlockBlockRegisterField>,
}
#[derive(Serialize, Deserialize)]
pub struct BlockBlockBlockBlockRegisterField {
#[serde(rename = "@name")]
pub name: String,
#[serde(rename = "@mask")]
pub mask: String,
#[serde(rename = "@multiple")]
pub multiple: Option<String>,
#[serde(rename = "@offset")]
pub offset: Option<String>,
}
#[derive(Serialize, Deserialize)]
pub struct ModuleBlockBlockRegister {
#[serde(rename = "@name")]
pub name: String,
#[serde(rename = "@addr")]
pub addr: String,
#[serde(rename = "@mask")]
pub mask: String,
}

1
src/lib.rs Normal file
View file

@ -0,0 +1 @@
pub mod deserialize;