diff --git a/.gitignore b/.gitignore index 8ea0ee8..ea8c4bf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ /target -result* diff --git a/CHANGELOG.md b/CHANGELOG.md index a155b60..840fc67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,15 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [unreleased] -### Added - -- Packagin with Nix flakes (with nixpkgs buildRustPackage) [!16](https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator/-/merge_requests/16) -- Now xml metadata can be overwritten with corresponding environmental variables. [!17](https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator/-/merge_requests/17) - -### Changed - -- Improve error message from syn in generator. !15 - ## [0.3.1] - 2025-04-11 ### Changed diff --git a/README-ja.md b/README-ja.md index ddda1ba..7e770e3 100644 --- a/README-ja.md +++ b/README-ja.md @@ -33,7 +33,7 @@ cargo build --features=bin --bins --release `target/release`に入ってるバイナリファイルを実行するか、`cargo run -- `で実行できます。 -詳しくは(`-h`ではなく)`--help`を見てください。 +詳しくは`--help`を見てください。 ### ライブラリクレートの使い方 diff --git a/README.md b/README.md index e9fd84e..9685c6f 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ to build. Execute the binary generated in `target/release/`, or run with `cargo run -- `. -See the `--help`(not `-h`) for more information. +See the `--help` for more information. ### Library crate usage diff --git a/flake.lock b/flake.lock deleted file mode 100644 index d28d4ad..0000000 --- a/flake.lock +++ /dev/null @@ -1,82 +0,0 @@ -{ - "nodes": { - "flake-utils": { - "inputs": { - "systems": "systems" - }, - "locked": { - "lastModified": 1731533236, - "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "nixpkgs": { - "locked": { - "lastModified": 1744098102, - "narHash": "sha256-tzCdyIJj9AjysC3OuKA+tMD/kDEDAF9mICPDU7ix0JA=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "c8cd81426f45942bb2906d5ed2fe21d2f19d95b7", - "type": "github" - }, - "original": { - "owner": "nixos", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "root": { - "inputs": { - "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs", - "rust-overlay": "rust-overlay" - } - }, - "rust-overlay": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1744166053, - "narHash": "sha256-mpI7OzFwp+fUeDtZYQbVZ2YmtxTN2UNrrOwbYD27xKU=", - "owner": "oxalica", - "repo": "rust-overlay", - "rev": "896158be1835589db6f42f45ef0a49b8b492cc66", - "type": "github" - }, - "original": { - "owner": "oxalica", - "repo": "rust-overlay", - "type": "github" - } - }, - "systems": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/flake.nix b/flake.nix deleted file mode 100644 index 6a76064..0000000 --- a/flake.nix +++ /dev/null @@ -1,37 +0,0 @@ -{ - description = "A very basic flake"; - - inputs = { - nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; - flake-utils.url = "github:numtide/flake-utils"; - rust-overlay = { - url = "github:oxalica/rust-overlay"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - }; - - outputs = - { - nixpkgs, - flake-utils, - rust-overlay, - ... - }: - flake-utils.lib.eachDefaultSystem ( - system: - let - pkgs = import nixpkgs { - inherit system; - overlays = [ rust-overlay.overlays.default ]; - }; - in - { - devShells.default = pkgs.mkShell { - packages = [ - pkgs.rust-bin.stable.latest.default - ]; - }; - packages.default = pkgs.callPackage ./nix/endcap-sl-software-ri-generator.nix { }; - } - ); -} diff --git a/nix/endcap-sl-software-ri-generator.nix b/nix/endcap-sl-software-ri-generator.nix deleted file mode 100644 index 0ffc9b7..0000000 --- a/nix/endcap-sl-software-ri-generator.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ rustPlatform }: -# https://nixos.org/manual/nixpkgs/stable/#rust -rustPlatform.buildRustPackage { - pname = "endcap-sl-software-ri-generator"; - version = "0.3.0"; - - src = ../.; - cargoLock.lockFile = ../Cargo.lock; - - buildFeatures = [ "bin" ]; -} diff --git a/src/generator.rs b/src/generator.rs index 110e4f1..f4487b4 100644 --- a/src/generator.rs +++ b/src/generator.rs @@ -26,12 +26,8 @@ use thiserror::Error; #[derive(Debug, Error)] pub enum CodeGenError { - #[error("tokenization(syn) error: {source}: {code}")] - SynError { - #[source] - source: syn::Error, - code: String, - }, + #[error("tokenization(syn) error")] + SynError(#[from] syn::Error), #[error("failed to create file (name duplicated): {0}")] FilePathDuplicatedError(String), #[error("parent is required for {module}")] @@ -46,17 +42,11 @@ mod util { use super::CodeGenError; pub(super) fn parse_to_ident(s: &str) -> Result { - syn::parse_str(s).map_err(|e| CodeGenError::SynError { - source: e, - code: s.to_string(), - }) + Ok(syn::parse_str(s)?) } pub(super) fn parse_to_literal(s: &str) -> Result { - syn::parse_str(s).map_err(|e| CodeGenError::SynError { - source: e, - code: s.to_string(), - }) + Ok(syn::parse_str(s)?) } // currently only U32 is used, so `dead_code` for Debug, PartialEq @@ -171,29 +161,27 @@ This code is auto generated using endcap_sl_software_ri_generator. GENERATOR_GIT_SHA, ); let files = self.generate_register_interface(None, None, HashMap::new())?; - files + Ok(files .into_iter() - .map(|(path, tokens)| -> Result<(PathBuf, syn::File), _> { - let tokens = if path - .file_name() - .is_some_and(|file| file == "register_interface.rs") - { - quote! { - #![doc = #build_metadata] + .map( + |(path, tokens)| -> Result<(PathBuf, syn::File), syn::Error> { + let tokens = if path + .file_name() + .is_some_and(|file| file == "register_interface.rs") + { + quote! { + #![doc = #build_metadata] - #tokens - } - } else { - tokens - }; - let file: syn::File = - syn::parse2(tokens.clone()).map_err(|e| CodeGenError::SynError { - source: e, - code: tokens.to_string(), - })?; - Ok((path, file)) - }) - .process_results(|kv| HashMap::from_iter(kv)) + #tokens + } + } else { + tokens + }; + let file: syn::File = syn::parse2(tokens)?; + Ok((path, file)) + }, + ) + .process_results(|kv| HashMap::from_iter(kv))?) } } diff --git a/src/io.rs b/src/io.rs index bdf712f..8b2b1eb 100644 --- a/src/io.rs +++ b/src/io.rs @@ -1,15 +1,11 @@ //! File IO for generated codes. -use std::{collections::HashMap, env, ffi::OsString, fs, io, path, process}; +use std::{collections::HashMap, fs, io, path, process}; use thiserror::Error; use crate::types::XmlGitInfo; -const ENVVAR_XML_GIT_DESCRIBE: &str = "XML_GIT_DESCRIBE"; -const ENVVAR_XML_GIT_TIMESTAMP: &str = "XML_GIT_TIMESTAMP"; -const ENVVAR_XML_GIT_SHA: &str = "XML_GIT_SHA"; - #[derive(Debug, Error)] pub enum XmlGitInfoError { #[error("io error while getting xml git info: {msg} {source}")] @@ -20,8 +16,6 @@ pub enum XmlGitInfoError { }, #[error("git failed: {msg}: {stderr}")] CommandFailed { msg: &'static str, stderr: String }, - #[error("env var {var} is not unicode: {}", s.to_string_lossy())] - NotUnicodeEnvVar { var: &'static str, s: OsString }, } impl XmlGitInfoError { @@ -31,84 +25,44 @@ impl XmlGitInfoError { } pub(crate) fn get_xml_gitinfo(xml_path: &path::Path) -> Result { - let describe = match env::var(ENVVAR_XML_GIT_DESCRIBE) { - Ok(describe) => describe, - Err(env::VarError::NotUnicode(s)) => { - return Err(XmlGitInfoError::NotUnicodeEnvVar { - var: ENVVAR_XML_GIT_DESCRIBE, - s, - }); - } - Err(env::VarError::NotPresent) => { - let out_describe = process::Command::new("git") - .args(["describe", "--always", "--dirty"]) - .current_dir(xml_path.parent().unwrap()) - .output() - .map_err(|e| XmlGitInfoError::io_error(e, "git describe"))?; - let describe = if out_describe.status.success() { - String::from_utf8_lossy(&out_describe.stdout) - .trim() - .to_owned() - } else { - return Err(XmlGitInfoError::CommandFailed { - msg: "git describe", - stderr: String::from_utf8_lossy(&out_describe.stderr).into_owned(), - }); - }; - describe - } + let describe = process::Command::new("git") + .args(["describe", "--always", "--dirty"]) + .current_dir(xml_path.parent().unwrap()) + .output() + .map_err(|e| XmlGitInfoError::io_error(e, "git describe"))?; + let describe = if describe.status.success() { + String::from_utf8_lossy(&describe.stdout).trim().to_owned() + } else { + return Err(XmlGitInfoError::CommandFailed { + msg: "git describe", + stderr: String::from_utf8_lossy(&describe.stderr).into_owned(), + }); }; - let timestamp = match env::var(ENVVAR_XML_GIT_TIMESTAMP) { - Ok(timestamp) => timestamp, - Err(env::VarError::NotUnicode(s)) => { - return Err(XmlGitInfoError::NotUnicodeEnvVar { - var: ENVVAR_XML_GIT_TIMESTAMP, - s, - }); - } - Err(env::VarError::NotPresent) => { - let timestamp_out = process::Command::new("git") - .args(["log", "-1", "--pretty=format:'%cI'"]) - .current_dir(xml_path.parent().unwrap()) - .output() - .map_err(|e| XmlGitInfoError::io_error(e, "git log (timestamp)"))?; - let timestamp = if timestamp_out.status.success() { - String::from_utf8_lossy(×tamp_out.stdout) - .trim() - .to_owned() - } else { - return Err(XmlGitInfoError::CommandFailed { - msg: "git log (timestamp)", - stderr: String::from_utf8_lossy(×tamp_out.stderr).into_owned(), - }); - }; - timestamp - } + let timestamp = process::Command::new("git") + .args(["log", "-1", "--pretty=format:'%cI'"]) + .current_dir(xml_path.parent().unwrap()) + .output() + .map_err(|e| XmlGitInfoError::io_error(e, "git log (timestamp)"))?; + let timestamp = if timestamp.status.success() { + String::from_utf8_lossy(×tamp.stdout).trim().to_owned() + } else { + return Err(XmlGitInfoError::CommandFailed { + msg: "git log (timestamp)", + stderr: String::from_utf8_lossy(×tamp.stderr).into_owned(), + }); }; - let git_sha = match env::var(ENVVAR_XML_GIT_SHA) { - Ok(sha) => sha, - Err(env::VarError::NotUnicode(s)) => { - return Err(XmlGitInfoError::NotUnicodeEnvVar { - var: ENVVAR_XML_GIT_SHA, - s, - }); - } - Err(env::VarError::NotPresent) => { - let sha = process::Command::new("git") - .args(["rev-parse", "HEAD"]) - .current_dir(xml_path.parent().unwrap()) - .output() - .map_err(|e| XmlGitInfoError::io_error(e, "git rev-parse (sha)"))?; - let git_sha = if sha.status.success() { - String::from_utf8_lossy(&sha.stdout).trim().to_owned() - } else { - return Err(XmlGitInfoError::CommandFailed { - msg: "git rev-parse (sha)", - stderr: String::from_utf8_lossy(&sha.stderr).into_owned(), - }); - }; - git_sha - } + let sha = process::Command::new("git") + .args(["rev-parse", "HEAD"]) + .current_dir(xml_path.parent().unwrap()) + .output() + .map_err(|e| XmlGitInfoError::io_error(e, "git rev-parse (sha)"))?; + let git_sha = if sha.status.success() { + String::from_utf8_lossy(&sha.stdout).trim().to_owned() + } else { + return Err(XmlGitInfoError::CommandFailed { + msg: "git rev-parse (sha)", + stderr: String::from_utf8_lossy(&sha.stderr).into_owned(), + }); }; Ok(XmlGitInfo { describe, diff --git a/src/main.rs b/src/main.rs index 6208678..01ca8e7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,16 +3,11 @@ use std::path; use anyhow::Result; use clap::{Parser, Subcommand}; -/// Validate the register map xml and generate register interface from register map xml. -/// See `help` with each commands to see detailed explanations. +/// Generate register interface from register map xml. #[derive(Parser, Debug)] -#[command(version, about, long_about)] +#[command(version, about)] struct Args { /// Input XML register map. - /// - /// The path must be a valid git repository to get git metadata. - /// You can also force these metadata with environmental variables `XML_GIT_DESCRIBE`, - /// `XML_GIT_TIMESTAMP` and `XML_GIT_SHA`. xml: path::PathBuf, #[command(subcommand)] command: Commands, @@ -28,8 +23,6 @@ enum Commands { out: path::PathBuf, }, /// Generate flattened register map in CSV. - /// - /// Also run validation before generation. #[cfg(feature = "flatmap")] Flatmap { /// Flattened csv out path.