From 7a4c1e532589c2f593c1ea2d50c454bec9c47392 Mon Sep 17 00:00:00 2001 From: qwjyh Date: Mon, 4 Dec 2023 21:34:24 +0900 Subject: [PATCH] Use HashMap instead of Vector --- Cargo.lock | 379 +++++++++++++---------- Cargo.toml | 1 + src/main.rs | 116 ++++--- src/storages.rs | 31 +- src/storages/directory.rs | 48 ++- src/storages/local_info.rs | 18 ++ src/storages/physical_drive_partition.rs | 45 ++- 7 files changed, 404 insertions(+), 234 deletions(-) create mode 100644 src/storages/local_info.rs diff --git a/Cargo.lock b/Cargo.lock index 71637de..d3c3022 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,18 +4,18 @@ version = 3 [[package]] name = "aho-corasick" -version = "1.0.4" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] [[package]] name = "anstream" -version = "0.5.0" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f58811cfac344940f1a400b6e6231ce35171f614f26439e80f8c1465c5cc0c" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" dependencies = [ "anstyle", "anstyle-parse", @@ -27,15 +27,15 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] name = "anstyle-parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" +checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" dependencies = [ "utf8parse", ] @@ -46,17 +46,17 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "anstyle-wincon" -version = "2.1.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58f54d10c6dfa51283a066ceab3ec1ab78d13fae00aa49243a45e4571fb79dfd" +checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -79,9 +79,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "byte-unit" @@ -111,20 +111,19 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.4.0" +version = "4.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d5f1946157a96594eb2d2c10eb7ad9a2b27518cb3000209dec700c35df9197d" +checksum = "41fffed7514f420abec6d183b1d3acfd9099c79c3a10a06ade4f8203f1411272" dependencies = [ "clap_builder", "clap_derive", - "once_cell", ] [[package]] name = "clap-verbosity-flag" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eef05769009513df2eb1c3b4613e7fad873a14c600ff025b08f250f59fee7de" +checksum = "e5fdbb015d790cfb378aca82caf9cc52a38be96a7eecdb92f31b4366a8afc019" dependencies = [ "clap", "log", @@ -132,9 +131,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.0" +version = "4.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78116e32a042dd73c2901f0dc30790d20ff3447f3e3472fad359e8c3d282bcd6" +checksum = "63361bae7eef3771745f02d8d892bec2fee5f6e34af316ba556e7f97a7069ff1" dependencies = [ "anstream", "anstyle", @@ -144,9 +143,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.0" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9fd1a5729c4548118d7d70ff234a44868d00489a4b6597b0b020918a0e91a1a" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" dependencies = [ "heck", "proc-macro2", @@ -156,9 +155,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "colorchoice" @@ -168,19 +167,9 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" - -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "crossbeam-deque" @@ -258,14 +247,14 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "dyn-clone" -version = "1.0.13" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfc4744c1b8f2a09adc0e55242f60b1af195d88596bd8700be74418c056c555" +checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" [[package]] name = "either" @@ -275,9 +264,9 @@ checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "env_logger" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" dependencies = [ "humantime", "is-terminal", @@ -294,39 +283,28 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.2" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", "libc", + "windows-sys 0.52.0", ] [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if", "libc", @@ -350,9 +328,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "heck" @@ -362,9 +340,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" [[package]] name = "humantime" @@ -374,9 +352,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -384,9 +362,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", "hashbrown", @@ -416,7 +394,7 @@ checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ "hermit-abi", "rustix", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -427,9 +405,9 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" dependencies = [ "libc", ] @@ -442,9 +420,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.147" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "libgit2-sys" @@ -460,6 +438,17 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall", +] + [[package]] name = "libssh2-sys" version = "0.3.0" @@ -488,15 +477,15 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.5" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -510,9 +499,9 @@ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "memoffset" @@ -525,14 +514,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "log", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -553,16 +542,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "once_cell" version = "1.18.0" @@ -577,9 +556,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.91" +version = "0.9.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "866b5f16f90776b9bb8dc1e1802ac6f0513de3a7a7465867bfbc563dc737faac" +checksum = "3812c071ba60da8b5677cc12bcb1d42989a65553772897a7e0355545a819838f" dependencies = [ "cc", "libc", @@ -605,22 +584,28 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] -name = "percent-encoding" -version = "2.3.0" +name = "pathdiff" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pkg-config" @@ -630,9 +615,9 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] @@ -648,9 +633,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" dependencies = [ "either", "rayon-core", @@ -658,50 +643,39 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", ] [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ "getrandom", - "redox_syscall 0.2.16", + "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.9.3" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", @@ -711,9 +685,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.6" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", @@ -722,21 +696,21 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "rustix" -version = "0.38.8" +version = "0.38.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" +checksum = "9470c4bf8246c8daf25f9598dca807fb6510347b1e1cfa55749113850c79d88a" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -753,18 +727,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.186" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f5db24220c009de9bd45e69fb2938f4b6d2df856aa9304ce377b3180f83b7c1" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.186" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad697f7e0b65af4983a4ce8f56ed5b357e8d3c36651bf6a7e13639c17b8e670" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", @@ -773,9 +747,9 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.25" +version = "0.9.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a49e178e4452f45cb61d0cd8cebc1b0fafd3e41929e996cef79aa3aca91f574" +checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c" dependencies = [ "indexmap", "itoa", @@ -816,9 +790,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.0" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "strsim" @@ -828,9 +802,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "2.0.29" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" dependencies = [ "proc-macro2", "quote", @@ -839,9 +813,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.29.8" +version = "0.29.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d10ed79c22663a35a255d289a7fdcb43559fc77ff15df5ce6c341809e7867528" +checksum = "cd727fc423c2060f6c92d9534cef765c65a6ed3f428a03d7def74a8c4348e666" dependencies = [ "cfg-if", "core-foundation-sys", @@ -855,27 +829,27 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" -version = "1.0.47" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.47" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", @@ -905,9 +879,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" @@ -926,9 +900,9 @@ checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] name = "unicode-width" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" [[package]] name = "unsafe-libyaml" @@ -938,9 +912,9 @@ checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" [[package]] name = "url" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -949,9 +923,9 @@ dependencies = [ [[package]] name = "utf8-width" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5190c9442dcdaf0ddd50f37420417d219ae5261bbf5db120d0f9bab996c9cba1" +checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" [[package]] name = "utf8parse" @@ -989,9 +963,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -1008,7 +982,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", ] [[package]] @@ -1017,13 +1000,28 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] @@ -1032,42 +1030,84 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "xdbm" version = "0.1.0" @@ -1081,6 +1121,7 @@ dependencies = [ "git2", "inquire", "log", + "pathdiff", "serde", "serde_yaml", "sysinfo", diff --git a/Cargo.toml b/Cargo.toml index f4552d4..39d2bcc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,3 +18,4 @@ serde = { version = "1.0", features = ["derive"] } serde_yaml = "0.9" byte-unit = "4.0.19" anyhow = "1.0" +pathdiff = "0.2.1" diff --git a/src/main.rs b/src/main.rs index dc7a125..3b3940b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,13 +11,16 @@ extern crate dirs; use anyhow::{anyhow, Context, Result}; use byte_unit::Byte; -use clap::{Parser, Subcommand}; +use clap::error::ErrorKind; +use clap::{CommandFactory, Parser, Subcommand}; use clap_verbosity_flag::Verbosity; use git2::{Commit, Oid, Repository}; use inquire::{validator::Validation, Text}; use serde::{Deserialize, Serialize}; use serde_yaml; +use std::collections::HashMap; use std::fmt::format; +use std::path::PathBuf; use std::{env, io::BufReader, path::Path}; use std::{ ffi::OsString, @@ -31,8 +34,8 @@ use std::{fs, io::prelude::*}; use sysinfo::{Disk, DiskExt, SystemExt}; use crate::storages::{ - get_storages, physical_drive_partition::*, write_storages, Storage, StorageExt, StorageType, - STORAGESFILE, + get_storages, local_info, physical_drive_partition::*, write_storages, Storage, StorageExt, + StorageType, STORAGESFILE, }; use devices::{Device, DEVICESFILE}; @@ -48,7 +51,9 @@ struct Cli { #[derive(Subcommand)] enum Commands { - /// Initialize + /// Initialize for this device. + /// Provide `repo_url` to use existing repository, otherwise this device will be configured as the + /// first device. Init { repo_url: Option, // url? }, @@ -76,6 +81,9 @@ enum StorageCommands { Add { #[arg(value_enum)] storage_type: StorageType, + + #[arg(short, long, value_name = "PATH")] + path: Option, }, /// List all storages. List {}, @@ -89,6 +97,7 @@ mod storages; struct BackupLog {} +#[feature(absolute_path)] fn main() -> Result<()> { let cli = Cli::parse(); env_logger::Builder::new() @@ -145,7 +154,8 @@ fn main() -> Result<()> { // save devname let devname_path = &config_dir.join("devname"); { - let f = File::create(devname_path).context("Failed to create devname file")?; + let f = File::create(devname_path) + .context("Failed to create a file to store local device name")?; let writer = BufWriter::new(f); serde_yaml::to_writer(writer, &device.name()).unwrap(); }; @@ -158,6 +168,7 @@ fn main() -> Result<()> { } else { get_devices(&config_dir)? }; + trace!("devices: {:?}", devices); if devices.iter().any(|x| x.name() == device.name()) { return Err(anyhow!("device name is already used.")); } @@ -182,60 +193,75 @@ fn main() -> Result<()> { )?; trace!("repo state: {:?}", repo.state()); match storage.command { - StorageCommands::Add { storage_type } => { - trace!("Storage Add {:?}", storage_type); - match storage_type { - StorageType::Physical => { - // Get storages - let mut storages: Vec = get_storages(&config_dir)?; - trace!("found storages: {:?}", storages); + StorageCommands::Add { storage_type, path } => { + trace!("Storage Add {:?}, {:?}", storage_type, path); + // Get storages + // let mut storages: Vec = get_storages(&config_dir)?; + let mut storages: HashMap = get_storages(&config_dir)?; + trace!("found storages: {:?}", storages); + let (key, storage) = match storage_type { + StorageType::Physical => { // select storage let device = get_device(&config_dir)?; - let storage = select_physical_storage(device, &storages)?; - println!("storage: {:?}", storage); - let new_storage_name = storage.name().clone(); - - // add to storages - storages.push(Storage::PhysicalStorage(storage)); - trace!("updated storages: {:?}", storages); - - // write to file - write_storages(&config_dir, storages)?; - - // commit - add_and_commit( - &repo, - &Path::new(STORAGESFILE), - &format!("Add new storage(physical drive): {}", new_storage_name), - )?; - - println!("Added new storage."); - trace!("Finished adding storage"); + let (key, storage) = select_physical_storage(device, &storages)?; + println!("storage: {}: {:?}", key, storage); + (key, Storage::PhysicalStorage(storage)) } StorageType::SubDirectory => { + let mut storages: HashMap = get_storages(&config_dir)?; + let path = path.unwrap_or_else(|| { + let mut cmd = Cli::command(); + cmd.error( + ErrorKind::MissingRequiredArgument, + " is required with sub-directory", + ) + .exit(); + }); + trace!("SubDirectory arguments: path: {:?}", path); + // Nightly feature std::path::absolute + let path = path.canonicalize()?; + trace!("canonicalized: path: {:?}", path); + + // let (key, storage) = storages::directory::Directory::new(name, parent, relative_path, notes) todo!() } - } + }; + + // add to storages + storages.insert(key.clone(), storage); + trace!("updated storages: {:?}", storages); + + // write to file + write_storages(&config_dir, storages)?; + + // commit + add_and_commit( + &repo, + &Path::new(STORAGESFILE), + &format!("Add new storage(physical drive): {}", key), + )?; + + println!("Added new storage."); + trace!("Finished adding storage"); } StorageCommands::List {} => { // Get storages - let storages: Vec = get_storages(&config_dir)?; + let storages: HashMap = get_storages(&config_dir)?; trace!("found storages: {:?}", storages); - for storage in storages { - println!("{}", storage); + for (k, storage) in storages { + println!("{}: {}", k, storage); } } StorageCommands::Bind { storage: storage_name, } => { // get storages - let mut storages: Vec = get_storages(&config_dir)?; + let mut storages: HashMap = get_storages(&config_dir)?; let commit_comment = { // find matching storage - let storage = &mut storages - .iter_mut() - .find(|s| s.name() == &storage_name) + let storage = storages + .get_mut(&storage_name) .context(format!("No storage has name {}", storage_name))?; // get disk from sysinfo let mut sysinfo = sysinfo::System::new_all(); @@ -316,7 +342,7 @@ fn set_device_name() -> Result { } }; - let device_name = Text::new("Provide the device(PC) name:") + let device_name = Text::new("Provide name for this device:") .with_validator(validator) .prompt(); @@ -406,7 +432,7 @@ fn add_and_commit(repo: &Repository, path: &Path, message: &str) -> Result Result<()> { trace!("status: "); for status in repo.statuses(None)?.iter() { @@ -416,3 +442,9 @@ fn full_status(repo: &Repository) -> Result<()> { } Ok(()) } + +#[test] +fn verify_cli() { + use clap::CommandFactory; + Cli::command().debug_assert() +} diff --git a/src/storages.rs b/src/storages.rs index 457924c..5453f22 100644 --- a/src/storages.rs +++ b/src/storages.rs @@ -1,11 +1,12 @@ //! Manipulates storages. -use crate::storages::directory::Directory; use crate::storages::physical_drive_partition::PhysicalDrivePartition; +use crate::{devices, storages::directory::Directory}; use anyhow::{anyhow, Context, Result}; use clap::ValueEnum; use serde::{Deserialize, Serialize}; -use std::{ffi, fmt, fs, io, path::Path}; +use std::path::{self}; +use std::{collections::HashMap, ffi, fmt, fs, io, path::Path}; /// YAML file to store known storages.. pub const STORAGESFILE: &str = "storages.yml"; @@ -31,6 +32,7 @@ pub enum Storage { } impl Storage { + /// Add or update alias of `disk` for current device. pub fn add_alias( &mut self, disk: &sysinfo::Disk, @@ -50,6 +52,17 @@ impl StorageExt for Storage { Self::SubDirectory(s) => s.name(), } } + + // fn mount_path( + // &self, + // &device: &devices::Device, + // &storages: &HashMap, + // ) -> Result<&path::PathBuf> { + // match self { + // Self::PhysicalStorage(s) => s.mount_path(&device, &storages), + // Self::SubDirectory(s) => s.mount_path(&device, &storages), + // } + // } } impl fmt::Display for Storage { @@ -64,14 +77,20 @@ impl fmt::Display for Storage { /// Trait to manipulate all `Storage`s (Enums). pub trait StorageExt { fn name(&self) -> &String; + // fn mount_path( + // &self, + // &device: &devices::Device, + // &storages: &HashMap, + // ) -> Result<&path::PathBuf>; } pub mod directory; +pub mod local_info; pub mod physical_drive_partition; /// Get `Vec` from devices.yml([DEVICESFILE]). /// If [DEVICESFILE] isn't found, return empty vec. -pub fn get_storages(config_dir: &Path) -> Result> { +pub fn get_storages(config_dir: &Path) -> Result> { if let Some(storages_file) = fs::read_dir(&config_dir)? .filter(|f| { f.as_ref().map_or_else( @@ -87,17 +106,17 @@ pub fn get_storages(config_dir: &Path) -> Result> { trace!("{} found: {:?}", STORAGESFILE, storages_file); let f = fs::File::open(config_dir.join(STORAGESFILE))?; let reader = io::BufReader::new(f); - let yaml: Vec = + let yaml: HashMap = serde_yaml::from_reader(reader).context("Failed to read devices.yml")?; Ok(yaml) } else { trace!("No {} found", STORAGESFILE); - Ok(vec![]) + Ok(HashMap::new()) } } /// Write `storages` to yaml file in `config_dir`. -pub fn write_storages(config_dir: &Path, storages: Vec) -> Result<()> { +pub fn write_storages(config_dir: &Path, storages: HashMap) -> Result<()> { let f = fs::File::create(config_dir.join(STORAGESFILE))?; let writer = io::BufWriter::new(f); serde_yaml::to_writer(writer, &storages).map_err(|e| anyhow!(e)) diff --git a/src/storages/directory.rs b/src/storages/directory.rs index f50cf1c..9cc67a2 100644 --- a/src/storages/directory.rs +++ b/src/storages/directory.rs @@ -1,7 +1,15 @@ //! Manipulate subdirectories of other storages, including directories. +use anyhow::{anyhow, Context, Result}; use serde::{Deserialize, Serialize}; -use std::{path, fmt::{self, write}, rc::Rc}; +use std::{ + collections::HashMap, + fmt::{self, write}, + path, + rc::Rc, +}; + +use crate::devices; use super::{Storage, StorageExt}; @@ -9,7 +17,7 @@ use super::{Storage, StorageExt}; #[derive(Serialize, Deserialize, Debug)] pub struct Directory { name: String, - parent: Box, + parent: String, relative_path: path::PathBuf, notes: String, } @@ -21,18 +29,48 @@ impl Directory { /// - `notes`: supplimental notes. pub fn new( name: String, - parent: Rc, // todo implement serialize + parent: String, // todo implement serialize relative_path: path::PathBuf, notes: String, ) -> Directory { - Directory {name, parent, relative_path, notes} + Directory { + name, + parent, + relative_path, + notes, + } } + + /// Get parent `&Storage` of directory. + fn parent<'a>(&'a self, storages: &'a HashMap) -> Result<&Storage> { + let parent = &self.parent; + storages.get(&self.parent.clone()).context(format!( + "No parent {} exists for directory {}", + parent, + self.name() + )) + } + + // /// Resolve mount path of directory with current device. + // fn mount_path( + // &self, + // &device: &devices::Device, + // &storages: &HashMap, + // ) -> Result { + // let parent = self.parent(&storages)?; + // let parent_mount_path = parent.mount_path(&device, &storages)?; + // Ok(parent_mount_path.join(self.relative_path.clone())) + // } } impl StorageExt for Directory { fn name(&self) -> &String { &self.name } + + // fn mount_path(&self, &device: &devices::Device, &storages: &HashMap) -> Result<&path::PathBuf> { + // Ok(&self.mount_path(&device, &storages)?) + // } } impl fmt::Display for Directory { @@ -46,4 +84,4 @@ impl fmt::Display for Directory { notes = self.notes, ) } -} \ No newline at end of file +} diff --git a/src/storages/local_info.rs b/src/storages/local_info.rs new file mode 100644 index 0000000..845d5ee --- /dev/null +++ b/src/storages/local_info.rs @@ -0,0 +1,18 @@ +use serde::{Deserialize, Serialize}; +use std::path; + +#[derive(Serialize, Deserialize, Debug)] +pub struct LocalInfo { + alias: String, + mount_path: path::PathBuf, +} + +impl LocalInfo { + pub fn new(alias: String, mount_path: path::PathBuf) -> LocalInfo { + LocalInfo { alias, mount_path } + } + + pub fn mount_path(&self) -> &path::PathBuf { + &self.mount_path + } +} diff --git a/src/storages/physical_drive_partition.rs b/src/storages/physical_drive_partition.rs index 0b5d934..6846ac6 100644 --- a/src/storages/physical_drive_partition.rs +++ b/src/storages/physical_drive_partition.rs @@ -1,17 +1,21 @@ //! Manipulate partition of physical drive (both removable and unremovable). -use crate::{devices::Device, get_device}; +use crate::devices; use crate::storages::{Storage, StorageExt}; +use crate::{devices::Device, get_device}; use anyhow::{anyhow, Context, Result}; use byte_unit::Byte; use inquire::Text; use serde::{Deserialize, Serialize}; +use std::path; use std::{ collections::{hash_map::RandomState, HashMap}, fmt, }; use sysinfo::{Disk, DiskExt, SystemExt}; +use super::local_info::LocalInfo; + /// Partitoin of physical (on-premises) drive. #[derive(Serialize, Deserialize, Debug)] pub struct PhysicalDrivePartition { @@ -20,7 +24,13 @@ pub struct PhysicalDrivePartition { capacity: u64, fs: String, is_removable: bool, - system_names: HashMap, + // system_names: HashMap, + local_info: HashMap, +} + +pub struct PhysicalDrivePartitionLocal { + alias: String, + mount_path: path::PathBuf, } impl PhysicalDrivePartition { @@ -38,30 +48,33 @@ impl PhysicalDrivePartition { let fs = disk.file_system(); trace!("fs: {:?}", fs); let fs = std::str::from_utf8(fs)?; + let local_info = LocalInfo::new(alias, disk.mount_point().to_path_buf()); Ok(PhysicalDrivePartition { name: name, kind: format!("{:?}", disk.kind()), capacity: disk.total_space(), fs: fs.to_string(), is_removable: disk.is_removable(), - system_names: HashMap::from([(device.name(), alias)]), + // system_names: HashMap::from([(device.name(), alias)]), + local_info: HashMap::from([(device.name(), local_info)]), }) } pub fn add_alias( &mut self, disk: &sysinfo::Disk, - config_dir: &std::path::PathBuf + config_dir: &std::path::PathBuf, ) -> Result<()> { let device = get_device(&config_dir)?; let alias = match disk.name().to_str() { Some(s) => s.to_string(), None => return Err(anyhow!("Failed to convert storage name to valid str.")), }; - let aliases = &mut self.system_names; + let new_local_info = LocalInfo::new(alias, disk.mount_point().to_path_buf()); + let aliases = &mut self.local_info; trace!("aliases: {:?}", aliases); - match aliases.insert(device.name(), alias) { - Some(v) => println!("Value updated. old val is: {}", v), + match aliases.insert(device.name(), new_local_info) { + Some(v) => println!("Value updated. old val is: {:?}", v), None => println!("inserted new val"), }; trace!("aliases: {:?}", aliases); @@ -73,6 +86,14 @@ impl StorageExt for PhysicalDrivePartition { fn name(&self) -> &String { &self.name } + + // fn mount_path(&self, &device: &devices::Device, &storages: &HashMap) -> Result<&path::PathBuf> { + // Ok(&self + // .local_info + // .get(&device.name()) + // .context(format!("LocalInfo for storage: {} not found", &self.name()))? + // .mount_path()) + // } } impl fmt::Display for PhysicalDrivePartition { @@ -91,12 +112,11 @@ impl fmt::Display for PhysicalDrivePartition { } } - /// Interactively select physical storage from available disks in sysinfo. pub fn select_physical_storage( device: Device, - storages: &Vec, -) -> Result { + storages: &HashMap, +) -> Result<(String, PhysicalDrivePartition)> { trace!("select_physical_storage"); // get disk info fron sysinfo let mut sys_disks = sysinfo::System::new_all(); @@ -111,13 +131,14 @@ pub fn select_physical_storage( trace!("{}", disk_name); loop { disk_name = Text::new("Name for the disk:").prompt()?; - if storages.iter().all(|s| s.name() != &disk_name) { + if storages.iter().all(|(k, v)| k != &disk_name) { break; } println!("The name {} is already used.", disk_name); } trace!("selected name: {}", disk_name); - PhysicalDrivePartition::try_from_sysinfo_disk(&disk, disk_name, device) + let storage = PhysicalDrivePartition::try_from_sysinfo_disk(&disk, disk_name.clone(), device)?; + Ok((disk_name, storage)) } pub fn select_sysinfo_disk(sysinfo: &sysinfo::System) -> Result<&Disk> {