Browse Source

【框架搭建】命令行程序搭建集成tokio

yuanan 2 months ago
parent
commit
3270a21b2a
8 changed files with 298 additions and 4 deletions
  1. 233 3
      Cargo.lock
  2. 4 0
      Cargo.toml
  3. 4 0
      emu-config.yaml
  4. 30 0
      src/cmd/cmd.rs
  5. 21 0
      src/cmd/config.rs
  6. 2 0
      src/cmd/mod.rs
  7. 1 0
      src/lib.rs
  8. 3 1
      src/main.rs

+ 233 - 3
Cargo.lock

@@ -17,6 +17,62 @@ version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
 checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
 
 
+[[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 0.59.0",
+]
+
+[[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 0.59.0",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.95"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04"
+
 [[package]]
 [[package]]
 name = "autocfg"
 name = "autocfg"
 version = "1.4.0"
 version = "1.4.0"
@@ -56,25 +112,125 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
 
+[[package]]
+name = "clap"
+version = "4.5.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff"
+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.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed"
+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 = "equivalent"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+
 [[package]]
 [[package]]
 name = "gimli"
 name = "gimli"
 version = "0.31.1"
 version = "0.31.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
 checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
 
 
+[[package]]
+name = "hashbrown"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
+
+[[package]]
+name = "heck"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+
+[[package]]
+name = "indexmap"
+version = "2.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652"
+dependencies = [
+ "equivalent",
+ "hashbrown",
+]
+
 [[package]]
 [[package]]
 name = "inpower-iot-mgc-rs"
 name = "inpower-iot-mgc-rs"
 version = "0.1.0"
 version = "0.1.0"
 dependencies = [
 dependencies = [
+ "anyhow",
+ "clap",
+ "serde",
+ "serde_yml",
  "tokio",
  "tokio",
 ]
 ]
 
 
+[[package]]
+name = "is_terminal_polyfill"
+version = "1.70.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
+
+[[package]]
+name = "itoa"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
+
 [[package]]
 [[package]]
 name = "libc"
 name = "libc"
 version = "0.2.169"
 version = "0.2.169"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
 checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
 
 
+[[package]]
+name = "libyml"
+version = "0.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3302702afa434ffa30847a83305f0a69d6abd74293b6554c18ec85c7ef30c980"
+dependencies = [
+ "anyhow",
+ "version_check",
+]
+
 [[package]]
 [[package]]
 name = "lock_api"
 name = "lock_api"
 version = "0.4.12"
 version = "0.4.12"
@@ -108,7 +264,7 @@ checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
 dependencies = [
 dependencies = [
  "libc",
  "libc",
  "wasi",
  "wasi",
- "windows-sys",
+ "windows-sys 0.52.0",
 ]
 ]
 
 
 [[package]]
 [[package]]
@@ -120,6 +276,12 @@ dependencies = [
  "memchr",
  "memchr",
 ]
 ]
 
 
+[[package]]
+name = "once_cell"
+version = "1.20.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e"
+
 [[package]]
 [[package]]
 name = "parking_lot"
 name = "parking_lot"
 version = "0.12.3"
 version = "0.12.3"
@@ -182,12 +344,53 @@ version = "0.1.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
 checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
 
 
+[[package]]
+name = "ryu"
+version = "1.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd"
+
 [[package]]
 [[package]]
 name = "scopeguard"
 name = "scopeguard"
 version = "1.2.0"
 version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
 checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
 
 
+[[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 = "serde_yml"
+version = "0.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59e2dd588bf1597a252c3b920e0143eb99b0f76e4e082f4c92ce34fbc9e71ddd"
+dependencies = [
+ "indexmap",
+ "itoa",
+ "libyml",
+ "memchr",
+ "ryu",
+ "serde",
+ "version_check",
+]
+
 [[package]]
 [[package]]
 name = "signal-hook-registry"
 name = "signal-hook-registry"
 version = "1.4.2"
 version = "1.4.2"
@@ -210,9 +413,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8"
 checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8"
 dependencies = [
 dependencies = [
  "libc",
  "libc",
- "windows-sys",
+ "windows-sys 0.52.0",
 ]
 ]
 
 
+[[package]]
+name = "strsim"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+
 [[package]]
 [[package]]
 name = "syn"
 name = "syn"
 version = "2.0.98"
 version = "2.0.98"
@@ -239,7 +448,7 @@ dependencies = [
  "signal-hook-registry",
  "signal-hook-registry",
  "socket2",
  "socket2",
  "tokio-macros",
  "tokio-macros",
- "windows-sys",
+ "windows-sys 0.52.0",
 ]
 ]
 
 
 [[package]]
 [[package]]
@@ -259,6 +468,18 @@ version = "1.0.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034"
 checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034"
 
 
+[[package]]
+name = "utf8parse"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
+
+[[package]]
+name = "version_check"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
+
 [[package]]
 [[package]]
 name = "wasi"
 name = "wasi"
 version = "0.11.0+wasi-snapshot-preview1"
 version = "0.11.0+wasi-snapshot-preview1"
@@ -274,6 +495,15 @@ dependencies = [
  "windows-targets",
  "windows-targets",
 ]
 ]
 
 
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets",
+]
+
 [[package]]
 [[package]]
 name = "windows-targets"
 name = "windows-targets"
 version = "0.52.6"
 version = "0.52.6"

+ 4 - 0
Cargo.toml

@@ -4,4 +4,8 @@ version = "0.1.0"
 edition = "2021"
 edition = "2021"
 
 
 [dependencies]
 [dependencies]
+anyhow = "1.0.95"
+clap = { version = "4.5.28", features = ["derive"] }
+serde = { version = "1.0.217", features = ["derive"] }
+serde_yml = "0.0.12"
 tokio = { version = "1.43.0", features = ["full"] }
 tokio = { version = "1.43.0", features = ["full"] }

+ 4 - 0
emu-config.yaml

@@ -0,0 +1,4 @@
+emu:
+  ver: '0.0.1'
+  pcs:
+  ems:

+ 30 - 0
src/cmd/cmd.rs

@@ -0,0 +1,30 @@
+use crate::cmd::config::{AppConfig, EMU_CONFIG};
+use clap::Parser;
+use tokio::fs::read_to_string;
+
+#[derive(Parser, Debug)]
+#[command(version, about, long_about = None)]
+struct Args {
+    #[arg(short, long, value_name = "EMU配置文件")]
+    config: String,
+}
+
+pub async fn cmd() {
+    let args = Args::parse();
+    match init_config(args.config).await {
+        Ok(()) => {
+            println!("{:?}", EMU_CONFIG.get().unwrap());
+        }
+        Err(e) => {
+            eprintln!("配置加载失败: {}", e.to_string());
+        }
+    }
+}
+
+/// 配置载入内存
+async fn init_config(config_path: String) -> anyhow::Result<()> {
+    let content = read_to_string(config_path).await?;
+    let app_config: AppConfig = serde_yml::from_str(content.as_str())?;
+    EMU_CONFIG.set(app_config).expect("配置载入内存错误");
+    Ok(())
+}

+ 21 - 0
src/cmd/config.rs

@@ -0,0 +1,21 @@
+use serde::{Deserialize, Serialize};
+use std::sync::OnceLock;
+
+pub static EMU_CONFIG: OnceLock<AppConfig> = OnceLock::new();
+
+#[derive(Debug, Serialize, Deserialize)]
+pub struct AppConfig {
+    pub emu: EmuConfig,
+}
+
+#[derive(Serialize, Deserialize, Debug)]
+pub struct EmuConfig {
+    pub ver: String,
+    pub pcs: PcsConfig,
+    pub ems: EmsConfig,
+}
+
+#[derive(Serialize, Deserialize, Debug)]
+pub struct PcsConfig {}
+#[derive(Serialize, Deserialize, Debug)]
+pub struct EmsConfig {}

+ 2 - 0
src/cmd/mod.rs

@@ -0,0 +1,2 @@
+pub mod cmd;
+pub mod config;

+ 1 - 0
src/lib.rs

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

+ 3 - 1
src/main.rs

@@ -1,4 +1,6 @@
+use inpower_iot_mgc_rs::cmd::cmd::cmd;
+
 #[tokio::main]
 #[tokio::main]
 async fn main() {
 async fn main() {
-    println!("Hello, world!");
+    cmd().await;
 }
 }