From ad77b3ac1b1780c8771d4b1c0ebd91e43f136ed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E8=88=AA=E5=AE=87?= <3364451258@qq.com> Date: Tue, 16 Jun 2026 23:27:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20workspace=20=E9=AA=A8=E6=9E=B6=20?= =?UTF-8?q?=E2=80=94=20core=20+=20cli=20=E6=A8=A1=E5=9D=97=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cargo/config.toml | 2 + Cargo.lock | 332 ++++++++++++++++++++++++++++++++++ Cargo.toml | 9 + cli/Cargo.toml | 15 ++ cli/src/main.rs | 3 + core/Cargo.toml | 11 ++ core/src/ecc/galois.rs | 1 + core/src/ecc/mod.rs | 2 + core/src/ecc/reed_solomon.rs | 1 + core/src/encoder/bitstream.rs | 1 + core/src/encoder/mod.rs | 3 + core/src/encoder/mode.rs | 1 + core/src/encoder/segment.rs | 1 + core/src/lib.rs | 6 + core/src/matrix/grid.rs | 1 + core/src/matrix/mask.rs | 1 + core/src/matrix/mod.rs | 4 + core/src/matrix/patterns.rs | 1 + core/src/matrix/placement.rs | 1 + core/src/qr.rs | 1 + core/src/render/ascii.rs | 1 + core/src/render/mod.rs | 3 + core/src/render/png.rs | 1 + core/src/render/svg.rs | 1 + core/src/version.rs | 1 + 25 files changed, 404 insertions(+) create mode 100644 .cargo/config.toml create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 cli/Cargo.toml create mode 100644 cli/src/main.rs create mode 100644 core/Cargo.toml create mode 100644 core/src/ecc/galois.rs create mode 100644 core/src/ecc/mod.rs create mode 100644 core/src/ecc/reed_solomon.rs create mode 100644 core/src/encoder/bitstream.rs create mode 100644 core/src/encoder/mod.rs create mode 100644 core/src/encoder/mode.rs create mode 100644 core/src/encoder/segment.rs create mode 100644 core/src/lib.rs create mode 100644 core/src/matrix/grid.rs create mode 100644 core/src/matrix/mask.rs create mode 100644 core/src/matrix/mod.rs create mode 100644 core/src/matrix/patterns.rs create mode 100644 core/src/matrix/placement.rs create mode 100644 core/src/qr.rs create mode 100644 core/src/render/ascii.rs create mode 100644 core/src/render/mod.rs create mode 100644 core/src/render/png.rs create mode 100644 core/src/render/svg.rs create mode 100644 core/src/version.rs diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..ca929a0 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,2 @@ +[target.x86_64-pc-windows-gnu] +rustflags = ["-C", "link-args=-lmcfgthread"] diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..8ee42d1 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,332 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "bitflags" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "clap" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "moxcms", + "num-traits", + "png", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "moxcms" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pxfm" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" + +[[package]] +name = "qr-core" +version = "0.1.0" +dependencies = [ + "image", +] + +[[package]] +name = "qrgen" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "qr-core", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "simd-adler32" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[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.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..2ed0967 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,9 @@ +[workspace] +resolver = "2" +members = ["core", "cli"] + +[workspace.package] +version = "0.1.0" +edition = "2021" +license = "MIT" +authors = ["刘航宇"] diff --git a/cli/Cargo.toml b/cli/Cargo.toml new file mode 100644 index 0000000..332e404 --- /dev/null +++ b/cli/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "qrgen" +version.workspace = true +edition.workspace = true +license.workspace = true +authors.workspace = true + +[[bin]] +name = "qrgen" +path = "src/main.rs" + +[dependencies] +qr-core = { path = "../core" } +clap = { version = "4", features = ["derive"] } +anyhow = "1" diff --git a/cli/src/main.rs b/cli/src/main.rs new file mode 100644 index 0000000..6f32072 --- /dev/null +++ b/cli/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("QRGen - 开发中"); +} diff --git a/core/Cargo.toml b/core/Cargo.toml new file mode 100644 index 0000000..2aafc66 --- /dev/null +++ b/core/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "qr-core" +version.workspace = true +edition.workspace = true +license.workspace = true +authors.workspace = true + +[dependencies] +image = { version = "0.25", default-features = false, features = ["png"] } + +[dev-dependencies] diff --git a/core/src/ecc/galois.rs b/core/src/ecc/galois.rs new file mode 100644 index 0000000..6fe9484 --- /dev/null +++ b/core/src/ecc/galois.rs @@ -0,0 +1 @@ +// FIXME: GF(2⁸) Galois 域运算 — Task 2 diff --git a/core/src/ecc/mod.rs b/core/src/ecc/mod.rs new file mode 100644 index 0000000..5b36e1d --- /dev/null +++ b/core/src/ecc/mod.rs @@ -0,0 +1,2 @@ +pub mod galois; +pub mod reed_solomon; diff --git a/core/src/ecc/reed_solomon.rs b/core/src/ecc/reed_solomon.rs new file mode 100644 index 0000000..928e124 --- /dev/null +++ b/core/src/ecc/reed_solomon.rs @@ -0,0 +1 @@ +// FIXME: Reed-Solomon 编码器 — Task 4 diff --git a/core/src/encoder/bitstream.rs b/core/src/encoder/bitstream.rs new file mode 100644 index 0000000..62eb58a --- /dev/null +++ b/core/src/encoder/bitstream.rs @@ -0,0 +1 @@ +// FIXME: 比特流 — Task 6 diff --git a/core/src/encoder/mod.rs b/core/src/encoder/mod.rs new file mode 100644 index 0000000..4fc8e37 --- /dev/null +++ b/core/src/encoder/mod.rs @@ -0,0 +1,3 @@ +pub mod mode; +pub mod segment; +pub mod bitstream; diff --git a/core/src/encoder/mode.rs b/core/src/encoder/mode.rs new file mode 100644 index 0000000..d808af4 --- /dev/null +++ b/core/src/encoder/mode.rs @@ -0,0 +1 @@ +// FIXME: 编码模式 — Task 5 diff --git a/core/src/encoder/segment.rs b/core/src/encoder/segment.rs new file mode 100644 index 0000000..50e7101 --- /dev/null +++ b/core/src/encoder/segment.rs @@ -0,0 +1 @@ +// FIXME: 数据分段 — Task 6 diff --git a/core/src/lib.rs b/core/src/lib.rs new file mode 100644 index 0000000..c4b586e --- /dev/null +++ b/core/src/lib.rs @@ -0,0 +1,6 @@ +pub mod ecc; +pub mod encoder; +pub mod matrix; +pub mod render; +pub mod version; +pub mod qr; diff --git a/core/src/matrix/grid.rs b/core/src/matrix/grid.rs new file mode 100644 index 0000000..8b4a3c0 --- /dev/null +++ b/core/src/matrix/grid.rs @@ -0,0 +1 @@ +// FIXME: 模块矩阵 — Task 7 diff --git a/core/src/matrix/mask.rs b/core/src/matrix/mask.rs new file mode 100644 index 0000000..c1fcfd4 --- /dev/null +++ b/core/src/matrix/mask.rs @@ -0,0 +1 @@ +// FIXME: 掩码评分 — Task 8 diff --git a/core/src/matrix/mod.rs b/core/src/matrix/mod.rs new file mode 100644 index 0000000..3ab7f3e --- /dev/null +++ b/core/src/matrix/mod.rs @@ -0,0 +1,4 @@ +pub mod grid; +pub mod patterns; +pub mod placement; +pub mod mask; diff --git a/core/src/matrix/patterns.rs b/core/src/matrix/patterns.rs new file mode 100644 index 0000000..9dc32d5 --- /dev/null +++ b/core/src/matrix/patterns.rs @@ -0,0 +1 @@ +// FIXME: 功能图案 — Task 7 diff --git a/core/src/matrix/placement.rs b/core/src/matrix/placement.rs new file mode 100644 index 0000000..e63148f --- /dev/null +++ b/core/src/matrix/placement.rs @@ -0,0 +1 @@ +// FIXME: 数据排列 — Task 8 diff --git a/core/src/qr.rs b/core/src/qr.rs new file mode 100644 index 0000000..2c7895e --- /dev/null +++ b/core/src/qr.rs @@ -0,0 +1 @@ +// FIXME: 顶层 QR 码 API — Task 10 diff --git a/core/src/render/ascii.rs b/core/src/render/ascii.rs new file mode 100644 index 0000000..9b94bfd --- /dev/null +++ b/core/src/render/ascii.rs @@ -0,0 +1 @@ +// FIXME: ASCII 渲染器 — Task 10 diff --git a/core/src/render/mod.rs b/core/src/render/mod.rs new file mode 100644 index 0000000..02b672d --- /dev/null +++ b/core/src/render/mod.rs @@ -0,0 +1,3 @@ +pub mod png; +pub mod svg; +pub mod ascii; diff --git a/core/src/render/png.rs b/core/src/render/png.rs new file mode 100644 index 0000000..0a28a65 --- /dev/null +++ b/core/src/render/png.rs @@ -0,0 +1 @@ +// FIXME: PNG 渲染器 — Task 10 diff --git a/core/src/render/svg.rs b/core/src/render/svg.rs new file mode 100644 index 0000000..adb3da8 --- /dev/null +++ b/core/src/render/svg.rs @@ -0,0 +1 @@ +// FIXME: SVG 渲染器 — Task 10 diff --git a/core/src/version.rs b/core/src/version.rs new file mode 100644 index 0000000..726fb3c --- /dev/null +++ b/core/src/version.rs @@ -0,0 +1 @@ +// FIXME: 版本参数表 — Task 3