first commit
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| /target | ||||
							
								
								
									
										604
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										604
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @ -0,0 +1,604 @@ | ||||
| # This file is automatically @generated by Cargo. | ||||
| # It is not intended for manual editing. | ||||
| version = 4 | ||||
|  | ||||
| [[package]] | ||||
| name = "addr2line" | ||||
| version = "0.24.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" | ||||
| dependencies = [ | ||||
|  "gimli", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "adler2" | ||||
| version = "2.0.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" | ||||
|  | ||||
| [[package]] | ||||
| name = "android-tzdata" | ||||
| version = "0.1.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" | ||||
|  | ||||
| [[package]] | ||||
| name = "android_system_properties" | ||||
| version = "0.1.5" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" | ||||
| dependencies = [ | ||||
|  "libc", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "autocfg" | ||||
| version = "1.4.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" | ||||
|  | ||||
| [[package]] | ||||
| name = "backtrace" | ||||
| version = "0.3.75" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" | ||||
| dependencies = [ | ||||
|  "addr2line", | ||||
|  "cfg-if", | ||||
|  "libc", | ||||
|  "miniz_oxide", | ||||
|  "object", | ||||
|  "rustc-demangle", | ||||
|  "windows-targets", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "bitflags" | ||||
| version = "2.9.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" | ||||
|  | ||||
| [[package]] | ||||
| name = "bumpalo" | ||||
| version = "3.18.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" | ||||
|  | ||||
| [[package]] | ||||
| name = "bytes" | ||||
| version = "1.10.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" | ||||
|  | ||||
| [[package]] | ||||
| name = "cc" | ||||
| version = "1.2.27" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" | ||||
| dependencies = [ | ||||
|  "shlex", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "cfg-if" | ||||
| version = "1.0.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" | ||||
|  | ||||
| [[package]] | ||||
| name = "chrono" | ||||
| version = "0.4.41" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" | ||||
| dependencies = [ | ||||
|  "android-tzdata", | ||||
|  "iana-time-zone", | ||||
|  "js-sys", | ||||
|  "num-traits", | ||||
|  "serde", | ||||
|  "wasm-bindgen", | ||||
|  "windows-link", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "core-foundation-sys" | ||||
| version = "0.8.7" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" | ||||
|  | ||||
| [[package]] | ||||
| name = "dwmbar-rs" | ||||
| version = "0.1.0" | ||||
| dependencies = [ | ||||
|  "chrono", | ||||
|  "tokio", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "gimli" | ||||
| version = "0.31.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" | ||||
|  | ||||
| [[package]] | ||||
| name = "iana-time-zone" | ||||
| version = "0.1.63" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" | ||||
| dependencies = [ | ||||
|  "android_system_properties", | ||||
|  "core-foundation-sys", | ||||
|  "iana-time-zone-haiku", | ||||
|  "js-sys", | ||||
|  "log", | ||||
|  "wasm-bindgen", | ||||
|  "windows-core", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "iana-time-zone-haiku" | ||||
| version = "0.1.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" | ||||
| dependencies = [ | ||||
|  "cc", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "js-sys" | ||||
| version = "0.3.77" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" | ||||
| dependencies = [ | ||||
|  "once_cell", | ||||
|  "wasm-bindgen", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "libc" | ||||
| version = "0.2.173" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "d8cfeafaffdbc32176b64fb251369d52ea9f0a8fbc6f8759edffef7b525d64bb" | ||||
|  | ||||
| [[package]] | ||||
| name = "lock_api" | ||||
| version = "0.4.13" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" | ||||
| dependencies = [ | ||||
|  "autocfg", | ||||
|  "scopeguard", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "log" | ||||
| version = "0.4.27" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" | ||||
|  | ||||
| [[package]] | ||||
| name = "memchr" | ||||
| version = "2.7.5" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" | ||||
|  | ||||
| [[package]] | ||||
| name = "miniz_oxide" | ||||
| version = "0.8.9" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" | ||||
| dependencies = [ | ||||
|  "adler2", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "mio" | ||||
| version = "1.0.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" | ||||
| dependencies = [ | ||||
|  "libc", | ||||
|  "wasi", | ||||
|  "windows-sys 0.59.0", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "num-traits" | ||||
| version = "0.2.19" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" | ||||
| dependencies = [ | ||||
|  "autocfg", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "object" | ||||
| version = "0.36.7" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" | ||||
| dependencies = [ | ||||
|  "memchr", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "once_cell" | ||||
| version = "1.21.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" | ||||
|  | ||||
| [[package]] | ||||
| name = "parking_lot" | ||||
| version = "0.12.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" | ||||
| dependencies = [ | ||||
|  "lock_api", | ||||
|  "parking_lot_core", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "parking_lot_core" | ||||
| version = "0.9.11" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
|  "libc", | ||||
|  "redox_syscall", | ||||
|  "smallvec", | ||||
|  "windows-targets", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "pin-project-lite" | ||||
| version = "0.2.16" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" | ||||
|  | ||||
| [[package]] | ||||
| name = "proc-macro2" | ||||
| version = "1.0.95" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" | ||||
| dependencies = [ | ||||
|  "unicode-ident", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "quote" | ||||
| version = "1.0.40" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "redox_syscall" | ||||
| version = "0.5.12" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" | ||||
| dependencies = [ | ||||
|  "bitflags", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "rustc-demangle" | ||||
| version = "0.1.25" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" | ||||
|  | ||||
| [[package]] | ||||
| name = "rustversion" | ||||
| version = "1.0.21" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" | ||||
|  | ||||
| [[package]] | ||||
| name = "scopeguard" | ||||
| version = "1.2.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" | ||||
|  | ||||
| [[package]] | ||||
| name = "serde" | ||||
| version = "1.0.219" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" | ||||
| dependencies = [ | ||||
|  "serde_derive", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "serde_derive" | ||||
| version = "1.0.219" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "syn", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "shlex" | ||||
| version = "1.3.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" | ||||
|  | ||||
| [[package]] | ||||
| name = "signal-hook-registry" | ||||
| version = "1.4.5" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" | ||||
| dependencies = [ | ||||
|  "libc", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "smallvec" | ||||
| version = "1.15.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" | ||||
|  | ||||
| [[package]] | ||||
| name = "socket2" | ||||
| version = "0.5.10" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" | ||||
| dependencies = [ | ||||
|  "libc", | ||||
|  "windows-sys 0.52.0", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "syn" | ||||
| version = "2.0.103" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "unicode-ident", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "tokio" | ||||
| version = "1.45.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" | ||||
| dependencies = [ | ||||
|  "backtrace", | ||||
|  "bytes", | ||||
|  "libc", | ||||
|  "mio", | ||||
|  "parking_lot", | ||||
|  "pin-project-lite", | ||||
|  "signal-hook-registry", | ||||
|  "socket2", | ||||
|  "tokio-macros", | ||||
|  "windows-sys 0.52.0", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "tokio-macros" | ||||
| version = "2.5.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "syn", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "unicode-ident" | ||||
| version = "1.0.18" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" | ||||
|  | ||||
| [[package]] | ||||
| name = "wasi" | ||||
| version = "0.11.0+wasi-snapshot-preview1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" | ||||
|  | ||||
| [[package]] | ||||
| name = "wasm-bindgen" | ||||
| version = "0.2.100" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
|  "once_cell", | ||||
|  "rustversion", | ||||
|  "wasm-bindgen-macro", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "wasm-bindgen-backend" | ||||
| version = "0.2.100" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" | ||||
| dependencies = [ | ||||
|  "bumpalo", | ||||
|  "log", | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "syn", | ||||
|  "wasm-bindgen-shared", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "wasm-bindgen-macro" | ||||
| version = "0.2.100" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" | ||||
| dependencies = [ | ||||
|  "quote", | ||||
|  "wasm-bindgen-macro-support", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "wasm-bindgen-macro-support" | ||||
| version = "0.2.100" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "syn", | ||||
|  "wasm-bindgen-backend", | ||||
|  "wasm-bindgen-shared", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "wasm-bindgen-shared" | ||||
| version = "0.2.100" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" | ||||
| dependencies = [ | ||||
|  "unicode-ident", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "windows-core" | ||||
| version = "0.61.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" | ||||
| dependencies = [ | ||||
|  "windows-implement", | ||||
|  "windows-interface", | ||||
|  "windows-link", | ||||
|  "windows-result", | ||||
|  "windows-strings", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "windows-implement" | ||||
| version = "0.60.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "syn", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "windows-interface" | ||||
| version = "0.59.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "syn", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "windows-link" | ||||
| version = "0.1.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" | ||||
|  | ||||
| [[package]] | ||||
| name = "windows-result" | ||||
| version = "0.3.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" | ||||
| dependencies = [ | ||||
|  "windows-link", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "windows-strings" | ||||
| version = "0.4.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" | ||||
| dependencies = [ | ||||
|  "windows-link", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "windows-sys" | ||||
| version = "0.52.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" | ||||
| dependencies = [ | ||||
|  "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]] | ||||
| 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" | ||||
							
								
								
									
										8
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| [package] | ||||
| name = "dwmbar-rs" | ||||
| version = "0.1.0" | ||||
| edition = "2024" | ||||
|  | ||||
| [dependencies] | ||||
| chrono = { version = "0.4.41", features = ["serde"] } | ||||
| tokio = { version = "1.45.1", features = ["full"] } | ||||
							
								
								
									
										342
									
								
								src/main.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										342
									
								
								src/main.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,342 @@ | ||||
| use std::fs; | ||||
| use std::process::Command; | ||||
| use std::sync::Arc; | ||||
| use std::time::Duration; | ||||
| use chrono::{DateTime, Local}; | ||||
| use tokio::sync::RwLock; | ||||
| use tokio::time::interval; | ||||
|  | ||||
| #[derive(Clone, Debug)] | ||||
| struct SystemInfo { | ||||
|     battery: String, | ||||
|     volume: String, | ||||
|     memory: String, | ||||
|     cpu_temp: String, | ||||
|     network: String, | ||||
|     datetime: String, | ||||
| } | ||||
|  | ||||
| impl Default for SystemInfo { | ||||
|     fn default() -> Self { | ||||
|         Self { | ||||
|             battery: "🔋 N/A".to_string(), | ||||
|             volume: "🔊 N/A".to_string(), | ||||
|             memory: "💾 N/A".to_string(), | ||||
|             cpu_temp: "🌡️ N/A".to_string(), | ||||
|             network: "🔌 N/A".to_string(), | ||||
|             datetime: "📅 N/A".to_string(), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| type SharedSystemInfo = Arc<RwLock<SystemInfo>>; | ||||
|  | ||||
| // Модуль батареи - обновляется каждые 30 секунд | ||||
| async fn battery_module(system_info: SharedSystemInfo) { | ||||
|     let mut interval = interval(Duration::from_secs(10)); | ||||
|      | ||||
|     loop { | ||||
|         interval.tick().await; | ||||
|          | ||||
|         let battery_info = tokio::task::spawn_blocking(|| { | ||||
|             if let Ok(capacity) = fs::read_to_string("/sys/class/power_supply/BAT0/capacity") { | ||||
|                 let capacity = capacity.trim(); | ||||
|                 let status = fs::read_to_string("/sys/class/power_supply/BAT0/status") | ||||
|                     .unwrap_or_default() | ||||
|                     .trim() | ||||
|                     .to_string(); | ||||
|                  | ||||
|                 let icon = match status.as_str() { | ||||
|                     "Charging" => "⚡", | ||||
|                     "Full" => "🔋", | ||||
|                     "Discharging" => { | ||||
|                         let cap: i32 = capacity.parse().unwrap_or(0); | ||||
|                         match cap { | ||||
|                             0..=15 => "🪫", | ||||
|                             16..=50 => "🔋", | ||||
|                             _ => "🔋", | ||||
|                         } | ||||
|                     }, | ||||
|                     _ => "🔋", | ||||
|                 }; | ||||
|                  | ||||
|                 format!("{} {}%", icon, capacity) | ||||
|             } else { | ||||
|                 "🔋 N/A".to_string() | ||||
|             } | ||||
|         }).await.unwrap_or_else(|_| "🔋 Error".to_string()); | ||||
|          | ||||
|         let mut info = system_info.write().await; | ||||
|         info.battery = battery_info; | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Модуль громкости - обновляется каждые 5 секунд | ||||
| async fn volume_module(system_info: SharedSystemInfo) { | ||||
|     let mut interval = interval(Duration::from_secs(5)); | ||||
|      | ||||
|     loop { | ||||
|         interval.tick().await; | ||||
|          | ||||
|         let volume_info = tokio::task::spawn_blocking(|| { | ||||
|             if let Ok(output) = Command::new("amixer") | ||||
|                 .args(&["get", "Master"]) | ||||
|                 .output()  | ||||
|             { | ||||
|                 let output_str = String::from_utf8_lossy(&output.stdout); | ||||
|                 if let Some(volume_line) = output_str.lines() | ||||
|                     .find(|line| line.contains("[") && line.contains("%"))  | ||||
|                 { | ||||
|                     if let Some(start) = volume_line.find('[') { | ||||
|                         if let Some(end) = volume_line.find('%') { | ||||
|                             let volume = &volume_line[start+1..end]; | ||||
|                             let muted = volume_line.contains("[off]"); | ||||
|                             return if muted { | ||||
|                                 format!("🔇 {}%", volume) | ||||
|                             } else { | ||||
|                                 let vol_num: i32 = volume.parse().unwrap_or(0); | ||||
|                                 let icon = match vol_num { | ||||
|                                     0 => "🔇", | ||||
|                                     1..=33 => "🔈", | ||||
|                                     34..=66 => "🔉", | ||||
|                                     _ => "🔊", | ||||
|                                 }; | ||||
|                                 format!("{} {}%", icon, volume) | ||||
|                             }; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             "🔊 N/A".to_string() | ||||
|         }).await.unwrap_or_else(|_| "🔊 Error".to_string()); | ||||
|          | ||||
|         let mut info = system_info.write().await; | ||||
|         info.volume = volume_info; | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Модуль памяти - обновляется каждые 3 секунды | ||||
| async fn memory_module(system_info: SharedSystemInfo) { | ||||
|     let mut interval = interval(Duration::from_secs(3)); | ||||
|      | ||||
|     loop { | ||||
|         interval.tick().await; | ||||
|          | ||||
|         let memory_info = tokio::task::spawn_blocking(|| { | ||||
|             if let Ok(meminfo) = fs::read_to_string("/proc/meminfo") { | ||||
|                 let mut total = 0u64; | ||||
|                 let mut available = 0u64; | ||||
|                  | ||||
|                 for line in meminfo.lines() { | ||||
|                     if line.starts_with("MemTotal:") { | ||||
|                         total = line.split_whitespace() | ||||
|                             .nth(1) | ||||
|                             .and_then(|s| s.parse().ok()) | ||||
|                             .unwrap_or(0); | ||||
|                     } else if line.starts_with("MemAvailable:") { | ||||
|                         available = line.split_whitespace() | ||||
|                             .nth(1) | ||||
|                             .and_then(|s| s.parse().ok()) | ||||
|                             .unwrap_or(0); | ||||
|                     } | ||||
|                 } | ||||
|                  | ||||
|                 if total > 0 { | ||||
|                     let used = total - available; | ||||
|                     let used_mb = used / 1024; | ||||
|                     let total_mb = total / 1024; | ||||
|                     let usage_percent = (used * 100) / total; | ||||
|                      | ||||
|                     let icon = match usage_percent { | ||||
|                         0..=50 => "💾", | ||||
|                         51..=80 => "📊", | ||||
|                         _ => "⚠️", | ||||
|                     }; | ||||
|                      | ||||
|                     format!("{} {}/{}MB ({}%)", icon, used_mb, total_mb, usage_percent) | ||||
|                 } else { | ||||
|                     "💾 N/A".to_string() | ||||
|                 } | ||||
|             } else { | ||||
|                 "💾 N/A".to_string() | ||||
|             } | ||||
|         }).await.unwrap_or_else(|_| "💾 Error".to_string()); | ||||
|          | ||||
|         let mut info = system_info.write().await; | ||||
|         info.memory = memory_info; | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Модуль температуры CPU - обновляется каждые 2 секунды | ||||
| async fn cpu_temp_module(system_info: SharedSystemInfo) { | ||||
|     let mut interval = interval(Duration::from_secs(2)); | ||||
|      | ||||
|     loop { | ||||
|         interval.tick().await; | ||||
|          | ||||
|         let temp_info = tokio::task::spawn_blocking(|| { | ||||
|             let temp_paths = [ | ||||
|                 "/sys/class/thermal/thermal_zone0/temp", | ||||
|                 "/sys/class/hwmon/hwmon0/temp1_input", | ||||
|                 "/sys/class/hwmon/hwmon1/temp1_input", | ||||
|                 "/sys/class/hwmon/hwmon2/temp1_input", | ||||
|             ]; | ||||
|              | ||||
|             for path in &temp_paths { | ||||
|                 if let Ok(temp_str) = fs::read_to_string(path) { | ||||
|                     if let Ok(temp) = temp_str.trim().parse::<i32>() { | ||||
|                         let temp_celsius = if temp > 1000 { temp / 1000 } else { temp }; | ||||
|                          | ||||
|                         let icon = match temp_celsius { | ||||
|                             0..=40 => "❄️", | ||||
|                             41..=60 => "🌡️", | ||||
|                             61..=80 => "🔥", | ||||
|                             _ => "💥", | ||||
|                         }; | ||||
|                          | ||||
|                         return format!("{} {}°C", icon, temp_celsius); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|              | ||||
|             "🌡️ N/A".to_string() | ||||
|         }).await.unwrap_or_else(|_| "🌡️ Error".to_string()); | ||||
|          | ||||
|         let mut info = system_info.write().await; | ||||
|         info.cpu_temp = temp_info; | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Модуль сети - обновляется каждые 10 секунд | ||||
| async fn network_module(system_info: SharedSystemInfo) { | ||||
|     let mut interval = interval(Duration::from_secs(10)); | ||||
|      | ||||
|     loop { | ||||
|         interval.tick().await; | ||||
|          | ||||
|         let network_info = tokio::task::spawn_blocking(|| { | ||||
|             // Проверяем активное подключение | ||||
|             if let Ok(output) = Command::new("ip") | ||||
|                 .args(&["route", "get", "8.8.8.8"]) | ||||
|                 .output() | ||||
|             { | ||||
|                 if output.status.success() { | ||||
|                     let output_str = String::from_utf8_lossy(&output.stdout); | ||||
|                     if let Some(dev_line) = output_str.lines().find(|line| line.contains(" dev ")) { | ||||
|                         if let Some(dev_start) = dev_line.find(" dev ") { | ||||
|                             let remaining = &dev_line[dev_start + 5..]; | ||||
|                             if let Some(interface) = remaining.split_whitespace().next() { | ||||
|                                 return if interface.starts_with("wl") || interface.starts_with("wlan") { | ||||
|                                     // Попробуем получить силу сигнала Wi-Fi | ||||
|                                     if let Ok(wifi_output) = Command::new("iwconfig") | ||||
|                                         .arg(interface) | ||||
|                                         .output() | ||||
|                                     { | ||||
|                                         let wifi_str = String::from_utf8_lossy(&wifi_output.stdout); | ||||
|                                         if let Some(signal_line) = wifi_str.lines() | ||||
|                                             .find(|line| line.contains("Signal level"))  | ||||
|                                         { | ||||
|                                             if let Some(level_start) = signal_line.find("Signal level=") { | ||||
|                                                 let level_part = &signal_line[level_start + 13..]; | ||||
|                                                 if let Some(level_end) = level_part.find(' ') { | ||||
|                                                     let level = &level_part[..level_end]; | ||||
|                                                     return format!("📶 {} ({})", interface, level); | ||||
|                                                 } | ||||
|                                             } | ||||
|                                         } | ||||
|                                     } | ||||
|                                     format!("📶 {}", interface) | ||||
|                                 } else { | ||||
|                                     format!("🌐 {}", interface) | ||||
|                                 }; | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|              | ||||
|             "🔌 Offline".to_string() | ||||
|         }).await.unwrap_or_else(|_| "🔌 Error".to_string()); | ||||
|          | ||||
|         let mut info = system_info.write().await; | ||||
|         info.network = network_info; | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Модуль времени - обновляется каждую секунду | ||||
| async fn datetime_module(system_info: SharedSystemInfo) { | ||||
|     let mut interval = interval(Duration::from_secs(1)); | ||||
|      | ||||
|     loop { | ||||
|         interval.tick().await; | ||||
|          | ||||
|         let now: DateTime<Local> = Local::now(); | ||||
|         let datetime_str = format!("📅 {} 🕐 {}",  | ||||
|                                   now.format("%Y-%m-%d"),  | ||||
|                                   now.format("%H:%M:%S")); | ||||
|          | ||||
|         let mut info = system_info.write().await; | ||||
|         info.datetime = datetime_str; | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Модуль вывода - обновляется каждые 100мс (0.1 секунды) | ||||
| async fn output_module(system_info: SharedSystemInfo) { | ||||
|     let mut interval = interval(Duration::from_millis(100)); | ||||
|      | ||||
|     loop { | ||||
|         interval.tick().await; | ||||
|          | ||||
|         let info = system_info.read().await; | ||||
|         let status_text = format!("{} | {} | {} | {} | {} | {}", | ||||
|                                  info.network, | ||||
|                                  info.cpu_temp, | ||||
|                                  info.memory, | ||||
|                                  info.volume, | ||||
|                                  info.battery, | ||||
|                                  info.datetime); | ||||
|          | ||||
|         // Обновляем dwm bar | ||||
|         tokio::task::spawn_blocking(move || { | ||||
|             let _ = Command::new("xsetroot") | ||||
|                 .args(&["-name", &status_text]) | ||||
|                 .output(); | ||||
|         }).await.ok(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[tokio::main] | ||||
| async fn main() { | ||||
|     println!("DWM Async Status Bar запущен..."); | ||||
|     println!("Интервалы обновления:"); | ||||
|     println!("  🔋 Батарея: 30 сек"); | ||||
|     println!("  🔊 Громкость: 5 сек"); | ||||
|     println!("  💾 Память: 3 сек"); | ||||
|     println!("  🌡️ CPU температура: 2 сек"); | ||||
|     println!("  🌐 Сеть: 10 сек"); | ||||
|     println!("  📅 Время: 1 сек"); | ||||
|     println!("  📊 Вывод в bar: 0.1 сек"); | ||||
|     println!("Для остановки нажмите Ctrl+C"); | ||||
|      | ||||
|     let system_info: SharedSystemInfo = Arc::new(RwLock::new(SystemInfo::default())); | ||||
|      | ||||
|     // Запускаем все модули параллельно | ||||
|     let battery_task = tokio::spawn(battery_module(system_info.clone())); | ||||
|     let volume_task = tokio::spawn(volume_module(system_info.clone())); | ||||
|     let memory_task = tokio::spawn(memory_module(system_info.clone())); | ||||
|     let cpu_temp_task = tokio::spawn(cpu_temp_module(system_info.clone())); | ||||
|     let network_task = tokio::spawn(network_module(system_info.clone())); | ||||
|     let datetime_task = tokio::spawn(datetime_module(system_info.clone())); | ||||
|     let output_task = tokio::spawn(output_module(system_info.clone())); | ||||
|      | ||||
|     // Ждем завершения любой из задач (что в принципе не должно произойти) | ||||
|     tokio::select! { | ||||
|         _ = battery_task => println!("Battery module stopped"), | ||||
|         _ = volume_task => println!("Volume module stopped"), | ||||
|         _ = memory_task => println!("Memory module stopped"), | ||||
|         _ = cpu_temp_task => println!("CPU temp module stopped"), | ||||
|         _ = network_task => println!("Network module stopped"), | ||||
|         _ = datetime_task => println!("DateTime module stopped"), | ||||
|         _ = output_task => println!("Output module stopped"), | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user